MFC消息机制

MfC打开过程详解及应用 本文主要介绍:在MFC中,菜单打开的 阅读详情

作为MFC的一个初学者,在学习到消息机制的时候,一般会有几个问题,下面我将从一一展开。

何谓消息、消息处理、消息映射?

消息

消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息。例如,单击鼠标左按钮,windows将产WM_LBUTTONDOWN消息,而释放鼠标左按钮将产生WM_LBUTTONUP消息,按下键盘上的字母键,将产生WM_CHAR消息。

消息处理

通过输入设备向程序发出指令要执行某个操作,具体的某个操作是你的一系列代码,也就是消息处理函数。

在MFC中,每个专门的处理函数单独处理每个消息。消息处理函数通常是某一类的成员函数,编写消息处理函数是编写框架应用程序的主要任务。可以使用ClassWizard创建消息处事函数,然后从Classwizard直接跳到源文件消息处理函数,编写处理代码。

1、windows消息和控件通知的处理函数
    windows消息和控件通知都是由派生于CWnd的窗口类对象处理的。它们包括CFrameWnd、CMDIFrameWnd、 CMDIChildWnd、CView、CDialog以及从这些派生的用户自定义的类。这样的类对象封装了windows窗口句柄HWND。
    windows消息和控件通知都有默认的处理函数,这些函数在CWnd类中进行了预定义,MFC类库以消息名为基础形成这些处理函数的名称,这些处理函数的名称都以前缀"On"开始。有的处理函数不带参数,有的则有几个参数;有的还有除void以外的返回值类型。CWnd中消息处理函数的说明都有 afx_msg前缀。关键字afx_msg用于把处理函数和其他CWnd成员函数区分开来。例如,消息WM_PAINT的处理函数在CWnd中被声明成:afx_msg void OnPaint();
    windows消息常见的有鼠标消息(如WM_LBUTTONDOWN)消息)、键盘字符消息(WM_CHAR消息)、键盘按键消息(WM_KEYDOWN)、窗口重画消息WM_PAINT,水平和垂直条滚动消息WM_HSCROLL和WM_VSCROLL)以及系统时钟消息 WM_TIMER等。
2、命令消息的处理函数
    由于用户界面的对象是用户自已定义的,每个应用程序的用户界面对象千差万别,所以对用户界面对象的命令消息没有默认的处理函数。如果某条命令直接影响某个对象,则应该让这个对象来处理这条命令。例如FILE菜单上的Open命令当然与应用程序有关:应用程序打开一个特定的文档来响应该命令。所以,Open 命令的处理函数是应用程序类的一个成员函数。

    把命令消息映射成处理函数时,ClassWizard以命令ID来命名处理函数,可以接受、修改、或替换推荐使用的名字。例如,Edit菜单项的Cut命令,对应ID就是ID_EDIT_CUT,处理函数被命名成:afx_msg void OnEditCut();
    此外,对于控件按钮的BN_CLICKED通知消息,其处理函数可以被命名为:

afx_msg void OnClickedUseAsDefault();
  
    命令消息的处理函数没有参数值,也不返回值。

消息映射

在SDK中消息其实非常容易理解,当窗口建立后便会有一个函数(窗口处理函数)开始执行一个消息循环,我们还可以清楚的看到消息处理的脉络。一个switch case语句就可以搞定,消息循环直到遇到WM_QUIT消息才会结束,其余的消息均被拦截后调用相应的处理函数。

但在封装了API的MFC中,消息似乎变的有些复杂了,我们看不到熟悉的switch case语句了,取而代之的是一个叫消息映射的东西。为什么MFC要引入消息映射机制,你可以想象一下,在现在的程序开发活动中,你的一个程序是否拥有多个窗体,主窗口就算只有一个,那菜单、工具条、控件这些都是子窗口,那我们需要写多少个switch case,并且还要为每个消息分配一个消息处理函数,这样做是多么的复杂呀。因此MFC采用了一种新的机制。利用一个数组,将窗口消息和相对应的消息处理函数进行映射,你可以理解成这是一个表,这种表就是消息映射表。这种机制就是消息映射。这张表在窗口基类CWnd定义,派生类的消息映射表如果你没有动作它是空的,也就是说如果你不手工的增加消息处理函数,则当派生窗口接受一个消息时会执行父类的消息处理函数。这样做显然是高效的。

