2011-01-10 3 views

答えて

2

「コントロールの変更を無効にするにはどうすればいいですか」という意味の場合は、CComboBoxでEnableWindowメソッドを呼び出してください。

しかし、実際にキーボードメッセージがコントロールにぶつからないようにブロックしたい場合は、window subclassingを使用してキーボードメッセージを呑み込んでください。 (「ウィンドウ・サブクラス化」という用語をC++クラスと混同しないでください。同じことではありません)。基本的には、コンボボックスに関連付けられているWM_CHARとWM_KEYDOWNのメッセージをすべて傍受し、他のすべてのメッセージを渡します。必ずこれはタブキーナビゲーションを破壊しないようにする

WNDPROC g_prevFunc = NULL; 

LRESULT MyWindowHook(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    if ((uMsg == WM_CHAR) || (uMsg == WM_KEYDOWN) || (uMsg == WM_KEYUP)) 
    { 
     return 0; // swallow message 
    } 

    return ::CallWindowProcW(g_prevFunc, hWnd, uMsg, wParam, lParam); 
} 


void MySubclassWindow(HWND hwnd) 
{ 
    g_prevFunc = (WNDPROC)::SetWindowLongW(hwnd, GWL_WNDPROC, (LONG_PTR)MyWindowHook); 
} 

// wherever your code gets initialized 
CYourWindow::OnInit() 
{ 
    // whatever other initialization you got going on... 

    // I'm assuming your CComboBox is named something like m_combobox. 

    ::MySubclassWindow(m_combobox.m_hWnd); 

} 

ダブルチェック:

はこれを行います。私はちょうど試したが、うまくいくようだ。 WM_CHARを飲み込む必要はないかもしれません。ちょうどWM_KEYUPとWM_KEYDOWNを飲み込む必要があります。あなたの一部に関するいくつかの実験が必要になるでしょう。

また、CWndクラスにはSubclassWindowというMFCメソッドがあります。したがって、純粋なMFCに行きたい場合は、これも調べることができます。 (>のSendMessage EM_SETREADONLY - >は、GetWindow(GW_CHILD) -

GetDlgItem(IDC_MY_COMBO):

+0

回答ありがとうございます! – lebron2323

2

コンボボックスをサブクラス化せずに簡単な解決策は、このように、読み取り専用する(CEditのボックスです)、その最初の子ウィンドウを設定することです、1,0)。

関連する問題