c++ - 手动替代消息映射?

标签 c++ c visual-c++ mfc winapi

我正在尝试创建一个 GUI 来显示从文件中读取的信息。所以我将需要一些按钮、文本字段和单选按钮 - 但直到运行时我才知道我需要多少。

我正在使用 Visual Studio 6.0。我的工具集是不容商量的,所以请不要建议使用 Java 或任何未预装在 Visual Studio 中的 C++ 工具包。我的问题是,我在网上找到的大部分教程都侧重于使用所见即所得编辑器——这需要预先了解需要哪些控件。

我找到了一个允许我手动添加控件的代码示例(以下摘录):

class CalcApp : public CWinApp
{
    ...
};

class CWindow : public CFrameWnd
{ 
    ...

    afx_msg void HandleButton2();
    afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );
    DECLARE_MESSAGE_MAP();
    virtual BOOL PreTranslateMessage(MSG* msg);
};

.cpp 文件:

BEGIN_MESSAGE_MAP( CWindow, CFrameWnd )

    ON_BN_CLICKED(IDC_BUTTON1, HandleButton1)
    ON_BN_CLICKED(IDC_BUTTON2, HandleButton2)

END_MESSAGE_MAP()

CWindow::CWindow()
{ 
    Create(NULL, "Title", 
            WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU, 
            CRect(CPoint(50,50),CSize(180,300))); 

    ...

    button2 = new CButton();
    button2 -> Create("&Quit",
            WS_CHILD|WS_VISIBLE|WS_TABSTOP,
            CRect(CPoint(2,202),CSize(152,38)),
            this, IDC_BUTTON2);
    }

    void CWindow::HandleButton2()
    {
        DestroyWindow ();
    }

    BOOL CalcApp::InitInstance()
    {
        m_pMainWnd = new CWindow();
        m_pMainWnd->ShowWindow(m_nCmdShow);
        m_pMainWnd->UpdateWindow();
        return TRUE;
    }

我无法弄清楚如何在不使用 BEGIN_MESSAGE_MAP() 等宏的情况下处理消息 - 同样,这需要预先知道您需要多少个处理程序。

我能找到的唯一解决方案如下所示:

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{
    ...
    WndClsEx.lpfnWndProc   = WndProc;

    RegisterClassEx(&WndClsEx);

    hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
                      ClsName,
                      WindowCaption,
                      WS_OVERLAPPEDWINDOW,
                      100,
                      120,
                      640,
                      480,
                      NULL,
                      NULL,
                      hInstance,
                      NULL);

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    while( GetMessage(&Msg, NULL, 0, 0) )
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

    return Msg.wParam;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch(Msg)
    {
    case WM_DESTROY:
        PostQuitMessage(WM_QUIT);
        break;
    default:
        return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
    return 0;
}

这很棒,除了..我没有 WinMain...

我的理解是,您可以执行“Win32”应用程序(上面的 WinMain 代码)或“MFC”应用程序(上面的 CButton 代码)。但是我只能找到MFC手动添加控件的例子,也只能找到Win32手动处理消息的例子。

你能指出我在这里遗漏的一件事吗?理想情况下,我想要一个使用 MFC 处理我自己的消息的解决方案,但我会选择一个关于使用 Win32 创建控件的好教程...

最佳答案

曾几何时,我做了这样的事情。我分配了大量控件 ID(未在 resource.h 中使用)。将具有这些 ID 的控件动态添加到页面。

为了处理事件,我接管了 Windows 上的 OnCommand 并监听了 ID 在我正在寻找的范围内的控件。

(我需要搜索旧代码才能更具体)

关于c++ - 手动替代消息映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2210279/

相关文章:

float 的 C printf 格式

c++ - C++ 成员函数中的 "if (!this)"有多糟糕?

.net - 如何将 System::String^ 转换为 std::string?

c++ - Qt变量重新赋值

c++ - 如何将用户定义的对象插入 STL 集中?

c - 如何在以下代码中的每个函数调用中阻止该值变为零?

c++ - Visual C++ 6.0 中的 cvblob 编译错误

c++ - 使用 C++ 删除旧文件

c++ - 什么是独立于操作系统的方式来打开 C++ 中关联程序的文件?

c - 仍然使用 TCP_NODELAY 发送一条消息