例如,用户在按下鼠标左键时,Windows会发出WM_LBUTTONDOWN消息。MFC提供了一种消息映射机制将用户单击左键发出的WM_LBUTTONDOWN消息和一个函数联系在一起。具体代码为:

afx_msg void OnLButtonDown(UINT nFlags,CPoint point);  //语句的位置在头文件消息声明宏(DECLARE_MESSAGE_MAP)内
ON_WM_LBUTTONDOWN();        //这条语句的位置是在实现文件的消息宏(BEGIN_MESSAGE_MAP宏和END_MESSAGE_MAP之间)内
通过上面两行代码已经建立了消息的映射,用户只需要将所要实现功能的代码写入下面的函数内即可:
void CDlg::OnLuttonDown(UINT nFlags,CPoint point){
    //添加代码
    //CDlg::OnLuttonDown(nFlags,point);
}
MFC中每一个消息都对应一个函数,这样一对一的关系罗列出来就是一个表,如果开发人员需要处理某条消息,只要在消息对应的处理函数中写入代码即可。
消息映射表在MFC中主要是通过三个宏来实现的。这三个宏分别是:
DECLARE_MESSAGE_MAP消息的声明宏
BEGIN_MESSAGE_MAP宏
END_MESSAGE_MAP宏

消息映射宏

一般情况下,一个MFC的消息映射在程序中有三处相关信息:1)消息响应函数的声明 2)消息响应函数实现 3)用来关联消息和消息响应函数的宏
针对不同的 Windows 消息,MFC提供了不同的消息映射宏,主要分为如下六类:
①Windows 消息映射宏  Windows 消息映射宏用于处理普通的窗口消息。此类消息映射宏前缀为“ON_WM_”,并且没有参数;因为它对应的消息和消息处理函数的函数名称、函数原型是确定的。 MFC提供了这类消息处理函数的定义和缺省实现。每个这样的宏处理不同的Windows消息。
例如:宏 ON_WM_CREATE()把消息WM_CREATE映射到OnCreate函数,消息映射条目的第一个成员nMessage指定为要处理的Windows消息的ID,第二个成员nCode指定为0。

