原创 windows消息传递笔记

2009-2-16 19:26 3080 7 7 分类: 软件与OS
 一关于消息
消息的分类:
标准消息:以WM_(除了WM_COMMAND)开头,处理函数以ON开头
命令消息:从WM_COMMAND开头 菜单消息
通告消息:控件消息

从Cwind中派生的类可以接受三种消息              视图类
而从CCmdTargat中派生的类只能接受命令和通告     文档类 APP类
命令消息的添加形式和标准消息是相同的,只不过在映射的时候使用ON_COMMAND开头
 
 ×*************************************
ON_COMMAND
响应菜单 按键
This macro is usually inserted in a message map by ClassWizard or manually. It indicates
which function will handle a command message from a command user-interface object such
as a menu item or toolbar button.
When a command-target object receives a Windows WM_COMMAND message with the specified ID,
ON_COMMAND will call the member function memberFxn to handle the message.
ON_MESSAGE( message, memberFxn )
***************************************
ON_NOTIFY: Handling WM_NOTIFY Messages in MFC Applications
ON_NOTIFY( wNotifyCode, id, memberFxn )
afx_msg void memberFxn( NMHDR * pNotifyStruct, LRESULT * result );
**************************
响应自定义的消息
ON_MESSAGE( message, memberFxn )
****************************************
 2.消息的操作
 ::SendMessage
/*The SendMessage function sends the specified message to a window or windows.
The function calls the window procedure for the specified window and does not
return until the window procedure has processed the message.
The PostMessage function, in contrast, posts a message to a thread's message queue
and returns immediately. */

LRESULT SendMessage(
  HWND hWnd,      // handle of destination window
  UINT Msg,       // message to send
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);


SendDlgItemMessage
The SendDlgItemMessage function sends a message to the specified control in a dialog box.

LONG SendDlgItemMessage(
  HWND hDlg,      // handle of dialog box
  int nIDDlgItem, // identifier of control
  UINT Msg,       // message to send
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

DispatchMessage
The DispatchMessage function dispatches a message to a window procedure. It is typically used to dispatch a message retrieved by the GetMessage function.

LONG DispatchMessage(
  CONST MSG *lpmsg   // pointer to structure with message
);
////////////////////////////////////////////////////////////////////////////
三、消息解释
     WM_CREATE
     处理函数是OnCreate()
     映射表ON_WM_CREATE()
     The WM_CREATE message is sent when an application requests that a window be created by
     calling the CreateWindowEx or CreateWindow function.
在该函数里面做一些初始化的时候,注意的是,如果处理消息,最好使用postmessage这样不至于影响,ONCREATE的
执行,一些依赖窗口处于完全激活状态的函数也不能在里面使用。视图类的OnIintUpdata是在窗口建立之后自动调用
可以在里面做一些初始化的工作

****************************
、、、、、、、、对应的是WM_CLOSE消息,由框架类调用
    
****************************
WM_QUERYENDSEESSION
OnQueryEndSession()
用户推出winwows的时候发出的消息,窗口类可以重载这个函数来做结束的工作
****************************
WM_DESTROY
OnDestroy()
在发送WM_CLOSE之后发送来销毁窗口
应用程序结束时在框架类中调用的,可以在里面做一些结束的操作
afx_msg void OnClose();
ON_WM_CLOSE()
void CMainFrame::OnClose()
{
    // TODO: Add your message handler code here and/or call default
   
    CFrameWnd::OnClose();
}
*****************************
WM_PAINT

An application sends the WM_PAINT message when the system or another application makes a request
to paint a portion of an application's window. The message is sent when the UpdateWindow or
RedrawWindow function is called, or by theDispatchMessage function when the application obtains
a WM_PAINT message by using theGetMessage orPeekMessage function
这个消息是WINDOWS发送最多的消息
Windows sends a WM_PAINT message whenever the CWnd update region is not empty and there are no
other messages in the application queue for that window.

这个消息是在OnPain()中完成的,框架给出了这个函数的虚函数OnDraw()
OnPaint()->OnPrepareDC()->OnDraw()
文档内容改变的时候,windows发出这个消息来使用UpdateWindow(重绘客户区)和RedrawWindow(重绘非客户区以及客户区)
更常用的是:
          InValidate和InValidateRect
 ××××××××××××××××××××××××××××网上文章×××××××××××××××××××××××××××××××××××××××××       
InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效

InvalidateRect函数中的参数TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景色。

Invalidate()之后:(MFC的,顺便了)
OnPaint()->OnPrepareDC()->OnDraw()
所以只是刷新在OnPaint()和OnDraw()函数中的绘图语句。其它地方没有影响。

Invalidate标记一个需要重绘的无效区域,并不意味着调用该函数后就立刻进行重绘。类似于PostMessage(WM_PAINT),需要处理到WM_PAINT消息时才真正重绘。以为您Invalidate之后还有其他的语句正在执行,程序没有机会去处理WM_PAINT消息,但当函数执行完毕后,消息处理才得以进行。

Invalidate只是放一个WM_PAINT消息在队列里,不做别的,所以只有当当前函数返回后,进入消息循环,取出WM_PAINT,才执行PAINT,所以不管Invalidate放哪里,都是最后的。

InvalidateRect(hWnd,&rect,TRUE);向hWnd窗体发出WM_PAINT的消息,强制客户区域重绘制,
rect是你指定要刷新的区域,此区域外的客户区域不被重绘,这样防止客户区域的一个局部的改动,而导致整个客户区域重绘而导致闪烁,如果最后的参数为TRUE,则还向窗体发送WM_ERASEBKGND消息,使背景重绘,当然在客户区域重绘之前。
UpdateWindow()只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT

如果希望立即刷新无效区域,可以在调用InvalidateRect之后调用UpdateWindow,如果客户区的任一部分无效,则UpdateWindow将导致Windows用WM_PAINT消息调用窗口过程(如果整个客户区有效,则不调用窗口过程)。这一WM_PAINT消息不进入消息队列,直接由WINDOWS调用窗口过程。窗口过程完成刷新以后立刻退出,WINDOWS将控制返回给程序中UpdateWindow调用之后的语句。

UpdateData()顺便说下,这个函数不是刷新界面用的。
UpdateData();参数为FALSE时,将界面上控件绑定的变量的数据导到控件内,参数为TRUE时,导入方向则相反
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

********************************
定时器的使用:注意的是 定时器是在框架类中使用的
设置定时器
WM_TIMER
映射表
ON_WM_TIMER()
The SetTimer function creates a timer with the specified time-out value.
UINT SetTimer(
  HWND hWnd,              // handle of window for timer messages//可以为null
  UINT nIDEvent,          // timer identifier
  UINT uElapse,           // time-out value
  TIMERPROC lpTimerFunc   // address of timer procedure 这个参数如果为null  发送WM_TIMER消息

void CTimertestView::OnTimer(UINT nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
    //MessageBox("SFSDGD");
    CView::OnTimer(nIDEvent);
}

KillTimer()
***********************************************


自定义消息

使用UINT RegisterWindowMessage(
  LPCTSTR lpString   // address of message string
);得到独一无二的消息号


消息映射表的使用这里就不介绍了
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条