MFC CSocket AfxBeginThread PossMessage Menu 自定义消息

 1 // StockServerDlg.h : 头文件
 2 //
 3
 4 #pragma once
 5 #include "afxwin.h"
 6
 7 UINT ThreadProc(LPVOID pParm);
 8
 9 struct threadInfo
10 {
11     char recvMsg[256];
12     char sendMsg[256];
13     HWND hWnd;    //主窗口句柄,用于消息的发送
14 };
15
16 // CStockServerDlg 对话框
17 class CStockServerDlg : public CDialogEx
18 {
19 // 构造
20 public:
21     CStockServerDlg(CWnd* pParent = NULL);    // 标准构造函数
22
23 // 对话框数据
24     enum { IDD = IDD_STOCKSERVER_DIALOG };
25
26     protected:
27     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
28
29
30 // 实现
31 protected:
32     HICON m_hIcon;
33     CWinThread *m_pThread;
34     threadInfo m_Info;
35
36     // 生成的消息映射函数
37     virtual BOOL OnInitDialog();
38     afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
39     afx_msg void OnPaint();
40     afx_msg HCURSOR OnQueryDragIcon();
41     DECLARE_MESSAGE_MAP()
42 public:
43     afx_msg void OnStart();
44     CMenu m_menu;
45     afx_msg void OnClose();
46 protected:
47     afx_msg LRESULT OnInfo(WPARAM wParam, LPARAM lParam);
48 public:
49     CString m_edit1;
50     CString m_edit2;
51     CEdit m_edit3;
52 };
  1 // StockServerDlg.cpp : 实现文件
  2 //
  3
  4 #include "stdafx.h"
  5 #include "StockServer.h"
  6 #include "StockServerDlg.h"
  7 #include "afxdialogex.h"
  8
  9 #ifdef _DEBUG
 10 #define new DEBUG_NEW
 11 #endif
 12
 13 BOOL ServerStatus = FALSE;
 14
 15 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
 16
 17 class CAboutDlg : public CDialogEx
 18 {
 19 public:
 20     CAboutDlg();
 21
 22 // 对话框数据
 23     enum { IDD = IDD_ABOUTBOX };
 24
 25     protected:
 26     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
 27
 28 // 实现
 29 protected:
 30     DECLARE_MESSAGE_MAP()
 31 };
 32
 33 CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
 34 {
 35 }
 36
 37 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
 38 {
 39     CDialogEx::DoDataExchange(pDX);
 40 }
 41
 42 BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
 43 END_MESSAGE_MAP()
 44
 45
 46 // CStockServerDlg 对话框
 47
 48
 49
 50 CStockServerDlg::CStockServerDlg(CWnd* pParent /*=NULL*/)
 51     : CDialogEx(CStockServerDlg::IDD, pParent)
 52     , m_edit1(_T(""))
 53     , m_edit2(_T(""))
 54 {
 55     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 56
 57 }
 58
 59 void CStockServerDlg::DoDataExchange(CDataExchange* pDX)
 60 {
 61     CDialogEx::DoDataExchange(pDX);
 62     DDX_Text(pDX, IDC_EDIT1, m_edit1);
 63     DDX_Text(pDX, IDC_EDIT2, m_edit2);
 64     DDX_Control(pDX, IDC_EDIT3, m_edit3);
 65 }
 66
 67 BEGIN_MESSAGE_MAP(CStockServerDlg, CDialogEx)
 68     ON_WM_SYSCOMMAND()
 69     ON_WM_PAINT()
 70     ON_WM_QUERYDRAGICON()
 71     ON_COMMAND(ID_START, &CStockServerDlg::OnStart)
 72     ON_COMMAND(ID_CLOSE, &CStockServerDlg::OnClose)
 73 ON_MESSAGE(WM_INFO, &CStockServerDlg::OnInfo)    //自定义消息
 74 END_MESSAGE_MAP()
 75
 76
 77 // CStockServerDlg 消息处理程序
 78
 79 BOOL CStockServerDlg::OnInitDialog()
 80 {
 81     CDialogEx::OnInitDialog();
 82
 83     // 将“关于...”菜单项添加到系统菜单中。
 84
 85     // IDM_ABOUTBOX 必须在系统命令范围内。
 86     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 87     ASSERT(IDM_ABOUTBOX < 0xF000);
 88
 89     CMenu* pSysMenu = GetSystemMenu(FALSE);
 90     if (pSysMenu != NULL)
 91     {
 92         BOOL bNameValid;
 93         CString strAboutMenu;
 94         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
 95         ASSERT(bNameValid);
 96         if (!strAboutMenu.IsEmpty())
 97         {
 98             pSysMenu->AppendMenu(MF_SEPARATOR);
 99             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
100         }
101     }
102
103     // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
104     //  执行此操作
105     SetIcon(m_hIcon, TRUE);            // 设置大图标
106     SetIcon(m_hIcon, FALSE);        // 设置小图标
107
108     // TODO: 在此添加额外的初始化代码
109     //添加自定义菜单
110     m_menu.LoadMenuW(IDR_MENU1);
111     SetMenu(&m_menu);
112     m_edit3.SetWindowText(_T("未启动"));
113     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
114 }
115
116 void CStockServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
117 {
118     if ((nID & 0xFFF0) == IDM_ABOUTBOX)
119     {
120         CAboutDlg dlgAbout;
121         dlgAbout.DoModal();
122     }
123     else
124     {
125         CDialogEx::OnSysCommand(nID, lParam);
126     }
127 }
128
129 // 如果向对话框添加最小化按钮,则需要下面的代码
130 //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
131 //  这将由框架自动完成。
132
133 void CStockServerDlg::OnPaint()
134 {
135     if (IsIconic())
136     {
137         CPaintDC dc(this); // 用于绘制的设备上下文
138
139         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
140
141         // 使图标在工作区矩形中居中
142         int cxIcon = GetSystemMetrics(SM_CXICON);
143         int cyIcon = GetSystemMetrics(SM_CYICON);
144         CRect rect;
145         GetClientRect(&rect);
146         int x = (rect.Width() - cxIcon + 1) / 2;
147         int y = (rect.Height() - cyIcon + 1) / 2;
148
149         // 绘制图标
150         dc.DrawIcon(x, y, m_hIcon);
151     }
152     else
153     {
154         CDialogEx::OnPaint();
155     }
156 }
157
158 //当用户拖动最小化窗口时系统调用此函数取得光标
159 //显示。
160 HCURSOR CStockServerDlg::OnQueryDragIcon()
161 {
162     return static_cast<HCURSOR>(m_hIcon);
163 }
164
165 void CStockServerDlg::OnStart()
166 {
167     // TODO: 在此添加命令处理程序代码
168     memset(m_Info.recvMsg,0,sizeof(m_Info.recvMsg));
169     memset(m_Info.sendMsg,0,sizeof(m_Info.sendMsg));
170     m_Info.hWnd = m_hWnd;
171     m_pThread = AfxBeginThread(ThreadProc,&m_Info);
172     if (m_pThread == NULL)
173     {
174         AfxMessageBox(_T("启动失败!"));
175         return;
176     }
177     ServerStatus = TRUE;
178     m_edit3.SetWindowText(_T("已启动"));
179 }
180
181
182 void CStockServerDlg::OnClose()
183 {
184     // TODO: 在此添加命令处理程序代码
185     m_edit3.SetWindowText(_T("未启动"));
186     ServerStatus = FALSE;
187 }
188
189 UINT ThreadProc(LPVOID pParm)
190 {
191     threadInfo *pInfo=(threadInfo*)pParm;
192     CSocket srvSocket, connSocket;
193     //最好不要使用srvSocket.Create创建,因为容易会出现10048错误
194     if (!srvSocket.Socket())
195     {
196         AfxMessageBox(_T("Socket Create Faild!"));
197         return 1;
198     }
199
200     BOOL bOptVal = TRUE;
201     int bOptLen = sizeof(BOOL);
202
203     //设置Socket的选项, 解决10048错误必须的步骤
204     srvSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);
205     //绑定端口
206     if (!srvSocket.Bind(8090))
207     {
208         AfxMessageBox(_T("Bind Create Faild!"));
209     }
210     //监听
211     if(!srvSocket.Listen(10))
212     {
213         AfxMessageBox(_T("Listen Create Faild!"));
214         return 1;
215     }
216     while(ServerStatus)
217     {
218         //接收外部连接
219         if(!srvSocket.Accept(connSocket))
220         {
221             continue;
222         }
223         else
224         {
225             char szRecvMsg[256] = {0};
226             char szOutMsg[256] = {0};
227             //接收客户端内容:阻塞
228             connSocket.Receive(szRecvMsg, 256);
229             sprintf_s(pInfo->recvMsg,"Receive data = %s",szRecvMsg);
230
231             //发送内容给客户端
232             connSocket.Send("Have Receive The Msg", 50);
233             sprintf_s(pInfo->sendMsg,"Have Receive The Msg");
234             ::PostMessage(pInfo->hWnd,WM_INFO,(WPARAM)pInfo,0);
235             //关闭
236             connSocket.Close();
237         }
238     }
239     //关闭
240     srvSocket.Close();
241     connSocket.Close();
242     return 0;
243
244 }
245
246 afx_msg LRESULT CStockServerDlg::OnInfo(WPARAM wParam, LPARAM lParam)
247 {
248     threadInfo *psInfo=(threadInfo*)wParam;
249     m_edit1 = psInfo->recvMsg;
250     m_edit2 = psInfo->sendMsg;
251     UpdateData(FALSE);
252
253     return 0;
254 }
时间: 2024-10-09 21:47:25