②命令消息映射宏  命令消息 WM_COMMAND 是一种特殊的窗口消息,它从一个窗口发送到另一个窗口,以处理来自用户的请求,是 ON_COMMAND 宏和 ON_COMMAND_RANGE 宏;这类宏带有参数,需要通过参数指定命令 ID和消息处理函数。
这些消息都映射到WM_COMMAND上,也就是将消息映射条目的第一个成员nMessage指定为WM_COMMAND,第二个成员nCode指定为CN_COMMAND(即0)。消息处理函数的原型是void (void),不带参数,不返回值。
除了单条命令消息的映射,还有把一定范围的命令消息映射到一个消息处理函数的映射宏 ON_COMMAND_RANGE。这类宏带有参数,需要指定命令ID的范围和消息处理函数。这些消息都映射到WM_COMMAND上,也就是将消息映射条目的第一个成员nMessage指定为WM_COMMAND,第二个成员nCode指定为CN_COMMAND(即0),第三个成员nID和第四个成员nLastID指定了映射消息的起止范围。消息处理函数的原型是void (UINT),有一个UINT类型的参数,表示要处理的命令消息ID,不返回值。
③
控制通知消息映射宏  控制通知消息是指控件窗口发送到其父窗口的消息,其消息映射宏为 ON_CONTROL 和 ON_CONTROL_RANGE,有时在程序中并不见 ON_CONTROL 宏,而见 ON_BN_CLICKED 宏, 其实 ON_CONTROL 宏派生出许多的映射宏,包括 ON_BN_CLICKED 宏等;
④控件通知消息映射宏 控件通知消息映射宏处理的窗口消息有 WM_COMMAND,WM_NOTIFY,其消息映射宏有 ON_NOTIFY 和 ON_NOTIFY_RANGE;
⑤反射消息映射宏 反射消息是指子窗口向父窗口发送的通知消息或控件通知消息,父窗口将该消息转化为相应的反射消息发送给子窗口优先处理。 处理窗口消息 WM_NOTIFY+WM_REFLECT_BASE 的宏是 ON_NOTIFY_REFLECT,处理窗口消息 WM_COMMAND+WM_REFLECT_BASE 的宏是 ON_CONTROL_REFLECT, 还有其他的反射消息宏,具体请参考MDSN。
⑥扩展消息映射宏、用于其他消息的宏  
很多普通消息映射宏都有对应的扩展消息映射宏,例如:ON_COMMAND对应的ON_COMMAND_EX,ON_ONTIFY对应的ON_ONTIFY_EX,等等。
其他消息的宏,例如用于用户定义消息的 ON_MESSAGE。这类宏带有参数,需要指定消息ID和消息处理函数。消息映射条目的第一个成员nMessage被指定为消息ID,第二个成员nCode被指定为0,第三个成员nID和第四个成员也是0。消息处理的。
消息映射宏中有带有COMMAND字样的都是用来处理命令消息的。命令消息主要是通过单击菜单及单击按钮产生的。命令消息在CCmdTarget类是没有处理函数的,也就是说不在消息映射表内。菜单项和按钮还有其他一些控件都有其ID值,命令消息映射宏主要就是将菜单、按钮和其他一些控件的ID和处理函数映射起来。命令消息的添加也是通过MFC的ClassWizard来完的。

Windows消息组成结构

windows消息由消息号和参数组成:
消息号:windows操作系统通过32整数标识一条windows消息,称为消息号。
windows消息号具有三个特点:
1) 唯一性:唯一性指对于windows操作系统中的每一条消息都有一个且只有一个消息号与它相对应。由于windows操作系统通过消息激活相应的过程,因此消息的标识必须是唯一的。
2) 直观性:消息号在形式上表现为消息名,消息名往住直观地说明了消息的产生方式和类型,例如消息名WM_LBUTTONDOWN直观地表示了单击产生的消息。
3) 可自定义性:windows系统定义了一些消息号和消息名,程序员可以运用这些消息,也可以使用自已定义的窗口的消息。形式如下: #define 消息名 消息号
注意,为了不与现有的windows系统消息相冲突,在消息号的定义中通常采用如下:
WM_USER+n   WM_USER是windows操作系统定义的用户消息起始值,程序员必须从该起始值后选取消息号,例如自定义消息名为“MESSAGE_1”和 “MESSAGE_2”,可采用如下形式:

#define MESSAGE_1 WM_USER+1
#DEFINE MESSAGE_2 WM_USER+2
参数:windows的消息具有以下两个参数:字参数(wParam);长参数(lParam)。字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体。附加信息的消息号取决于消息号。

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到底有哪些消息?

windows消息的背景

    在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解出来了。
这样一样就一目了然了,ON_COMMAND和ON_NOTIFY都可以用ON_MESSAGE来处理,只不过自己要多做很多事情。ON_COMMAND和ON_NOTIFY最好就不要互换了!


【注:此处也可参考博文http://blog.youkuaiyun.com/arnozhang12/article/details/8051826,以便理解】

消息类别

其实消息类别可以分成多种,有三种主要的消息类别:
1、Windows 消息

此类消息主要包括以前缀 WM_ 开头的消息,WM_COMMAND 除外。Windows 消息由窗口和视图处理。其所对应的宏一般为在消息 WM_ 前面加上 ON_。此类消息往往带有用于确定如何处理消息的参数。

2、控件通知

