=WM_VSCROLL(消息反射) 和 WM_VSCROLL(消息响应)的区别

=WM_VSCROLL(消息反射) 和 WM_VSCROLL(消息响应)的区别


所谓消息反射就是控件拥有者自己不处这个理消息,而是反射给控件对象本身来处理这个消息


1、“=WM_VSCROLL”是消息反射标志  , WM_VSCROLL是 消息响应的标志,在VC6.0的ClassWizard中注意会发现这两个不同的消息,VS2010中没有“=WM_VSCROLL”,但是可以通过手动添加:

消息映射宏声明:    

BEGIN_MESSAGE_MAP(CMyScrollBar, CScrollBar)
	//{{AFX_MSG_MAP(CMyScrollBar)
	ON_WM_VSCROLL()           //普通消息
	ON_WM_VSCROLL_REFLECT()  //反射消息,由控件自身处理
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
消息响应函数

//响应“WM_VSCROLL”消息
void CMyScrollBar::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
   // TODO: Add your message handler code here and/or call default  

   CScrollBar::OnVScroll(nSBCode, nPos, pScrollBar);
}

//响应“=WM_VSCROLL”消息
void CMyScrollBar::VScroll(UINT nSBCode, UINT nPos) 
{
    // TODO: Add your message handler code here
}
          注意:上面两个“TODO”的内容是有区别的

2、以MFC基于对话框工程来讲解:

       a.  CMyDialog,CMyApp,然后添加一个CMyScrollBar:public CScrollBar类

       b.   在MyDialog.h中添加垂直滚动条,绑定一个变量

                CMyScrollBar   m_Vsrcrollbar;

      c.   在CMyDialog中OnInitDialog函数中初始化上面的变量

            

	//初始化垂直滚动条
	int i_scroMax = 100;
	m_Vscrollbar.SetScrollRange(0,i_scroMax);
	m_Vscrollbar.SetScrollPos(50);


       d.   为CMyScrollBar类添加"WM_VSCROLL"消息(这个消息是反射消息)响应函数 (通过ClassWiard)

            

      

#define INT_SBLINEUP 4
#define INT_SBLINEDOWN 4
#define INT_SBPAGEUP 25
#define INT_SBPAGEDOWN 25      //下面所有代码都会使用

void CMyScrollBar::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	int pos,*Minpos,*Maxpos;
	pos = GetScrollPos();
	GetScrollRange(Minpos,Maxpos);
	switch( nSBCode )
	{
	case SB_LINEUP:
		if( pos > *Minpos )
			pos -= INT_SBLINEUP;
		break;

	case SB_LINEDOWN:
		if( pos < *Maxpos )
			pos += INT_SBLINEDOWN;
		break;

	case SB_PAGEUP:
		if( pos-INT_SBPAGEUP > *Minpos )
			pos -= INT_SBPAGEUP;
		else
			pos = *Minpos;
		break;

	case SB_PAGEDOWN:
		if( pos+INT_SBPAGEDOWN < *Maxpos )
			pos += INT_SBPAGEDOWN;
		else
			pos = *Maxpos;
		break;

	case SB_THUMBPOSITION:
		pos = nPos;
		break;

	}
	SetScrollPos(pos,TRUE);
	CScrollBar::OnVScroll(nSBCode, nPos, pScrollBar);
}

          编译运行后,单击滚动条发现没有任何反应;在上面的函数上加断点,调试发现触发WM_VSCROLL消息后,根本没有调用这个函数。那么如何让CMyScrollBar类控件对象自己处理“WM_VSCROLL”消息呢?请看“第e步”。


      e.为CMyScrollBar类添加"=WM_VSCROLL"消息(这个消息是反射消息)响应函数 (通过类视图,右键单击类名|Add Windows Message Handler....,用ClassWizard也行)

            

           

void CMyScrollBar::VScroll(UINT nSBCode, UINT nPos) 
{
	// TODO: Add your message handler code here
	int pos,Minpos=0,Maxpos=100;
	pos = GetScrollPos();
	GetScrollRange(&Minpos,&Maxpos);
	switch( nSBCode )
	{
	case SB_LINEUP:
		if( pos > Minpos )
			pos -= INT_SBLINEUP;
		break;
		
	case SB_LINEDOWN:
		if( pos < Maxpos )
			pos += INT_SBLINEDOWN;
		break;
		
	case SB_PAGEUP:
		if( pos-INT_SBPAGEUP > Minpos )
			pos -= INT_SBPAGEUP;
		else
			pos = Minpos;
		break;
		
	case SB_PAGEDOWN:
		if( pos+INT_SBPAGEDOWN < Maxpos )
			pos += INT_SBPAGEDOWN;
		else
			pos = Maxpos;
		break;
		
	case SB_THUMBPOSITION:
		pos = nPos;
		break;
		
	}
	SetScrollPos(pos,TRUE);
}
           运行后发现垂直滚动条可以很好的运行;调试发现,触发WM_VSCROLL消息后,会跳到下面这个函数中
           CMyScrollBar::VScroll(UINT nSBCode, UINT nPos)

         总结:两个消息的宏声明不一样            
BEGIN_MESSAGE_MAP(CMyScrollBar, CScrollBar)
	//{{AFX_MSG_MAP(CMyScrollBar)
	ON_WM_VSCROLL()      //普通消息
	ON_WM_VSCROLL_REFLECT()  //反射消息,由控件自身处理
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

      f. 
在MyDialog.h中添加垂直滚动条,绑定一个变量

                CMyScrollBar   m_srcrolbar;

      g.   在CMyDialog中OnInitDialog函数中初始化上面的变量           

	int i_scroMax = 100;
	m_scrolbar.SetScrollRange(0,i_scroMax);
	m_scrolbar.SetScrollPos(50);

      h.  在CMyDialog类中响应WM_VSROLL消息响应

         

         
void CMyDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	int pos,Minpos=0,Maxpos=0;
	pos = m_scrolbar.GetScrollPos();
	m_scrolbar.GetScrollRange(&Minpos,&Maxpos);
	switch( nSBCode )
	{
	case SB_LINEUP:
		if( pos > Minpos )
			pos -= INT_SBLINEUP;
		break;

	case SB_LINEDOWN:
		if( pos < Maxpos )
			pos += INT_SBLINEDOWN;
		break;

	case SB_PAGEUP:
		if( pos-INT_SBPAGEUP > Minpos )
			pos -= INT_SBPAGEUP;
		else
			pos = Minpos;
		break;

	case SB_PAGEDOWN:
		if( pos+INT_SBPAGEDOWN < Maxpos )
			pos += INT_SBPAGEDOWN;
		else
			pos = Maxpos;
		break;

	case SB_THUMBPOSITION:
		pos = nPos;
		break;

	}
	m_scrolbar.SetScrollPos(pos,TRUE);
	CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}

           运行发现m_srcolbar对象对应的控件可以正常的运行。因为这个OnVscroll函数中的代码是针对m_srcolbar对象设计的,故其可以正确运行。


     J.  上面的代码看起来很不和谐,有个办法能很好的解决这个问题,就是让绑定控件的变量m_Vscrollbar的类Child自己现实“WM_SCROLL”消息响应函数Child::OnVScroll函数,其父窗体类CFatherDlg也实现“WM_SCROLL”消息响应函数CFatherDlg::OnVScroll,然后用如下方式调用:

        Mark:20131215,(VC6/VS2010环境下调试)此函数被调用了两次,难以理解!即使为空函数体也是这种情况,求解!  

//Mark:20131215
void CFatherDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{

	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if( pScrollBar->GetDlgCtrlID() == m_Vscrollbar.GetDlgCtrlID()) //如果消息对应的控件ID号是我要处理的控件则进行对应处理
        {
           m_Vscrollbar.OnVScroll(nSBCode,nPos,pScrollBar);    
        } 
       //这样就可以针对控件的ID号分别控制多个垂直滚动条,而达到互不干扰、代码思路清晰的好处

CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}

         注意:上面的m_Vscrollbar对象的OnVscroll函数一定要声明成public访问权限,用ClassWizard添加的是Protected访问权限,可以自己手动改过来。

     

