2009-02-12 26 views

Trả lời

2

Hãy chắc chắn Edit kiểm soát phong cách ES_WANTRETURN được thiết lập trong tài nguyên thoại cho sự kiểm soát

+0

Điều này không hoạt động. Đây không phải là điều tôi muốn. Tôi muốn lấy chìa khóa RETURN VÀ làm một cái gì đó. Không chỉ cho phép nhập phím RETURN. – knaser

+0

Sau đó, bạn sẽ cần phải phân lớp kiểm soát chỉnh sửa và xử lý các tin nhắn WM_CHAR hoặc KeyDown được trả lời trong các câu hỏi SO khác. HOẶC trong MessageMap của hộp thoại, xử lý Chỉnh sửa Thay đổi tin nhắn từ điều khiển (được gửi cho mọi ký tự). – SAMills

+1

ES_WANTRETURN là * chỉ * áp dụng cho các hộp văn bản nhiều dòng. –

14

Bạn cũng có thể lọc để chìa khóa trong PreTranslateMessage của hộp thoại của bạn. Nếu bạn nhận được WM_KEYDOWN cho VK_RETURN, hãy gọi GetFocus. Nếu tiêu điểm nằm trên điều khiển chỉnh sửa của bạn, hãy gọi xử lý của bạn để trả về được nhấn trong điều khiển chỉnh sửa.

Lưu ý thứ tự các mệnh đề trong nếu dựa vào đoản mạch để có hiệu quả.

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg) 
{ 
    if (pMsg->message == WM_KEYDOWN && 
     pMsg->wParam == VK_RETURN && 
     GetFocus() == m_EditControl) 
    { 
     // handle return pressed in edit control 
     return TRUE; // this doesn't need processing anymore 
    } 
    return FALSE; // all other cases still need default processing 
} 
2

Câu trả lời đúng là xử lý thông báo WM_GETDLGCODE/OnGetDlgCode. Trong đó bạn có thể chỉ định rằng bạn muốn tất cả các phím được xử lý bởi lớp của bạn.

UINT CMyEdit::OnGetDlgCode() 
{ 
    return CEdit::OnGetDlgCode() | DLGC_WANTALLKEYS; 
} 
1

Theo mặc định, Return chìa khóa đóng một hộp thoại MFC. Điều này là do Trả lại phím làm cho hàm OnOK() của CDialog được gọi. Bạn có thể ghi đè chức năng đó để chặn Phím trả về. Tôi đã có ý tưởng cơ bản từ this article (xem Phương pháp 3 ở cuối).

Trước tiên, hãy chắc chắn rằng bạn đã thêm thành viên để được chỉnh sửa điều khiển thoại của bạn bằng cách sử dụng Class Wizard, ví dụ:

CEdit m_editFind; 

Tiếp theo, bạn có thể thêm các nguyên mẫu hàm sau để tệp tiêu đề của bạn thoại:

protected: 
    virtual void OnOK(); 

sau đó, bạn có thể thêm việc thực hiện sau vào cpp tập tin của hộp thoại của bạn:

void CMyDialog::OnOK() 
{ 
    if(GetFocus() == &m_editFind) 
    { 
     // TODO: Add your handling of the Return key here. 
     TRACE0("Return key in edit control pressed\n"); 

     // Call `return` to leave the dialog open. 
     return; 
    } 

    // Default behavior: Close the dialog. 
    CDialog::OnOK(); 
} 

Xin lưu ý: Nếu bạn có nút OK trong hộp thoại có ID IDOK, thì nó cũng sẽ gọi OnOK(). Nếu điều này gây ra bất kỳ vấn đề gì cho bạn, thì bạn phải chuyển hướng nút đến một hàm xử lý khác. Cách thực hiện điều này cũng được mô tả trong Phương thức 3 của the article mà tôi đã đề cập ở trên.

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