此类消息包括从控件和其他子窗口发送到其父窗口的 WM_COMMAND 通知消息。例如,当用户在编辑控件 (Edit Control) 中执行可能更改文本的操作后,该编辑控件 (Edit Control) 将向其父级发送包含 EN_CHANGE 控件通知代码的 WM_COMMAND 消息。该消息的窗口处理程序以某种适当的方式响应此通知消息,例如在控件中检索该文本。
框架像传送其他 WM_ 消息一样传送控件通知消息。但是有一个例外的情况,即当用户单击按钮时由按钮发送的 BN_CLICKED 控件通知消息。该消息被作为命令消息特别处理,并像其他命令一样传送。
3、命令消息

此类消息包括用户界面对象(菜单、工具栏按钮和快捷键)发出的 WM_COMMAND和 CN_UPDATE_COMMAND_UI通知消息。框架处理命令的方式与处理其他消息不同,可以使用更多种类的对象处理命令。
Windows 消息和控件通知消息由窗口来处理(窗口是从 CWnd 类派生的类的对象)。包括 CFrameWnd、CMDIFrameWnd、CMDIChildWnd、CView、CDialog 以及从这些基类派生的您自己的类。这些对象封装了 HWND——Windows 窗口的句柄。

命令消息可以由范围更广的对象(文档、文档模板以及应用程序对象本身)处理,而不仅仅由窗口和视图处理。当某一命令直接影响到某个特定对象时,应当让该对象处理此命令。例如,“文件”菜单中的“打开”命令在逻辑上与应用程序相关联:该应用程序接收到此命令时会打开指定的文档。因此“打开”命令的处理程序是应用程序类的成员函数。
命令消息我们比较常见的便是菜单项和工具条了,大家可以看到他的消息映射宏和窗口消息不太一样,一般的形式是这样的

第一个参数是命令ID,一个ID号对应一个消息处理,当然你可以让多个ID共用一个处理函数。常见的应用例如:菜单项打开文档的ID和工具条按钮打开文档的ID同时使用一个处理函数,或者直接将它们的ID设成相同的。

ON_COMMAND(id,memberFxn)  // 标准的命令消息
ON_COMMAND_EX(ID,pfn)   // 多个对象对同一命令ID的处理
ON_COMMAND_RANGE(nID,nLastID,pfn)  // 多个命令ID提供相同的处理 
ON_UPDATE_COMMAND_UI(ID,pfn) 
ON_UPDATE_COMMAND_UI_RANGE(nID,nLastID,pfn)  // 该函数可以处理一组[命令用户接口对象]的外观

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

ON_CONTROL(EN_CHANGE,id,memberFxn)

还有很多种消息存在于MFC,宏定义有区别,大家可以触类旁通。
窗口消息有上百个。你可以从MSDN上查到WM_开头的,或者查看CWnd的成员函数,会给你列出很多,别忘了还有很多非窗口消息。

此外,按消息的产生可以分为四类:

  (1)外界输入事件产生的消息; 
       (2)windows系统向应用程序发出的消息
  (3)应用程序之间发送的消息; 
       (4)其他

根据产生消息的对象,可以进一步将消息分为以下几类:
  (1)窗口管理消息  包括激活基本窗口操作的消息,如关闭、最大化等。
  (2)初始化消息  应用程序、窗口、控件等对象初始化的消息。
  (3)输入消息  包括键盘、鼠标、绘图仪等处部输入工具的输入消息。
  (4)系统消息  windows系统内部消息。
  (5)剪贴板消息  操作剪贴板时产生的消息。
  (6)系统信息消息  用于系统信息发送和处理的消息。
  (7)控件处理消息  操作控件时产生的消息。
  (8)控件通知消息  系统采用空件通知消息向控件发送消息。
  (9)滚动条消息  操作滚动条时产生的消息
  (10)非用户区消息  非用户区产生的消息
  (11)MDI消息  用于多文档操作的消息
  (12)DDE消息  用于动态数据交换的消息。
  (13)应用程序自定义的消息等等。

windows消息由消息号和参数组成:

MFC消息处理的过程是怎样的?

1. _AfxCbtFilterHook截获消息(这是一个钩子函数)

2. _AfxCbtFilterHook把窗口过程设定为AfxWndProc。

