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中的弹出菜单从按钮单击处理程序不工作 //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

我已经写了上面的一段代码,在点击按钮时在屏幕上生成弹出菜单,但它根本没有显示任何菜单?我是否遗漏了什么

正如你所问的,这里是完整的代码。实际上,我已经通过GUI放置了一个静态按钮,点击按钮试图生成弹出菜单


这些按钮不是动态创建的。此外,这里的整个代码都是由向导生成的,除了关于按钮单击的最后一部分代码。

问题在于句柄,如果我使用正确的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);