[英]Edit control cannot get focus or set text after subclassing
我已經創建了一個編輯框,並且可以正常工作,但是在為其添加了自定義WndProc之后,“我的編輯”文本不可見,並且在單擊時不會聚焦。
HWND handle=CreateWindowExW(0,L"Edit",L"my edit",WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_CENTER | ES_MULTILINE | ES_AUTOVSCROLL,
0,0,200,200,window.handle,0,GetModuleHandle(NULL),0);
到這里為止一切正常
設置此窗口過程后,編輯控件不再按預期工作
SetWindowLongPtr(handle,GWLP_WNDPROC,(LRESULT)staticWndProc);
LRESULT CALLBACK staticWndProc(HWND handle, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch (uMsg){
case WM_LBUTTONDOWN:
std::wcout << handle << L" click\n"; //click event works
break;
default:
return DefWindowProcW(handle,uMsg,wParam,lParam);
}
return 0;
}
我是否必須手動處理某些事件或更改我的構造樣式標志?
子類化涉及攔截窗口消息,可能會處理其中的一些消息,並將未處理的消息傳遞給原始窗口過程 。
您沒有這樣做-您將沒有處理的所有內容傳遞給DefWindowProc
。 DefWindowProc
對於編輯控件(或實際上對於任何類型的控件)沒有任何專門的行為。 因此,您已經有效地將編輯控件變成了通用窗口。
SetWindowLongPtr
,不鼓勵使用SetWindowLongPtr
對窗口進行子類化,但是,如果您確實使用該方法,則對SetWindowLongPtr
的調用返回值將為您提供舊的窗口過程,並且您打算使用CallWndProc
函數而不是DefWindowProc
稱它為。
但是,現代的子窗口化方法是使用SetWindowSubclass
函數,該函數可以為您處理原始DefSubclassProc
您需要做的就是調用DefSubclassProc
函數,如下所示:
LRESULT CALLBACK staticWndProc(HWND handle, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR, DWORD_PTR){
switch (uMsg){
case WM_LBUTTONDOWN:
std::wcout << handle << L" click\n"; //click event works
break;
case WM_NCDESTROY:
RemoveWindowSubclass(handle, staticWndProc, 0);
// fall through
default:
return DefSubclassProc(handle,uMsg,wParam,lParam);
}
return 0;
}
SetWindowSubclass(handle, staticWndProc, 0, 0);
請注意,收到WM_NCDESTROY
時,上面顯示的子類函數將自行刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.