3. AfxWndProc()接收消息,寻找消息所属的CWnd对象,然后调用AfxCallWndProc( )。
4. AfxCallWndProc()存储消息(消息标识符和消息参数)供未来参考,然后调用WindowProc( )。
5. WindowProc()发送消息给OnWndMsg( ),如果消息未被处理,则发送给DefWindowproc( )。
6. OnWndMsg()首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数;对于WM_NOTIFY消息调用OnNotify()消息响应函数。任何被遗漏的消息将是标准消息。OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数。
7. OnCommand()查看这是不是一个控件通知(lParam参数不为NULL),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果它不是一个控件通知,或者控件拒绝映射的消息,OnCommand()就会调用OnCmdMsg()函数。
8. OnNotify( )也试图将消息映射到制造通知的控件;如果映射不成功,OnNotify( )就调用相同的OnCmdMsg( )函数。
9. 根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。例如:如果拥有该窗口的类是一个框架类,则命令和控件通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数。

如何添加MFC消息?

我们已经了解了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宏,建立的消息映射。 




参考

MFC的消息机制的实现原理和消息处理的过程 http://blog.youkuaiyun.com/cherish_2012/article/details/21182265

WM_COMMAND 和 WM_NOTIFY 的区别 http://blog.youkuaiyun.com/arnozhang12/article/details/8051826

MFC-消息分派 http://blog.youkuaiyun.com/linzhengqun/article/details/1905671




Mac版Burp Suite专业版破解与汉化完整指南 在Web安全测试领域,Java应用程序的许可证验证机制与本地化实现是常见的技术课题。其原理通常涉及Java Agent技术,通过在JVM启动时动态修改字节码,实现对软件授权状态的校验逻辑进行拦截与重写,从而绕过官方验证。同时,软件界面的国际化(i18n)与本地化(l10n)则依赖于资源文件的替换与加载。从技术价值角度看,深入理解这些机制不仅能满足特定场景下的工具定制需求,更能加深对Java安全机制、软件保护与逆向工程的理解。在实际的工程实践中,安全研究人员与开发者常面临功能受限或语言障碍的挑战,尤其是在渗透 阅读详情

相关推荐

用Seurat和ComplexHeatmap绘制单细胞marker基因热图:从数据处理到可视化全流程

本文详细介绍了使用Seurat和ComplexHeatmap绘制单细胞marker基因热图的全流程,涵盖从数据处理、基因筛选、平均表达矩阵计算到高级可视化与注释添加。重点解析了如何利用ComplexHeatmap生成发表级热图,并整合热词信息,解决单细胞数据可视化中的常见问题,提升科研图表质量。

weixin_29048775的博客 530

MFC中CFile::Open构造函数

Open 设计用于默认CFile构造函数。 virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL); virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CAtl...

Rock N' Roll Forever 1539

CAD的.dwg文件导入 ArcGIS:高程分析、坡度分析、坡向分析

CAD的.dwg文件导入 ArcGIS,再进行高程分析、坡度分析、坡向分析。

My_Echo_yM的博客 7239

CFile类的open方法中的参数说明

CFile::Open是在MFC里面,打开一个文件的方法。 Open函数的原型如下: virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL ); 如果你想读一个文件,就用CFile::modeRead作为第二个参数,同时CFile::modeCreate代表创建一个文...

weixin_30301183的博客 288

idea 编译打包nacos2.0.3源码,生成可执行jar 包常见问题

idea 编译打包nacos2.0.3源码,生成可执行jar 包常见问题

fyihdg的专栏 1218

自动驾驶轨迹规划算法——Apollo Lattice Planner

Apollo Lattice Planner是百度Apollo自动驾驶系统中的一种基于采样的实时轨迹规划算法。其核心思想是在离散化的状态空间中,对终端状态进行采样,并通过多项式曲线连接当前状态与候选终端状态,形成候选轨迹集,最后基于代价函数选择最优轨迹。该算法将车辆可达状态按纵向距离、横向偏移和速度等维度规则离散化,形成"格点"状态空间。 Lattice Planner通过三个主要步骤实现轨迹规划:1)终端状态采样,在规划时域内枚举多种驾驶意图;2)轨迹生成,使用五次多项式连接起点与各终