MFC CSocket AfxBeginThread PossMessage Menu 自定义消息的相关文章

MFC CSocket和CAsyncSocket的连接

MFC CSocket和CAsyncSocket的连接 flyfish 2015-1-31 CSocket的Connect是阻塞的. 所以代码类似 if(!Connect()) { } 判断成功还是失败 CAsyncSocket的Connect是非阻塞的 当调用CAsyncSocket::Connect连接一个服务器 虽然CAsyncSocket::Connect函数返回值是BOOL类型, 但代码不是 if(!Connect()) { } 当连接操作完成,完成(complete)!=成功(suc

MFC中用户自定义类响应自定义消息

这篇技术文章不是讨论经典的MFC中的消息工作机理的,讨论消息工作原理.方式和路径的文章在网上和书本中随处可见.网上众多的讨论都是关于如何响应并进行用户自定义消息映射的:网上还有一些文章介绍如何在自定义类中响应Windows消息,在本文中都简略叙述.但是,网上大部分的文章没用透彻阐述如何在用户自定义类中响应自定义消息这一通用方法. 问题定义如下:用户自定义一个类,这个类不一定要有界面(完全可以是不可视的),要求自定义的类可以响应某个自定义消息. 首先能够响应消息的类必须都从CCmdTarget类中

静态MFC CSocket CAsyncSocket map_pp.cpp错误

静态MFC,在线程中使用SOCKET,发生错误: Debug Assertion Failed!Program:...File:f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\map_pp.cppLine:179 这是MFC的一个BUG,在6.0中就发现,可惜微软到VS2013还是没有修改,估计这个东西微软也要淘汰了,懒得改了,下面是MSDN的解决方法: When using MFC sockets in secondary threads in a sta

MFC 线程创建方式

MFC 分UI线程和工作线程,一般现在的应用程序都是一个主UI线程和N个工作线程来完成工作.主UI线程获取到工作线程发送的信息来刷新界面. 不过因为工作需要,MFC有要维护的项目,因此就学习一下MFC创建UI线程,使用工作线程的方式. 1.UI线程,继承CWinThread类  1 class CAddDeviceApp : public CWinThread 2 { 3     DECLARE_DYNCREATE(CAddDeviceApp) 4 protected: 5     CAddDe

MFC操作ini配置文件

MFC操作ini配置文件 概述     在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置.大小.一些用户设置的数据等等,在   Dos   下编程的时候,我们一般自己产生一个文件,由自己把这些数据写到文件中,然后在下一次执行的时候再读出来使用.在   Win32   编程中当然你也可以这样干,但   Windows   已经为我们提供了两种方便的办法,那就是使用注册表或者   ini   文件(Profile)来保存少量数据.本

MFC子窗口向父窗口发送消息

MFC子窗口向父窗口发送消息(测试成功20110117) 分类: VC++学习2012-08-17 17:22 4327人阅读 评论(4) 收藏 举报 测试mfcuserc 在MFC中,使用用户自定义消息,子窗口向父窗口发送消息过程.代码: 1)在resourse.h中增加定义: //#define WM_add_event_ok (WM_USER + 100) //这种定义方法没有测试,不知道行不行:static UINT WM_add_event_ok = RegisterWindowMes

VC常用小知识

(1) 如何通过代码获得应用程序主窗口的 指针?主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现.AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED)//使程序最大化. (2) 确定应用程序的路径Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名.Example:TCHARexeFullPath[MAX_PATH] // MAX_PATH在API中定义了吧,好象是128G

VC中常见的108个问题

(1) 如何通过代码获得应用程序主窗口的 指针? 主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现. AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED) //使程序最大化. (2) 确定应用程序的路径 Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名. Example: TCHAR exeFullPath[MAX_PATH] // MAX_PATH在API中定义了吧,

Windows下多线程编程(一)

前言 熟练掌握Windows下的多线程编程,能够让我们编写出更规范多线程代码,避免不要的异常.Windows下的多线程编程非常复杂,但是了解一些常用的特性,已经能够满足我们普通多线程对性能及其他要求. 进程与线程 1. 进程的概念 进程就是正在运行的程序.主要包括两部分: • 一个是操作系统用来管理进程的内核对象.内核对象也是系统用来存放关于进程的统计信息的地方. • 另一个是地址空间,它包含所有可执行模块或 D L L模块的代码和数据.它还包含动态内 2. 线程的概念 线程就是描述进程的一条执