ON_MESSAGE宏

 

为何在自定义消息处理函数中无法利用wParamlParam传递指针?

ON_COMMAND()宏创建的自定义消息处理机制确实无法使用wParamlParam参数,这是由于ON_COMMAND()宏决定的

使用wParamlParam参数,那么应当使用ON_MESSAGE()宏,由它扩展生成的消息处理函数的原型中才有这两个参数

 

ON_MESSAGE响应的是自定义消息,有关自定义消息的处理请看如下步骤:
1.
定义消息:
在"C实验ON_MESSAGEDlg"类的头文件中加入如下代码:
#define WM_CUSTOMIZE WM_USER+100
头文件中加入Customize的声明:
afx_msg LRESULT Customize(WPARAM wParam, LPARAM lParam);

2.cpp
文件中加入消息的注册
ON_MESSAGE(WM_CUSTOMIZE, Customize)

3
.加入消息响应函数实现
LRESULT C实验ON_MESSAGEDlg::Customize(WPARAM wParam, LPARAM lParam)

{

  CString strTittle;

  strTittle.Format("自定义消息参数:x=%d,y=%d",wParam,lParam);

  //SetWindowText(strTittle);

  setMessage(strTittle);

  return 1;

}

void C实验ON_MESSAGEDlg::setMessage(LPCTSTR newInfo)

{

   CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDIT1);

   pEdit->SetWindowTextA(newInfo);

}

 

4.显式地发送消息:
在主框架的帮助主菜单中加入自定义消息子菜单,其ID设为ID_CUSTOMIZE,通过类向导响应该命令,函数名默认。其函数体如下:
void C实验ON_MESSAGEDlg::OnCustomize()

{

    // TODO: 在此添加命令处理程序代码

    HWND pdlg;

    POINT pos;

  //将消息参数定义为屏幕坐标值

    GetCursorPos(&pos);

    pdlg=this->GetSafeHwnd();

    /::SendMessage(pdlg,WM_CUSTOMIZE,(UINT)pos.x,pos.y);

    ::PostMessage(pdlg, WM_CUSTOMIZE, (UINT)pos.x, pos.y);

}

// 农机调度项目中代码:

void CWebServer::PostMsgToOwner(SERVER_INFO serverInfo)

{

    //向所属窗体发送通知消息

    if ( ::IsWindow(m_ownerHWND)  )

    {

        LPARAM lParam = 0;

        WPARAM wParam = 0;

 

        if (serverInfo == SERVER_STARTED)

        {

            //用户只能配置客户端数、不需要知道临时并发数

            lParam = MAKEWPARAM(m_cocurrentConstantClientNumber, m_serverConstantConnectPort);

            wParam = MAKEWPARAM(0, serverInfo);

        }

        else

        {

            wParam = MAKEWPARAM(0, serverInfo);

        }

        ::PostMessage(m_ownerHWND, WM_USER_SERVERINFO, wParam, lParam);

    }

}

 

ON_NOTIFY 是控件向其父窗口发送消息处理的宏, ON_COMMAND 是菜单和工具栏项处理消息的宏, ON_MESSAGE 是处理自定义消息的宏


对这几个消息的理解要先了解一下 Window 消息的背景。
Windows3.1 里,控件会将 mouse, keybord 等等的消息通知它的父窗口, 使用的消息就只有 WM_COMMAND, 事件种类和控件 ID 被包含在 wParam 中, 控件的句柄包含在 lParam 中。由于 wParam lParam 已经满了,当控件要向父窗口发送其它特殊消息同时附带很多信息的时候就没有地方可以存放它们了。所以 Windows3.1 中定义了许多其它的 消息种类,比如 WM_VSCROLL, WM_CTLCOLOR 等等,每种消息 wParam,lParam 中附带的信息是不同的。
当到了 Win32 后,控件的种类越来越多,当然不可以为每一个控件都定义一套消息,这样也不利于系统的扩充。所以在 Win32 中定义了唯一一个强大的消息 WM_NOTIFY 。当然 WM_NOTIFY 也遵守原来的消息规则,既只带参数 wParam lParam 。唯一不同处在于,此时的 lParam 中传送的 是一个 NMHDR 指针。不同的控件可以按照规则对 NMHDR 进行扩充,因此 WM_NOTIFY 消息传送的信息量可以相当的大,这个可以看看 MSDN 中的相 关说明, TreeControl 中就有很多这种消息。

现在就可以知道为什么有 ON_MESSAGE ON_COMMAND, , ON_NOTIFY 了。
ON_MESSAGE
是处理所有的 Windows 的消息的,因为所有的消息都以相同的格式传送,也就是 ID, WPARAM, LPARAM.
ON_COMMAND
是专门处理 WM_COMMAND 消息的,这样我们就不用自己解开 WM_COMMAND wParam lParam 中传送的控件 ID 事件种类 ,所有的都在 MFC 内部解决了:),当然方便了。
ON_NOTIFY
更是不用说了,看看他的处理函数,是不是把 NMHDR 解出来了。

你可能感兴趣的:(windows,框架,server,user,command,mfc)