アイコンをStretchBltで拡大縮小させたい。


志の助  2007-10-07 21:50:20  No: 66535

SDKです。
アイコンをウィンドウのクライアント領域に表示させたい場合、通常DrawIconやDrawIconExを使いますが、StretchBlt関数を使ってBitmapの拡大縮小のようなことをしようと思いつきまして壁に当たってしまいました。
(拡大縮小はDrawIconExでできることも承知です。)

下のようなコードで実現できると思ったんですが、表示したアイコンの背景が黒くなってしまいます。
どこがおかしいんでしょうか?

         static iRate; //縮尺

  HDC hdc, hdc_mem;
  HBITMAP hBM_mem;

  static int w = GetSystemMetrics(SM_CXICON);
  static int h = GetSystemMetrics(SM_CYICON);

  case WM_PAINT:
    hdc = BeginPaint(hwnd, &ps);
    hdc_mem = CreateCompatibleDC(hdc);
    hBM_mem = CreateCompatibleBitmap(hdc, w, h);
    SelectObject(hdc_mem, hBM_mem);

    DrawIcon(hdc_mem, 0, 0, hIcon);
    StretchBlt(hdc, 0, 0, (w * iRate) / 100, (h * iRate) / 100, hdc_mem, 0, 0, w, h, SRCCOPY);
    
    DeleteObject(hBM_mem);
    DeleteDC(hdc_mem);
    EndPaint(hwnd, &ps);
    return 0;


michi  2007-10-08 02:01:00  No: 66536

> DrawIcon(hdc_mem, 0, 0, hIcon);

によってhIconの透過情報を使って描画されますが。
hdc_mem自体が透過情報を持つわけではありません。

そもそもデバイスコンテキストに透過情報という概念はありません。
Regionを使って透過処理ができなくもないと思いますがお勧めしません。
DrawIconExに任せるのがベストだと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加