2010-01-02 116 views
7

當我使用Tab鍵或方向鍵移動到對話框上的CEdit控件時,控件中的所有文本都被選中。這種行爲會引起我的問​​題,如果控件只是將光標放在文本的開始(或結束)並且沒有選擇任何東西,我更喜歡它。 有沒有簡單的方法來做到這一點(例如,我可以設置的控件屬性)?CEdit在獲取焦點時選擇所有內容

回答

2

我不認爲這樣的風格存在。
但是你可以用嚮導中添加的onSetFocus處理程序:

void CMyDlg::OnSetfocusEdit1() 
{ 
    CEdit* e = (CEdit*)GetDlgItem(IDC_EDIT1); 
    e->SetSel(0); // <-- hide selection 
} 
+0

這並不適合我。我的編輯控件是多行的,其內容可以比控件高(我有一個垂直滾動條)。 bNoScroll需要爲TRUE,並且「no select」的選擇是-1,0,所以我的代碼稱它爲'e-> SetSel(-1,0,TRUE);'。當我通過我的對話框的控件選項卡時,這將保持任何當前的滾動位置,但也確保一旦焦點返回到我的編輯控件,就不會選擇任何內容。 – franji1 2017-07-05 16:25:04

7

實現目標的另一種方法是,以防止被選擇的內容。在對話框中瀏覽控件時,對話框管理器將查詢與其行爲有關的某些屬性的相應控件。默認情況下,編輯控件會響應DLGC_HASSETSEL標誌(等等)向對話管理器指示其內容應該被自動選擇。

要解決此問題,您必須繼承編輯控件並處理WM_GETDLGCODE消息才能正確更改標誌。首先,從CEdit派生一個類:

class CPersistentSelectionEdit : public CEdit { 
public: 
    DECLARE_MESSAGE_MAP() 
    afx_msg UINT OnGetDlgCode() { 
     // Return default value, removing the DLGC_HASSETSEL flag 
     return (CEdit::OnGetDlgCode() & ~DLGC_HASSETSEL); 
    } 
}; 

BEGIN_MESSAGE_MAP(CPersistentSelectionEdit, CEdit) 
    ON_WM_GETDLGCODE() 
END_MESSAGE_MAP() 

下一個子類的實際控制。有很多方法可以做到這一點。爲了簡單起見,只需要聲明一個類成員CPersistentSelectionEditm_Edit1在對話框類,並添加DoDataExchange相應的條目:

// Subclass the edit control 
DDX_Control(pDX, IDC_EDIT1, m_Edit1); 

在這一點上,你有沒有它的內容編輯控制,自動選擇當導航到。您可以根據需要控制選擇。

+2

如果您使用此方法,則每次將焦點設置到文本框時都不會丟失插入位置,所以我更喜歡它。 – DanDan 2014-08-14 23:22:48

相關問題