c++自定义消息完整例子
来源:互联网 发布:复旦大数据学院金融 编辑:程序博客网 时间:2024/06/16 16:18
OnReceive为自定义消息实现的方法
因为线程中无法直接操作控件,以及其他原因,所以需要使用自定义消息来实现这个功能
自定义消息 #define WM_ENABLEBUTTON WM_USER+100
然后在头文件中增加自定义消息的声明,完整代码如下MfcMultithreadingTcpClientDlg.h
// MfcMultithreadingTcpClientDlg.h : 头文件//#pragma once#include "afxwin.h"class CMfcMultithreadingTcpClientDlg : public CDialog{// 构造public:CMfcMultithreadingTcpClientDlg(CWnd* pParent = NULL);// 标准构造函数// 对话框数据enum { IDD = IDD_MFCMULTITHREADINGTCPCLIENT_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持// 实现protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon(); //add afx_msg LRESULT OnReceive(WPARAM wParam,LPARAM lParam); //addDECLARE_MESSAGE_MAP()public: afx_msg void OnBnClickedButton1(); // 具体内容框 CListBox m_ListWords; afx_msg void OnBnClickedButton2(); CEdit m_ShuRuKuang;};
然后在BEGIN_MESSAGE_MAP中添加自定义消息,最后写明调用与实现就好了MfcMultithreadingTcpClientDlg.cpp
// MfcMultithreadingTcpClientDlg.cpp : 实现文件//#include "stdafx.h"#include "MfcMultithreadingTcpClient.h"#include "MfcMultithreadingTcpClientDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#endif#define WM_ENABLEBUTTON WM_USER+100// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialog{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()// CMfcMultithreadingTcpClientDlg 对话框CMfcMultithreadingTcpClientDlg::CMfcMultithreadingTcpClientDlg(CWnd* pParent /*=NULL*/): CDialog(CMfcMultithreadingTcpClientDlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CMfcMultithreadingTcpClientDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_ListWords); DDX_Control(pDX, ShuRuKuang, m_ShuRuKuang);}BEGIN_MESSAGE_MAP(CMfcMultithreadingTcpClientDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAP ON_MESSAGE(WM_ENABLEBUTTON,OnReceive) ON_BN_CLICKED(IDC_BUTTON1, &CMfcMultithreadingTcpClientDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &CMfcMultithreadingTcpClientDlg::OnBnClickedButton2)END_MESSAGE_MAP()LRESULT CMfcMultithreadingTcpClientDlg::OnReceive (WPARAM wParam,LPARAM lParam){ char *p; p=(char *)lParam; CString s(p); //if(wParam!=NULL)//{//GetDlgItem(btnTagMessage)->EnableWindow(TRUE); AfxMessageBox("按钮已被启用"); m_ListWords.AddString(s);m_ListWords.SetTopIndex(m_ListWords.GetCount()-1);//}return true;}SOCKET conn;UINT MTClientThread(LPVOID pParam);CString GetWord(char *str);BOOL CMfcMultithreadingTcpClientDlg::OnInitDialog(){CDialog::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码return TRUE; // 除非将焦点设置到控件,否则返回 TRUE}void CMfcMultithreadingTcpClientDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// 如果向对话框添加最小化按钮,则需要下面的代码// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,// 这将由框架自动完成。void CMfcMultithreadingTcpClientDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSOR CMfcMultithreadingTcpClientDlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void CMfcMultithreadingTcpClientDlg::OnBnClickedButton1(){ // TODO: 在此添加控件通知处理程序代码 AfxBeginThread(MTClientThread,this); /* while(_getch()!=27) closesocket(conn); WSACleanup();*/ m_ListWords.AddString("准备链接服务器,要解决线程中操作控件的问题!");m_ListWords.SetTopIndex(m_ListWords.GetCount()-1);}UINT MTClientThread(LPVOID pParam){const char* servername="127.0.0.1";WSADATA wsaData;struct hostent *hp;unsigned int addr;struct sockaddr_in server;int wsaret=WSAStartup(0x101,&wsaData);if(wsaret)return 0;conn=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(conn==INVALID_SOCKET)return 0;//inet_addr是将.分ip转换为十进制数字if(inet_addr(servername)==INADDR_NONE){ hp=gethostbyname(servername);}else{ addr=inet_addr(servername); hp=gethostbyaddr((char*)&addr,sizeof(addr),AF_INET);}if(hp==NULL){ closesocket(conn); return 0;}server.sin_addr.s_addr=*((unsigned long*)hp->h_addr);server.sin_family=AF_INET;server.sin_port=htons(20248);if(connect(conn,(struct sockaddr*)&server,sizeof(server))){closesocket(conn);return 0;}char buff[512];int z;z=recv(conn,buff,512,0);buff[z]=0;//CString a=GetWord(buff);//cout << "aaaa" << a;//wcout << LPCTSTR(a);//cout << tmp;//strcpy(buff,"bbbbbbb\r\n");//send(conn,buff,strlen(buff),0);while(true){z=recv(conn,buff,128,0);if(z==SOCKET_ERROR){//cout << "\r\n\r\nsocket error socket error socket error\r\n";break;} buff[z]=0;::SendMessage (::AfxGetMainWnd()->m_hWnd,WM_ENABLEBUTTON,0,(LPARAM)buff);} //在这里加自定义消息// ::SendMessage (::AfxGetMainWnd()->m_hWnd,WM_ENABLEBUTTON,0,(LPARAM)a); // char *ch=NULL; // ch="蛋疼"; // ::SendMessage (::AfxGetMainWnd()->m_hWnd,WM_ENABLEBUTTON,0,(LPARAM)buff); return 0;}CString GetWord(char *str){CString tmp(str); return tmp;}void CMfcMultithreadingTcpClientDlg::OnBnClickedButton2(){ // TODO: 在此添加控件通知处理程序代码、char buff[512];m_ShuRuKuang.GetWindowTextA(buff,512);// strcpy(buff,"#啦啦啦aaaa\r\n"); send(conn,buff,strlen(buff),0);}
- c++自定义消息完整例子
- 消息持续发送的完整例子
- C++:线程池完整例子
- c汇编完整解析例子
- 一个自定义消息的例子
- JAVA用户自定义事件监听完整例子
- JAVA用户自定义事件监听完整例子
- JAVA用户自定义事件监听完整例子
- JAVA用户自定义事件监听完整例子
- [C#]自定义消息收发
- c访问mysql的完整例子
- c语言访问mysql 完整例子
- c语言访问mysql 完整例子
- c访问mysql的完整例子
- c访问mysql的完整例子
- c访问mysql的完整例子
- 理解HTTP消息头【很完整,例子也很丰富】
- 理解HTTP消息头【很完整,例子也很丰富】
- 基于 OSGi的企业级开发框架实践——认识OSGi和SpringDM
- MAC下配置JAVAWEB环境(原创,写的很详细)
- Shell排序
- 汇编中的参数传递和堆栈平衡
- 如果向uShare请求的文件路径不对
- c++自定义消息完整例子
- 整数的所有不同分割数目----2013年2月15日
- 滚动数组
- 设计模式之工厂方法模式
- 入门 委托、事件和回调函数
- 码农的一生
- 改变数组里的内容
- 自然图像抠图/视频抠像技术发展情况梳理(image matting, alpha matting, video matting)--计算机视觉专题1
- VS2010智能提示没有啦!