用MFC实现消息的发送和接收(含服务器)
VC上位机MFC利用串口控件发送接收数据程序代码

VC上位机MFC利用串口控件发送接收数据程序代码打开vc++6.0,建立一个基于对话框的mfc应用程序。
添加控件后会弹出一个确认框
点击“确定”
单击\,控件将被成功添加
然后在控件的属性里进行一些必要的配置:
Inputmode设置为1-binary,这意味着以二进制模式检查数据
其它的用默认值。
您还可以使用oninitdialog()函数中的代码进行设置,如下所示:
设置好以后,要在程序的开始打开串口,不然是没发使用的。
在oninitdialog中加入以下代码:
睡眠(100);方差数据;intdata_len;charcdata[1024];
cdata[data_len]=0;
//CDATA是指向所接收字符串的指针
m_list.addstring(cdata);//在listbox控件中显示接收到的数据}。
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编程,我们可以实现简单的网络聊天程序。
第3章MFC的消息和命令资料

2)在类的实现文件(MyHelloView.cpp)中 加上消息映射表 宏,开始消息映射
BEGIN_MESSAGE_MAP(CMyHelloView, CView)
//{{AFX_MSG_MAP(CMyHelloView)
//}}AFX_MSG_MAP
// Standard printing commands
视图类的构造函数中初始化 // MyHelloView.cpp : implementation of the CMyHelloView class CMyHelloView::CMyHelloView() {
// TODO: add construction code here m_MousePoint="";//初始化为空串 }
消息类型 消息标识()ID
说明(产生消息的事件)
WM_MOUSEMOVE 鼠标移动时发送该消息
WM_LBUTTONDOWN 鼠标左键被按下时发送该消息
WM_LBUTTONUP
鼠标左键被释放时发送该消息
鼠标消息 WM_LBUTTONDBCLK 鼠标左键被双击时发送该消息
WM_RBUTONDOWN 鼠标右键被按下时发送该消息
第3章 MFC的消息和命令
3.1 Windows操作系统的消息
用户通过窗口界面的各种操作最后转化 为发送到程序中的对象的各种消息,然 后由Windows系统交由相应的函数处理
3.1.1 Windows消息的发送和接收
消息:
– 消息号:一条消息的标识,同时表达了消息 的意义和来源
– 字参数:wParam参数 – 长整型参数:lParam参数
3. 命令消息
也以WM_COMMAND为消息名 包含命令的标示符(ID),以区分具体的命令 来源是以下3种用户接口对象:
利用MFC的Csocket类实现网络通信

服务器端的创建(6)
编辑界面,对界面上的控件点击右键,选择属性选项,可 以修改ID(把ID改为有意义的名字)和标题
界面上没有控件的地方点击右键,弹出菜单,单击“建立 类向导”(或者英文版叫Class Wizard),为每个控件添加 变量。注意控件ID、变量类型、变量名(参看下页“建立类 向导”)
s_ip=CString(“127.0.0.1”); //默认的目的ip地址
UpdateData(FALSE);
//变量的值传到界面上
c_BTNSend.EnableWindow(FALSE);//发送按钮失效
19
客户端的创建(6) “连接”按钮代码
void CLXClientDlg::OnBtnConnect()//连接按钮相关代码 {
修改控件ID,通过“新建类向导”为控件添加变量
16
客户端的创建(3)程序关闭时关闭端口
通过“建立类向导”,添加WM_DESTROY消息响应函数 1单击
2单击确定
17
客户端创建(4)关闭端口代码
添加关闭端口代码
18
客户端创建(5)
初始化时添加代码,即在 BOOL CLXClientDlg::OnInitDialog()的末尾添加下面代码
2
服务器端的创建(1)
新建工程LXServer
3
服务器端的创建(2)
创建的程序类型为“基本对话”
4
服务器端的创建(3)
选择Windows Sockts支持
5
服务器端的创建(4)
接下来几步直接点击“下一步”,直到下面对话框单击 “完成”
6
服务器端的创建(5)
界面制作7ຫໍສະໝຸດ 添加控件(以客户端界面为例)
MFC_消息传递方法

