2010-01-02 43 views
7

Khi tôi chuyển sang điều khiển CEdit trên hộp thoại bằng cách sử dụng phím tab hoặc các phím mũi tên, tất cả văn bản trong điều khiển được chọn. Hành vi này đang gây ra cho tôi các vấn đề và tôi muốn nó nếu điều khiển chỉ đặt con trỏ ở đầu (hoặc kết thúc) của văn bản và không chọn bất cứ điều gì. Có cách nào đơn giản để thực hiện việc này không (ví dụ: thuộc tính của điều khiển mà tôi có thể đặt)?CEdit chọn mọi thứ khi lấy nét

Trả lời

2

Tôi không nghĩ rằng kiểu như vậy tồn tại.
Nhưng bạn có thể thêm handler OnSetfocus với trình hướng dẫn:

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

Điều này không hoàn toàn phù hợp với tôi. Điều khiển chỉnh sửa của tôi là nhiều dòng và nội dung của chúng có thể cao hơn kiểm soát (tôi có thanh cuộn dọc). BNoScroll cần phải là TRUE và lựa chọn cho "no select" là -1, 0, vì vậy mã của tôi gọi nó là 'e-> SetSel (-1, 0, TRUE);'. Điều này duy trì bất kỳ vị trí cuộn hiện tại nào khi tôi duyệt qua các điều khiển của hộp thoại của mình, nhưng cũng đảm bảo không có gì được chọn khi tiêu điểm quay trở lại điều khiển chỉnh sửa của tôi. – franji1

7

Một cách khác để đạt được mục tiêu của bạn là để ngăn chặn các nội dung từ được chọn. Khi điều hướng qua các điều khiển trong hộp thoại, trình quản lý hộp thoại sẽ truy vấn các điều khiển tương ứng về các thuộc tính nhất định liên quan đến hành vi của chúng. Theo mặc định, điều khiển chỉnh sửa phản hồi với cờ DLGC_HASSETSEL (trong số những người khác) để chỉ báo cho trình quản lý hộp thoại rằng nội dung của nó phải được chọn tự động.

Để giải quyết vấn đề này, bạn phải phân lớp kiểm soát chỉnh sửa và xử lý thông báo WM_GETDLGCODE để thay đổi cờ phù hợp. Đầu tiên, lấy một lớp từ 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() 

Tiếp theo phân lớp kiểm soát thực tế. Có một số cách để làm điều này. Để giữ cho mọi thứ đơn giản chỉ cần khai báo thành viên lớp m_Edit1 loại CPersistentSelectionEdit trong lớp thoại của bạn và thêm một mục thích hợp ở DoDataExchange:

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

Tại thời điểm này bạn có một kiểm soát chỉnh sửa mà không có nội dung của nó tự động chọn khi điều hướng đến. Bạn có thể kiểm soát việc lựa chọn bất cứ cách nào bạn muốn.

+2

Nếu bạn sử dụng phương pháp này, bạn không bị mất vị trí dấu mũ mỗi khi bạn đặt trọng tâm vào hộp văn bản, vì vậy tôi thích nó. – DanDan

Các vấn đề liên quan