swaggytiger的博客 1624

C#中控件的消息循环

通常情况下windows的控件会把消息发送给它们的父窗口,这就表示处理消息的代码必须写在父窗口中。在MFC4.0之后,提供了新的功能message reflection,支持在Control中直接处理消息。但是在Control中处理消息时,拦截的消息编码需要加上WM_REFLEC

dianxer的专栏 2831

深度强化Q学习-基于微软AirSim仿真环境的自动驾驶案例(原理代码详解简易可行)

最近在学习《强化学习原理与Python实现》,肖智清著。参考第十二章的自动驾驶案例,写一篇总结,尽量做到简单可行,让有志于自动驾驶的小伙伴可以通过此篇博客可以管中窥豹,初步了解自动驾驶的强化学习训练过程。 本篇将自动驾驶问题转化为回合制的强化学习任务,设计以车辆观察图像和运行状态为输入的自动驾驶算法,并在AirSim仿真环境中进行训练和测试。本篇使用带经验回放和目标网络的基于深度Q网络算法设计并实现智能体,对经验回放、目标网络和深度Q学习算法进行简单介绍,并用代码实现。

shao918516的博客 8599

ON_NOTIFY_REFLECT消息

ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, CListCtrlExSortHead::OnNMCustomdraw) vc6 ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CListCtrlExSortHead::OnNMCustomdraw) vs

W Blog 4468

基于 YOLOv26 的金属表面缺陷检测系统:智能视觉质检方案

摘要: 基于YOLOv26的金属表面缺陷检测系统采用深度学习技术,实现对划痕、裂纹、腐蚀等8类常见缺陷的自动化检测。系统通过数据增强预处理和YOLOv26模型的高精度识别能力,具备多类别分类、实时推理和强鲁棒性特点,适用于不同金属材质与光照条件。架构包含数据采集、预处理、YOLOv26检测和后处理模块,代码实现采用PyTorch框架,支持训练数据增强与标准化处理,为工业质检提供高效智能解决方案。

一键难忘的博客 589

低光照图像增强:从传统方法到深度学习

低光照图像增强:从传统方法到深度学习​ 人工智能,计算机视觉,大模型,AI,本文聚焦视觉模型的偏差与公平性问题,阐述了偏差在性别、种族、年龄等方面的表现及对医疗、司法、安防等领域的影响。分析了偏差源于数据采集与标注问题及算法局限。介绍了准确率差异等公平性评估指标、相关数据集和工具,还给出数据处理、算法改进、模型训练等避免歧视的策略,并附代码示例与实际案例,为提升视觉模型公平性提供多方面参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 2万+

【MFC】消息机制

1.Windows消息机制 Windows应用程序是通过消息驱动的,在MFC软件开发时,进行界面操作经常要用到消息,通过消息对应的处理函数来实现响应的操作。比如,用户操作窗口,就会产生消息,送给对应的消息处理函数进行处理,对用户的操作做出一些反应。 2.MFC消息映射 MFC使用消息映射机制来处理消息,具体表现就是消息和消息处理函数一一对应的消息映射表,以及消息处理函数的声明和是实现。当窗口收到消息时,会在消息映射表中寻找对应的处理函数,然后由消息处理函数做出相应的处理。 3.自定义消息的方法 M

summersneverdie的博客 2457

数据行小于列索引,内部模式表示可能存在问题

通过检查数据源的完整性和一致性,检查Debezium配置,检查列映射以及启用调试模式和日志记录,您应该能够解决这个错误。请注意,具体的解决方法可能因您的具体情况而异,因此您可能需要根据问题的根本原因进行适当的调整和修复。如果问题仍然存在,您可能需要进一步检查您的数据和配置,并根据具体情况进行调整和修复。在Debezium中,您可以使用列重命名和列映射来定义源和目标之间的列映射关系。通过检查日志,您可以查看详细的错误信息和堆栈跟踪,从而更好地理解问题的根本原因。首先,我们应该检查数据源的完整性和一致性。

