(此文仅与爱好桌面应用的朋友交流经验,如果有所错误,欢迎指正。)
一直以来,我都是靠MFC写东西,真的很方便,自己不用动手写窗口,wizard自动生成了。
结果了,不明白底层的运作,总是感觉缺点什么!
最近终于知道了这是为什么了,MFC不是c++标准,而是微软提供的一个非标准的类库。很简单的问题,想了好久,笨死了~~
既然如此,那么其他编译器不一定支持MFC,理所当然的,Linux,Unix当然不可能支持这个类库。这就是MFC的局限化。
虽然现在不用MFC了,大家更喜欢在信息系统制作中使用j2ee或者.NET,可是了,MFC经典的程序设计模式,还是值得学习的。
再有,我觉得,如果没有提供这个类库,我自己就写一个,然后封装,以后不就可以节约很多时间了吗?一点小体会。
以下是自己写的一个简单的窗口程序,参照了网上的一个人写的代码。详细写出了注释,喜欢的人可以在自己的编译器下运行。(注:要支持WIN32 编程的编译器。本人用VC,运行于win32 application下)
#include<windows.h>//调用windows.h提供的win32 API 及一部分win32 宏
//消息处理函数(实际上是一种回调函数)
//参数:窗口句柄,消息,消息参数,消息参数
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//win32应用主函数,消息入口
//参数:实例句柄,上一个实例句柄,命令行参数,窗口显示方式
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd;//窗口句柄
MSG msg;//消息变量
WNDCLASS wndclass;//wndclass对象
char strClassName[]="window";//窗口类名。以str为前缀,符合初学者的习惯
char strTitleName[]="MyWindow";//窗口标题
//以下是wndclass对象成员变量的赋值
//定制“窗口类”结构
wndclass.style=0;
wndclass.lpfnWndProc=WndProc;//关联消息处理函数
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//光标
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//图标
wndclass.hInstance=hInstance;//实例句柄
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//画刷,背景
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=strClassName;//这里最好是将类名定义为lpszClassName,这样一致易于辨认
//注册窗口类
if(!RegisterClass(&wndclass))
{
MessageBeep(0);//调用系统声音
return FALSE;
}
//使用已注册的窗口类,创建主窗口
hwnd=CreateWindow(strClassName,//窗口类名
strTitleName,//窗口标题
WS_OVERLAPPEDWINDOW,//窗口风格
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,
hInstance,//实例句柄
NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
//应用程序消息处理
while(GetMessage(&msg,hwnd,NULL,NULL))//从消息列队中取出消息,就是从message queue中取出消息
{
TranslateMessage(&msg);//转换消息
DispatchMessage(&msg);//派发消息
}
return msg.wParam;
}
//消息函数定义
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//消息处理
switch(message)
{
case WM_DESTROY:PostQuitMessage(0);//退出消息循环
default:
return DefWindowProc(hwnd,message,wParam,lParam);//其余的消息交给由系统提供的缺省处理函数
}
return 0;
}
其实这是最简单的窗口程序,有关wndclass类可以上网查。还有wndproc原型也可以查到,这里不做多的描述。只想与大家分享做东西的心得。
望高手指正。。。。。。