代码非常简单,往系统菜单里添加自定义菜单,使用ON_UPDATE_COMMAND_UI_RANGE来SetCheck,
可是没有打勾的效果,看看是哪里出了问题?谢谢……
sysMenuDemo.h
#pragma once
#define IDM_RECT 16
#define IDM_CIRCLE 17class CMyApp : public CWinApp {
virtual BOOL InitInstance();
};class CMainWindow : public CWnd {
public:
CMainWindow();
protected:
int nShape;
void PostNcDestroy();
int OnCreate(LPCREATESTRUCT lpCreateStruct);
void OnPaint();
void OnSysCommand(UINT nID, LPARAM lParam);
void OnUpdateShape(CCmdUI* pCmdUI);
DECLARE_MESSAGE_MAP()
};sysMenuDemo.cpp
#include <afxwin.h>
#include "sysMenuDemo.h"CMyApp myApp;BOOL CMyApp::InitInstance() {
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}BEGIN_MESSAGE_MAP(CMainWindow, CWnd)
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_SYSCOMMAND()
ON_UPDATE_COMMAND_UI_RANGE(IDM_RECT, IDM_CIRCLE, OnUpdateShape)
END_MESSAGE_MAP()CMainWindow::CMainWindow() {
CString strWndClass = AfxRegisterWndClass(0,
AfxGetApp()->LoadStandardCursor(IDC_ARROW),
(HBRUSH)(COLOR_WINDOW + 1),
AfxGetApp()->LoadStandardIcon(IDI_WINLOGO));
CreateEx(0,
strWndClass,
_T("玩玩系统菜单"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL);
}int CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if(CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
CMenu* pSysMenu = GetSystemMenu(FALSE);
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_RECT, _T("矩形"));
pSysMenu->AppendMenu(MF_STRING, IDM_CIRCLE, _T("圆形"));
return 0;
}void CMainWindow::OnSysCommand(UINT nID, LPARAM lParam) {
switch(nID) {
case IDM_RECT:
nShape = IDM_RECT;
Invalidate();
break;
case IDM_CIRCLE:
nShape = IDM_CIRCLE;
Invalidate();
break;
default:
CWnd::OnSysCommand(nID, lParam);
break;
}
}void CMainWindow::OnPaint() {
CPaintDC dc(this);
CBrush brush;
brush.CreateSolidBrush(RGB(255, 255, 0));
CBrush* pOldBrush = dc.SelectObject(&brush);
CRect rcShape;
GetClientRect(&rcShape);
switch(nShape) {
case IDM_RECT:
dc.Rectangle(&rcShape);
break;
case IDM_CIRCLE:
dc.Ellipse(&rcShape);
break;
default:
break;
}
dc.SelectObject(pOldBrush);
}void CMainWindow::PostNcDestroy() {
delete this;
}void CMainWindow::OnUpdateShape(CCmdUI* pCmdUI) {
pCmdUI->SetCheck(pCmdUI->m_nID == nShape);
}
运行没有问题,就是SetCheck没有效果,怎么回事?

解决方案 »

  1.   

    感觉你这样写有逻辑问题:你是菜单子项有两个:矩形、圆形,你无非是想选择一个后并将这个菜单勾选。选择另一个子项,这个勾选。它们是对应使用的:
    OnShape(CCmdUI* pCmdUI)//比方它是举行的消息
    {}OnUpdateShape(CCmdUI* pCmdUI)
    {
         pCmdUI->SetCheck(TRUE);
    }你这个:pCmdUI->SetCheck(pCmdUI->m_nID == nShape);
    m_nID 与 nShape有必然的联系吗?pCmdUI->m_nID == nShape肯定永远为FALSE;不信你设个断点试下,我估计进都不会进去!除非是巧合,这两个值相同.
      

  2.   

    OnShape()//比方它是举行的消息       刚刚参数是对于的{ } 
      

  3.   

    我以为没有人会回答我的帖子了呢……我的想法很简单,nShape用来标志是矩形还是圆形,使用ON_UPDATE_COMMAND_UI_RANGE来进行“打勾”更新,
    只有它的ID等于nShape才打勾,你这里设置“TRUE”同样没有打勾效果……但是如果我从CFrameWnd派生时,一切又正常了,怎么回事?