[ATL/WTL]_[初级]_[Win32窗口自定义消息处理过程]

本文介绍如何在WTL中通过修改窗口过程来实现特定窗口消息的拦截与处理,例如响应编辑框的回车键和实现Ctrl+A全选功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景

  1. 有时候我们需要单独对某个窗口消息进行拦截,比如CEdit响应回车, 这时候就需要拦截窗口处理过程了. 当然MFC的界面可以重载:
  2. 也比如CEdit设置ES_MULTILINE属性后并不支持ctrl+a全选, 这时候也需要自己过滤消息增加全选.
BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg){

但是WTL的CEdit并不支持这种方式,WTL如果想在 PreTranslateMessage 里拦截消息,必须继承 CMessageFilter 后还要把这个控件注册到消息循环里才行,也就是必须写子类 或者从父窗口拦截这个CEdit的消息.

CMessageLoop* pLoop = _Module.GetMessageLoop();
ATLASSERT(pLoop != NULL);
pLoop->AddMessageFilter(this);

方案

  1. 通过使用 SetWindowLong来改变窗口处理过程来处理相关的消息,其他消息使用原过程继续处理.
static WNDPROC OldWndProc = NULL;
static UiPreviewListDialog* gDialog = NULL;

static LRESULT CALLBACK NewEditProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) // 该对话框新的窗口回调函数,过滤WM_KEYDOWN消息。
{
    switch(message)
    {
        case WM_GETDLGCODE:
        {
            return (DLGC_WANTALLKEYS | CallWindowProc(OldWndProc, hWnd, message, wParam, lParam)); // 注意这里,否则没有办法捕获Tab/方向键
        }

        case WM_KEYDOWN:
        {
            if(wParam == VK_RETURN)
            {   
                std::cout << "Enter: " << std::endl;
                BOOL handle;
                gDialog->OnSearch(message,wParam,hWnd,handle);
            }
        }
        break;

        default:
            break;
    }
    return CallWindowProc(OldWndProc, hWnd, message, wParam, lParam);
}

    gDialog = this;
    OldWndProc = (WNDPROC)edit_.SetWindowLong(GWL_WNDPROC, (LONG)NewEditProc);


  1. 全选,使用ES_MULTILINE后默认不能使用ctrl+a全选.
static std::map<HWND,WNDPROC> gProcs;

static LRESULT CALLBACK Edit_Prc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
  if(msg == WM_CHAR && wParam==1)
  {
      SendMessage(hwnd,EM_SETSEL,0,-1); return 1;
  }
  else 
  {
      return CallWindowProc(gProcs[hwnd],hwnd,msg,wParam,lParam);
  }
}

WNDPROC p_code = (WNDPROC)edit_code_.SetWindowLong(GWL_WNDPROC, (LONG)Edit_Prc);
    WNDPROC p_email = (WNDPROC)edit_email_.SetWindowLong(GWL_WNDPROC, (LONG)Edit_Prc);

    gProcs[edit_code_.m_hWnd] = p_code;
    gProcs[edit_email_.m_hWnd] = p_email;

参考:
CEdit中对于回车键的响应
SetWindowLong function
CallWindowProc
select-all-text-in-edit-contol-by-clicking-ctrla

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白行微

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值