Как «разделить» длинный метод WndProc на несколько функций? - PullRequest
0 голосов
/ 28 ноября 2011

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

К сожалению, должен использовать только C и сырой Win32.

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static WNDPROC OldWndProc[BUTTON_COUNT];
    static HMENU menu;
    static windowSizeX, windowSizeY;
    //lots more static variables

    switch (message) 
    {
    case WM_SIZE:
        clientX = LOWORD(lParam);
        clientY = HIWORD(lParam);

        si.cbSize = sizeof(si);
        si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
        si.nMin = 0;
        si.nMax = 1500;
        si.nPage = clientY;
        si.nPos = 0;

        SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
        return 0;

        // more code
}

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Вы можете использовать Взломщики сообщений .

Как правило, оконная процедура будет обрабатывать много сообщений с кодом в процедуре для обработки каждого сообщения.Это часто приводит к тому, что исходный код для оконной процедуры продолжается для многих страниц.Когда приложение использует взломщики сообщений, почти любая оконная процедура может быть перечислена очень кратко.Большая часть кода передается функциям обработки сообщений, которые вызывают взломщики сообщений.

   LRESULT _export CALLBACK Template_WndProc(HWND hwnd, WORD msg,
                                             WPARAM wParam,
                                             LPARAM lParam)
   {
       switch (msg)
       {
       HANDLE_MSG(hwnd, WM_MOUSEMOVE, Template_OnMouseMove);
       HANDLE_MSG(hwnd, WM_LBUTTONDOWN, Template_OnLButtonDown);
       HANDLE_MSG(hwnd, WM_LBUTTONDBLCLK, Template_OnLButtonDown);
       HANDLE_MSG(hwnd, WM_LBUTTONUP, Template_OnLButtonUp);

       default:
           return Template_DefProc(hwnd, msg, wParam, lParam);
       }
   }
1 голос
/ 28 ноября 2011

Решение, как вы уже догадались, состоит в том, чтобы поместить код для обработки разных сообщений в разные функции. Вместо того, чтобы иметь массу статических переменных в вашем WndProc, вы должны сгруппировать связанные переменные в структуры. Тогда у вас может быть несколько глобальных структур (или статических при необходимости), которые вы передадите нужным функциям обработки сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...