XbtoMemory的博客 731

【MFC】消息映射机制

MFC消息映射机制 总所周知,Windows应用程序都是消息驱动的在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作。比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应。 今天就来简单聊一聊MFC中的消息映射机制。 第一步:用户通过标准输入发送消息给操作系统。 第二步:操作系统将消息丢进消息队列中,进行排队。 第三步:响应的应用程序得到消息,也就是GetMessage(); 第四步:应用程序会发送消息(不含组合键).

Cain Xcy的博客 3166

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

mfc 消息机制

为什么MFC要引入消息映射机制,你可以想象一下,在现在的程序开发活动中,你的一个程序是否拥有多个窗体,主窗口就算只有一个,那菜单、工具条、控件这些都是子窗口,那我们需要写多少个switch case,并且还要为每个消息分配一个消息处理函数,这样做是多么的复杂呀。这张表在窗口基类CWnd定义,派生类的消息映射表如果你没有动作它是空的,也就是说如果你不手工的增加消息处理函数,则当派生窗口接受一个消息时会执行父类的消息处理函数。OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。

堡哥的博客 1381

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[MFC] MFC消息机制的补充

对于 MFC消息循环和消息队列的记录。

zlllc的博客 1656

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

深入浅出MFC:MFC的消息机制

对与这一部分如果有不理解,请先学习设计模式中的观察者模式与命令模式(手动微笑) 对于一个Windows程序,在进行完基本的初始化工作之后,则就将开始进行最最重要也是难以理解的部分:消息循环与消息映射 最简单的消息循环不过如下: while (GetMessage(&msg, ...)) { TranslateMessage(&msg); //转换键盘消息 DispatchMessage

qq_30168505的博客 3058

通俗的理解MFC消息机制

MFC(Microsoft Foundation Classes)中的消息机制是一种处理系统或用户触发事件的方式,类似于快递系统。消息机制的核心包括三个部分:消息循环、窗口过程和消息映射。消息循环不断检查并分发新消息,窗口过程负责接收消息,而消息映射则将消息与对应的处理函数绑定。这种机制实现了事件触发与处理的解耦,提高了程序的灵活性和效率。例如,当用户点击按钮时,MFC会通过消息循环、窗口过程和消息映射找到并执行相应的处理函数,从而完成关闭窗口等操作。MFC的消息机制使程序能够高效、有序地响应各种事件。

doubleintfloat的博客 1155

windows消息机制(MFC)

windows消息机制(MFC) 消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据的含义也不一样。 time表示产生消息的时间,pt表示产生消息时鼠标的位置。 按照类型,Windows将消息分为: (0) 消息ID范围 系统定...

u011555996的博客 1165

【C++】【MFC】mfc消息机制

以前在相对封闭的环境开发,把所有学习到的知识都整理在了本子上,现在反过来有人问我,你写博客吗?一个技术人员没有博客?匆匆忙忙补一些。MFC消息机制  postMessage / sendMessage  + GetMessage + translateMessage + DispatchMessagevoid message(){ MSG mMsg = {0}; while(Get...

zuobar的博客 1067

MFC六大核心机制【消息映射】

1、MFC程序的初始化。 2、运行时类型识别(RTTI)。 3、动态创建。 4、永久保存。5、消息映射。6、消息传递。 五、消息映射和命令传递 作为C++程序员,我们总是希望自己程序的所有代码都是自己写出来的,如果使用了其他的一些库,也总是千方百计想弄清楚其中的类和函数的原理,否则就会感觉不踏实。所以,我们对于在进行MFC视窗程序设计时经常要用到的消息机制也不满足于会使用,而是希望能理解个中道...

平凡 1163
上一篇: C/C++宏的使用总结
下一篇: 孙鑫视频VC++深入详解学习笔记
-年轮-
博客等级 码龄14年 9粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值