MFC消息探究
mfc 消息机制
mfc消息机制
MFC(Microsoft Foundation Class)是微软开发的一种面向对象的C++框架,用于Windows操作系统的应用程序开发。
MFC消息机制是MFC框架的核心之一,其基本原理是在窗口、控件等对象之间传递消息,以便处理事件和交互。
具体而言,MFC消息机制包括以下几个方面:1.消息循环:MFC使用一个消息循环来接受和处理Windows操作系统发送的Windows消息,处理完消息后将处理结果反馈给Windows操作系统。
2.消息映射:MFC中的控件和窗口都有一个关联的消息映射表,用于将Windows消息映射到应用程序代码中的相应处理函数上。
当某个控件或窗口收到消息后,根据消息类型在相应的消息映射表中查找对应的消息处理函数,并调用相应的处理函数处理消息。
3.消息类型:MFC处理的Windows消息类型包括键盘和鼠标消息、定时器消息、系统负载消息、窗口大小变化消息等等,具体的消息类型可以在MFC框架的文档中查找。
4.消息处理函数:MFC中的消息处理函数是C++成员函数,定义为afx_msg 修饰的函数,Windows消息处理函数命名时需要遵循一定的命名规则,例如OnPaint()函数用于处理绘图事件。
需要注意的是,MFC消息机制是针对Windows操作系统设计的,其他操作系统可能具有不同的消息机制。
此外,MFC框架已经不是微软推荐的最先进的应用程序开发框架,已经逐渐被其他框架和技术所取代,例如.NET Framework,WPF,UWP等。
MFC实现简单网络聊天程序
MFC实现简单网络聊天程序MFC(Microsoft Foundation Classes)是微软公司提供的一个应用程序框架,用于开发Windows系统上的图形用户界面程序。
在此基础上,我们可以利用MFC来实现简单的网络聊天程序。
首先,我们需要创建一个MFC应用程序项目。
使用Visual Studio打开,选择MFC应用程序向导,选择对话框风格。
然后,设置对话框的布局,包括聊天消息显示框、消息输入框、发送按钮等控件。
接下来,我们需要使用Socket编程来实现网络通信功能。
MFC提供了CSocket类,我们可以使用它来处理数据的发送和接收。
在对话框类中添加成员变量m_socket,类型为CSocket。
在OnInitDialog函数中,我们需要创建Socket,并进行连接。
可以通过使用Create函数创建CSocket对象,并调用Connect函数来连接指定的地址和端口号。
例如,可以连接到本地主机上的一些端口,这样就可以进行本地测试。
然后,我们需要添加事件处理函数来处理发送和接收消息。
当发送按钮被点击时,可以通过调用Socket对象的Send函数将消息发送给服务器。
可以使用CString类来处理字符串数据。
当接收到消息时,可以通过调用Socket对象的Receive函数将消息接收到的缓冲区中。
为了提供实时地聊天消息显示功能,我们需要使用SetWindowText函数将数据显示到聊天消息显示框中。
当接收到消息时,可以将消息显示在聊天消息显示框中,同时可以使用UpdateData函数实时更新界面。
在程序结束时,我们需要断开连接并销毁Socket对象。
在析构函数中,可以调用Shutdown函数来关闭连接,然后销毁Socket对象。
除了基本的发送和接收消息功能,我们还可以添加一些其他的功能,比如可以使用菜单栏来选择连接和断开服务器,可以添加登录和注册功能等。
这些可以根据实际需求进行扩展。
总结起来,通过使用MFC应用程序框架和Socket编程,我们可以实现简单的网络聊天程序。
MFC消息处理函数总结解读
MFC消息处理函数总结解读MFC(Microsoft Foundation Classes)是Windows编程中常用的框架之一,它提供了一组面向对象的类库,帮助开发人员更轻松地构建Windows应用程序。
在MFC中,消息处理函数是非常重要的一部分,它们用于处理窗口消息,包括按键事件、鼠标事件等,可以响应用户的操作。
消息处理函数的基本格式如下:```afx_msg LRESULT OnMessage(WPARAM wParam, LPARAM lParam);```其中afx_msg是一个宏定义,用于指示该函数为一个MFC消息处理函数。
LRESULT是一个32位整数,用于返回消息处理结果。
OnMessage是函数名,可以根据实际需求进行命名。
wParam和lParam是消息的参数,根据不同的消息类型可以传递不同的值。
下面是对常见的消息处理函数的解读。
1. OnCreateOnCreate消息处理函数在窗口创建时被调用,可以进行一些初始化操作。
例如创建子窗口、加载资源等。
可以通过返回-1来取消窗口的创建。
2. OnDestroyOnDestroy消息处理函数在窗口销毁时被调用,可以进行一些资源的释放操作。
例如关闭文件、释放内存等。
3. OnPaintOnPaint消息处理函数在窗口需要重绘时被调用,可以进行绘图操作。
通常会使用GDI(图形设备接口)函数进行绘图,例如绘制文本、绘制图形等。
4. OnSizeOnSize消息处理函数在窗口大小改变时被调用,可以根据新的窗口大小进行调整。
例如重新设置子窗口的位置和大小。
5. OnKeyDownOnKeyDown消息处理函数在键盘按键被按下时被调用,可以响应用户的按键操作。
可以根据不同的按键进行不同的处理,例如响应回车键、删除键等。
6. OnMouseMoveOnMouseMove消息处理函数在鼠标移动时被调用,可以获取鼠标的当前位置。
可以根据鼠标位置进行一些操作,例如绘制跟随鼠标的图形、显示鼠标所在位置的坐标等。
mfc 中nm_rclick的用法
mfc 中nm_rclick的用法在MFC中,nm_rclick是指当用户右键点击某个控件时触发的消息。
nm_rclick 是通过向父窗口发送NM_RCLICK消息来实现的。
下面将详细介绍nm_rclick 的用法。
首先,需要了解一些基本概念。
在MFC中,控件是通过CWnd类的派生类来表示的,处理控件的消息一般是在父窗口中进行的。
通过向父窗口发送消息的方式来实现对控件的操作。
当用户在控件上右键点击时,控件会发送一条NM_RCLICK消息给父窗口。
父窗口可以通过处理该消息来执行相应的操作。
nm_rclick消息的处理方式有两种:消息映射和自定义处理。
一、消息映射的方式:在父窗口的消息映射表中添加对NM_RCLICK消息的映射。
示例如下:ON_NOTIFY(NM_RCLICK, IDC_LIST, OnRclickList)上述代码表示当ID为IDC_LIST的列表控件接收到NM_RCLICK消息时,调用OnRclickList函数进行处理。
在OnRclickList函数中可以对右击事件进行相应的处理,例如显示一个右键菜单或执行其他操作。
void CMyDialog::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) {处理右键点击事件TODO: 添加代码*pResult = 0;}二、自定义消息处理的方式:在父窗口中重载PreTranslateMessage函数,在该函数中判断是否接收到了NM_RCLICK消息,并进行相应的处理。
示例如下:BOOL CMyDialog::PreTranslateMessage(MSG* pMsg){if (pMsg->message == WM_RBUTTONDOWN){HWND hWnd = ::GetForegroundWindow();CWnd* pWnd = CWnd::FromHandle(hWnd);if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_LIST){处理右键点击事件TODO: 添加代码return TRUE; 拦截消息}}return CDialog::PreTranslateMessage(pMsg);}上述代码中,首先判断当前接收消息的窗口是否为打开的对话框,并且判断窗口ID是否为IDC_LIST,表示列表控件。
mfc实验报告
mfc实验报告MFC实验报告引言:MFC(Microsoft Foundation Class)是一种用于开发Windows桌面应用程序的框架,它提供了丰富的类库和工具,简化了Windows应用程序的开发过程。
本文将介绍我在进行MFC实验过程中的经验和收获。
一、实验背景MFC作为一种常用的开发框架,被广泛应用于Windows平台的软件开发中。
通过学习和实践MFC,可以更好地理解Windows应用程序的开发原理和方法。
二、实验目的本次实验的目的是通过开发一个简单的MFC应用程序,掌握MFC的基本使用方法和开发流程。
同时,通过实践了解MFC的一些重要概念和特性。
三、实验过程1. 环境搭建首先,需要安装Visual Studio,选择合适的版本并按照提示进行安装。
安装完成后,打开Visual Studio,创建一个新的MFC应用程序项目。
2. 界面设计在MFC应用程序中,界面设计是一个重要的环节。
通过使用Visual Studio提供的可视化设计工具,我们可以方便地创建和布局界面元素,如按钮、文本框等。
3. 事件处理在MFC应用程序中,用户的操作往往会触发一些事件,如点击按钮、输入文本等。
我们需要编写相应的事件处理函数,来响应这些事件并执行相应的操作。
在实验中,我学会了如何编写事件处理函数,并与界面元素进行关联。
4. 数据处理在实际应用中,数据的处理是不可或缺的一部分。
通过学习MFC,我了解到如何在应用程序中进行数据的输入、输出和处理。
MFC提供了丰富的类库和接口,可以方便地进行数据操作。
5. 调试与测试在开发过程中,调试和测试是必不可少的环节。
通过使用Visual Studio提供的调试工具,我学会了如何定位和修复程序中的错误,并进行功能测试和性能测试。
四、实验结果经过一段时间的学习和实践,我成功地开发了一个简单的MFC应用程序。
该程序可以实现基本的界面显示和数据处理功能。
通过实验,我对MFC的使用有了更深入的了解,并且掌握了一些常用的开发技巧和方法。
MFC自定义消息步骤
MFC自定义消息步骤MFC(Microsoft Foundation Classes)是Microsoft公司为Windows平台开发的C++类库,它封装了许多Windows API函数,简化了Windows应用程序的开发过程。
在MFC中,可以使用自定义消息来进行应用程序内部的消息传递。
自定义消息的步骤如下:1. 定义消息常量:首先,在需要使用自定义消息的地方(通常是对话框或视图类中),定义一个用于表示自定义消息的整型常量。
可以使用WM_USER作为基准值,如const UINT WM_MY_MESSAGE = WM_USER + 12. 注册消息:在应用程序启动时,通常在InitInstance函数中,使用CWinApp类的RegisterWindowMessage函数来注册自定义消息,该函数用于获取一个唯一的消息值,如:UINT myMessage = RegisterWindowMessage(LPCTSTR pString).3. 处理消息:在需要处理自定义消息的类中,重写消息处理函数(通常是OnWndMsg函数),根据自定义消息的值,对相应的消息进行处理。
如:BEGIN_MESSAGE_MAP(CMyDialog, CDialog)ON_WM_COPYDATA//...ON_REGISTERED_MESSAGE(myMessage, OnMyMessageHandler)END_MESSAGE_MAPLRESULT CMyDialog::OnMyMessageHandler(WPARAM wParam, LPARAM lParam)//处理自定义消息//...return 0;4. 发送消息:要发送自定义消息,可以使用CWnd类的PostMessage或SendMessage函数。
其中,PostMessage函数用于异步发送消息,而SendMessage函数用于同步发送消息。
(1) 异步发送消息(PostMessage):CWnd* pDestWnd = GetDlgItem(IDC_MY_CONTROL);pDestWnd->PostMessage(myMessage, wParam, lParam);(2) 同步发送消息(SendMessage):CWnd* pDestWnd = GetParent(;pDestWnd->SendMessage(myMessage, wParam, lParam);5.消息映射宏:在使用消息映射宏处理自定义消息时,需要使用ON_REGISTERED_MESSAGE宏,该宏会自动在消息映射表中添加对应的消息处理函数。
mfc程序实验报告
mfc程序实验报告篇一:MFC实验报告实验日期:2013 年05 月18 日一、实验目的1、熟悉Visual C++的基本操作。
2、基本了解基于对话框的windows 应用程序的编写过程。
3、对于Windows Socket编程建立初步概念。
二、实验要求1、应用Visual C++中MFC CSocket 类,实现网络数据传输。
2、仿照本实验步骤,制作实用的局域网一对一聊天程序。
三、实验原理设置加入连接的数目,通过更改IP 地址和端口号,成为不同的客户端,与服务器端连接,实现用户间的聊天功能。
1.程序整体框架:主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。
当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。
2.客户端(Client)客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。
客户端不需要指定打开的端口,通常临时的、动态的分配一个端口。
3.服务器端(Server)服务器端,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
4.用户图形界面用户图形界面方便程序与用户的交互,多个用户参加,完成会话功能,具体的设计要方便用户的使用,直观清晰,简洁明了,友好美观。
四、实验内容一个最简单的点对点聊天程序客户机/服务器模式是socket点对点网络程序典型的模式,以下这个实验就是实现一个简单的点对点通信的聊天程序。
它用到的方法也是面向连接TCP连接的套接字MFC典型方式。
其工作过程是:服务器首先启动,创建套接字后等待客户的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务器可以通过建立的套接字连接进行信息通信。
MFC六大核心机制
MFC六大核心机制1.消息映射机制:MFC使用明确的消息映射机制来处理用户界面和系统事件。
应用程序通过重写消息映射函数来处理不同的消息事件,如鼠标点击、按键操作等。
消息映射机制使得开发者可以方便地响应和处理不同的用户交互动作。
2. 文档视图(Doc/View)体系:MFC采用了文档视图体系,将应用程序数据(文档)和用户界面(视图)分离。
文档表示应用程序的数据,视图代表用户界面,通过文档视图模式可以实现多视图的显示和操作。
开发者可以自定义文档类和视图类,通过它们来管理和展示数据。
3.对象序列化机制:对象序列化是指将对象的状态转换为可以存储或传输的格式,以便于在不同的环境中恢复对象的状态。
MFC提供了强大的对象序列化支持,可以方便地对应用程序的数据进行存储和加载。
开发者只需将需要序列化的成员变量标记为可序列化,并实现相关的序列化函数即可实现数据的持久化。
4.多线程支持:MFC提供了多线程支持,使得应用程序可以在多个线程中同时执行任务。
开发者可以使用MFC提供的线程类来创建和管理线程,并通过消息机制进行线程间的通信。
多线程支持有助于提高应用程序的性能和响应能力。
MFC的运行时类是一组用于封装常用功能的类,包括字符串操作、容器类、文件I/O等。
这些类提供了方便、高效的操作接口,减少了开发者对底层操作的依赖。
开发者可以直接使用MFC提供的运行时类来简化开发过程。
6.扩展性:MFC提供了丰富的扩展性机制,包括自定义控件、自定义对话框、自定义视图等。
开发者可以通过派生已有的MFC类来创建自定义的控件或界面,以满足特定的应用程序需求。
扩展性机制使得开发者可以充分发挥自己的创造力和想象力,实现更加个性化的应用程序。
总结:MFC六大核心机制为开发者提供了丰富的类和功能,使得开发Windows图形界面应用程序更加简单和高效。
通过消息映射机制、文档视图体系、对象序列化机制、多线程支持、运行时类和扩展性机制,开发者可以轻松地实现各种应用程序的需求,并提供更好的用户体验。
mfc中on_message的用法
一、介绍MFC和消息响应机制MFC(Microsoft Foundation Class)是微软公司提供的一套类库,用于快速开发Windows桌面应用程序。
在MFC中,消息响应机制是非常重要的一部分,它用于处理用户和系统发送的消息,比如鼠标点击、键盘输入等。
二、on_message的作用和用法在MFC中,on_message是一个重要的消息处理函数,用于处理特定的消息。
它将消息传递给对应的处理函数,这样就能够对消息做出响应。
on_message函数通常是在MFC框架的消息映射表中进行注册的,当特定的消息到达时,框架会调用对应的on_message函数。
三、on_message函数的格式和参数在MFC中,on_message函数通常具有以下格式:afx_msg LRESULT on_message(WPARAM wParam, LPARAM lParam);其中,afx_msg是MFC中用于声明消息处理函数的宏,LRESULT是消息处理函数的返回值类型,on_message是函数名,而WPARAM和LPARAM则是消息参数,它们用于传递消息的相关信息。
四、注册on_message函数在MFC中,要使用on_message函数处理特定的消息,首先需要将它注册到消息映射表中。
可以通过在消息映射表中添加ON_MESSAGE宏来实现注册,具体格式如下:ON_MESSAGE(message, memberFxn)其中,message是要处理的消息类型,memberFxn是对应的on_message函数名。
五、实现on_message函数在注册了on_message函数之后,需要在对应的类中实现这个函数。
在函数体内,可以根据具体的需求对消息进行处理,比如更新界面、执行特定操作等。
六、on_message函数的使用示例以下是一个简单的on_message函数的使用示例,用于处理鼠标左键的点击消息:afx_msg LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam){// 在此添加消息处理程序代码和/或调用默认值return 0;}在这个示例中,当鼠标左键点击时,框架会调用OnLButtonDown函数进行处理。
mfc checkbox消息函数
mfc checkbox消息函数MFC CheckBox消息函数是MFC框架中用于处理复选框控件消息的函数。
复选框控件是一种常见的用户界面元素,用于选择或取消选择某个选项。
通过MFC CheckBox消息函数,我们可以捕捉用户对复选框的操作,进而执行相应的逻辑处理。
在MFC中,处理复选框消息的函数通常被称为OnCheck函数。
当用户点击复选框时,MFC会自动调用对应的OnCheck函数来处理该事件。
通过重写OnCheck函数,我们可以根据用户的选择状态执行相应的操作。
例如,我们可以在OnCheck函数中添加代码来修改其他控件的可见性、启用或禁用某些功能、更新数据等。
通过捕捉复选框的消息,我们可以根据用户的选择状态来动态改变程序的行为,提供更好的用户体验。
在编写MFC CheckBox消息函数时,我们需要注意以下几点:1. 确定复选框的ID:在MFC中,每个控件都有一个唯一的ID,我们需要在代码中指定复选框的ID,以便MFC能够正确地识别和处理消息。
2. 使用ON_BN_CLICKED宏:在消息映射表中,我们需要使用ON_BN_CLICKED宏来将复选框的点击事件与对应的消息函数关联起来。
这样,当用户点击复选框时,MFC才能够正确地调用对应的消息函数。
3. 处理复选框的选择状态:在消息函数中,我们可以通过获取复选框的选择状态来进行逻辑处理。
通过调用GetCheck函数,我们可以获取复选框的当前选择状态,然后根据不同的状态执行相应的操作。
总结起来,MFC CheckBox消息函数是用于处理复选框控件消息的函数。
通过捕捉复选框的消息,我们可以根据用户的选择状态执行相应的操作,实现更灵活和交互性强的用户界面。
在编写MFC CheckBox消息函数时,我们需要确定复选框的ID,并使用ON_BN_CLICKED宏将点击事件与消息函数关联起来。
通过获取复选框的选择状态,我们可以根据不同的状态执行不同的逻辑处理。
MFC消息机制详解
消息映射的实现Windows消息概述Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。
这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。
消息的分类队列消息和非队列消息从消息的发送途径上看,消息分两种:队列消息和非队列消息。
队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。
这里,对消息队列阐述如下:Windows维护一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)。
鼠标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。
Windows 每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列。
线程消息队列接收送给该线程所创建窗口的消息。
线程从消息队列取出消息,通过Windows把它送给适当的窗口过程来处理。
除了键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。
这些队列消息以外的绝大多数消息是非队列消息。
系统消息和应用程序消息从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。
系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,为了ID的唯一性,使用::RegisterWindowMessage来得到该范围的消息ID。
消息结构和消息处理消息的结构为了从消息队列获取消息信息,需要使用MSG结构。
mfc自定义消息用法
mfc自定义消息用法在MFC(Microsoft Foundation Class)中,自定义消息可以通过两种方式定义和使用:通过注册消息和通过自定义消息常量。
一、通过注册消息的方式:1. 调用`RegisterWindowMessage`函数定义一个系统唯一的消息,例如:`static UINT WM_MY_MESSAGE = RegisterWindowMessage("User");`2. 使用`ON_REGISTERED_MESSAGE`宏指令代替`ON_MESSAGE`宏指令,其余步骤同上。
二、通过自定义消息常量方式:1. 在公共头文件中添加自定义消息常量,例如:`const UINTWM_TESTMESSAGE = WM_USER + 0x100;`2. 在类的头文件中,添加对应的消息处理函数声明,例如:`afx_msg LRESULT OnTestMessage(WPARAM wParam, LPARAM lParam);`3. 在类的实现文件中,添加消息映射,以告知程序当接收到自定义消息时,应该交由哪个函数处理。
例如:```c++BEGIN_MESSAGE_MAP(CReceiveDlg, CDialogEx)ON_MESSAGE(WM_TESTMESSAGE, OnTestMessage)END_MESSAGE_MAP()```4. 编写消息对应的函数具体实现。
例如:```c++LRESULT CReceiveDlg::OnTestMessage(WPARAM wParam, LPARAM lParam){// 消息处理的具体实现代码...return 0;}```5. 使用`PostMessage`或`SendMessage`发送自定义消息。
例如:`::PostMessage(m_pRecvDlg->GetSafeHwnd(), WM_TESTMESSAGE, (WPARAM)pInfo, 0);`。
基于mfc的实验报告
基于mfc的实验报告摘要本实验旨在通过使用MFC(Microsoft Foundation Classes)开发框架,实现一个简单的图形化界面程序。
通过这次实验,我深入理解了MFC框架的基本原理和开发流程,并成功完成了一个简单的图形化界面程序。
1. 引言MFC是微软公司开发的一套C++类库,用于创建Windows平台上的应用程序。
它建立在Windows API之上,简化了Windows操作系统的编程方式。
MFC 提供了一系列的类和函数,包括窗口(Window)、对话框(Dialog)、消息映射(Message Map)等,极大地简化了Windows应用程序的开发过程。
2. 实验目的本实验主要目的是熟悉MFC框架的基本原理和开发流程,实现一个简单的图形化界面程序。
通过本实验,能够掌握MFC框架中的窗口创建、消息处理、界面设计等基本概念和操作。
3. 实验过程3.1 环境配置首先,需要在计算机上安装Visual Studio和MFC组件。
打开Visual Studio,创建一个新的MFC应用程序项目,并选择对话框类型作为项目的基础结构。
3.2 窗口创建在MFC应用程序中,窗口是最基本的界面单位。
通过菜单选择“添加类”的方式,创建一个新的对话框类,并继承自CDialog类。
在新建的对话框类中,可以定义与界面相关的成员变量和控件。
3.3 控件添加在对话框设计界面中,可以通过拖拽和调整控件的方式,向对话框中添加各种控件,如按钮、文本框、列表框等。
每个控件都有自己的属性和事件响应函数。
3.4 消息映射消息映射是MFC框架的核心概念之一。
通过消息映射,可以将用户的操作(如点击按钮)与特定的函数关联起来。
在对话框类中,可以通过DECLARE_MESSAGE_MAP和BEGIN_MESSAGE_MAP宏定义来实现消息映射关系的建立。
3.5 编译和运行完成界面设计和消息映射后,即可对程序进行编译和运行。
在编译过程中,MFC 会自动将资源文件编译成可执行的文件。
mfc键盘消息总结以及键值表-全
•
MessageBox("鼠标中键滚动消息");
•
break;
•
case WM_PAINT:
时
//刷新新户口时,或者 窗口重绘
•
MessageBox("请按下a,b,c字母键,或者滚动鼠标
中键,或者将指示灯亮时点击鼠标左键");
•
default:
•
•
break;
•
}
键盘键值表
十六进制描述键值表
• 0x1 鼠标左键 • 0x2 鼠标右键
• 指示灯亮与灭主要使用于两个键: Num Lock键 和 Caps Lock键 • 键按下与弹起可使用任何键,比如shift和ctrl键等
• c.详细说明:
• 1.若低序位为1,则键被触发,指示灯亮;若为0,指示灯灭。
• 例子:BYTE Caps_Lock=LOBYTE(GetKeyState(VK_CAPITAL));if(Caps_Lock)来判断指示灯亮与 灭;
0x3 CANCEL 键 0x4 鼠标中键 0x8 BACKSPACE 键 0x9 TAB 键 0xC CLEAR 键 0xD ENTER 键 0x10 SHIFT 键 0x11 CTRL 键 0x12 MENU 键 0x13 PAUSE 键 0x14 CAPS LOCK 键
• 0x1B ESC 键 0x20 SPACEBAR 键 0x21 PAGE UP 键 0x22 PAGE DOWN 键 0x23 END 键 0x24 HOME 键 0x25 LEFT ARROW 键 0x26 UP ARROW 键 0x27 RIGHT ARROW 键 0x28 DOWN ARROW 键 0x29 SELECT 键 0x2A PRINT SCREEN 键 0x2B EXECUTE 键 0x2C SNAPSHOT 键 0x2D INSERT 键 0x2E DELETE 键 0x2F HELP 键 0x90 NUM LOCK 键
mfc的工作原理
mfc的工作原理
MFC (Microsoft Foundation Class) 是微软公司开发的一种基于
类库的应用程序框架,用于构建Windows操作系统上的图形
用户界面(GUI)应用程序。
MFC的工作原理主要涉及以下
几个方面:
1. 封装了Windows API:MFC通过封装Windows API,提供
了一套更加简洁、易用的面向对象的编程接口,使开发者能够更方便地创建和管理窗口、对话框、控件以及其他GUI元素。
2. 事件驱动的编程模型:MFC采用了事件驱动的编程模型,
开发者可以通过重载消息映射表中的事件处理函数,响应用户的输入或系统的消息,例如点击按钮、键盘按键等。
这种模型使得开发者能够更加灵活地控制应用程序的行为。
3. 对象模型:MFC基于面向对象的编程思想,通过类的继承
和多态等机制,实现了可重用性和扩展性。
开发者可以通过创建和继承MFC的类,重写其成员函数来实现自定义的应用程
序逻辑。
4. 消息循环:MFC应用程序通过消息循环来处理用户的输入
和系统的消息。
消息循环负责从消息队列中获取消息,并将其分发给相应的窗口或控件进行处理。
开发者可以通过重载消息循环中的函数,定制应用程序的消息处理方式。
总的来说,MFC的工作原理是基于面向对象的编程思想和事
件驱动的编程模型,封装了Windows API提供了方便的编程
接口,通过消息循环处理用户输入和系统消息。
这样的设计使开发者能够更加简单地创建和管理GUI应用程序。
MFC实验二 对话框程序设计
实验二对话框程序设计(一) 实验目的:1 学习如何创建对话框程序,并想其中添加控件。
2 学习如何使用对话框来打开和保存文件。
3 学习创建消息对话框。
在Windows程序中,对话框是最重要的显示信息和取得用户数据的单元;一个应用程序可以拥有几个对话框,这些对话框从用户那里接受特定类型的信息;可以使用资源编辑器创建对话框资源,向其中添加控件,调整对话框的布局,使对话框更加便于使用。
(二) 实验内容:应用实例创建一个基于对话框的应用程序,并添加文件菜单,用来打开和保存文件;建立消息对话框,用来提醒用户在退出前保存文件;同时建立一个属性页对话框,掌握其基本用法。
(三) 实验步骤:实验一:创建简单的对话框应用程序1.使用AppWizard创建一个基于对话框类型的程序Prog01。
在AppWizard的第一页选择“Dialog based” ,生成标准对话框模板。
2.可以设置对话框的属性,右键单击整个对话框的背景,选择“Properties”项,在弹出的对话框中修改此对话框ID为:IDD_PROG01_DIALOG,标题为:“简单计算器”。
当对话框资源完成以后,选择ctrl+w,打开ClassWizard,已经有一个类Prog01Dlg与新的对话框相联系。
3.在控件工作栏点击要添加的空间图标,选择所需的控件。
一共要添加三个静态文本框、三个编辑框、五个命令按钮。
可以改变空间的大小、位置、对齐方式等等。
4.添加控件结束后,设置各个控件的属性。
右键需要设置属性的控件,在弹出的菜单中选择Prperties,或选中控件按回车键。
各个控件的属性设置如下图。
下表列出了本题中所有控件的属性设置以及添加的成员变量:5.为控件添加相对应的成员变量。
执行xiew-class wizard命令或者Ctrl+w,选择member variables ,可以在对话框类中为控件添加关联的成员变量和删除变量。
以第一个编辑框为例,成员变量名为m_floatFirstNum,float型。
MFC之对话框向主窗体传递消息
对话框向主窗体传递消息,在视图中显示现举例说明对话框向主窗体传递消息,以及主窗体响应消息的过程。
我们拿单文档来说明,我们要实现下列功能:通过对话框,在文本框中输入字符串,在视图中显示刚才输入的字符串。
1、在应用程序向导中选择单个文档,然后完成。
我这里的项目名称为mybook2、在资源视图中,插入一对话框,对话框名称为dlg_wzm。
3、在刚才生成的对话框中插入一文本框,设置好相应的类和变量。
为确认按钮生成响应函数。
同时在mybook.cpp的BOOL CMyBookApp::InitInstance()函数中让该对话框启动,也就是加入CDlg_wzm dlg; dlg.DoModal();两行程序,当然在前面的要加入#include "dlg_wzm.h"。
(详细过程略)4、下面重点在于点击该对话框的确认按钮向主窗体发送消息。
要现定义一个消息名称。
在stdafx.h文件中加入一行:#define WM_MYMESSAGE WM_USER+1005、在CMainFrame的pulic申明中加入一变量CString wzmstr。
目的是为了保存对话框中的字符串的值。
在对话框的Onok()函数中:void CDlg_wzm::OnOK(){// TODO: Add extra validation herethis->UpdateData(true);CMainFrame* pWnd=(CMainFrame*)AfxGetMainWnd(); //得到父窗体的指针pWnd->wzmstr=this->m_input_edit;ASSERT(pWnd!=NULL);::SendMessage(pWnd->GetSafeHwnd(), WM_MYMESSAGE,0,0); //发送消息//注意WM_MYMESSAGE就是我们前面定义的消息。
//CDialog::OnOK();}6、下面我们看看主窗体怎么接受消息。
MFC六大核心机制
MFC六大核心机制MFC(Microsoft Foundation Classes)是微软公司开发的一套基于C++语言的应用程序框架。
它提供了一系列类和函数库,方便开发人员构建Windows应用程序。
MFC框架包含了许多核心机制,下面将介绍其中的六大核心机制。
一、消息映射机制:消息映射机制是MFC框架的核心之一,它用于处理Windows消息。
Windows操作系统是事件驱动的,应用程序需要响应来自用户的输入或系统的消息。
通过消息映射机制,开发人员可以向MFC框架注册处理特定消息的函数,当该消息发生时,框架将自动调用相应的函数进行处理。
开发人员只需要在类的消息映射表中添加相应的消息与处理函数的映射关系,就可以实现消息的处理。
二、文档/视图机制:文档/视图机制是MFC框架中用来管理应用程序数据和图形界面显示的一种机制。
应用程序的数据和用户界面是相互独立的,通过文档/视图机制可以将二者进行分离。
开发人员可以创建一个或多个文档类来管理数据,同时可以创建一个或多个视图类来负责显示用户界面。
MFC框架会自动处理数据和界面之间的同步,例如当数据发生变化时,会自动更新界面;当用户修改界面时,会自动更新数据。
三、消息响应机制:消息响应机制是MFC框架中用来处理用户输入和系统消息的一种机制。
开发人员可以通过消息响应机制,将特定的消息与相应的处理函数进行关联,当该消息发生时,框架会自动调用相应的处理函数。
例如,开发人员可以通过响应鼠标点击消息来实现用户点击按钮的响应,或者通过响应键盘输入消息来实现用户输入的响应。
四、对象模型机制:对象模型机制是MFC框架中用来管理对象的一种机制。
MFC框架使用了一种轻量级的对象模型,对象之间的关系通过继承和组合来实现。
开发人员可以创建自己的类并继承自MFC提供的基类,以实现各种功能。
MFC框架提供了丰富的基类库,包括窗口类、对话框类、控件类等,开发人员可以通过继承这些基类来快速构建自己的应用程序。
MFC消息处理函数总结解读
1.AfxWndProc( 该函数负责接收消息,找到消息所属的 CWnd 对象,然后调用AfxCallWnd Proc2.AfxCallWndProc( 该函数负责保存消息 (保存的内容主要是消息标识符和消息参数供应用程序以后使用,然后调用 WindowProc(函数3.WindowProc( 该函数负责发送消息到 OnWndMsg(函数,如果未被处理,则调用DefWin dowProc(函数4.OnWndMsg( 该函数的功能首先按字节对消息进行排序, 对于WM_COMMAND消息, 调用 OnCommand(消息响应函数,对于 WM_NOTIFY消息调用 OnNotify(消息响应函数。
任何被遗漏的消息将是一个窗口消息。
OnWndMsg(函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。
如果 OnWndMsg(函数不能找到这样的处理函数的话, 则把消息返回到WindowProc(函数,由它将消息发送给 DefWindowProc(函数 5.OnCommand( 该函数查看这是不是一个控件通知 (lParam参数不为 NULL , 如果 lParam 参数为空的话,说明该消息不是控件通知 ,如果它是, OnCommand(函数会试图将消息映射到制造通知的控件; 如果他不是一个控件通知 (或者如果控件拒绝映射的消息OnCommand(就会调用 OnCmdMsg(函数6.OnCmdMsg( 根据接收消息的类, OnCmdMsg(函数将在一个称为命令传递(Command Ro uting 的过程中潜在的传递命令消息和控件通知。
例如:如果拥有该窗口的类是一个框架类, 则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数MFC 应用程序创建窗口的过程1.PreCreateWindow( 该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数 (可以设置窗口风格等等2.PreSubclassWindow( 这也是一个重载函数,允许首先子分类一个窗口3.OnGetMinMaxInfo( 该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息, 允许设置窗口的最大或者最小尺寸4.OnNcCreate( 该函数也是一个消息响应函数, 响应 WM_NCCREATE消息, 发送消息以告诉窗口的客户区即将被创建5.OnNcCalcSize( 该函数也是消息响应函数 , 响应 WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小6.OnCreate( 该函数也是一个消息响应函数,响应 WM_CREATE消息,发送消息告诉一个窗口已经被创建7.OnSize( 该函数也是一个消息响应函数, 响应 WM_SIZE消息, 发送该消息以告诉该窗口大小已经发生变化8.OnMove( 消息响应函数,响应 WM_MOVE消息,发送此消息说明窗口在移动9.OnChildNotify( 该函数为重载函数, 作为部分消息映射被调用, 告诉父窗口即将被告知一个窗口刚刚被创建MFC 应用程序关闭窗口的顺序 (非模态窗口1.OnClose( 消息响应函数,响应窗口的 WM_CLOSE消息,当关闭按钮被单击的时候发送此消息2.OnDestroy( 消息响应函数,响应窗口的 WM_DESTROY消息,当一个窗口将被销毁时, 发送此消息3.OnNcDestroy( 消息响应函数,响应窗口的 WM_NCDESTROY消息,当一个窗口被销毁后发送此消息4.PostNcDestroy( 重载函数,作为处理 OnNcDestroy(函数的最后动作,被 CWnd 调用MFC 应用程序中打开模式对话框的函数调用顺序1.DoModal( 重载函数,重载 DoModal(成员函数2.PreSubclassWindow( 重载函数,允许首先子分类一个窗口3.OnCreate( 消息响应函数,响应 WM_CREATE消息,发送此消息以告诉一个窗口已经被创建4.OnSize( 消息响应函数,响应 WM_SIZE消息,发送此消息以告诉窗口大小发生变化5.OnMove( 消息响应函数,响应 WM_MOVE消息,发送此消息,以告诉窗口正在移动6.OnSetFont( 消息响应函数,响应 WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体7.OnInitDialog( 消息响应函数, 响应 WM_INITDIALOG消息, 发送此消息以允许初始化对话框中的控件,或者是创建新控件8.OnShowWindow( 消息响应函数, 响应 WM_SHOWWINDOW消息,该函数被ShowWind ow(函数调用9.OnCtlColor( 消息响应函数,响应 WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色10. OnChildNotify( 重载函数,作为 WM_CTLCOLOR消息的结果发送MFC 应用程序中关闭模式对话框的顺序1.OnClose( 消息响应函数,响应 WM_CLOSE消息,当 " 关闭 " 按钮被单击的时候,该函数被调用2.OnKillFocus( 消息响应函数,响应 WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送3.OnDestroy( 消息响应函数,响应 WM_DESTROY消息,当一个窗口即将被销毁时,被发送4.OnNcDestroy( 消息响应函数,响应 WM_NCDESTROY消息,当一个窗口被销毁以后被发送5.PostNcDestroy( 重载函数,作为处理 OnNcDestroy(函数的最后动作被 CWnd 调用打开无模式对话框的顺序1.PreSubclassWindow( 重载函数,允许用户首先子分类一个窗口2.OnCreate( 消息响应函数,响应 WM_CREATE消息,发送此消息以告诉一个窗口已经被创建3.OnSize( 消息响应函数,响应 WM_SIZE消息,发送此消息以告诉窗口大小发生变化4.OnMove( 消息响应函数,响应 WM_MOVE消息,发送此消息以告诉窗口正在移动5.OnSetFont( 消息响应函数,响应 WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体以上这些的执行都是按给定的顺序执行!只有清楚的了解应用程序的执行顺序, 才能在编写代码的时候知道, 在什么时候应该执行什么,以及在什么地方该处理什么!这只是本人总结的一点小小的经验, 希望能对 MFC 的初学者有所帮助! MFC 应用程序中处理消息的顺序1.AfxWndProc( 该函数负责接收消息,找到消息所属的 CWnd 对象,然后调用AfxCallWnd Proc2.AfxCallWndProc( 该函数负责保存消息 (保存的内容主要是消息标识符和消息参数供应用程序以后使用,然后调用 WindowProc(函数3.WindowProc( 该函数负责发送消息到 OnWndMsg(函数,如果未被处理,则调用DefWin dowProc(函数4.OnWndMsg( 该函数的功能首先按字节对消息进行排序, 对于WM_COMMAND消息, 调用 OnCommand(消息响应函数,对于 WM_NOTIFY消息调用 OnNotify(消息响应函数。
mfc checkbox消息函数
mfc checkbox消息函数MFC复选框消息函数是一种用于处理复选框控件的消息的函数。
在MFC(Microsoft Foundation Classes)中,复选框控件是一种常见的用户界面元素,允许用户选择或取消选择一个或多个选项。
当用户点击复选框时,会触发一个消息,这个消息可以被应用程序捕获并处理。
处理复选框消息的函数通常被称为复选框消息函数。
复选框消息函数的主要作用是根据用户的选择状态执行相应的操作。
例如,当用户选择一个复选框时,可以在函数中添加代码来更新界面或执行特定的功能。
为了处理复选框消息,首先需要在MFC应用程序中创建一个复选框控件。
可以使用资源编辑器在对话框上添加一个复选框控件,并为其分配一个唯一的ID。
然后,在对话框类的消息映射中添加一个条目,将复选框的ID与相应的消息处理函数关联起来。
当复选框的状态发生变化时,消息处理函数将被调用。
在复选框消息函数中,可以使用MFC提供的函数来获取复选框的当前状态。
例如,可以使用CButton类的GetCheck函数来获取复选框的选择状态。
根据复选框的状态,可以执行不同的操作。
例如,如果复选框被选中,可以在消息函数中添加代码来显示一个消息框或执行一些其他的操作。
如果复选框被取消选择,可以执行一些其他的操作。
除了处理复选框的选择状态外,复选框消息函数还可以处理其他与复选框相关的消息。
例如,可以处理复选框的单击事件、双击事件或右键单击事件。
MFC复选框消息函数是一种用于处理复选框控件消息的函数。
通过编写适当的消息处理函数,可以根据用户的选择状态执行不同的操作,从而实现对复选框控件的有效控制。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
然后调用的 pApp->InitApplication 用途暂时还不明白
消息的设置从下面这个函数开始 pThread->InitInstance() 调用基类的函数 CWinApp::InitInstance(); 通过下面代码连接文档,视图等 pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CTestDoc), RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口 RUNTIME_CLASS(CTestView));
BEGIN_MESSAGE_MAP 的定义如下:
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
PTM_WARNING_DISABLE \
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return GetThisMessageMap(); } \
theApp 的其它大多数成员初始化为 NULL
WinMainCRTStartup 继续运行,调用在 appmodul.cpp 中的 WinMain 函数(这就是我们熟悉的程 序入口),WinMain 函数直接调用 AfxWinMain(应该算是 MFC 的程序入口点了)函数 AfxWinMain 通过 CWinThread* pThread = AfxGetThread(); CWinApp* pApp = AfxGetApp(); 取得 theApp 的指针
先从我们能够看到的地方开始在自动生成的所有头文件(除了 Resource.h)都写着: DECLARE_MESSAGE_MAP()
在 cpp 文件里面则有 BEGIN_MESSAGE_MAP(CMessageMechanismApp, CWinAppEx)
ON_COMMAND(ID_APP_ABOUT, &CMessageMechanismApp::OnAppAbout) ……… END_MESSAGE_MAP() 通过寻找这些奇怪的宏的定义我们在 afxwin.h 里面看到 #define DECLARE_MESSAGE_MAP() \ protected: \ static const AFX_MSGMAP* PASCAL GetThisMessageMap(); \ virtual const AFX_MSGMAP* GetMessageMap() const; \
对于单文档的程序在 ProcessShellCommand 执行过程中下面一段代码生成了一个 CMainFrame 的 对象,这段代码位于 docteml.cpp 中
CFrameWnd* pFrame = (CFrameWnd*)m_pOleFrameClass->CreateObject(); if (pFrame == NULL) {
return &messageMap; \
}
\
PTM_WARNING_RESTORE
显 然 , 宏 DECLARE_MESSAGE_MAP() 在 头 文 件 中 为 我 们 的 类 声 明 了 两 个 成 员 函 数 GetThisMessageMap(),GetMessageMap(); 这 两 个 函 数 的 定 义 则 由 BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 在 对 应 的 源 文 件 中 提 供 。 可 以 看 到 GetMessageMap() 直 接 调 用 了 自 己 类 的 GetThisMessageMap 函 数 , BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 以 及 中 间 的 ON_COMMAND 等 宏 合 力 定 义 了 GetThisMessageMap 函 数 , 在 GetThisMessageMap 中 先 利 用 ON_COMMAND 定 义 的 东 西 生 成 一 个 AFX_MSGMAP_ENTRY 对 象 数 组 , 然 后 利 用 这 个 对 象 生 成 AFX_MSGMAP 对象。以上两个类的定义为: struct AFX_MSGMAP_ENTRY {
从 AFX_MSGMAP 的定义可以知道,它是一个存储消息信息的数据结构,其中 pfn 存的就是那个消 息要调用的函数。上面定义了一个数组,怎么知道那个数组有多长呢?仔细看会发现{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 },这个就是数组结束的标志。再看看 AFX_MSGMAP 结构体它包含了一个指向他的对象所 在类的基类的 GetThisMessageMap 的指针和一个指向上面声明的消息记录数组的指针。指向基类的函数 的指针有什么作用呢?随着深入了解,我们会发现它与消息的传递有关。也就是我们常常发现一个消息, 无论一个消息我们在 App 类还是 Doc 类还是 View 类中定义,我们都可以响应它,这是消息传递带来的 好 处 。 在 _messageEntry 的 定 义 体 里 面 , 我 们 可 以 通 过 ON_COMMAND 或 者 其 它 的 如 ON_UPDATE_COMMAND_UI 们需要对 MFC 类库的各种功能的实现有所研究。MFC 的消息是一个让人 叹为观止的设计,通过各种宏以及一些易被人们忽略的基础 C 语言知识把本来用消息循环实现的 Windows 程序完美地封装成了一个用面向对象观念实现的 MFC 程序。为了对 MFC 有更深入的了解,我研究了一下 它的消息的封装过程。
如果是多文档或者是对话框的话应该在 InitInstance 里面直接有 pMainFrame->LoadFrame(IDR_MAINFRAME)
在 LoadFrame 函数中调用了: CFrameWndEx::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext) 在上面那个函数中再调用: CFrameWnd::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext)
MFC 消息探究
作者:陈剑,杨晓
MFC 是一个十分精密的类库,设计者经历了 AFX 项目的失败后,从面向对象的角度封装了 Windows 庞大的 API。 然而这些封装对于我们这些接触了一些 Win32 的 MFC 初学者来说有点过于隐秘。 比如说 写 MFC 程序的过程中我们无法看到 main 函数,也不知道 App,Frame,View 这三个类是如何结合起来 的。这些困惑会让我们感觉到很迷茫,而且感觉到程序会一不小心就出现一些奇怪的错误。
const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() \
{\
typedef theClass ThisClass;
\
typedef baseClass TheBaseClass;
\
static const AFX_MSGMAP_ENTRY _messageEntries[] = \
走到这一步,我们发现无法再倒推下去了,没办法,只好搜索资料。要了解消息的注册过程,我们还 要了解整个 MFC 程序的启动过程,MFC 程序的启动过程可以粗略概括如下: 程序启动时最先启动的是以下位于 crt0.c 的函数 int WinMainCRTStartup(void);
在调用这个函数后所有的全局对象,静态对象都会被初始化。在这些对象的初始化中有一个对象的初 始化起了关键作用,它就是位于和你项目同名字那个 cpp 文件里面的 theApp 对象。theApp 对象初始化 时,它的构造函数把自己的信息存到进程和应用程序里面: AfxGetThread() = this AfxGetApp() = this
终于到达了我们消息设置的起点: AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)
在上面那个函数中定义了窗口类 WNDCLASS wndcls;然后把窗口类的消息处理函数初始化为 DefWindowProc,我们知道 DefWindowProc 是 Win32 自带的消息处理函数,它并不知道我们要怎样处 理我们的消息,这个处理函数将来会被我们 mfc 的处理函数代替,我们继续看下去吧。
Create 函数调用 CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle,
TRACE(traceAppMsg, 0, "Warning: Dynamic create of frame %hs failed.\n", m_pOleFrameClass->m_lpszClassName);
return NULL; }
// create new from resource (OLE frames are created as child windows) if (!pFrame->LoadFrame(m_nIDServerResource,