这是第一次较大的尝试用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也要加油!)
构架设计重要