MFC正在将项添加到系统菜单
MFC adding item to system menu
我在一个基于拨号的应用程序中向系统菜单添加了一个项目,该项目显示在菜单中,但当我单击它时,什么也没发生。这是代码:
#define IDM_CLIP 17
BOOL CCalculatorControlDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
CString strClip;
strClip.LoadString(IDS_CLIPBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
pSysMenu->AppendMenu(MF_STRING, IDM_CLIP, strClip);
}
}
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
m_Calculator1.SetNumFormat("%0.2f");
LOGFONT lf;
m_Calculator1.GetResultWndFont(&lf);
strcpy(lf.lfFaceName, "Brittanic Bold");
m_Calculator1.SetResultsWndFont(&lf);
m_Calculator1.GetButtonFont(&lf);
strcpy(lf.lfFaceName, "Tahoma");
m_Calculator1.SetButtonFont(&lf);
m_Calculator1.SetResultsWndBkClr(RGB(128,128,128));
m_Calculator1.SetResultsWndTxtClr(RGB(255,255,255));
return FALSE;
}
void CCalculatorControlDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else if((nID & 0xFFF0) == IDM_CLIP)
{
m_Calculator1.OnEditCopy();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
"关于"对话框是由框架自动添加的,我添加了IDM_CLIP。m_Calculator1.OnEditCopy()是我的CCalculatorCtrl类中的函数,它正在将文本复制到剪贴板。我还在CalculatorControlDlg.cpp文件中包含了CCalculatorCtrl.h文件,我在其中编辑系统菜单。这是OnEditCopy方法,btw使用按钮控件。。。
这是我在CCalculatorControlDlg类中调用的方法。
void CCalculatorCtrl::OnEditCopy()
{
if ( !OpenClipboard() )
{
AfxMessageBox( _T("Cannot open the Clipboard") );
return;
}
// Remove the current Clipboard contents
if( !EmptyClipboard() )
{
AfxMessageBox( _T("Cannot empty the Clipboard") );
return;
}
// Get the currently selected data
HGLOBAL hGlob = GlobalAlloc(GMEM_FIXED, 64);
strcpy_s((char*)hGlob, 64, m_strCurrentEntry);
// For the appropriate data formats...
if ( ::SetClipboardData( CF_TEXT, hGlob ) == NULL )
{
CString msg;
msg.Format(_T("Unable to set Clipboard data, error: %d"), GetLastError());
AfxMessageBox( msg );
CloseClipboard();
GlobalFree(hGlob);
return;
}
AfxMessageBox( _T("Copy to clipboard successful!"));
CloseClipboard();
}
我希望我可以理解。。。提前谢谢。
在方法中
void CCalculatorControlDlg::OnSysCommand(UINT nID, LPARAM lParam)
线路
else if((nID & 0xFFF0) == IDM_CLIP)
不可能是对的,您正在将0x11(十六进制表示17)屏蔽为0xfff0。结果是16。
(nID&0xFFF0)从来不是IDM_CLIP的值17。
使用另一个id作为IDM_CLIP。
根据代码,应该很明显发生了什么;请记住,17
是0x11
问题是,当你做(nID & 0xFFF0)
时,结果是0x0011 & 0xFFF0
,产生:0x0010
。
因此,解决方案是将IDM_CLIP
固定为具有适当的值。正如你所看到的,它不可能只是任何东西。在CWnd::OnSysCommand
上的MSDN页面上写道:"在WM_SYSCOMMAND
消息中,nID
参数的四个低位由Windows内部使用。当应用程序测试nID
的值时,它必须使用逐位AND运算符将值0xFFF0与nID
组合,以获得正确的结果。"
基于应该显而易见的是,您选择的值不应该设置任何低4位。
相关文章:
- C++,系统无法执行指定的程序
- 在UNIX系统中使用DIR查找文件的字节大小
- 无法获取菜单选择以运行函数.C++
- 如何在OpenGL菜单系统中实现文本的智能渲染
- 将WM_CHANGEUISTATE发送到窗口应用程序后,当用鼠标访问菜单时,助记符不会显示在系统菜单上
- 当我最大化子窗口时,系统菜单消失
- 如何将系统图标放在菜单中
- 系统托盘上下文菜单空白
- 使用本机C 包装器作为NCurses,如何创建菜单/子菜单系统
- TrackPopupMenu 显示的系统菜单与窗口状态不匹配
- 更换Windows上的系统菜单弹出窗口
- 右键单击系统托盘图标,然后单击C 中的上下文菜单
- 如何在Qt中获取文件系统操作的上下文菜单
- 对系统菜单进行子类划分
- OOP游戏菜单系统开发概念
- Delphi XE-无法从系统菜单中删除项目
- MFC正在将项添加到系统菜单
- C++菜单类系统结构:渲染顺序,变量类函数
- 为菜单系统实现lua回调
- 面向对象菜单系统