如何将长WndProc方法“拆分”为多个函数?

时间:2011-11-28 06:36:49

标签: c visual-studio-2010 winapi

是否有一种简单的方法可以将令人难以置信的长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 个答案:

答案 0 :(得分:2)

您可以使用Message Crackers

  

通常,窗口过程将处理许多消息,并在过程中使用代码来处理每条消息。这通常导致窗口过程的源代码继续进行许多页面。当应用程序使用消息破解程序时,几乎所有窗口过程都可以非常简洁地列出。大部分代码被转移到消息破解者调用的消息处理函数。

   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 :(得分:1)

正如您所猜测的,解决方案是将代码放入不同的函数中处理不同的消息。您应该将相关变量分组到结构中,而不是在WndProc中包含大量静态变量。然后,您可以将一些全局结构(或必要时静态)传递给需要它们的消息处理函数。