1

出于某些自定义原因,我正在尝试对组合框的列表框和编辑控件进行子类化。下面是代码工作。编辑控件的子类化工作完美,但列表框没有收到 MouseDown 的消息。

void Subclass(HWND hComboBox)
{
    HWND hEdit=FindWindowEx(hComboBox, NULL, WC_EDIT, NULL);
    HWND hCombo=FindWindowEx(hComboBox, NULL, WC_LISTBOX, NULL);
    SetProp(hEdit, TEXT("Wprc"), (HANDLE)GetWindowLongPtr(hEdit, GWL_WNDPROC));
    SubclassWindow(hEdit, ComboBox_Proc);
    SetProp(hCombo, TEXT("Wprc1"), (HANDLE)GetWindowLongPtr(hCombo, GWL_WNDPROC));
    SubclassWindow(hCombo, ComboBox_Proc1);
}


static LRESULT CALLBACK ComboBox_Proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

    switch(msg)
    {
        case WM_CHAR:
            break;
        case WM_KEYDOWN:
            break;
        case WM_DESTROY:
            SetWindowLongPtr(hwnd, GWLP_WNDPROC, (DWORD)GetProp(hwnd, TEXT("Wprc")));
            RemoveProp(hwnd, TEXT("Wprc"));
            break;
        default:
            return CallWindowProc((WNDPROC)GetProp(hwnd, TEXT("Wprc")), hwnd, msg, wParam, lParam);
    }
    return FALSE;
}

static LRESULT CALLBACK ComboBox_Proc1(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
    switch(msg)
    {
        case WM_LBUTTONDOWN:
          //PROBLEM IS HERE
            break;
        case WM_DESTROY: 
            SetWindowLongPtr(hwnd, GWLP_WNDPROC, (DWORD)GetProp(hwnd, TEXT("Wprc1")));
            RemoveProp(hwnd, TEXT("Wprc1"));
            break;
        default:
            return CallWindowProc((WNDPROC)GetProp(hwnd, TEXT("Wprc1")), hwnd, msg, wParam, lParam);
    }
    return FALSE;
}
4

2 回答 2

1

ComboBox 的 ListBox 部分是 COMBOLBOX 类型(带有 L)。

ComboLBox 窗口不是 ComboBox 窗口的子窗口。我发现子类 COMBOLBOX 控件的唯一方法如下。

在绘制列表框之前, Windows 将 WM_CTLCOLORLISTBOX 消息发送到 COMBOBOX(无 L)。此消息的 lParam 包含列表框的句柄。

 case  WM_CTLCOLORLISTBOX:
 {       
    if ( !hSubclassedListBox ) 
    { 
        hSubclassedListBox = (HWND)lParam; 
        SubclassWindow(hSubclassedListBox , MyLBProc);
    }
 }

另请参阅此链接以获取更多信息

于 2012-04-26T11:08:24.720 回答
1

对于那些使用 WINVER 设置为 0500 或更高版本(Windows XP 或更高版本)的 Visual Studio 的用户,您可以使用 GetComboBoxInfo 函数(将句柄传递给 ComboBox),它将(在 COMBOBOXINFO 结构中)将句柄返回给两个编辑框和组合框(ListBox)。然后可以使用句柄来获取它们所代表的 CWnd 派生对象。

于 2018-12-30T02:50:36.993 回答