代码之家  ›  专栏  ›  技术社区  ›  Rini

手动替代消息映射?

  •  1
  • Rini  · 技术社区  · 16 年前

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

    我正在使用Visual Studio 6.0。我的工具集是相当不可协商的,所以请不要建议Java或任何在VisualStudio中不预先安装的C++工具包。我的问题是,我在网上找到的大部分教程都集中在使用Wysiwyg编辑器上——这需要事先知道需要什么控件。

    我找到了一个代码示例,它允许我手动添加控件(下面的练习):

    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创建控件的好教程…

    1 回复  |  直到 16 年前
        1
  •  2
  •   Arve    16 年前

    从前我做过这样的事。我分配了一系列控制ID(不在resource.h中使用)。将具有这些ID的控件动态添加到页面。

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

    (我需要搜索旧代码以便更具体)