我在开发菜单控件时,用API "SetMenu" 给主窗体动态添加菜单,在窗体失去焦点时,菜单会消失,最后不得已,只好拦截主窗口的消息WM_PAINT,再进行一次"SetMenu",重新加载菜单,但会出现明显的窗口抖动,不知那位高手能帮我解决? 代码片段: ... Case WM_PAINT if GetMenu(frmMain.hwnd)=0 then SetMenu(frmMain.hwnd,hMenu) ...
回复人:Chice_wxg(我怕谁?我是谁!我是流氓我最贼。) (五级(中级)) 信誉:97 2002-2-18 19:40:32 得分: 20 删除
你试试 BOOL DrawMenuBar( HWND hWnd // handle to window with menu bar to redraw ); 不过这种代码我没写过。仅供参考。呵呵
回复人:luoxiangdong(罗向东) (一级(初级)) 信誉:95 2002-2-18 19:53:41 得分: 0 删除
当失去焦点时,GetMenu(frmMain.hwnd)=0 ,窗口的菜单已经不存在了?!? DrawMenuBar 恐怕不行吧?
回复人:Chice_wxg(我怕谁?我是谁!我是流氓我最贼。) (五级(中级)) 信誉:97 2002-2-18 20:44:50 得分: 0 删除
那我更不清楚了。 不知道VB菜单是怎么管理的。
回复人:luoxiangdong(罗向东) (一级(初级)) 信誉:95 2002-2-19 18:24:05 得分: 0 删除
今日细细查看MSDN,在实践中又发现,如果先用VB的“菜单编辑器”编辑菜单,则在窗体失去焦点时,我定义的菜单会还原为用VB的“菜单编辑器”编辑的菜单。 估计VB是把“菜单编辑器”编辑的菜单作为其窗体的WindowClass的菜单,要改变为自定菜单,必须该掉WindowClass中定义的菜单,但我发现WindowClass中的菜单参数是用资源中的菜单名称字符串表示的,想必VB是用内置菜单资源实现的,但怎样用自己的菜单(只知道菜单的hWnd)替换内置资源中的菜单,我没办法了!!
8 个解决方案
#1
我想到一个办法:
先GetClassInfo取得当前的WNDCLASS
然后把其中的lpszMenuName改掉。
然后再重新RegisterClass就应该可以了。
#2
我也这样想了,但是我只有自定菜单的句柄,怎样得到lpszMenuName?
#3
我也不知道,我只是想到了这里而已。
#4
今天我用一个办法解决了以上问题,首先给窗体添加任意菜单,再在用以下语句:
...
Case WM_PAINT
if GetMenu(frmMain.hwnd)<>hMenu then
DestoryMenu(GetMenu(frmMain.hwnd))
SetMenu(frmMain.hwnd,hMenu)
...
只是需要另外添加菜单,实在是笨办法。
不知这个过程有没有办法在程序运行时由菜单控件动态进行?
...
Case WM_PAINT
if GetMenu(frmMain.hwnd)<>hMenu then
DestoryMenu(GetMenu(frmMain.hwnd))
SetMenu(frmMain.hwnd,hMenu)
...
只是需要另外添加菜单,实在是笨办法。
不知这个过程有没有办法在程序运行时由菜单控件动态进行?
#5
菜单控件并不是控件,仅是预解释(相对于VC的预编译)代码。
#6
菜单不是控件呀!
这样写就不错了。
这样写就不错了。
#7
有没有办法在程序运行时由动态对一个本没有菜单的VB窗体添加菜单?
我用SetMenu添加成功,但窗体重画时消失了?
我用SetMenu添加成功,但窗体重画时消失了?
#8
可能是与windows的缺省窗口过程有关。
#1
我想到一个办法:
先GetClassInfo取得当前的WNDCLASS
然后把其中的lpszMenuName改掉。
然后再重新RegisterClass就应该可以了。
#2
我也这样想了,但是我只有自定菜单的句柄,怎样得到lpszMenuName?
#3
我也不知道,我只是想到了这里而已。
#4
今天我用一个办法解决了以上问题,首先给窗体添加任意菜单,再在用以下语句:
...
Case WM_PAINT
if GetMenu(frmMain.hwnd)<>hMenu then
DestoryMenu(GetMenu(frmMain.hwnd))
SetMenu(frmMain.hwnd,hMenu)
...
只是需要另外添加菜单,实在是笨办法。
不知这个过程有没有办法在程序运行时由菜单控件动态进行?
...
Case WM_PAINT
if GetMenu(frmMain.hwnd)<>hMenu then
DestoryMenu(GetMenu(frmMain.hwnd))
SetMenu(frmMain.hwnd,hMenu)
...
只是需要另外添加菜单,实在是笨办法。
不知这个过程有没有办法在程序运行时由菜单控件动态进行?
#5
菜单控件并不是控件,仅是预解释(相对于VC的预编译)代码。
#6
菜单不是控件呀!
这样写就不错了。
这样写就不错了。
#7
有没有办法在程序运行时由动态对一个本没有菜单的VB窗体添加菜单?
我用SetMenu添加成功,但窗体重画时消失了?
我用SetMenu添加成功,但窗体重画时消失了?
#8
可能是与windows的缺省窗口过程有关。