#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
WNDCLASS wndcls;
wndcls.cbClsExtra = 0;
wndcls.cbWndExtra = 0;
wndcls.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
wndcls.hIcon = LoadIcon (NULL,IDI_ERROR);
wndcls.hCursor = LoadCursor (NULL,IDC_CROSS);
wndcls.hInstance = hInstance;
wndcls.lpfnWndProc = WinSunProc; //这个是什么函数?自己写的吗?
wndcls.lpszClassName = "wenxin";
wndcls.style = CS_HREDRAW | CS_VREDRAW;
wndcls.lpszMenuName = NULL;
RegisterClass(&wndcls); //注册窗口类
HWND hwnd;
hwnd = CreateWindow ("wenxin","测试窗口", WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL );
ShowWindow (hwnd, SW_SHOWNORMAL);
UpdateWindow (hwnd);
MSG msg;
while (GetMessage (&msg, NULL, 0, 0 ))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return 0;
}
LRESULT CALLBACK WinSunProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf (szChar , "char is %d",wParam);
MessageBox(hwnd,szChar,"wenxin",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked","wenxin",0);
HDC hdc;
hdc = GetDC(hwnd);
TextOut (hdc,0,50,"测试窗口",strlen("测试窗体"));
ReleaseDC (hwnd,hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hwnd,&ps);
TextOut(hDC,0, 0, "个性飞扬",strlen("个性飞扬"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES == MessageBox(hwnd,"是否真的结束?","要退出第一个写的程序吗?",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg, wParam, lParam);
}
return 0;
}
以上代码是产生一个小的简单的窗体,这个窗体虽然简单,但是所有的机制都还算健全。先分析这些代码能帮我们理解windows的运行机制。
首先代码中声明了一个函数WndSunProc(),这个函数有一个特殊的关键字CALLBACK,经这个关键字定义的函数为回调函数,供操作系统调用,对于CALLBACK关键字这里不再做其他的解释。
接下来便是程序的启动函数WinMain(),程序启动时便会进入此函数,在此函数中首先定义了WNDCLASS类型的对象(这里暂称wndcls为对象),接下来对wndcls便做了很多的赋值操作,结构WNDCLASS包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性。在赋值操作中最重要的算是对wndcls.lpfnWndProc的赋值了,这个变量指向了一个函数,窗体有消息需要处理时便会调用此函数来处理消息,因此WndSunProc()函数为消息处理函数,故在下面的代码中在该函数中添加了对部分消息的处理。对wndcls赋值完成之后算是设计好了窗体的外观。接下来便是注册窗口类操作RegisterClass(&wndcls)。
注册好窗体类之后定义了一个窗体句柄变量(hwnd)用来记录建立窗体的句柄,接下来调用CreateWindow()函数来创建一个窗体,这个函数只负责创建窗体,创建的窗体并不能立刻显示出来。之后的ShowWindow()函数负责将窗体显示出来。
窗体显示出来之后还是不能处理任何消息的并且如果不写循环获取消息代码,窗口进程会在建立之后瞬间杀死(具体原因还在分析之中)。所以接下来的代码是循环获取Message消息,并转化处理消息。
WinMain()函数之后的WinSunProc()函数便是消息处理函数的函数体,其中具体的代码这里就不分析了。
这里对最基本、最简单的窗体代码进行了简单的分析,目的是与后面的MFC代码做对比只用。MFC启动过程(二)中将会分析简单的MFC窗口建立的过程,并对比这两个过程。
以上代码是本菜鸟从孙鑫视频配套的文件中获得的,下面的解析是根据自己的理解写的。如有错误,欢迎指正,如想与本菜鸟联系,邮箱:likui360@hotmail.com。