Visual c++ MFC中的弹出菜单从按钮单击处理程序不工作 //CMFCApplication1Dlg对话框 CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd*pParent/*=NULL*/) :CDialogEx(CMFCApplication1Dlg::IDD,pParent) { m_hIcon=AfxGetApp()->加载图标(IDR_大型机); } 无效CMFCApplication1Dlg::DoDataExchange(CDATA Exchange*pDX) { CDialogEx::DoDataExchange(pDX); } 开始消息映射(CMFCApplication1Dlg、CDialogEx) 关于\u WM\u SYSCOMMAND() 关于油漆 关于_WM_QUERYDRAGICON() 单击时(IDC按钮1和CMFCApplication1Dlg::OnBnClickedButton1) 结束消息映射() //CMFCApplication1Dlg消息处理程序 BOOL CMFCApplication1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); //将“关于…”菜单项添加到系统菜单。 //IDM_ABOUTBOX必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX&0xFFF0)=IDM_ABOUTBOX); 断言(IDM_ABOUTBOXAppendMenu(MF_分隔符); pSysMenu->AppendMenu(MF_字符串、IDM_ABOUTBOX、strAboutMenu); } } //设置此对话框的图标。框架会自动执行此操作 //当应用程序的主窗口不是对话框时 SetIcon(m_hIcon,TRUE);//设置大图标 SetIcon(m_hIcon,FALSE);//设置小图标 //TODO:在此处添加额外的初始化 return TRUE;//除非将焦点设置为控件,否则返回TRUE } void CMFCApplication1Dlg::OnSysCommand(UINT-nID,LPARAM-LPARAM) { if((nID&0xFFF0)=IDM_ABOUTBOX) { 卡布特德尔加布特; dlgAbout.DoModal(); } 其他的 { CDialogEx::OnSysCommand(nID,lParam); } } //如果在对话框中添加最小化按钮,则需要以下代码 //来绘制图标。对于使用文档/视图模型的MFC应用程序, //这是框架自动为您完成的。 void CMFCApplication1Dlg::OnPaint() { if(IsIconic()) { CPaintDC(this);//用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND,reinterpret_cast(dc.GetSafeHdc()),0); //在客户端矩形中居中图标 int cxIcon=GetSystemMetrics(SM_cxIcon); int cycon=GetSystemMetrics(SM_cycon); 正确无误; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; int y=(rect.Height()-cycon+1)/2; //绘制图标 dc.DrawIcon(x,y,m_hIcon); } 其他的 { CDialogEx::OnPaint(); } } //系统调用此函数以获取用户拖动时要显示的光标 //最小化的窗口。 HCURSOR CMFCApplication1Dlg::OnQueryDragIcon() { 返回静态_cast(m_hIcon); } 作废CMFCApplication1Dlg::OnBnClickedButton1() { //模拟与产品相似的代码 CFrameWnd*pFrame=GetParentFrame(); CMenu弹出窗口; CreatePopupMenu(); LPCWSTR pszMenuItem2=L“韩语,带字母:기존 운"; AppendMenuW(popup.m_menu,MF_STRING,1,pszMenuItem2); TCHAR*pszMenuItem3=“| |不带wchar的韩语:또는 차량 삽입"; 附录菜单(popup.m_menu,MF_STRING,2,pszMenuItem3); UINT nCmd=弹出.跟踪弹出菜单(TPM_LEFTALIGN | TPM_Right Button | TPM_RETURNCMD, 14,20,pFrame,0); }
我已经写了上面的一段代码,在点击按钮时在屏幕上生成弹出菜单,但它根本没有显示任何菜单?我是否遗漏了什么 正如你所问的,这里是完整的代码。实际上,我已经通过GUI放置了一个静态按钮,点击按钮试图生成弹出菜单Visual c++ MFC中的弹出菜单从按钮单击处理程序不工作 //CMFCApplication1Dlg对话框 CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd*pParent/*=NULL*/) :CDialogEx(CMFCApplication1Dlg::IDD,pParent) { m_hIcon=AfxGetApp()->加载图标(IDR_大型机); } 无效CMFCApplication1Dlg::DoDataExchange(CDATA Exchange*pDX) { CDialogEx::DoDataExchange(pDX); } 开始消息映射(CMFCApplication1Dlg、CDialogEx) 关于\u WM\u SYSCOMMAND() 关于油漆 关于_WM_QUERYDRAGICON() 单击时(IDC按钮1和CMFCApplication1Dlg::OnBnClickedButton1) 结束消息映射() //CMFCApplication1Dlg消息处理程序 BOOL CMFCApplication1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); //将“关于…”菜单项添加到系统菜单。 //IDM_ABOUTBOX必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX&0xFFF0)=IDM_ABOUTBOX); 断言(IDM_ABOUTBOXAppendMenu(MF_分隔符); pSysMenu->AppendMenu(MF_字符串、IDM_ABOUTBOX、strAboutMenu); } } //设置此对话框的图标。框架会自动执行此操作 //当应用程序的主窗口不是对话框时 SetIcon(m_hIcon,TRUE);//设置大图标 SetIcon(m_hIcon,FALSE);//设置小图标 //TODO:在此处添加额外的初始化 return TRUE;//除非将焦点设置为控件,否则返回TRUE } void CMFCApplication1Dlg::OnSysCommand(UINT-nID,LPARAM-LPARAM) { if((nID&0xFFF0)=IDM_ABOUTBOX) { 卡布特德尔加布特; dlgAbout.DoModal(); } 其他的 { CDialogEx::OnSysCommand(nID,lParam); } } //如果在对话框中添加最小化按钮,则需要以下代码 //来绘制图标。对于使用文档/视图模型的MFC应用程序, //这是框架自动为您完成的。 void CMFCApplication1Dlg::OnPaint() { if(IsIconic()) { CPaintDC(this);//用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND,reinterpret_cast(dc.GetSafeHdc()),0); //在客户端矩形中居中图标 int cxIcon=GetSystemMetrics(SM_cxIcon); int cycon=GetSystemMetrics(SM_cycon); 正确无误; GetClientRect(&rect); intx=(rect.Width()-cxIcon+1)/2; int y=(rect.Height()-cycon+1)/2; //绘制图标 dc.DrawIcon(x,y,m_hIcon); } 其他的 { CDialogEx::OnPaint(); } } //系统调用此函数以获取用户拖动时要显示的光标 //最小化的窗口。 HCURSOR CMFCApplication1Dlg::OnQueryDragIcon() { 返回静态_cast(m_hIcon); } 作废CMFCApplication1Dlg::OnBnClickedButton1() { //模拟与产品相似的代码 CFrameWnd*pFrame=GetParentFrame(); CMenu弹出窗口; CreatePopupMenu(); LPCWSTR pszMenuItem2=L“韩语,带字母:기존 운"; AppendMenuW(popup.m_menu,MF_STRING,1,pszMenuItem2); TCHAR*pszMenuItem3=“| |不带wchar的韩语:또는 차량 삽입"; 附录菜单(popup.m_menu,MF_STRING,2,pszMenuItem3); UINT nCmd=弹出.跟踪弹出菜单(TPM_LEFTALIGN | TPM_Right Button | TPM_RETURNCMD, 14,20,pFrame,0); },visual-c++,mfc,popupmenu,Visual C++,Mfc,Popupmenu,我已经写了上面的一段代码,在点击按钮时在屏幕上生成弹出菜单,但它根本没有显示任何菜单?我是否遗漏了什么 正如你所问的,这里是完整的代码。实际上,我已经通过GUI放置了一个静态按钮,点击按钮试图生成弹出菜单 这些按钮不是动态创建的。此外,这里的整个代码都是由向导生成的,除了关于按钮单击的最后一部分代码。问题在于句柄,如果我使用正确的API获取句柄,它将显示弹出菜单。 这是更新后的代码 // CMFCApplication1Dlg dialog CMFCApplication1Dlg::CMFCAp
这些按钮不是动态创建的。此外,这里的整个代码都是由向导生成的,除了关于按钮单击的最后一部分代码。问题在于句柄,如果我使用正确的API获取句柄,它将显示弹出菜单。 这是更新后的代码
// CMFCApplication1Dlg dialog
CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMFCApplication1Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication1Dlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// CMFCApplication1Dlg message handlers
BOOL CMFCApplication1Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CMFCApplication1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMFCApplication1Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMFCApplication1Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMFCApplication1Dlg::OnBnClickedButton1()
{
//Simulating the similar code as product
CFrameWnd *pFrame = GetParentFrame();
CMenu popup;
popup.CreatePopupMenu();
LPCWSTR pszMenuItem2 = L"Korean with wchar_t: 기존 운";
AppendMenuW(popup.m_hMenu, MF_STRING, 1, pszMenuItem2);
TCHAR* pszMenuItem3 = "|| Korean without wchar_t: 또는 차량 삽입";
AppendMenu(popup.m_hMenu, MF_STRING, 2, pszMenuItem3);
UINT nCmd = popup.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,
14, 20, pFrame, 0);
}
作废CMFCApplication1Dlg::OnBnClickedButton1()
{
//模拟与产品相似的代码
HWND wnd=GetSafeHwnd();//您是否在显示菜单并跟踪进度的事件处理程序中放置了断点。我们不知道您将此代码放在哪个事件/消息中。@AndrewTruckle,对不起,我在帖子中更新了代码。请选中“好”。如前所述,在该处理程序中放置断点并对其进行调试。如果您不知道如何执行此操作,请轻松了解调试。您需要查看您使用的句柄是否为NULL。我之所以这样说是因为您使用的是对话应用程序,而我从未使用过GetParentFrame(用于单文档/多文档界面应用程序)。我通常使用GetSafeHWnd().Thank you@AndrewTruckle.你说得对。句柄是问题。如果我使用GetSafeHWnd,它会显示弹出菜单。再次感谢您,将积分归您:)而不是
CWnd::FromHandle(wnd)
您可以只使用这个
@MarkRansom我所面临的实际问题,在我的示例项目中,它显示了带有韩语字符的弹出菜单的文本字符串(기존 운) 但在我公司的项目中,使用相同的代码,它将所有韩语字符替换为“?”(问号),并显示(“?”)。当我获得菜单的文本字符串时,它在TrackPopupMenu()之后被更改为“?”这可能意味着您的公司项目是在Ansi模式而不是Unicode模式下构建的。虽然如果更改父窗口会改变一些事情,但这意味着一种混合模式,如果不经过特殊的扭曲,很难获得这种模式。
void CMFCApplication1Dlg::OnBnClickedButton1()
{
//Simulating the similar code as product
HWND wnd= GetSafeHwnd();//<---- this had to change
CMenu popup;
popup.CreatePopupMenu();
LPCWSTR pszMenuItem2 = L"Korean with wchar_t: 기존 운";
AppendMenuW(popup.m_hMenu, MF_STRING, 1, pszMenuItem2);
TCHAR* pszMenuItem3 = "|| Korean without wchar_t: 또는 차량 삽입";
AppendMenu(popup.m_hMenu, MF_STRING, 2, pszMenuItem3);
UINT nCmd = popup.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,
14, 20, CWnd::FromHandle(wnd)/*need this api to get the CWnd from HWND*/, 0);