2011-01-02 28 views
5

Về cơ bản tôi muốn có một Enter để kích hoạt tin nhắn tôi có thể nắm bắt khi tập trung chỉnh sửa tập trung và người dùng nhấn enter. Tất cả các giải pháp trực tuyến dường như là về phân lớp, nhưng tôi đã tự hỏi nếu có một cách khác xung quanh nó?win32 C++ phát hiện 'enter' trong một điều khiển chỉnh sửa withot subclassing?

Ví dụ: nút của tôi có số nhận dạng ID_BUTTON_SEND. Đây là cách tôi tưởng tượng nó;

case WM_COMMAND: 
    switch (LOWORD(wParam)) 
      case ID_BUTTON_SEND 
       if ('enter was pressed') 
         do this 
       else 
         default 

... bạn có ý tưởng :) Tôi đã đọc http://support.microsoft.com/kb/102589 nhưng tùy chọn thẳng thắn 1 không có ý nghĩa nhiều với tôi.

Chúc mừng

Trả lời

3

Cách tốt nhất để nắm bắt điều này là trước khi TranslateMessage được gọi. Vì vậy, nếu sử dụng MFC, ghi đè CWnd :: PreTranslateMessage. Nếu chỉ sử dụng Win API, thì chỉ cần kiểm tra thông điệp bơm của bạn những gì tin nhắn chứa trước khi gọi tới TranslateMessage.

+0

Tôi nên tìm thông điệp gì? WM_CHAR, WM_KEYPRESS hay gì đó? Ngoài ra - điều này có tác động hiệu quả không, thực hiện kiểm tra này cho mỗi lần nhận được tin nhắn? – KaiserJohaan

+0

Đừng lo lắng về các vấn đề hiệu suất, chúng có thể bỏ qua. Tuy nhiên, tôi đã quên những thông điệp cần tìm :) nhưng vì nó vẫn chưa được tranaslated tôi nghĩ rằng WM_KEYDOWN sẽ là một trong những tìm kiếm. (hoặc WM_KEYUP). – kellogs

3

Bạn có thể bẫy sự kiện thay đổi tiêu điểm và khi điều khiển chỉnh sửa nhận sự kiện tiêu điểm chỉ cần thay đổi nút mặc định của hộp thoại thành nút * ID_BUTTON_SEND *. Sau đó, khi tiêu điểm bị mất, hãy xóa cờ nút mặc định này.

Điều đó có nghĩa là bất cứ khi nào người dùng truy cập vào khi điều khiển chỉnh sửa có lỗi, hộp thoại sẽ tự động kích hoạt nút * ID_BUTTON_SEND * mặc định.

Bạn có thể làm cho các nút nút mặc định bằng cách thêm BS_DEFPUSHBUTTON đến GWL_STYLE của nút.

2

Chỉ để nhắc lại bài viết KB. Đối với tùy chọn 1, bạn có thể thực sự chỉ cần xử lý IDOK trong WM_COMMAND.

case WM_COMMAND: 
    if(wParam == IDOK){ 
    ENTER WAS PRESSED 
    }else{ 
    REGULAR EVENT HANDLING 
    } 

Đây là cách dễ dàng và sạch hơn để kiểm tra Enter.

+0

Cảm ơn bạn! Đã cố gắng theo dõi điều đó trong nhiều ngày. Đối với OP, bạn có thể kiểm tra HWND của điều khiển, vì nó nằm trong lparam của bạn. –

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