• 締切済み

完全に透明なフォーム

toshi_ynと申します。 良く話題にあがる透明フォームを作っております。 透明フォーム自体は実現できているのですが、完全な透明フォームが できず困っております。 フォームがActiveになったイベントを拾うため、WM_ACTIVATEイベントを 設定し、それなりに透明フォームができています。(描画スピードは遅い・・) しかしながら、複数のウィンドウがあり、特に下側のあるウィンドウの変化に 対応できておりません。 具体的に言うと、他のアプリのウィンドウが2枚あり、本アプリの透明フォームが 一番上にあるとします。 そこで、タスクバーから下側にある他のアプリのウィンドウが閉じられても、 その変化に追従できず透明になっていない。(閉じられたウィンドウのイメージ が透明フォームに残ってしまっている) 透明フォームを実現するためフォームのCanvasを書き換えるのに時間がかかる のがネックのような気がしていますが・・・。 どなたか、アドバイスをいただければ幸いです。 よろしくお願いします。 //---現在のコード-------- Unit.h private: // ユーザー宣言 void __fastcall TForm1::On_WM_Activate(TWMActivate &msg); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_ACTIVATE, TWMActivate, On_WM_Activate); END_MESSAGE_MAP(TForm) Unit.cpp void __fastcall TForm1::On_WM_Activate(TWMActivate &msg) { HBITMAP DesktopBitmap; HDC MemDC, DeskDC; DeskDC = GetDC(0); MemDC = CreateCompatibleDC(DeskDC); DesktopBitmap = CreateCompatibleBitmap(DeskDC, Screen->Width, Screen->Height); SelectObject(MemDC, DesktopBitmap); BitBlt(MemDC, 0, 0, Screen->Width, Screen->Height, DeskDC, 0, 0, SRCCOPY); DeleteDC(MemDC); ReleaseDC(0, DeskDC); }

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

アドバイスを。 BitBlt()でビットマップを転送する範囲を必要最低限にすることで多少はスピードアップできるでしょう。 他のウィンドウの動きを監視するにはメッセージをフックする必要があります。 あと、ターゲットがWindows2000、WindowsXPに限定されるなら、レイヤードウィンドウを使う手もあります。 http://www.microsoft.com/japan/msdn/windows/windows2000/layerwin.asp

参考URL:
http://www.microsoft.com/japan/msdn/windows/windows2000/layerwin.asp
toshi_yn
質問者

お礼

早速のアドバイスありがとうございます。 説明不足でした。 残念ながら、こちらの環境はWin98、Borland C++ Builder Ver.4です。 Windos2000では、透明フォームがサポートされており、羨ましい限りです。

すると、全ての回答が全文表示されます。

関連するQ&A