我重载了CMainFrame的WindowProc函数,可菜单不见了,怎么办?

ghost79 2004-08-10 09:23:42
应该是哪个消息啊,另外这个生成菜单的消息映射函数该怎么写,谢谢!
...全文
145 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zjz800800 2004-08-11
楼住,你怎么重载的贴出来看看
回复
nanfeng231 2004-08-10
先回家吃饭了,晚上看
回复
ghost79 2004-08-10
这样写的:
本身这段代码是别人的,他另外设计了一个类:CSkinWin,好像用了一个钩子函数和框架窗口挂接了。
LRESULT CSkinWin::WindowProc(UINT msg, WPARAM wp, LPARAM lp)
{
if ( !IsWindow(m_hWnd) )
return 0;
if ( !m_bInit )
return Default();

switch ( msg )
{
case WM_SHOWWINDOW:
//call setwindowpos to force OnNcCalcSize when hWnd is a dialog
if ( wp )
SetWindowPos( m_hWnd, 0, 0, 0, 400, 400, SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED );
Default();
return 0;
break;
//case WM_ERASEBKGND:
case WM_INITMENUPOPUP:
Default();
return 0;
case WM_SYSCOMMAND:
OnSysCommand( wp, lp );
//Default();
return 0;
case WM_SETTEXT:
return OnSetText( wp, lp );
case WM_NCPAINT:
OnNcPaint( (HRGN)wp );
return 0;
case WM_NCCALCSIZE:
OnNcCalcSize( (BOOL)wp, (NCCALCSIZE_PARAMS *)lp );
return 0;
case WM_SIZE:
OnSize( wp, LOWORD(lp), HIWORD(lp) );
return 0;
case WM_NCACTIVATE:
return OnNcActivate( (BOOL)wp );
case WM_NCHITTEST:
return OnNcHitTest(CPoint(LOWORD(lp), HIWORD(lp)));
case WM_NCLBUTTONUP:
OnNcLButtonUp(wp, CPoint(LOWORD(lp), HIWORD(lp)));
return 0;
case WM_NCLBUTTONDOWN:
OnNcLButtonDown(wp, CPoint(LOWORD(lp), HIWORD(lp)));
return 0;
case WM_NCLBUTTONDBLCLK:
OnNcLButtonDblClk(wp, CPoint(LOWORD(lp), HIWORD(lp)));
return 0;
case WM_NCRBUTTONUP:
OnNcRButtonUp(wp, CPoint(LOWORD(lp), HIWORD(lp)));
return 0;
case WM_NCRBUTTONDOWN:
OnNcRButtonDown(wp, CPoint(LOWORD(lp), HIWORD(lp)));
return 0;
case WM_NCMOUSEMOVE:
OnNcMouseMove( wp,CPoint(LOWORD(lp), HIWORD(lp)));
return 0;
case WM_GETMINMAXINFO:
OnGetMinMaxInfo( (MINMAXINFO *)lp );
return 0;
case WM_WINDOWPOSCHANGING:
OnWindowPosChanging((WINDOWPOS *)lp);
return 0;
case WM_SIZING:
OnSizing( wp, (LPRECT)lp );
return 0;
case WM_ACTIVATE:
OnActivate( wp, CWnd::FromHandle((HWND)lp), 0 );
return 0;
case WM_COMMAND:
if ( !HandleSysCommand( wp, lp ) )
Default();
return 0;
default:
return Default();
}
}
回复
nanfeng231 2004-08-10
我看过 highersong发的帖子,你看看吧

M F C依次调用下面的函数,指引输入消息到处理函数。
1) AfxWndProc( )接收消息,寻找消息所属的C W n d对象,然后调用AfxCallWndProc( )。
2) AfxCallWndProc( )存储消息(消息标识符和参数)供未来参考,然后调用WindowProc( )。
3) WindowProc( ) 发送消息给OnWndMsg( ) ,然后,如果消息未被处理,则发送给
D e f Windowproc( )。
4) OnWndMsg( )要么为W M _ C O M M A N D消息调用OnCommand( ),要么为W M _ N O T I F Y
消息调用OnNotify( )。任何被遗漏的消息都将是一个窗口消息。OnWndMsg( )搜索类的消息
映像,以找到一个能处理任何窗口消息的处理函数。如果O n W n d M s g ( )不能找到这样的处理函
数,则把消息返回到WindowProc( ),由它将消息发送给D e f WindowProc( )。
5) OnCommand( )查看这是不是一个控件通知( l P a r a m不是N U L L );如果它是,
OnCommand( )就试图将消息映射到制造通知的控件;如果它不是一个控件通知,或者控件拒
绝映射的消息,OnCommand( )就调用OnCmdMsg( )。
6) OnNotify( )也试图将消息映射到制造通知的控件;如果映射不成功, OnNotify( )就调
用相同的OnCmdMsg( )函数。
7) 根据接收消息的类,OnCmdMsg( )将在一个称为命令传递(Command Routing)的过程中
潜在地传递命令消息和控件通知。例如,如果拥有该窗口的类是一个框架类,则命令和通知
消息也被传递到视图和文档类,并为该类寻找一个消息处理函数。
WindowProc( )的原型函数为:
L R E S U LT WindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam);
WindowProc( )接着调用OnWndMsg( ),它试图在类中为该消息寻找一个处理函数;任何
返回到WindowProc( )的未被处理的消息都被传输到D e f WindowProc( );D e f WindowProc( )是
所有未被处理的消息的贮藏所。
回复
zhang_zhibin 2004-08-10
重载,
你调用基类的函数了吗?
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-08-10 09:23
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……