手动替代消息映射?

时间:2010-02-05 20:42:42

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

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

我正在使用Visual Studio 6.0。我的工具集是相当不可协商的,因此请不要建议使用Java或任何未预装在Visual Studio中的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 个答案:

答案 0 :(得分:2)

曾几何时我做过这样的事情。我分配了一大堆控制ID(未在resource.h中使用)。向页面动态添加了带有这些ID的控件。

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

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