背景:新建了一个基于对话框的MFC程序,在主对话框中添加tabcontrol控件,又新建了两个Dialog(CDialog1和CDialog2),将它们设为tabcontrol控件的子对话框。
目的:两个子对话框之间传递消息,子对话框与主对话框传递消息。
方法:第一步: 定义消息.在目标窗口类的头文件或者stdafx.h中添加:#defineWM_MY_MESSAGE (WM_USER+100); 推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
第二步: 在目标类头文件的AFX_MSG块中说明消息处理函数: afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);view plaincopy to clipboardprint?1.class CDialog1:public CDialog2.{3....4.// 一般消息映射函数5.protected:6.// {{AFX_MSG(CDialog)7. virtual BOOL OnInitDialog();8. afx_msg void OnSysCommand(UINT nID, LPARAM lParam);9. afx_msg void OnPaint();10. afx_msg HCURSOR OnQueryDragIcon();11.afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);12.//}}AFX_MSG13.DECLARE_MESSAGE_MAP()14.}第三步:在目标类源文件cpp中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
view plaincopy to clipboardprint?1.BEGIN_MESSAGE_MAP(CDialog1, CDialog)2. ON_WM_SYSCOMMAND()3. ON_WM_PAINT()4. ON_WM_QUERYDRAGICON()5.ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)6.//}}AFX_MSG_MAP7.END_MESSAGE_MAP()1.LPESULT CDialog1::OnMyMessage(WPARAM wParam, LPARAM lParam)2.{3.// TODO: 处理用户自定义消息4.//MessageBox("消息传递完成!");5.return 0;6.}第五步:发送消息时,在源地址类CDialog2的CPP文件中(如一个Button),调用函数PostMessage或SendMessage发送消息。
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实现消息的发送和接收(含服务器)

新建WClient工程基于对话框OK,直接Finish界面制作我们需要三个按钮移除它们接下来添加六个静态文本三个编辑框两个列表控件,最后我们有:接下来设置控件文本,控件ID,设置成员变量,排布界面调整:-设置文本居右横排变竖排:Center vertically 反选中。
拉长两个静态文本控件调整两个ListBox同样大小Make Same Size空间ID设置:成员变量设置:你可以使用Ctrl+W快捷键跳出该窗口点OK点OK点OK点OK点OK点OK点OK点OK点OK点OK点OK现在客户端界面已经准备好了,接下来就是服务器了过程略:现在所有界面准备完毕,接下来为两个程序添加对应的继承CSocket类的类在WClient中:Ctrl+W –》Add Class-》NewClass我们添加了什么呢?在WClient中:Ctrl+W –》Add Class-》NewClass然后呢接下来为两个类添加虚函数CWClientSocket 调出右键菜单Add Handler ,我们将所有的都添加进去。
虽然不是所有的都用的上,但有总比没有好CWServerSocket接下来我们可以看看CPP H文件中的变化头文件(.h)源文件(.cpp)接下来添加代码:首先,服务器端需要响应客户端连接接受客户端发送的数据,向客户端发送数据,管理Socket套接字。
则服务器端需要对OnAccept、OnRecieve、OnClose事件进行响应处理。
在CServerDlg.h中定义窗体响应Socket类对应事件的响应函数定义Socket对象,以及CSocketFile ,CArchive对象(有关说明查阅课本169页)在CServerDlg.h中包含我们定义的CWServerSocket对象的变量用于监听端口,以及与客户端(一个)进行通信添加CWServerSocket.h头文件定义对象在CServerSocket.h中定义用于存储窗体变量的指针,和初始化函数。
手把手教你VC上位机MFC利用串口控件发送接收数据

1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest;2.在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。
选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。
(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX 一项选上,重新安装VC6,选上ActiveX就可以了),这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
3.利用ClassWizard定义CMSComm类控制对象打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES() #i nclude "mscomm.h"//}}AFX_INCLUDES 。
4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。
用MFC实现的飞信给好友发送短信接口

