2012-04-26 8 views
1

いくつかのカスタマイズの理由から、リストボックスとコンボボックスの編集コントロールをサブクラス化しようとしています。以下はコードの作業です。編集コントロールのサブクラス化は完璧に機能していますが、リストボックスはMouseDownのメッセンジャーを取得していません。ComboBox Subboxing Listbox

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; 
} 

答えて

1

コンボボックスのリストボックス部分は型COMBOLBOX(Lと)です。

ComboLBoxウィンドウは、ComboBoxウィンドウの子ではありません。 COMBOLBOXコントロールのサブクラスを見つけた唯一の方法は次のとおりです。

Windowsは、リストボックスが描画される前に、COMBOX(はL)にWM_CTLCOLORLISTBOXメッセージを送信します。このメッセージのlParamには、リストボックスのハンドルが含まれています。

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

Alsoo詳しく

ため、このlinkを見ます