ALT+Tabチックなプログラムを書く…なぜかウィンドウ透明化編

『Slashcolon /: » ALT+Tabチックなプログラムを書く…切替タスク取得編』『Slashcolon /: » ALT+Tabチックなプログラムを書く…アイコン取得編』の一応続編です ;)

アイコンに引き続いて、どうでも良い見た目の実装なんですけど…表示するウィンドウというかダイアログの透明化です。実装したことがなかったので、なんとなくやってみたかっただけなんですけど。

透明化って、むちゃくちゃ簡単でWS_EX_LAYERED属性をウィンドウに付けて、SetLayeredWindowAttributesで透明度を設定すればハイ終わりって感じなんですね。

ところが…
VS6だけだとWS_EX_LAYEREDが定義されてないとか、SetLayeredWindowAttributesがリンクエラーになったりするんですね :shock:

要するにウィンドウの透明化って、Windows 2000からのものなんでPlatform SDKを入れてWINVERを…みたいなことをする必要がある。でも、VS6での開発は客先指定なのでSDKを入れるのはチョットってことでuser32.dllをダイナミックに呼び出すことに。

まぁ、DLLをダイナミックに呼び出す方法は珍しくもなんともないんだけど…ペタっと貼っておく。

    // 本来はSDKで定義されてる値
#define LWA_ALPHA 0x00000002
#define WS_EX_LAYERED 0x00080000
    // 透明化レベル 0~255 0で透明
#define ALPHA_LEVEL 200
 
   // 関数ポインタの型定義
typedef BOOL (WINAPI *LPFNSETLAYEREDWINDOWATTRIBUTES)(HWND, COLORREF, BYTE, DWORD);
 
    // 以下のコードをOnInitDialog辺りに
    LPFNSETLAYEREDWINDOWATTRIBUTES SetLayeredWindowAttributes;
 
    LONG exStyle = ::GetWindowLong(this->m_hWnd, GWL_EXSTYLE);
    ::SetWindowLong(this->m_hWnd, GWL_EXSTYLE, exStyle | WS_EX_LAYERED);
 
    HMODULE hModule = ::LoadLibrary("user32.dll");
 
    SetLayeredWindowAttributes =
        (LPFNSETLAYEREDWINDOWATTRIBUTES)::GetProcAddress(hModule,
            "SetLayeredWindowAttributes");
 
    SetLayeredWindowAttributes(this->m_hWnd, NULL, ALPHA_LEVEL, LWA_ALPHA);
    ::FreeLibrary(hModule);

これで、VS6標準で問題なくコンパイルできました ;) あ、モチロンVS2005とかVS2008なら、わざわざこんなことしなくても普通にコンパイルできるんですけど。

そう言えば、Channel 9では「Visual C++ 10: 10 is the new 6」というテーマでC++チームのプログラムマネージャーAmit Mohindra氏が語ってます。

30分以上の長丁場ですが…VC++ 10(VS2010)では、簡単にOffice 2007とかで採用されてるリボンインタフェース(評判の良いやつです :mrgreen: )が実装できることや、超簡単に自動保存機能が実装できること、さらにはC++0xの一部を取り入れてることなどを語っています。

C#に主役の座を譲りつつあるように見えるけど…まだまだMSはC++もがんばってるよぉ~って感じですね ;)

Programming: Principles and Practice Using C++ Programming: Principles and Practice Using C++
Bjarne Stroustrup


Amazonで詳しく見る
by G-Tools

Be Sociable, Share!

TrackBack URL :

No comments yet. Be the first.

Leave a reply