SetLayeredWindowAttributes参数错误

今天在程序中调用SetLayeredWindowAttributes竟然不成功,返回值为0,GetLastError提示:参数错误

而这样的代码我已经不止一次用过,在若干次搜索尝试后发现:

SetLayeredWindowAttribute does not work for child windows

具有WS_CHILD风格的子窗口,无法使用SetLayeredWindowAttributes函数设置透明

给我提示的第一个帖子:

http://www.codeguru.com/forum/archive/index.php/t-292750.html

and 2nd

http://social.microsoft.com/Forums/en-US/vcgeneral/thread/9540a3ac-6c5d-412c-8b2a-ae025cf4941d/

终于被我找到MSDN中的相关说明:

http://msdn.microsoft.com/en-us/library/ms632599.aspx#layered

<textarea cols="50" rows="15" name="code" class="cpp:nogutter">Also by default, a child window (that is, one created with the WS_CHILD style and with a valid parent hWnd parameter in the call to CreateWindow or CreateWindowEx) has the same layout as its parent. To disable inheritance of mirroring to all child windows, specify WS_EX_NOINHERITLAYOUT in the call to CreateWindowEx. Note, mirroring is not inherited by owned windows (those created without the WS_CHILD style) or those created with the parent hWnd parameter in CreateWindowEx set to NULL. To disable inheritance of mirroring for an individual window, process the WM_NCCREATE message with GetWindowLong and SetWindowLong to turn off the WS_EX_LAYOUTRTL flag. This processing is in addition to whatever other processing is needed. The following code fragment shows how this is done. SetWindowLong (hWnd, GWL_EXSTYLE, GetWindowLong(hWnd,GWL_EXSTYLE) &amp; ~WS_EX_LAYOUTRTL)) </textarea>

 

顺便把MSDN中的一段贴在下面,方便下次使用:

Using Layered Windows

To have a dialog box come up as a translucent window, first create the dialog as usual. Then, on WM_INITDIALOG, set the layered bit of the window's extended style and call SetLayeredWindowAttributes with the desired alpha value. The code might look like this:

<textarea cols="50" rows="15" name="code" class="cpp">// Set WS_EX_LAYERED on this window SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); // Make this window 70% alpha SetLayeredWindowAttributes(hwnd, 0, (255 * 70) / 100, LWA_ALPHA);</textarea>

 

Note that the third parameter of SetLayeredWindowAttributes is a value that ranges from 0 to 255, with 0 making the window completely transparent and 255 making it completely opaque. This parameter mimics the more versatile BLENDFUNCTION of the AlphaBlend function.

To make this window completely opaque again, remove the WS_EX_LAYERED bit by calling SetWindowLong and then ask the window to repaint. Removing the bit is desired to let the system know that it can free up some memory associated with layering and redirection. The code might look like this:

 

<textarea cols="50" rows="15" name="code" class="cpp">// Remove WS_EX_LAYERED from this window styles SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) &amp; ~WS_EX_LAYERED); // Ask the window and its children to repaint RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);</textarea>

 

THE END.我错了

你可能感兴趣的:(SetLayeredWindowAttributes参数错误)