ComboBox子类化列表框

时间:2012-04-26 09:29:21

标签: c++ subclass common-controls

我正在尝试将Listbox和Combobox的编辑控件子类化,这是出于某些原因。下面是代码工作。编辑控件的子类化工作正常,但Listbox没有得到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;
}

2 个答案:

答案 0 :(得分: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);
    }
 }

此外,请参阅此link了解更多信息

答案 1 :(得分:1)

对于使用WINVER设置为0500或更高版本(Windows XP或更高版本)的Visual Studio的用户,可以使用GetComboBoxInfo函数(将句柄传递给ComboBox),该函数将返回(以COMBOBOXINFO结构)句柄到“编辑”框和ComboLBox(列表框)。然后可以使用这些句柄获取它们表示的CWnd派生的对象。