Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 3 của 3
  1. #1
    Ngày tham gia
    Sep 2015
    Đang ở
    Hà Nội
    Bài viết
    0

    Tạo PreTranslate cho Win32 Dialog để bắt sự kiện WM_KEYDOWN (parent)

    Mình muốn bắt sự kiện bàn phím trong Dialog nhưng một child_window (child) nào đó đã handle được sự kiện này và không trả về cho Dialog (parent). Mình có tìm hiểu trên mạng thì người ta bảo sử dụng PreTranslate trong MFC.

    Suy ra, trong Win32 sẽ bắt sự kiện ngay message loop, trước khi nó được gọi hàm Translate:
    Mã:
    while (GetMessage(&msg, NULL, 0, 0))
    	{
    		// pretranslate
    		if (msg.message == WM_KEYDOWN)
    		{
    			// xử lý sự kiện
    			//....
    		}
    		else if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    	}
    Nhưng nếu là một Dialog được tạo bằng hàm DialogBox sẽ không có message loop, vậy làm sao mình có thể tạo một PreTranslate ở trường hợp này. Hoặc làm sao để bắt sự kiện WM_KEYDOWN trong hàm MainDialogProc :
    Mã:
    return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), 0, MainDialogProc);
    }
    Mình handle trong hàm MainDialogProc thì không bắt được WM_KEYDOWN nên mình nghĩ WM_KEYDOWN đã được một child control xử lý và return nên WM_KEYDOWN không đến được MainDialogProc

    please help,

  2. #2
    Mình vừa nghĩ ra một cách thay vì sử dụng hàm DialogBox mình sử dụng hàm HWND hwnd = CreateDialog. Chỉ để tạo Window và return HWND
    Sau đó sử dụng Message Loop như bình thường.

    Liệu có cách nào nữa ko nhỉ ? [IMG]images/smilies/biggrin.png[/IMG]

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    override lại hàm PreTranslateMessage là ok nha bạn, mình làm rồi!
    Mã:
    afx_msg BOOL PreTranslateMessage(MSG* pMsg);
    Mã:
    BOOL CFS2pkDlg::PreTranslateMessage(MSG* pMsg)
    {
    // code here
    
    return CDialog::PreTranslateMessage(pMsg);
    }

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •