C++ 如何单独处理子列表框WndProc?

C++ 如何单独处理子列表框WndProc?,c++,c,winapi,C++,C,Winapi,我想在它自己的wndproc中处理所有ListBox消息,以便为自己的透明项目绘制混合在主窗口中显示的图像。不幸的是,现在只有WM_PAINT、WM_ERASEBKGND和一些LB_*消息以及没有WM_DRAWITEM出现在ListWndProc中 代码是: #include <windows.h> bool InitInstance(HINSTANCE hInstance, int nCmdShow) { wc.style = CS_HREDRAW | C

我想在它自己的wndproc中处理所有ListBox消息,以便为自己的透明项目绘制混合在主窗口中显示的图像。不幸的是,现在只有WM_PAINT、WM_ERASEBKGND和一些LB_*消息以及没有WM_DRAWITEM出现在
ListWndProc

代码是:

#include <windows.h>

bool InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_UPDATER));
    wc.hCursor       = 0;
    //wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
    wc.hbrBackground = CreatePatternBrush(LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1)));
    wc.lpszMenuName  = 0;
    wc.lpszClassName = szWindowClass;

if(!RegisterClass(&wc)) { return FALSE; }

// MainWindow
g_hWndMain = CreateWindowEx(WS_EX_NOANIMATION, 
    szWindowClass, 
    szTitle, 
    WS_VISIBLE,
    CW_USEDEFAULT, 
    CW_USEDEFAULT, 
    CW_USEDEFAULT, 
    CW_USEDEFAULT, 
    NULL, 
    NULL, 
    hInstance, 
    NULL);

_ASSERT(g_hWndMain != NULL);

if (!g_hWndMain) { return FALSE; }

ShowWindow(g_hWndMain, nCmdShow);
UpdateWindow(g_hWndMain);
列表框wndproc:

LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    case WM_ERASEBKGND:
    {
        return TRUE;
    }

    case WM_DRAWITEM:
    {
    }
    break;
}
发件人:

WM\U DRAWITEM消息

当按钮、组合框、列表框或菜单的外观发生更改时,发送到所有者绘制的按钮、组合框、列表框或菜单的父窗口


列表框不应该收到该消息,即使所有者已绘制。它的父窗口,即主窗口,可以获取它们,这样您就不必对列表框进行子类化。

它被发送到父窗口,因为列表框本身不知道如何自定义绘制项目。所以不要将其子类化。
LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    case WM_ERASEBKGND:
    {
        return TRUE;
    }

    case WM_DRAWITEM:
    {
    }
    break;
}