如何单独处理子ListBox WndProc

How to handle child ListBox WndProc separately?

本文关键字:ListBox WndProc 理子 处理 何单独      更新时间:2023-10-16

我想在它自己的wndproc中为自己的透明项目处理所有ListBox消息,这些项目与MainWindow中显示的图像混合绘制。不幸的是,现在只有WM_PAINT、WM_ERASEBKGND和一些LB_*消息,而没有WM_DRAWTITEM进入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);

主窗口过程:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) 
    {
    case WM_CREATE:
        {
        g_hWndList = CreateWindowEx(0,
            _T("LISTBOX"), 
            NULL, 
            WS_CHILD | WS_VISIBLE | LBS_NOSEL | LBS_HASSTRINGS,
            10,     // Top X coord
            10,     // Top Y coord
            600,    // Width
            400,    // Height
            hWnd,
            NULL,
            g_hInst,
            NULL);
        _ASSERT(g_hWndList != NULL);
        defProcList = (WNDPROC)SetWindowLong(g_hWndList, GWL_WNDPROC, (LPARAM)(ListWndProc));
    }
}

列表框wndproc:

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

来自文档:

WM_DRAWTITEM消息

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

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