用MFC实现的飞信给好友发送短信接口声明:本文摘自/showtopic-25343.html,转载请注明出处这段时间,我在学习vc。
以前一直是在用C#和Java的,最近发现MFC还是有一定的用处的,所以就利用暑假这段时间来学习一下。
但是光看书没有用,几个月之前,我用C#实现了一个飞信发短信的接口。
所以这次,以学习MFC为目的,写了一个MFC版的飞信发短信接口。
开发工具用的是Visual studio 2005。
其中用到了MFC中的众多功能,如Socket、CString类的使用、Winnet、加密(hash)、ATl提供的正则表达式库和调用Dom解析xml等等。
最后,我将该接口做成了一个MFC dll,从而也学习了MFC dll的制作和使用。
编译的时候采用默认的Unicode编码。
另外,其中还涉及到编码的转换等等。
在处理字符串的时候基本都用CString,不知道这种习惯好不好。
接口中只提供一个CFetion类,其中提供3个函数,功能主要登陆、发送短信和登出,相当简单,一看就明白。
由于其中调用了Com,所以调用的时候需要进行Com的初始化工作。
下面是一个使用的例子:#include "Fetion.h"#pragma comment(lib, "MFCFetionSDK.lib")CoInitialize(NULL);CFetion fetion(_T("你的手机号"), _T("你的密码"));fetion.Login();fetion.SendSMSToPhone(_T("好友手机号"), _T("要发送的消息。
"));fetion.Logout();CoUninitialize();速度方面,我测试一下,还是相当快的,占的内存也非常的少。
关于飞信协议方面,还是采用MD5进行加密的,改成SHA1也相当简单。
MFC用户自定义消息SendMessage的使用

