簡體   English   中英

子類化后,編輯控件無法獲得焦點或設置文本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM