`
wo_deqing
  • 浏览: 64213 次
文章分类
社区版块
存档分类
最新评论

VC添加自定义消息

 
阅读更多

VC的ClassWizard不允许增加用户自定义消息,所以你必须手工进行添加。当你添加了自定义的消息以后,ClassWizard就可以像处理其它消息一样处理你定义的消息了。
一、VC6添加自定义消息
1、定义消息。在Windows中,所有的消息都用一个特定的整数值来表示,为了避免自定义消息与已存在的其他消息发生冲突,应该利用Windows提供的一个常量:WM_USER,小于这个常量的是系统保留的。即用户自定义的消息至少为WM_USER+1,注意最后表示的消息的数值不要超过0x7FFF。在开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
#define UM_PROGRESS WM_USER + 100
2、在类头文件的AFX_MSG块中声明消息处理函数:
class CMainFrame:public CFrameWnd{
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnProgress(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
3、在类的实现文件中,使用ON_MESSAGE宏指令将消息映射到消息处理表中。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(UM_PROGRESS, OnProgress)//注意这条语句的后面没有分号
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
4、实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。
LPESULT CMainFrame::OnProgress(WPARAM wParam,LPARAM lParam){
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect); //获得窗格区域
//创建进度栏,注意第三个参数为CWnd* pParentWnd,根据情况选择父窗体
m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_VERTICAL,rect,this,123);
m_progress.SetPos(50);
return 0;
}
5、在适当的时候发送自定义消息,进行消息处理。需要注意使用SendMessage还是PostMessage进行处理:SendMessage是消息处理完毕后再返回;而PostMessage则是把消息放到消息队列后立即返回。
SendMessage(UM_PROGRESS);
PostMessage(UM_PROGRESS);
如果用户需要整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。
二、VC2003添加自定义消息
在VC2003中添加自定义消息和VC6基本一致。需要注意的是VC6处理的消息可以没有参数,但VC2003消息处理的函数必须带有两个参数wParam和lParam,并且其返回值类型为LRESULT。这里,还有另一种方法可以实现地定义消息的处理(VC6和VC2003均适用):
1、定义消息:#define UM_PROGRESS WM_USER + 100
2、重载CMainFrame的DefWindowProc函数,然后添加对用户自定义消息处理:
LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam,

LPARAM lParam){
switch(message){
case UM_PROGRESS:{
//通过指定资源ID获得相应的索引
int index = m_wndStatusBar.CommandToIndex(IDS_PROGRESS);
CRect rect;
m_wndStatusBar.GetItemRect(index,&rect);
m_progress.Create(WS_CHILD|WS_VISIBLE,rect,
&m_wndStatusBar
,123);
m_progress.SetPos(50);
break;
}
default:
break;
}
return CFrameWnd::DefWindowProc(message, wParam, lParam);
}

何谓消息、消息处理函数、消息映射?
消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。具体的某个操作是你写的一系列代码。称为消息处理函数。在SDK中消息其实非常容易理解,当窗口建立后便会有一个函数(窗口处理函数)开始执行一个消息循环,我们还可以清楚的看到消息处理的脉络。一个switchcase语句就可以搞定,消息循环直到遇到WM_QUIT消息才会结束,其余的消息均被拦截后调用相应的处理函数。但在封装了API的MFC中,消息似乎变的有些复杂了,我们看不到熟悉的switchcase语句了,取而代之的是一个叫消息映射的东西。为什么MFC要引入消息映射机制,你可以想象一下,在现在的程序开发活动中,你的一个程序是否拥有多个窗体,主窗口就算只有一个,那菜单、工具条、控件这些都是子窗口,那我们需要写多少个switchcase,并且还要为每个消息分配一个消息处理函数,这样做是多么的复杂呀。因此MFC采用了一种新的机制。利用一个数组,将窗口消息和相对应的消息处理函数进行映射,你可以理解成这是一个表。这种机制就是消息映射。这张表在窗口基类CWnd定义,派生类的消息映射表如果你没有动作它是空的,也就是说如果你不手工的增加消息处理函数,则当派生窗口接受一个消息时会执行父类的消息处理函数。这样做显然是高效的。
MFC提供的消息结构
同时MFC定义了下面的两个主要结构:
AFX_MSGMAP_ENTRY
struct AFX_MSGMAP_ENTRY{
UINT nMessage; // Windows消息的ID号
UINT nCode; // 控制消息的通知
UINT nID; // Windows控制消息的ID
UINT nLastID; //表示是一个指定范围的消息被映射的范围
UINT nSig; //表示消息的动作标识
AFX_PMSG pfn; // 指向消息处理函数的指针
};
AFX_MSGMAP
struct AFX_MSGMAP{
#ifdef _AFXDLL
const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
#else
const AFX_MSGMAP* pBaseMap;
#endif
const AFX_MSGMAP_ENTRY* lpEntries;
};
///AFX_MSGMAP可以得到基类的消息映射入口地址和得到本身的消息映射入口地址。

MFC下一个消息的处理过程是一般是这样的。
1、_AfxCbtFilterHook截获消息(这是一个钩子函数)
2、_AfxCbtFilterHook把窗口过程设定为AfxWndProc。
3、函数AfxWndProc接收Windows操作系统发送的消息。
4、函数AfxWndProc调用函数AfxCallWndProc进行消息处理。
5、函数AfxCallWndProc调用CWnd类的方法WindowProc进行消息处理。

如何添加自己的消息?
我们已经了解了WINDOW的消息机制,如何加入我们自己的消息呢?好我们来看
一个标准的消息处理程序是这个样子的
在 CWnd 类中预定义了标准 Windows 消息 (WM_XXXX WM是WINDOW MESSAGE的缩写) 的默认处理程序。类库基于消息名命名这些处理程序。例如,WM_PAINT 消息的处理程序在 CWnd 中被声明为:
afx_msg void OnPaint();
afx_msg 关键字通过使这些处理程序区别于其他 CWnd 成员函数来表明 C++ virtual 关键字的作用。但是请注意,这些函数实际上并不是虚拟的,而是通过消息映射实现的。我们在本文的一开始便说明了为什么要这样做。
所有能够进行消息处理的类都是基于CCmdTarget类的,也就是说CCmdTarget类是所有可以进行消息处理类的父类。CCmdTarget类是MFC处理命令消息的基础和核心。

若要重写基类中定义的处理程序,只需在派生类中定义一个具有相同原型的函数,并创建此处理程序的消息映射项。我们通过ClassWizard可以建立大多数窗口消息或自定义的消息,通过ClassWizard可以自动建立消息映射,和消息处理函数的框架,我们只需要把我们要做的事情填空,添加你要做的事情到处理函数。这个非常简单,就不细说了。但是也许我们需要添加一些ClassWizard不支持的窗口消息或自定义消息,那么就需要我们亲自动手建立消息映射和消息处理的框架,通常步骤如下:
第一步:定义消息。Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
#define WM_MYMESSAGE (WM_USER + 100)

第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息,填空就是要填到这里。
return 0;
}
第三步:在类头文件的AFX_MSG块中说明消息处理函数:
// {{AFX_MSG(CMainFrame)
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
ON_MESSAGE( WM_MYMESSAGE, OnMyMessage )

可以看出,用户自定义的消息和我们通过ClassWizard添加的消息一样,都是利用了ON_MESSAGE宏,建立的消息映射。

其实消息类别可以分成多种,上面说的只是其中之一。有三种主要的消息类别:(以下部分摘自MSDN)
1、Windows 消息
此类消息主要包括以前缀 WM_ 开头的消息,WM_COMMAND 除外。Windows 消息由窗口和视图处理。此类消息往往带有用于确定如何处理消息的参数。
2、控件通知
此类消息包括从控件和其他子窗口发送到其父窗口的 WM_COMMAND 通知消息。例如,当用户在编辑控件 (Edit Control)中执行可能更改文本的操作后,该编辑控件 (Edit Control) 将向其父级发送包含 EN_CHANGE 控件通知代码的WM_COMMAND 消息。该消息的窗口处理程序以某种适当的方式响应此通知消息,例如在控件中检索该文本。
框架像传送其他 WM_ 消息一样传送控件通知消息。但是有一个例外的情况,即当用户单击按钮时由按钮发送的 BN_CLICKED 控件通知消息。该消息被作为命令消息特别处理,并像其他命令一样传送。
3、命令消息
此类消息包括用户界面对象(菜单、工具栏按钮和快捷键)发出的 WM_COMMAND 通知消息。框架处理命令的方式与处理其他消息不同,可以使用更多种类的对象处理命令。
Windows 消息和控件通知消息由窗口来处理(窗口是从 CWnd 类派生的类的对象)。包括CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及从这些基类派生的您自己的类。这些对象封装了 HWND——Windows 窗口的句柄。
命令消息可以由范围更广的对象(文档、文档模板以及应用程序对象本身)处理,而不仅仅由窗口和视图处理。当某一命令直接影响到某个特定对象时,应当让该对象处理此命令。例如,“文件”菜单中的“打开”命令在逻辑上与应用程序相关联:该应用程序接收到此命令时会打开指定的文档。因此“打开”命令的处理程序是应用程序类的成员函数。

命令消息我们比较常见的便是菜单项和工具条了,大家可以看到他的消息映射宏和窗口消息不太一样,一般的形式是这样的
ON_COMMAND(id,memberFxn)
第一个参数是命令ID,一个ID号对应一个消息处理,当然你可以让多个ID共用一个处理函数。常见的应用例如:菜单项打开文档的ID和工具条按钮打开文档的ID同时使用一个处理函数,或者直接将它们的ID设成相同的。

还有一种消息叫通知消息。例如树型控件的等一些复杂的控件在单击后需要传递更多的信息,例如光标的位置和当前项的一个结构,所以MFC为控件的每个通知消息也定义了一个宏,它长成了这个样子:
ON_CONTROL(EN_CHANGE,id,memberFxn)

还有很多种消息存在于MFC,宏定义有区别,大家可以触类旁通。

窗口消息有上百个。你可以从MSDN上查到WM_开头的,或者查看CWnd的成员函数,会给你列出很多,别忘了还有很多非窗口消息。雷神无法一一列出,也没有必要。大家查一下就行了。不过对一些常用的、新的控件消息和特殊的通知消息我还是把他们列出几个表,大家做个参考吧。

表一:常见的消息映射宏
消息映射宏 消息映射宏.jpg

表二:常见并通用的窗口消息
常见并通用的窗口消息 通用窗口消息.jpg

表三:WIN32新控件共有的通知消息
说明 通用窗口消息.jpg

表四:特殊的通知消息
说明 特殊的通知消息.jpg

说到这里其实才是一个开始,关于消息还有很多的内容没有说到,大家可以在实际应用时体会

VC的ClassWizard不允许增加用户自定义消息,所以你必须手工进行添加。当你添加了自定义的消息以后,ClassWizard就可以像处理其它消息一样处理你定义的消息了。
一、VC6添加自定义消息
1、定义消息。在Windows中,所有的消息都用一个特定的整数值来表示,为了避免自定义消息与已存在的其他消息发生冲突,应该利用Windows提供的一个常量:WM_USER,小于这个常量的是系统保留的。即用户自定义的消息至少为WM_USER+1,注意最后表示的消息的数值不要超过0x7FFF。在开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
#define UM_PROGRESS WM_USER + 100
2、在类头文件的AFX_MSG块中声明消息处理函数:
class CMainFrame:public CFrameWnd{
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnProgress(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
3、在类的实现文件中,使用ON_MESSAGE宏指令将消息映射到消息处理表中。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(UM_PROGRESS, OnProgress)//注意这条语句的后面没有分号
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
4、实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。
LPESULT CMainFrame::OnProgress(WPARAM wParam,LPARAM lParam){
CRect rect;
m_wndStatusBar.GetItemRect(2,&rect); //获得窗格区域
//创建进度栏,注意第三个参数为CWnd* pParentWnd,根据情况选择父窗体
m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_VERTICAL,rect,this,123);
m_progress.SetPos(50);
return 0;
}
5、在适当的时候发送自定义消息,进行消息处理。需要注意使用SendMessage还是PostMessage进行处理:SendMessage是消息处理完毕后再返回;而PostMessage则是把消息放到消息队列后立即返回。
SendMessage(UM_PROGRESS);
PostMessage(UM_PROGRESS);
如果用户需要整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。
二、VC2003添加自定义消息
在VC2003中添加自定义消息和VC6基本一致。需要注意的是VC6处理的消息可以没有参数,但VC2003消息处理的函数必须带有两个参数wParam和lParam,并且其返回值类型为LRESULT。这里,还有另一种方法可以实现地定义消息的处理(VC6和VC2003均适用):
1、定义消息:#define UM_PROGRESS WM_USER + 100
2、重载CMainFrame的DefWindowProc函数,然后添加对用户自定义消息处理:
LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam,

LPARAM lParam){
switch(message){
case UM_PROGRESS:{
//通过指定资源ID获得相应的索引
int index = m_wndStatusBar.CommandToIndex(IDS_PROGRESS);
CRect rect;
m_wndStatusBar.GetItemRect(index,&rect);
m_progress.Create(WS_CHILD|WS_VISIBLE,rect,
&m_wndStatusBar
,123);
m_progress.SetPos(50);
break;
}
default:
break;
}
return CFrameWnd::DefWindowProc(message, wParam, lParam);
}

何谓消息、消息处理函数、消息映射?
消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。具体的某个操作是你写的一系列代码。称为消息处理函数。在SDK中消息其实非常容易理解,当窗口建立后便会有一个函数(窗口处理函数)开始执行一个消息循环,我们还可以清楚的看到消息处理的脉络。一个switchcase语句就可以搞定,消息循环直到遇到WM_QUIT消息才会结束,其余的消息均被拦截后调用相应的处理函数。但在封装了API的MFC中,消息似乎变的有些复杂了,我们看不到熟悉的switchcase语句了,取而代之的是一个叫消息映射的东西。为什么MFC要引入消息映射机制,你可以想象一下,在现在的程序开发活动中,你的一个程序是否拥有多个窗体,主窗口就算只有一个,那菜单、工具条、控件这些都是子窗口,那我们需要写多少个switchcase,并且还要为每个消息分配一个消息处理函数,这样做是多么的复杂呀。因此MFC采用了一种新的机制。利用一个数组,将窗口消息和相对应的消息处理函数进行映射,你可以理解成这是一个表。这种机制就是消息映射。这张表在窗口基类CWnd定义,派生类的消息映射表如果你没有动作它是空的,也就是说如果你不手工的增加消息处理函数,则当派生窗口接受一个消息时会执行父类的消息处理函数。这样做显然是高效的。
MFC提供的消息结构
同时MFC定义了下面的两个主要结构:
AFX_MSGMAP_ENTRY
struct AFX_MSGMAP_ENTRY{
UINT nMessage; // Windows消息的ID号
UINT nCode; // 控制消息的通知
UINT nID; // Windows控制消息的ID
UINT nLastID; //表示是一个指定范围的消息被映射的范围
UINT nSig; //表示消息的动作标识
AFX_PMSG pfn; // 指向消息处理函数的指针
};
AFX_MSGMAP
struct AFX_MSGMAP{
#ifdef _AFXDLL
const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
#else
const AFX_MSGMAP* pBaseMap;
#endif
const AFX_MSGMAP_ENTRY* lpEntries;
};
///AFX_MSGMAP可以得到基类的消息映射入口地址和得到本身的消息映射入口地址。

MFC下一个消息的处理过程是一般是这样的。
1、_AfxCbtFilterHook截获消息(这是一个钩子函数)
2、_AfxCbtFilterHook把窗口过程设定为AfxWndProc。
3、函数AfxWndProc接收Windows操作系统发送的消息。
4、函数AfxWndProc调用函数AfxCallWndProc进行消息处理。
5、函数AfxCallWndProc调用CWnd类的方法WindowProc进行消息处理。

如何添加自己的消息?
我们已经了解了WINDOW的消息机制,如何加入我们自己的消息呢?好我们来看
一个标准的消息处理程序是这个样子的
在 CWnd 类中预定义了标准 Windows 消息 (WM_XXXX WM是WINDOW MESSAGE的缩写) 的默认处理程序。类库基于消息名命名这些处理程序。例如,WM_PAINT 消息的处理程序在 CWnd 中被声明为:
afx_msg void OnPaint();
afx_msg 关键字通过使这些处理程序区别于其他 CWnd 成员函数来表明 C++ virtual 关键字的作用。但是请注意,这些函数实际上并不是虚拟的,而是通过消息映射实现的。我们在本文的一开始便说明了为什么要这样做。
所有能够进行消息处理的类都是基于CCmdTarget类的,也就是说CCmdTarget类是所有可以进行消息处理类的父类。CCmdTarget类是MFC处理命令消息的基础和核心。

若要重写基类中定义的处理程序,只需在派生类中定义一个具有相同原型的函数,并创建此处理程序的消息映射项。我们通过ClassWizard可以建立大多数窗口消息或自定义的消息,通过ClassWizard可以自动建立消息映射,和消息处理函数的框架,我们只需要把我们要做的事情填空,添加你要做的事情到处理函数。这个非常简单,就不细说了。但是也许我们需要添加一些ClassWizard不支持的窗口消息或自定义消息,那么就需要我们亲自动手建立消息映射和消息处理的框架,通常步骤如下:
第一步:定义消息。Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
#define WM_MYMESSAGE (WM_USER + 100)

第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息,填空就是要填到这里。
return 0;
}
第三步:在类头文件的AFX_MSG块中说明消息处理函数:
// {{AFX_MSG(CMainFrame)
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
ON_MESSAGE( WM_MYMESSAGE, OnMyMessage )

可以看出,用户自定义的消息和我们通过ClassWizard添加的消息一样,都是利用了ON_MESSAGE宏,建立的消息映射。

其实消息类别可以分成多种,上面说的只是其中之一。有三种主要的消息类别:(以下部分摘自MSDN)
1、Windows 消息
此类消息主要包括以前缀 WM_ 开头的消息,WM_COMMAND 除外。Windows 消息由窗口和视图处理。此类消息往往带有用于确定如何处理消息的参数。
2、控件通知
此类消息包括从控件和其他子窗口发送到其父窗口的 WM_COMMAND 通知消息。例如,当用户在编辑控件 (Edit Control)中执行可能更改文本的操作后,该编辑控件 (Edit Control) 将向其父级发送包含 EN_CHANGE 控件通知代码的WM_COMMAND 消息。该消息的窗口处理程序以某种适当的方式响应此通知消息,例如在控件中检索该文本。
框架像传送其他 WM_ 消息一样传送控件通知消息。但是有一个例外的情况,即当用户单击按钮时由按钮发送的 BN_CLICKED 控件通知消息。该消息被作为命令消息特别处理,并像其他命令一样传送。
3、命令消息
此类消息包括用户界面对象(菜单、工具栏按钮和快捷键)发出的 WM_COMMAND 通知消息。框架处理命令的方式与处理其他消息不同,可以使用更多种类的对象处理命令。
Windows 消息和控件通知消息由窗口来处理(窗口是从 CWnd 类派生的类的对象)。包括CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog以及从这些基类派生的您自己的类。这些对象封装了 HWND——Windows 窗口的句柄。
命令消息可以由范围更广的对象(文档、文档模板以及应用程序对象本身)处理,而不仅仅由窗口和视图处理。当某一命令直接影响到某个特定对象时,应当让该对象处理此命令。例如,“文件”菜单中的“打开”命令在逻辑上与应用程序相关联:该应用程序接收到此命令时会打开指定的文档。因此“打开”命令的处理程序是应用程序类的成员函数。

命令消息我们比较常见的便是菜单项和工具条了,大家可以看到他的消息映射宏和窗口消息不太一样,一般的形式是这样的
ON_COMMAND(id,memberFxn)
第一个参数是命令ID,一个ID号对应一个消息处理,当然你可以让多个ID共用一个处理函数。常见的应用例如:菜单项打开文档的ID和工具条按钮打开文档的ID同时使用一个处理函数,或者直接将它们的ID设成相同的。

还有一种消息叫通知消息。例如树型控件的等一些复杂的控件在单击后需要传递更多的信息,例如光标的位置和当前项的一个结构,所以MFC为控件的每个通知消息也定义了一个宏,它长成了这个样子:
ON_CONTROL(EN_CHANGE,id,memberFxn)

还有很多种消息存在于MFC,宏定义有区别,大家可以触类旁通。

窗口消息有上百个。你可以从MSDN上查到WM_开头的,或者查看CWnd的成员函数,会给你列出很多,别忘了还有很多非窗口消息。雷神无法一一列出,也没有必要。大家查一下就行了。不过对一些常用的、新的控件消息和特殊的通知消息我还是把他们列出几个表,大家做个参考吧。

表一:常见的消息映射宏
消息映射宏 消息映射宏.jpg

表二:常见并通用的窗口消息
常见并通用的窗口消息 通用窗口消息.jpg

表三:WIN32新控件共有的通知消息
说明 通用窗口消息.jpg

表四:特殊的通知消息
说明 特殊的通知消息.jpg

说到这里其实才是一个开始,关于消息还有很多的内容没有说到,大家可以在实际应用时体会
分享到:
评论

相关推荐

    VC6自定义消息WM_USER

    在窗口过程(`WndProc`)中,我们需要添加对自定义消息的处理。在`switch`语句中增加一个`case`分支来处理`WM_MYCUSTOMMSG`: ```c++ switch (message) { case WM_MYCUSTOMMSG: // 自定义消息的处理代码 ...

    VC发送自定义消息

    2. 在消息映射中添加对自定义消息的处理,如上述`ON_MESSAGE`的例子所示。 3. 在源代码中,可能有一个按钮或事件触发发送自定义消息,例如在按钮的点击事件处理函数中调用`SendMessage`。 4. `OnMyCustomMessage`...

    VC中自定义消息的传递

    2. **消息映射**: 在接收自定义消息的类中,我们需要在消息映射表中添加一条对应的消息映射项。例如: ```cpp BEGIN_MESSAGE_MAP(CMyClass, CDialog) ... ON_MESSAGE(WM_MYCUSTOMMSG, &CMyClass::OnMyCustomMsg) ...

    VC中添加响应自定义的消息的代码步骤

    在VC(Visual C++)开发环境中,自定义消息的处理是一项常见且实用的功能,它允许开发者为应用程序添加特定的行为响应,以实现更为复杂和灵活的交互逻辑。下面将详细解析如何在VC中添加并响应自定义消息的具体步骤,...

    vc自定义消息实例

    在这个“vc自定义消息实例”中,我们将探讨如何在VC++环境下创建和处理自定义消息,这对于扩展Windows API功能和实现特定功能是非常有用的。 自定义消息是在Windows消息系统中,程序员为应用程序定义的非标准消息...

    VC++6.0下强大的自定义消息程序的编写

    ### VC++6.0下强大的自定义消息程序的编写 #### 概述 在Windows编程中,使用Visual C++ 6.0(简称VC++6.0)进行开发时,自定义消息是一种非常实用的技术。它能够帮助程序员更加灵活地控制程序的行为、状态更新以及...

    VC-DEFINE-MESSAGE.rar_vc自定义消息

    在`RegisterClass`函数中添加你的自定义消息。例如: ```cpp WNDCLASS wc; wc.lpfnWndProc = MyWindowProc; // 自定义的窗口过程函数 wc.lpszClassName = "MyClass"; wc.style = CS_HREDRAW | CS_VREDRAW; wc....

    在VC项目中使用自定义资源(Code)

    在VC++项目中,自定义资源的使用是一个重要的技术点,尤其对于开发具有特定功能或需求的桌面应用程序来说。自定义资源可以包括图标、位图、对话框、字符串表等,甚至可以是开发者自己定义的数据格式。下面我们将深入...

    VC中实现自定义消息(源码+文档说明)

    本资源主要关注的是如何在MFC中实现自定义消息,并提供了源代码示例和文档说明。自定义消息是扩展Windows消息系统的一种方式,它允许程序员在应用程序内部或者不同组件之间传递特定的信息。 首先,自定义消息的创建...

    visual c++ vc自定义消息弹出框MessageBox上有图片,自定义文字大小和颜色,超链接

    总的来说,通过自定义对话框和巧妙使用MFC控件,开发者可以在VC++环境中创建出功能更加强大的消息弹出框,不仅限于基本的文字提示,还可以包含图片、定制的文字样式和超链接,从而提升用户体验。深入理解和熟练运用...

    vc2008 自定义表格类

    这个"vc2008 自定义表格类"旨在提供一个强大且美观的解决方案,帮助开发者更高效地管理数据展示。下面我们将详细探讨这个自定义表格类的一些关键知识点: 1. **自定义控件**:在Windows应用程序开发中,自定义控件...

    VC中怎样使用sendmessage自定义消息函数

    ### VC中如何使用`SendMessage`自定义消息函数 在Visual C++ (VC) 的MFC框架中,`SendMessage`函数是一种非常重要的通信机制,用于在不同的窗口之间传递信息。通过自定义消息,开发者能够实现更加灵活和高效的功能...

    VC调用自定义工具条按钮窗口的实现

    调用自定义工具条按钮通常涉及消息映射和消息处理。在你的自定义按钮类中,你需要定义消息处理函数,这些函数会响应用户的交互。例如,你可以这样定义: ```cpp ON_BN_CLICKED(IDC_MY_BUTTON, OnMyButtonClick) ```...

    VC实现自定义绘图风格代码

    在VC++编程环境中,自定义绘图风格是创建独特用户界面和交互体验的重要技术。本文将深入探讨如何利用VC++实现一个类似于系统“画笔”应用程序中的“绘图风格”选择窗口,并将其集成到“ControlBar”中。我们将讨论...

    VC各种自定义扩展控件

    自定义扩展可能包括改变按钮的外观(如添加图片、使用不同形状),增加新的行为(如双击触发事件)或者提供更复杂的交互(如下拉菜单)。开发者可以通过重绘按钮的消息处理,或者使用MFC(Microsoft Foundation ...

    VC自定义向导(含控件自绘)

    在这个场景下,"VC自定义向导(含控件自绘)"是一个专为Visual C++(VC)设计的工具,它允许开发者创建自定义的向导式用户界面,并且包含控件自绘功能。控件自绘是指程序直接控制控件的绘制过程,以实现更个性化的界面...

    vc6.0自定义Geoprocessing Tool

    本教程以“vc6.0自定义Geoprocessing Tool”为主题,通过VC++ 6.0这个经典的开发环境,探讨如何实现自定义GP工具,涉及的主要知识点包括IGPFunction和IGPFunctionFactory接口的实现。 1. **Geoprocessing基础**:...

    vc 各种自定义按纽

    标题“vc 各种自定义按纽”表明了这个压缩包文件包含了多种使用VC 6.0实现的自定义按钮示例,非常适合学习界面设计的初学者。 VC 6.0是Microsoft Visual C++的一个版本,它是一个集成开发环境(IDE),用于编写使用...

    一看就懂,一做就会:Window自定义消息

    4. 处理自定义消息:最后,在窗口过程函数`MyWndProc`中,我们需要添加对自定义消息的处理逻辑。当消息队列中有WM_MSG_NOTIFY消息时,程序会调用`MyWndProc`,并根据消息的类型执行相应的代码: ```cpp LRESULT ...

Global site tag (gtag.js) - Google Analytics