3、总结

      如果要控件对应的对象自己处理一个消息,那么控件类自己必须实现“=WM_XXXX”反射响应函数;如果让控件的拥有者相对应的对象处理这个消息,那么应该在改对象的类中实现“WM_XXX”普通响应函数,并针对这个控件绑定的对象设计代码。














  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Option Compare Database Option Explicit Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" _ (ByVal dwExStyle As Long, _ ByVal lpClassName As String, _ ByVal lpWindowName As String, _ ByVal dwStyle As Long, _ ByVal x As Long, _ ByVal y As Long, _ ByVal nWidth As Long, _ ByVal nHeight As Long, _ ByVal hWndParent As Long, _ ByVal hMenu As Long, _ ByVal hInstance As Long, _ lpParam As Any) As Long Declare Function LoadIcon Lib "user32" Alias "LoadIconA" _ (ByVal hInstance As Long, _ ByVal lpIconName As String) As Long Declare Function LoadCursor Lib "user32" Alias "LoadCursorA" _ (ByVal hInstance As Long, _ ByVal lpCursorName As String) As Long Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long Declare Function RegisterClassEx Lib "user32" Alias "RegisterClassExA" _ (pcWndClassEx As WNDCLASSEX) As Integer Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, _ ByVal nCmdShow As Long) As Long Declare Function UpdateWindow Lib "user32" (ByVal hwnd As Long) As Long Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long Declare Function PostMessage Lib "user32" Alias "ostMessageA" _ (ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" _ (ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Declare Function GetMessage Lib "user32" Alias "GetMessageA" _ (lpMsg As MSG, _ ByVal hwnd As Long, _ ByVal wMsgFilterMin As Long, _ ByVal wMsgFilterMax As Long) As Long Declare Function TranslateMessage Lib "user32" (lpMsg As MSG) As Long Declare Function DispatchMessage Lib "user32" Alias "DispatchMessageA" (lpMsg As MSG) As Long Declare Sub PostQuitMessage Lib "user32" (ByVal nExitCode As Long) Declare Function BeginPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long Declare Function EndPaint Lib "user32" (ByVal hwnd As Long, lpPaint As PAINTSTRUCT) As Long Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, _ ByVal lpStr As String, _ ByVal nCount As Long, _ lpRect As RECT, _ ByVal wFormat As Long) As Long Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, _ ByVal crKey As Long, _ ByVal bAlpha As Byte, _ ByVal dwFlags As Long) As Long Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ (ByVal hwnd As Long, _ ByVal nIndex As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ (ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Type WNDCLASSEX cbSize As Long style As Long lpfnWndProc As Long cbClsExtra As Long cbWndExtra As Long hInstance As Long hIcon As Long hCursor As Long hbrBackground As Long lpszMenuName As String lpszClassName As String hIconSm As Long End Type Type POINTAPI x As Long y As Long End Type Type MSG hwnd As Long message As Long wParam As Long lParam As Long time As Long pt As POINTAPI End Type Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Type PAINTSTRUCT hdc As Long fErase As Long rcPaint As RECT fRestore As Long fIncUpdate As Long rgbReserved(32) As Byte End Type Public Const WS_VISIBLE As Long = &H10000000 Public Const WS_VSCROLL As Long = &H200000 Public Const WS_TABSTOP As Long = &H10000 Public Const WS_THICKFRAME As Long = &H40000 Public Const WS_MAXIMIZE As Long = &H1000000 Public Const WS_MAXIMIZEBOX As Long = &H10000 Public Const WS_MINIMIZE As Long = &H20000000 Public Const WS_MINIMIZEBOX As Long = &H20000 Public Const WS_SYSMENU As Long = &H80000 Public Const WS_BORDER As Long = &H800000 Public Const WS_CAPTION As Long = &HC00000 Public Const WS_CHILD As Long = &H40000000 Public Const WS_CHILDWINDOW As Long = (WS_CHILD) Public Const WS_CLIPCHILDREN As Long = &H2000000 Public Const WS_CLIPSIBLINGS As Long = &H4000000 Public Const WS_DISABLED As Long = &H8000000 Public Const WS_DLGFRAME As Long = &H400000 Public Const WS_EX_ACCEPTFILES As Long = &H10& Public Const WS_EX_DLGMODALFRAME As Long = &H1& Public Const WS_EX_NOPARENTNOTIFY As Long = &H4& Public Const WS_EX_TOPMOST As Long = &H8& Public Const WS_EX_TRANSPARENT As Long = &H20& Public Const WS_GROUP As Long = &H20000 Public Const WS_HSCROLL As Long = &H100000 Public Const WS_ICONIC As Long = WS_MINIMIZE Public Const WS_OVERLAPPED As Long = &H0& Public Const WS_OVERLAPPEDWINDOW As Long = (WS_OVERLAPPED Or _ WS_CAPTION Or _ WS_SYSMENU Or _ WS_THICKFRAME Or _ WS_MINIMIZEBOX Or _ WS_MAXIMIZEBOX) Public Const WS_POPUP As Long = &H80000000 Public Const WS_POPUPWINDOW As Long = (WS_POPUP Or WS_BORDER Or WS_SYSMENU) Public Const WS_SIZEBOX As Long = WS_THICKFRAME Public Const WS_TILED As Long = WS_OVERLAPPED Public Const WS_TILEDWINDOW As Long = WS_OVERLAPPEDWINDOW Public Const CW_USEDEFAULT As Long = &H80000000 Public Const CS_HREDRAW As Long = &H2 Public Const CS_VREDRAW As Long = &H1 Public Const IDI_APPLICATION As Long = 32512& Public Const IDC_ARROW As Long = 32512& Public Const WHITE_BRUSH As Integer = 0 Public Const BLACK_BRUSH As Integer = 4 Public Const WM_KEYDOWN As Long = &H100 Public Const WM_CLOSE As Long = &H10 Public Const WM_DESTROY As Long = &H2 Public Const WM_PAINT As Long = &HF Public Const SW_SHOWNORMAL As Long = 1 Public Const DT_CENTER As Long = &H1 Public Const DT_SINGLELINE As Long = &H20 Public Const DT_VCENTER As Long = &H4 Public Const WS_EX_PALETTEWINDOW As Long = &H188 Public Const LWA_ALPHA = &H2 Public Const GWL_EXSTYLE = (-20) Public Const WS_EX_LAYERED = &H80000 Dim strMessage As String '------------------------------------------------------------------------------- Public Function displayMessage(mess As String) As Long strMessage = mess Const CLASSNAME = "我的信息提示~" Const TITLE = "透明提示框!" Dim hwnd As Long Dim wc As WNDCLASSEX Dim message As MSG wc.cbSize = Len(wc) wc.style = CS_HREDRAW Or CS_VREDRAW wc.lpfnWndProc = GetFuncPtr(AddressOf WindowProc) wc.cbClsExtra = 0& wc.cbWndExtra = 0& wc.hInstance = Application.hWndAccessApp wc.hIcon = LoadIcon(Application.hWndAccessApp, IDI_APPLICATION) wc.hCursor = LoadCursor(Application.hWndAccessApp, IDC_ARROW) wc.hbrBackground = GetStockObject(WHITE_BRUSH) wc.lpszMenuName = 0& wc.lpszClassName = CLASSNAME wc.hIconSm = LoadIcon(Application.hWndAccessApp, IDI_APPLICATION) RegisterClassEx wc hwnd = CreateWindowEx(WS_EX_PALETTEWINDOW, _ CLASSNAME, _ TITLE, _ WS_OVERLAPPEDWINDOW, _ 300, _ 100, _ 200, _ 300, _ 0&, _ 0&, _ Application.hWndAccessApp, _ 0&) ShowWindow hwnd, SW_SHOWNORMAL UpdateWindow hwnd SetFocus hwnd Do While 0 <> GetMessage(message, 0&, 0&, 0&) TranslateMessage message DispatchMessage message Loop displayMessage = message.wParam End Function '-------------------------------------------------------------------------------- Public Function WindowProc(ByVal hwnd As Long, _ ByVal message As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Dim ps As PAINTSTRUCT Dim rc As RECT Dim hdc As Long Select Case message Case WM_PAINT hdc = BeginPaint(hwnd, ps) Call GetClientRect(hwnd, rc) Call DrawText(hdc, strMessage, Len(strMessage), rc, DT_SINGLELINE Or _ DT_CENTER Or DT_VCENTER) Call EndPaint(hwnd, ps) Dim Ret As Long Ret = GetWindowLong(hwnd, GWL_EXSTYLE) Ret = Ret Or WS_EX_LAYERED SetWindowLong hwnd, GWL_EXSTYLE, Ret SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA Exit Function Case WM_KEYDOWN Call PostMessage(hwnd, WM_CLOSE, 0, 0) Exit Function Case WM_DESTROY PostQuitMessage 0& Exit Function Case Else WindowProc = DefWindowProc(hwnd, message, wParam, lParam) End Select End Function '-------------------------------------------------------------------------------- Function GetFuncPtr(ByVal lngFnPtr As Long) As Long GetFuncPtr = lngFnPtr End Function 使用方法: 本帖隐藏的内容 Sub text() Call displayMessage("输入需要警示的内容~") End Sub
Selecting the "Horizontal Scroll" and "Verticla Scroll" styles among the properties of your dialog box in the resource editor, you can add scroll bars to the dialog box. Remember also to select the 'resizing' border style. However for adding functionality to the scroll bars, you need to override the WM_VSCROLL and WM_HSCROLL message handlers. Also,override the WM_SIZE handler to set the scroll bar range if the size is reduced than the original. So you get the original size of the dialog in your OninitDialog(). The code would look something like this. Modify to your needs. 1. To OnInitDialog(),add the following line. GetWindowRect(m_rect); m_nScrollPos = 0; to get the original window size. Make m_rect a member variable of your dialog. Add another variable m_nScrollPos and initialize its value to zero. It stores the current vertical scroll position. 2. Here is the WM_SIZE handler for setting the scroll bar range.Set range 0 if size is increased more than original. void CCharlesDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: Add your message handler code here m_nCurHeight = cy; int nScrollMax; if (cy < m_rect.Height()) { nScrollMax = m_rect.Height() - cy; } else nScrollMax = 0; SCROLLINFO si; si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_ALL;// SIF_ALL = SIF_PAGE | SIF_RANGE | SIF_POS; si.nMin = 0; si.nMax = nScrollMax; si.nPage = si.nMax/10; si.nPos = 0; SetScrollInfo(SB_VERT, &si, TRUE); } You need m_nCurHeight to store the current height of the dialog and use it to handle the scrolling in OnVScroll. m_ncurHeight is also a member variable of the dialog. 3. Here is the handler for WM_VSCROLL. void CCharlesDlg::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar) { //TODO:Add your message handler code here and/or call default int nDelta; int nMaxPos = m_rect.Height() - m_nCurHeight; switch(nSBCode) { case SB_LINEDOWN: if (m_nScrollPos >= nMaxPos) return; nDelta = min(nMaxPos/100,nMaxPos-m_nScrollPos); break; case SB_LINEUP: if (m_nScrollPos <= 0) return; nDelta = -min(nMaxPos/100,m_nScrollPos); break; case SB_PAGEDOWN: if (m_nScrollPos >= nMaxPos) return; nDelta = min(nMaxPos/10,nMaxPos-m_nScrollPos); break; case SB_THUMBPOSITION: nDelta = (int)nPos - m_nScrollPos; break; case SB_PAGEUP: if (m_nScrollPos <= 0) return; nDelta = -min(nMaxPos/10,m_nScrollPos); break; default: return; } m_nScrollPos += nDelta; SetScrollPos(SB_VERT,m_nScrollPos,TRUE); ScrollWindow(0,-nDelta); CDialog::OnVScroll(nSBCode, nPos, pScrollBar); } The above code handles the vertical scrolling. For horizontal scrolling add the WM_HSCROLL similarly and add the necessary code to OnSize and OnInitDialog. Information provided in this document and any software that may accompany this document is provided "as is" without warranty of any kind, either expressed or implied, including but not limited to the implied warranties of merchantability and/or fitness for a particular purpose. The user assumes the entire risk as to the accuracy and the use of this information.
消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。 消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,它在Windows单元中是这样声明的: type TMsg = packed record hwnd: HWND; //窗口句柄 message: UINT;//消息常量标识符 wParam: WPARAM ;// 32位消息的特定附加信息 lParam: LPARAM ;// 32位消息的特定附加信息 time: DWORD;//消息创建时的时间 pt: TPoint; //消息创建时的鼠标位置 end ; 消息中有什么? 是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可 视对象的句柄(窗口、对话框、按钮、编辑框等)。message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也 可以是自定义的常量。 wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。 lParam 通常是一个指向内存中数据的指针。由于WParam、lParam和Pointer都是32位的,因此,它们之间可以相互转换。 WM_NULL =$0000 // WM_CREATE =$0001 //应用程序创建一个窗口 WM_DESTROY = $0002 //一个窗口被销毁 WM_MOVE = $0003 //移动一个窗口 WM_SIZE= $0005 //改变一个窗口的大小 WM_ACTIVATE= $0006 //一个窗口被激活或失去激活状态; WM_SETFOCUS= $0007 //获得焦点后 WM_KILLFOCUS= $0008 //失去焦点 WM_ENABLE= $000A //改变enable状态 WM_SETREDRAW= $000B //设置窗口是否能重画 WM_SETTEXT= $000C //应用程序发送此消息来设置一个窗口的文本 WM_GETTEXT = $000D //应用程序发送此消息来复制对应窗口的文本到缓冲区 WM_GETTEXTLENGTH = $000E //得到与一个窗口有关的文本的长度(不包含空字符) WM_PAINT = $000F //要求一个窗口重画自己 WM_CLOSE = $0010 //当一个窗口或应用程序要关闭时发送一个信号 WM_QUERYENDSESSION= $0011 //当用户选择结束对话框或程序自己调用ExitWindows函数 WM_QUIT= $0012 //用来结束程序运行或当程序调用postquitmessage函数 WM_QUERYOPEN = $0013 //当用户窗口恢复以前的大小位置时,把此消息发送给某个图标 WM_ERASEBKGND = $0014 //当窗口背景必须被擦除时(例在窗口改变大小时) WM_SYSCOLORCHANGE = $0015 //当系统颜色改变时,发送此消息给所有顶级窗口 WM_ENDSESSION = $0016 // 当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,通知它对话是否结束 WM_SYSTEMERROR = $0017 // WM_SHOWWINDOW= $0018 //当隐藏或显示窗口是发送此消息给这个窗口 WM_ACTIVATEAPP = $001C //发此消息给应用程序哪个窗口是激活的,哪个是非激活的; WM_FONTCHANGE= $001D //当系统的字体资源库变化时发送此消息给所有顶级窗口 WM_TIMECHANGE= $001E //当系统的时间变化时发送此消息给所有顶级窗口 WM_CANCELMODE= $001F //发送此消息来取消某种正在进行的摸态(操作) WM_SETCURSOR = $0020 //如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口 WM_MOUSEACTIVATE = $0021 //当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口 WM_CHILDACTIVATE = $0022 //发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小 WM_QUEUESYNC= $0023 //此消息由基

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值