【发布时间】:2021-06-29 17:32:42
【问题描述】:
如何为主应用程序窗口制作“关灯”效果?我的意思是:
- 灯亮:
- 关灯:
UPDATE-1: 我做了自己的“熄灯”窗口实现。
算法如下:
- 创建一个新的隐藏子窗口(暗窗口)
- 创建主窗口的屏幕截图
- 用黑色画笔填充变暗的窗口,并使用
AlphaBlend()函数将屏幕截图HDC复制到上面,并具有一定的透明度值 - 显示变暗的窗口。
而且效果很好。但是有一个缺点 - 当显示和隐藏变暗的窗口时,主窗口的所有子控件都会在短时间内涂上它的颜色(变暗的窗口颜色):
这个:
这是来自 .rc 文件的描述:
mainWindow DIALOGEX 0, 0, 309, 177
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,198,156,50,14,WS_CLIPSIBLINGS
PUSHBUTTON "Cancel",IDCANCEL,252,156,50,14,WS_CLIPSIBLINGS
CONTROL "",IDC_TAB1,"SysTabControl32",0x0,7,4,204,111,WS_CLIPSIBLINGS
PUSHBUTTON "Button1",IDC_BUTTON1,228,18,22,17,WS_CLIPSIBLINGS
PUSHBUTTON "Button2",IDC_BUTTON2,262,43,32,19,WS_CLIPSIBLINGS
EDITTEXT IDC_EDIT1,216,46,35,15,ES_AUTOHSCROLL | WS_CLIPSIBLINGS
LTEXT "Static",IDC_STATIC1,223,86,59,11,WS_CLIPSIBLINGS
LTEXT "Static",IDC_STATIC2,7,119,36,13,WS_CLIPSIBLINGS
CONTROL "Check1",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_CLIPSIBLINGS | WS_TABSTOP,45,121,56,8
CONTROL "Check2",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_CLIPSIBLINGS | WS_TABSTOP,110,119,36,13
CONTROL "Check3",IDC_CHECK3,"Button",BS_AUTOCHECKBOX | WS_CLIPSIBLINGS | WS_TABSTOP,127,137,44,11
PUSHBUTTON "Button3",IDC_BUTTON3,110,154,55,16,WS_CLIPSIBLINGS
EDITTEXT IDC_EDIT2,232,72,40,14,ES_AUTOHSCROLL|WS_CLIPSIBLINGS
CONTROL "",IDC_SLIDER1,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP | WS_CLIPSIBLINGS,220,106,69,15
CONTROL "Radio1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON|WS_CLIPSIBLINGS,21,136,38,10
CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_ARROWKEYS|WS_CLIPSIBLINGS,100,137,11,14
PUSHBUTTON "Button4",IDC_BUTTON4,17,149,50,14,WS_CLIPSIBLINGS
CONTROL "Check4",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP | WS_CLIPSIBLINGS,203,131,35,11
END
现在的问题是 - 如何解决这个问题?
【问题讨论】:
-
创建另一个具有黑色背景和 alpha 透明度的窗口,然后将其放置在主窗口上方。
-
将指向所有小部件的指针放入容器中。遍历容器,告诉每个小部件隐藏。屏幕将显示窗口背景颜色,而不是黑色。我现在在我的 GUI 应用程序中执行此操作(隐藏需要解锁的功能)。
-
@RemyLebeau,感谢您的回答!第二个窗口应该有什么样式?它应该是一个子窗口吗?重要的是,第二个窗口应该响应主程序窗口的最小化、最大化和移动。
-
从 Windows 8 开始,
WS_EX_LAYERED是 available for child controls。因此,您可以创建一个黑色半透明子窗口,它以 z 顺序位于其他控件之上。 -
@RemyLebeau,我已经更新了我的问题。你能评论吗?谢谢!
标签: c++ visual-studio winapi