用户自定义消息SendMessage的使用这里主要讲一下mfc中SendMessage的使用方法。
传递消息主要分4步:1.在类的定义中声明消息函数:afx_msg void AAA();2.在相应的cpp文件中的MESSAGE_MAP区域内添加ON_MESSAGE(MESSAGE_ID,AAA),其中参数1为要传递消息的ID,参数2为刚刚声明的函数名称,不用带括号。
3.实现消息函数:在cpp文件中添加LRESULT 类名::AAA(WPARAM wparam,LPARAM lparam){执行内容……return 0;}4.发送消息:在需要发送消息的地方添加下列语句:HWND hWnd = ::FindWindowEx( m_hWnd, NULL, NULL, WINDOW_TEXT ) ;FromHandle(hWnd)->SendMessage(MESSAGE_ID,a,b);其中,m_hWnd为接收消息的父窗口的句柄,WINDOW_TEXT为接收消息窗口的标题,得到的hWnd为接收消息窗口的句柄。
调用该窗口的SendMessage 函数,MESSAGE_ID为刚刚设定的消息ID,a和b是要传递的参数。
注:在这4个步骤中,前三个我在做的时候基本没什么障碍。
问题主要出现在第4步。
开始找到网上的例子给的都是FindWindow函数,怎么用都不好使。
后来看到有人说FindWindow是找操作系统下打开的窗口的句柄,找窗口中子窗口要用FindWindowEx函数。
我也尝试过用对话框的ID找到相应的句柄,像GetDlgItem(ID)函数一样,未果。
我使用的对话框都是没有标题栏的,所以也就没有窗口的标题,当然这并不会影响我设置标题。
只要在生成该窗口的区域内添加SetWindowText(“窗口标题”)就可以了。
也就是说窗口标题可以设置,但是不会显示。
最后一点在SendMessage()函数中,MFC默认传递的参数是WPARAM和LPARAM型(一个是UINT型,一个LONG型),如果要传递浮点类型,或者其它不是整数的类型,就可以用指针的形式传递(如果发送方只是申请一个变量并以地址的形式传递,然后接收方以指针的形式接收,如果在执行完SendMessage 之后原函数体立即结束了,我不知道在接收函数体接收和使用该变量的之间的一瞬间,该内存区域会不会被占用,我觉得还是有这种可能的。
MFC 的消息处理

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

在MFC中添加用户自定义消息首先弄清楚两点:(1)谁要发送这个消息(2)谁要接受这个消息。
用一个简单的例子来说明。
对象A向B(也可以就是A到A)发送消息。
1 发送消息首先在A的头文件中定义这个消息:#define WM_USERMESSAGE WM_USER+30所有自定义消息都是以WM_USER消息为基础加上一个任意的自然数来表示的。
A是向外发送消息的对象,因此在A的某个方法(函数)里就会调用用来发消息的函数B::SendMessage()/B::PostMessage(),因为是B接受消息,因此是如上的形式。
2 接受消息对象接受一个消息,应该有三部分:在头文件中有该消息的处理函数的原型;在实现文件中有接受消息映射的宏;以及该消息的处理函数的具体实现。
2.1 头文件中加上自定义消息的处理函数原型在DECLARE_MESSAGE_MAP()语句之前,一对AFX_MSG之间加上如下形式的函数原型:afx_msg LRESULT OnProcName( WPARAM wParam, LPARAM lParam );对Win32来说,wParam, lParam是传递消息最常用的手段。
2.2 在实现文件中加上接受消息映射的宏在cpp文件里,BEGIN_MESSAGE_MAP语句之后,在一对AFX_MSG_MAP之间,增加如下形式的代码:ON_MESSAGE(WM_USERMESSAGE, OnProcName)上面是不用分号结尾的。
2.3 在实现文件中给出消息处理函数的具体实现。
发信人: Amia (小羊·橘子·和中南海有缘), 信区: VisualC标题: MFC中自由使用自定义消息发信站: 哈工大紫丁香(2003年11月26日07:45:34 星期三), 站内信件消息映射、循环机制是Windows程序运行的基本方式。
V C++MFC 中有许多现成的消息句柄,可当我们需要完成其它的任务,需要自定义消息,就遇到了一些困难。
MFC中的消息发送与响应

MFC中的消息发送与响应1. 主窗口向子窗口发送消息:/phenixyf/article/details/9300425从主窗口向子窗口发送消息,可以在子窗口中添加自定义的消息,然后在主窗口中需要地方呼叫该消息。
呼叫方法:1.将子窗口添加为主窗口的成员变量;2.主窗口呼叫该消息,成员变量名.SendMessage(UM_PROGRESS);子窗口添加自定义消息步骤如下:1、定义消息。
在Windows中,所有的消息都用一个特定的整数值来表示,为了避免自定义消息与已存在的其他消息发生冲突,应该利用Windows提供的一个常量:WM_USER,小于这个常量的是系统保留的。
即用户自定义的消息至少为WM_USER+1,注意最后表示的消息的数值不要超过0x7FFF。
在开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
#define UM_PROGRESS WM_USER + 100将上句添加到子窗口类的头文件(.h)中。
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_MSGDECLARE_MESSAGE_MAP()3、在子窗口类的实现文件(.cpp)中,使用ON_MESSAGE宏指令将消息映射到消息处理表中。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_WM_TIMER()ON_MESSAGE(UM_PROGRESS, OnProgress)//注意这条语句的后面没有分号//}}AFX_MSG_MAPEND_MESSAGE_MAP()4、实现消息处理函数。
MFC自定义消息和子对话框父对话框发送消息

MFC自定义消息和子对话框父对话框发送消息消息机制是windows的典型运行机制,在MFC中有很多的消息如WM_BTN**等。
但是在有些情况下我们需要自定义一些消息去做一些我们需要的功能,MFC的向导不能帮助我们做到这一点,我们可以通过添加相应的代码去完成这个功能。
添加自定义消息操作如下:1. 建立MFC工程,如基于对话框的应用程序,Test。
2. 在资源中添加要处理的消息的值,即在CTestDlg.h 中添加如下代码。
(因为很多MFC的消息是在WM_USER内的,所以这里用比WM_USER大的消息)#define WM_MyMessage (WM_USER+100)3. 声明消息处理函数,在CTestDlg.h中添加代码1.class CTestDlg : public CDialog2.{3.protected:4.……5.// 生成的消息映射函数6.……7.afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); // add lyw8.DECLARE_MESSAGE_MAP()9.……4. 添加消息映射处理,在CTestDlg.cpp中人找到如下部分添加代码1.BEGIN_MESSAGE_MAP(CTestDlg, CDialog)2.……3.ON_MESSAGE(WM_MyMessage, OnMyMessage)4.END_MESSAGE_MAP()5. 实现自己的自定义消息处理1.LRESULT CT estDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)2.{3.//MessageBox("recv msg success");4.//添加自己的消息处理5.……6.return 0;7.}6. 如果要发送一个自定义的消息,使用代码SendMessage( WM_MyMessage, 0, 0);或者PostMessage(WM_MyMessage, 0, 0);如果是在子对话框里,想向父对话框发送消息GetParent()->SendMessage(WM_XXX,a,b);//或使用如下代码发送消息:HWND hwnd = ::GetParent(m_hWnd);::SendMessage(hwnd,WM_XXX,a,b);//SendMessage(WM_add_event_ok,a,b);//在测试中,不使用GetParent()->的时候,消息无法传递到父窗口的消息处理函数中,只有增加了GetParent()->后,消息才能成功的发送。
(转载)MFC的消息处理函数

(转载)MFC的消息处理函数MFC的消息处理函数1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调⽤AfxCallWndProc2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应⽤程序以后使⽤,然后调⽤WindowProc()函数3.WindowProc() 该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调⽤DefWindowProc()函数4.OnWndMsg() 该函数的功能⾸先按字节对消息进⾏排序,对于WM_COMMAND消息,调⽤OnCommand()消息响应函数,对于WM_NOTIFY消息调⽤OnNotify()消息响应函数。
任何被遗漏的消息将是⼀个窗⼝消息。
OnWndMsg()函数搜索类的消息映像,以找到⼀个能处理任何窗⼝消息的处理函数。
如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数5.OnCommand() 该函数查看这是不是⼀个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是⼀个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调⽤OnCmdMsg()函数6.OnCmdMsg() 根据接收消息的类,OnCmdMsg()函数将在⼀个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。
例如:如果拥有该窗⼝的类是⼀个框架类,则命令和通知消息也被传递到视图和⽂档类,并为该类寻找⼀个消息处理函数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消息,该函数被ShowWindow()函数调⽤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对象,然后调⽤AfxCallWndProc2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应⽤程序以后使⽤,然后调⽤WindowProc()函数3.WindowProc() 该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调⽤DefWindowProc()函数4.OnWndMsg() 该函数的功能⾸先按字节对消息进⾏排序,对于WM_COMMAND消息,调⽤OnCommand()消息响应函数,对于4.OnWndMsg() 该函数的功能⾸先按字节对消息进⾏排序,对于WM_COMMAND消息,调⽤OnCommand()消息响应函数,对于WM_NOTIFY消息调⽤OnNotify()消息响应函数。
MFC实现简单网络聊天程序

// TODO: Add your control notification handler code here UpdateData(TRUE); //使控件与变量同步 if(m_iType==0) //m_iType=0 即 client 端 m_ctlConnect.SetWindowText("连接");//m_ctlConnect 为控件“连接”按钮的映射变 量 else m_ctlConnect.SetWindowText("监听"); } 运行程序,结果如下图所示: 选中“客户端”显示“连接” ;选中“服务器端”显示“监听” :
添加代码: //in MySocket.h class CMySocket : public CAsyncSocket { //省略代码(自动生成) public: void SetParent(CDialog* pWnd);//成员函数,设置指向父对话框的指针 // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(MySocket) public: virtual void OnAccept(int nErrorCode); virtual void OnConnect(int nErrorCode); virtual void OnClose(int nErrorCode); virtual void OnReceive(int nErrorCode); virtual void OnSend(int nErrorCode); //}}AFX_VIRTUAL // 省略代码(自动生成) protected: private: CDialog* m_pWnd;//私有成员变量,指向父对话框的指针 }; // in MySocket.cpp 以下代码很重复,都是调用对话框类的成员函数 void CMySocket::OnAccept(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class if(nErrorCode==0)//判断是否有错误 ((CMySockDlg*)m_pWnd)->OnAccept();//没有错误,则调用对话框类的 OnAccept
MFC 发送字符串消息

VC/MFC 不同进程间的消息通信与数据(字符串)发送3.4 使用WM_COPYDATA消息通信对于少量数据可以用WM_COPYDATA方便地实现通信。
由于SendMessage()是阻塞的,只有接收方响应了消息,SendMessage()才能返回,否则一直阻塞。
所以,对于大量数据来说,用SendMessage()就容易造成窗口假死。
3.4.1 通过WM_COPYDATA消息实现进程间通信的方法在Win32中,WM_COPYDATA消息主要目的是允许在进程间传递只读数据。
SDK文档推荐用户使用SendMessage()函数,接收方在数据复制完成前不返回,这样发送方就不可能删除和修改数据。
这个函数的原型如下:SendMessage(WM_COPYDATA,wParam,lParam)其中wParam设置为包含数据的窗口句柄,lParam指向一个COPYDATASTRUCT的结构,其定义为:typedef struct tagCOPYDATASTRUCT{DWORD dwData;DWORD cbData;PVOID lpData;}COPYDATASTRUCT;其中dwData为自定义数据,cbData为数据大小,lpData为指向数据的指针。
需要注意的是,WM_COPYDATA消息保证发送的数据从原进程复制到目标进程。
但是,WM_COPYDATA消息不能发送HDC、HBITMAP之类的东西,它们对于目标进程来说是无效的。
目标进程得到这些数据不能在原进程作任何事情,因为它们属于不同的进程。
与其他进程通信方法一样,要实现进程间的数据通信,在发送数据的程序中,首先要找到接收数据进程的窗口句柄pWnd,可以用CWnd::FindWindow(NULL,_ T("DataRecv"))函数来得到,其中字符串"DataRecv"为接收数据的程序名。
然后用SendMessage()函数发送数据,其具体的做法见后面的实例。
基于MFC的即时通讯软件的设计与实现

基于MFC的即时通讯软件的设计与实现摘要在互联网上有很多即时通讯软件。
由于安全性原因,企业内部网络与外网是物理隔离的,无法使用传统的即时通讯软件。
本文开了一个专门为企业定制的通讯软件,该软件通过MFC、XML和Socket编程实现。
其中客户端包含登录、用户列表和收发消息。
服务器端包含主界面、组织管理和用户管理。
最终通过测试,该基于MFC的即时通讯软件能够实现注册、登录、收发消息等基本功能,软件运行稳定。
关键词:MFC; XML; Socket; 即时通讯Design and Implementation of Instant Messaging Software Based on MFCZhu Yan, Guo Xiaomei(College of Information Engineering, Hunan University of Science and Engineering, Yong Zhou425199, Hunan.)AbstractThere are many instant messaging programs on the Internet. For security reasons, the Intranet is physically isolated from theInternet, and traditional IM software cannot be used. This paper develops a communication software specially customized for enterprises, which is implemented by MFC, XML and Socket programming. The client includes login, user list, and sending and receiving messages. The server contains the main interface, organization management, and user management. Finally through the test, the MFC based instant messagingsoftware can achieve registration, login, send and receive messages and other basic functions, the software runs stably.Key words:MFC; XML; Socket; instant messaging1背景及意义企业级的即时通信实际上也可以说是个人即时通信的应用延伸。
VCMFC下实现简单的socket发送接收文件

最简单的发送接收文件(VC6.0下编译通过):Server:#include<afx.h>#include<winsock2.h>#pragma comment(lib,"WS2_32.lib")int main(){WSADATA data;int m;WORD w=MAKEWORD(2,0);::WSAStartup(w,&data);SOCKET s,s1;s=::socket(AF_INET,SOCK_STREAM,0);//IPPROTO_TCP);sockaddr_in addr2,addr;char text[100]={0};int n=sizeof(addr2);addr.sin_family=AF_INET;addr.sin_port=htons(75);addr.sin_addr.S_un.S_addr=INADDR_ANY;::bind(s,(sockaddr *)&addr,sizeof(addr));::listen(s,5);printf("服务器已经启动\r\n");s1=::accept(s,(sockaddr*)&addr2,&n);if(s1!=NULL){printf("%s已经连接上\r\n",inet_ntoa(addr2.sin_addr));::recv(s1,text,100,0);//CFile file((LPSTR)text,CFile::modeReadWrite);if(text!=0){MessageBox(NULL,text,"xiaoxi",MB_OK);CFile file1(text,CFile::modeCreate|CFile::modeReadWrite);if(file1!=NULL){do{m=::recv(s1,text,100,0);file1.Write(text,100);}while(m==100);}file1.Close();}}::closesocket(s);::closesocket(s1);::WSACleanup();::WSACleanup();return 1;}Client:#include<afx.h>#include<winsock2.h>#pragma comment(lib,"WS2_32.lib")int main(){WSADATA data;WORD w=MAKEWORD(2,0);::WSAStartup(w,&data);SOCKET s;char text[100];char filename[100];printf("输入文件名:\n");gets(filename);CFile file(filename,CFile::modeReadWrite);CString str;s=::socket(AF_INET,SOCK_STREAM,0);sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(75);addr.sin_addr.S_un.S_addr=inet_addr("服务器IP");//本机程序服务器IP为你的机子IP或127.0.0.1;printf("客户端已经启动\r\n");int m=::connect(s,(sockaddr *)&addr,sizeof(addr));if(m!=-1){int m;str=file.GetFileName();MessageBox(NULL,str,"xiaoxi",MB_OK);::send(s,str,str.GetLength(),0);file.Read(text,100);do{::send(s,text,100,0);m=file.Read(text,100);printf("%d\n",m);}while(m);}file.Close();::closesocket(s);::WSACleanup();return 1;}有啥不明白的可以加群: 223048036,相互交流学习。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
新建WClient工程基于对话框OK,直接Finish
界面制作
我们需要三个按钮
移除它们
接下来添加六个静态文本三个编辑框两个列表控件,最后我们有:接下来设置控件文本,控件ID,设置成员变量,排布界面
调整:
-设置文本居右
横排变竖排:
Center vertically 反选中。
拉长两个静态文本控件
调整两个ListBox同样大小Make Same Size
空间ID设置:
成员变量设置:你可以使用Ctrl+W快捷键跳出该窗口
点OK 点OK
点OK 点OK 点OK
点OK 点OK
点OK 点OK 点OK
点OK
现在客户端界面已经准备好了,接下来就是服务器了过程略:
现在所有界面准备完毕,接下来为两个程序添加对应的继承CSocket类的类
在WClient中:
Ctrl+W –》Add Class-》NewClass
我们添加了什么呢?
在WClient中:
Ctrl+W –》Add Class-》NewClass
然后呢
接下来为两个类添加虚函数
CWClientSocket 调出右键菜单
Add Handler ,我们将所有的都添加进去。
虽然不是所有的都用的上,但有总比没有好
CWServerSocket
接下来我们可以看看CPP H文件中的变化头文件(.h)
源文件(.cpp)
接下来添加代码:
首先,服务器端需要响应客户端连接接受客户端发送的数据,向客户端发送数据,管理Socket套接字。
则服务器端需要对OnAccept、OnRecieve、OnClose事件进行响应处理。
在CServerDlg.h中定义窗体响应Socket类对应事件的响应函数
定义Socket对象,以及CSocketFile ,CArchive对象(有关说明查阅课本169页)
在CServerDlg.h中包含我们定义的CWServerSocket对象的变量用于监听端口,以及与客户端(一个)进行通信
添加CWServerSocket.h头文件
定义对象
在CServerSocket.h中定义用于存储窗体变量的指针,和初始化函数。
用于在异步调用中访问窗体
在CServerSocket.h中定义窗体指针
初始化函数
在CServerDlg.cpp 和CServerSocket.cpp中分别定义函数实现在CWserverDlg的OnInitDialog函数里添加如下初始语句
各函数实现
当客户端连接过来时,
接受到信息时
套接字被关闭时
双击界面按钮,添加按钮响应事件
在WServerDlg.h中增加SetButtons函数定义
添加,代码
SetButtons函数为控制界面按钮联动。
设置个控件显隐状态在WServerSocket.cpp中添加
在CClientDlg.h中添加头文件引用
定义变量
定义函数
在CWClientDlg.cpp文件中实现该函数里添加初始化代码
实现各函数:
在CClientSocket.h中
引入头文件定义函数
定义变量
在CCLientSocket.cpp中
引入头文件
定义代码,函数实现
两个项目编译运行。