Windows 2000は ComboLBox に対して SetLayeredWindow を実行してはいけない

    COMBOBOXINFO info = { sizeof(COMBOBOXINFO) };
    GetComboBoxInfo(ComboBox1->Handle, &info);
    HWND hWnd = info.hwndList;
    ::SetWindowLong(hWnd, GWL_EXSTYLE, ::GetWindowLong(hWnd, GWL_EXSTYLE) ^ WS_EX_LAYERED);
    ::SetWindowLong(hWnd, GWL_EXSTYLE, ::GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
    ::SetLayeredWindowAttributes(hWnd, 0, alpha, LWA_ALPHA);

上記はコンボボックスのリスト部分を透過にするコードです。

ところが、Windows 2000で実行すると透過になるどころか、消えなくなるというバグがあります。

win2k

Windows 2000で、CrystalDiskMark 7.0.0 でコンボボックスを操作すると残像が残るのはこのためです。
ちなみにSetLayeredWindowAttributesではどんなパラメータを渡しても解除はできないので
SetWindowLong のGWL_EXSTYLE で WS_EX_LAYERED を解除するしかありません。
   
ソースファイルの
SetLayeredWindow(info.hwndList, m_ComboAlpha) をすべてコメントアウトすれば問題なくなります
(((・ω・)))

ソースファイルを見ると ComboBox の本体に透過処理するコードが入っていますが、Windows 10でも効果がないように見えるので、良く分かりません (・ω・)
不透明率が 242(95%)だったので分からないだけでした
crs
てっきり、こういうのを期待してプログラムしてるのかと…。
List部分は 95%で、本体は 50%でいい気がしますが ・ω・

EditBox に対する透過処理はWindows 2000でも正常に動作します。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です