未引用参数,添加任务栏命令及其它
2006-07-20 11:40:57 来源:WEB开发网你可以调用 ::GetSystemMenu 来获得此系统菜单,然后可以添加、删除或修改菜单项。你甚至可以通过关掉 WS_SYSMENU 窗口创建式样标志或 PreCreateWindow 虚函数来完全屏蔽掉这个系统菜单。但不论你做什么,当用户右键单击任务栏上应用程序的最小化按钮时,这个系统菜单还是会显示出来的。
到了 Monicque 的问题:如果在系统菜单中添加自己的命令,MFC 是如何处理它们的呢?如果按常规来做 ——在某个地方写一个 ON_COMMAND 处理器并将它加到消息映射中,你会发现你的处理器不起作用,怎么会这样呢?
那是因为 Windows 和 MFC 处理系统命令的方式与处理普通菜单命令的方式不一样。当用户调用窗体中的常规菜单命令或按钮时,Windows 向主窗口发送一个 WM_COMMAND 消息。如果你使用 MFC,那么其命令路由机制将捕获此消息并通过操作系统将它路由到该命令的 ON_COMMAND 命令处理器对象。(有关 MFC 命令处理机制的详细内容,参见我在 MSJ 1995年7月发表的文章:“Meandering Through the Maze of MFC Message and Command Routing”)。
然而系统命令不属于 WM_COMMAND 消息范围。而属于另外一个叫做——WM_SYSCOMMAND 的消息。不论命令ID是真正的系统命令如 SC_MINIMIZE 和 SC_CLOSE,还是你自己添加的其它命令ID都是如此。为了处理系统菜单命令,你必须处理显式处理 WM_SYSCOMMAND 并且要选择你自己的命令 IDs。这就需要你在主窗口消息映射中添加ON_WM_SYSCOMMAND,它有一个处理函数如下:CMainFrame::OnSysCommand(UINT nID, LPARAM lp)
{
if (nID==ID_MY_COMMAND) {
... // 处理它
return 0;
}
// 传递到基类:这一步很重要!
return CFrameWnd::OnSysCommand(nID, lp);
}
如果该命令不是你的,不要忘了将它传递到你的基类处理——典型地,那就是 CFrameWnd 或 CMDIFrameWnd。否则,Windows 将无法得到此消息,并且会破坏内建的命令。
更多精彩
赞助商链接