Ручная альтернатива карте сообщений? - PullRequest
1 голос
/ 05 февраля 2010

Я пытаюсь создать графический интерфейс для отображения информации, прочитанной из файла. Поэтому мне понадобится некоторое количество кнопок, текстовых полей и переключателей - но я не буду знать, сколько мне нужно, до времени выполнения.

Я использую Visual Studio 6.0. Мой набор инструментов практически не подлежит обсуждению, поэтому, пожалуйста, воздержитесь от предложения Java или любого набора инструментов C ++, который предварительно не установлен в Visual Studio. Моя проблема в том, что большинство учебных пособий, которые я обнаружил в Интернете, фокусируются на использовании редактора 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 Ответ

2 голосов
/ 05 февраля 2010

Однажды я сделал что-то подобное. Я выделил ярость контрольных идентификаторов (не используется в resource.h). Динамически добавлены элементы управления с этими идентификаторами на страницу.

Чтобы обработать событие, я взял OnCommand в Windows и прослушал элементы управления с идентификаторами в диапазоне, который я искал.

(мне нужно найти старый код, чтобы быть более точным)

...