谁知道VB是这样管理菜单系统的,怎样改变窗体WindowClass的默认菜单?

时间:2022-08-30 20:57:00

我在开发菜单控件时,用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)
...

只是需要另外添加菜单,实在是笨办法。
不知这个过程有没有办法在程序运行时由菜单控件动态进行?

#5


菜单控件并不是控件,仅是预解释(相对于VC的预编译)代码。

#6


菜单不是控件呀!
这样写就不错了。

#7


有没有办法在程序运行时由动态对一个本没有菜单的VB窗体添加菜单?

我用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)
...

只是需要另外添加菜单,实在是笨办法。
不知这个过程有没有办法在程序运行时由菜单控件动态进行?

#5


菜单控件并不是控件,仅是预解释(相对于VC的预编译)代码。

#6


菜单不是控件呀!
这样写就不错了。

#7


有没有办法在程序运行时由动态对一个本没有菜单的VB窗体添加菜单?

我用SetMenu添加成功,但窗体重画时消失了?

#8


可能是与windows的缺省窗口过程有关。