在我发送TB_DELETEBUTTON消息以删除系统托盘工具栏中的(外部应用程序的)按钮之后,该按钮仍为该删除按钮的空白/空矩形,并且该工具栏也没有删除该空白矩形,直到我在其他图标上单击鼠标左键或右键,然后终于重新绘制了工具栏窗口,并且删除的按钮上的空白矩形消失了。
这是我要避免的美学问题。发送TB_DELETEBUTTON消息后,我只是想以编程方式更新/重画工具栏窗口,但是在调用UpdateWindow,UpdateLayeredWindow或RedrawWindow之后,已删除按钮的空白矩形仍然保留在那里。
我尝试与 RedrawWindow 一起使用的标志联合是:RDW_FRAME,RDW_ALLCHILDREN,RDW_UPDATENOW和RDW_INVALIDATE一起。
我要传递给这些函数的窗口句柄是类名称为“ ToolbarWindow32”的窗口(位于其上的应用程序的系统托盘按钮/图标),可以找到获取此窗口句柄的示例。 here。
我的问题是:如何正确更新/重绘此窗口?
答案 0 :(得分:0)
调用InvalidateRect函数后,我注意到通知区域窗口已重绘(因为该窗口轻弹了一会儿),因此重绘该窗口似乎不是解决此问题的有效解决方案...
但是,在下一个线程中,我找到了一个解决方案:
问题是,为了“适当地”刷新通知区域的大小以删除以前删除的按钮中的任何空白,我只需要通过{发送WM_LBUTTONDOWN和WM_LBUTTONUP消息{3}}功能。
这些窗口消息必须按照以下顺序发送两次(至少对于Windows 10是)到 ToolbarWindow32 窗口:WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUTTONUP。这是为了重现系统托盘内第一个按钮中的两次单击(而不是双击),这是在应用此自动化解决方案之前我需要手动执行的操作。发送消息后,窗口将正确变为“自动调整大小”。
唯一的美学问题是,如果第一个按钮是应用程序中的按钮,则在单击该按钮时会执行一些不希望的动作,但这并不常见。通常,用户只能双击以从系统托盘上的按钮还原窗口,或者右键单击以打开其上下文菜单,但是单击按钮不会发生任何事情...如果开发人员没有编程任何事情发生。
请注意,当存在包含“隐藏”按钮的向上箭头时,此方法也适用。