初试MFC--基于Dialog编程

本文介绍了初次使用MFC进行Dialog编程的经验,包括全局变量的设定、线程的创建与同步、自定义窗口消息处理、网络编程及预编译头文件问题的解决。重点讨论了UI线程与工作线程的区别,以及在多线程环境下如何处理网络信息并更新UI。
摘要由CSDN通过智能技术生成
 

这是第一次较大的尝试用MFC编写程序,也是第一次在新浪写技术博客,受maxf同学的影响吧,不然估计还是不会写。不扯废话,开始吧。

《一》关于全局变量的设定。

1》在stdfx.h里面定义一个全局变量即可,其他地方使用,就可以用extern声明。

2》在CXXApp里面定义一个public变量,可以其构造函数或者initInstance里面初始化。使用时使用全局函数

   AfxGetApp()可以获得主线程。((CXXApp*)AfxGetApp())-》var就可得到你定义的变量。

  在CWinThread里面有个成员变量mainFram,所以在这里定义一个公共成员变量也是可以的。

《二》关于线程

主要有两种线程,一个是所谓的UIThread,一个是work thread.

首先说UIthread吧,它是一个runtimeclass继承CWinThread,然后设定MainFrame,

再用

CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, intnPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize= 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs = NULL );

既可以启动,一个很好的例子就是计时器,这里就不贴代码了。

然后是work thread

首先设定线程函数 UINT threadFun(LPVOID ),有两种选择,定义成全局函数,或者类成员函数,记得要定义成static才能去掉this指针。

然后使用

CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, intnPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize= 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTESlpSecurityAttrs = NULL );

启动

关于同步问题,以及互斥,临界资源,等问题,稍加学习,使用信号量,互斥锁以及监视器,就可以实现。

再者就是关于线程的状态切换的问题,这里不再赘述。

《三》自定义窗口消息

首先定义消息码,如#define WM_MY_MSG WM_USER+1

然后定义消息处理函数afx OnMYMsg()然后在message map添加处理项ON_MESSAGE(WM_SOCK_MSG,OnSockMsg)

使用PostMessage(hwnd,lpstr,wparam,lpram)有一些的函数。自己选择吧,

《四》关于网络编程问题。这里跟基于控制台的程序的一个很大区别就是不能阻塞,否则UI界面处于假死状态。no response

有两种方式:

1》使用线程。

2》使用MFC封装的CSocket,CASy。。。(异步套接字,名字有点长,记不住了。)继承这两个其中的一个,然后定制自己想要侦听的消息,如FD_READ或者FD_WRITE等等,然后改写处理函数即可。

我在这里使用的是多线程 的方式。

首先是用线程接收网络信息,然后自定义一个窗口消息,将信息传递给小窗口消息处理函数,处理函数解析消息,然后做出相印的反应,并且更新UI。

<五>关于添加心的头文件,而出现预编译通不过的问题即:fatal error C1010: unexpected end of file while looking for precompiled header directive.处理方式很简单,在这里添加stdfx。h就OK了。

还有一种方法:对于VC6::如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则Alt+F7进入当前工程的 Settings,选择C/C++选项卡,从Category组合框中选中Precompiled Headers,选择Not Using Precompiled headers。确定。

原因也很简单:

对预编译头文件说明如下:  
   
所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。  
   
预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。  
   
编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include   "stdafx.h"前的代码都是预编译的,它跳过#include   "stdafx.   h"指令,使用projectname.pch编译这条指令之后的所有代码。  
   
因此,所有的CPP实现文件第一条语句都是:#include   "stdafx.h"。 

《六》

关于CListBox的问题,就是使用addstring的时候默认的是安首字符字母顺序插入  

药箱插入末尾可以使用:InsterString(-1,CString);当然也可以附加自己的顺序处理函数。

时间原因就嫌写这么多把。

程序猿是练出来的。加油!(maxf也要加油!)

构架设计重要
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值