[英]Deselect edit control win32 c++
我將如何去取消選擇編輯控件中的文本?
輸入輸入后,我希望用戶能夠取消選擇編輯控件。 因為即使您單擊它並按下一個鍵,它也會進入編輯。
這是我的編輯控件的代碼:
HFONT fontMain = CreateFont(
-16, // Height Of Font
0, // Width Of Font
0, // Angle Of Escapement
0, // Orientation Angle
0, // Font Weight
false, // Italic
false, // Underline
false, // Strikeout
ANSI_CHARSET, // Character Set Identifier
OUT_TT_PRECIS, // Output Precision
CLIP_DEFAULT_PRECIS, // Clipping Precision
ANTIALIASED_QUALITY, // Output Quality
FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch
TEXT("Calibri"));
HWND editControl = CreateWindow(
TEXT("EDIT"),
TEXT("TEST TEXT"),
WS_CHILD | WS_VISIBLE | ES_LEFT | ES_MULTILINE,
x, y, width, height,
window,
(HMENU) 100,
instance,
NULL);
SendMessage(window /* parent window */, WM_SETFONT, (WPARAM)fontMain, NULL);
DeleteObject(fontMain);
我檢查了 MSDN 文檔並沒有找到任何額外的樣式來添加來完成任務。
如果您對如何完成此任務有任何想法,您能幫幫我嗎?
謝謝你。
您可以使用相同的技巧來消除(組合框的)下拉列表、彈出菜單等。
您需要繼承 EDIT 控件,以便首先接收到您自己的窗口過程的消息。
在您的文本框子類WM_SETFOCUS
處理程序中,調用SetCapture
以便將下一次單擊傳遞到文本框,即使它在外面。
在文本框子類的鼠標單擊消息處理程序中,測試位置,如果在文本框之外,則調用SetFocus(NULL)
以放棄焦點。 (這是彈出窗口會自行消失的地方)。 也調用ReleaseCapture()
。
還要在子類的WM_KILLFOCUS
處理程序中調用ReleaseCapture()
,因為鼠標單擊不是失去焦點的唯一方法。
以上是讓文本框外的任何點擊移除其焦點的方法。 如果您只想在父窗口的客戶區域單擊以使文本框失焦,那么您當然可以跳過子類化和捕獲,而只需處理父窗口中的鼠標單擊事件,調用SetFocus(NULL)
或SetFocus(parentHWnd)
.
我在窗口過程中處理了 WM_LBUTTONDOWN 消息。
這樣當我在父窗口上單擊鼠標按鈕時,它將焦點設置到父窗口。
static LRESULT WINAPI WndProc
(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message){
case WM_LBUTTONDOWN : {
// Passing the parent window as the parameter.
SetFocus(HWND parentWindow);
}
}
}
此方法的工作原理是,如果單擊父窗口以外的任何其他窗口,可能不會觸發 WM_LBUTTONDOWN。
上述語句可能有一些例外,但總體而言,它適用於按鈕和編輯,但由於某種原因不適用於靜態文本。
答案由@PaulSanders 和@BenVoigt提供
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.