簡體   English   中英

取消選擇編輯控件win32 c++

[英]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 文檔並沒有找到任何額外的樣式來添加來完成任務。

如果您對如何完成此任務有任何想法,您能幫幫我嗎?
謝謝你。

您可以使用相同的技巧來消除(組合框的)下拉列表、彈出菜單等。

  1. 您需要繼承 EDIT 控件,以便首先接收到您自己的窗口過程的消息。

  2. 在您的文本框子類WM_SETFOCUS處理程序中,調用SetCapture以便將下一次單擊傳遞到文本框,即使它在外面。

  3. 在文本框子類的鼠標單擊消息處理程序中,測試位置,如果在文本框之外,則調用SetFocus(NULL)以放棄焦點。 (這是彈出窗口會自行消失的地方)。 也調用ReleaseCapture()

  4. 還要在子類的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.

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