昨天编了一个小程序,简单的Win32窗口编程,感觉收获很大,在这里与大家共享,尤其是初学者,源代码如下:
#include <windows.h>
#include <stdio.h>
//当应用程序建立的时候,操作系统都会给该相应的操作系统分配一个消息队列,然后操作系统会把与该应用程序相关的消息都投放到该消息队列中
LRESULT CALLBACK WinSunProc( //回调函数WinSunProc的声明
HWND hwnd, // handle to window HWND为窗口句柄数据类型,其变量是指向窗口资源的,类似于指针
UINT uMsg, // message identifier UINT为无符号整型数据类型,uMsg是存放基本消息数据(每一个基本消息都是用不同的数字一一对应表示的,为了方便都用带有一定含义的宏表示)的
WPARAM wParam, // first message parameter wParam和lParam都是消息辅助变量,也都是无符号整型,WPARAM、LPARAM都是无符号整型数据类型
LPARAM lParam // second message parameter
);
int WINAPI WinMain( //主函数,即Windows程序的入口函数 小括号内是其的形参
HINSTANCE hInstance, // handle to current instance(存放当前窗口实例) HINSTANCE为应用程序实例句柄数据类型,
HINSTANCE hPrevInstance, // handle to previous instance(存放先前窗口实例)
LPSTR lpCmdLine, // command line 其内放命令行参数
int nCmdShow // show state 表示窗口的状态,如最大化、最小化、正常当前默认状态
)
{
WNDCLASS wndcls; //WNDCLASS为设计窗口类结构体的数据类型 以下就是对窗口该结构体赋值
wndcls.cbClsExtra=0; //cbClsExtra cbWndExtra都为整型变量,其放类和窗口要存放的额外内存空间的具体字节数
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(DKGRAY_BRUSH);//窗口背景是黑色画刷BLACK_BRUSH 利用函数
wndcls.hCursor=LoadCursor(NULL,IDC_ARROW); //装载光标 利用函数
wndcls.hIcon=LoadIcon(NULL,IDI_APPLICATION);//当使用微软设置的图标的话,LoadIcon(,)第一个参数应为NULL,第二个就选用微软提供的图标
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WinSunProc;
wndcls.lpszClassName="Weixin2003";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW;//窗口类型,不同的赋值有不同的特性,水平重画和垂直重画
//1.设计窗口完成
RegisterClass(&wndcls); //2.注册窗口
HWND hwnd; //窗口句柄
hwnd=CreateWindow("Weixin2003","小强加油加油加加油!",WS_OVERLAPPEDWINDOW/*&~WS_MAXIMIZEBOX*/, //3.创建窗口
0,0,600,400,NULL,NULL,hInstance,NULL); //
ShowWindow(hwnd,SW_SHOWNORMAL); //显示一个窗口及其显示的形式 4.显示并更新窗口
UpdateWindow(hwnd);
MSG msg; //定义一个消息结构体MSG变量
while(GetMessage(&msg,NULL,0,0)) //从消息队列中取出一条消息,参一指向消息的一个指针,参二指明消息的取出类型,参三参四指明消息的最大值和最小值
{ //其对消息进行范围过滤,如果两个都设为0,则没有范围过滤了(消息是捕获的)
TranslateMessage(&msg);//对消息对WM_KEYDOWN、WM_KEYUP翻译,产生WM_CHAR消息,并且不影响原来的消息,只会产生新消息,并将其投放到消息队列里
DispatchMessage(&msg);//将消息路由给了操作系统,然后操作系统在调用过程函数,即回调函数WinSunProc
}
return 0;
}
LRESULT CALLBACK WinSunProc( //系统回调函数,其参数的数据类型是系统默认的,不能变,函数名可以改变
HWND hwnd, // handle to window 消息将前四个参数传送给了回调函数
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg) //根据不同消息传送的额数据不同对其进行不同的处理
{
case WM_CHAR:
char szChar[40];
HDC hDc;hDc=GetDC(hwnd);
sprintf(szChar,"按下的键盘字符是%c,ASCII码是%d",wParam,wParam); //C语言中的库函数,将wParam中键盘对应的字符转化为十进制数,并将字符串存放在szChar字符数组中
MessageBox(hwnd,szChar,"强",0);
TextOut(hDc,0,100,szChar,strlen(szChar));
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"鼠标点击","强",0);
HDC hdc;
hdc=GetDC(hwnd); //利用GetDC函数获取“画布”,即获取对应的画图窗口
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("维新培训"));
TextOut(hDC,0,50,"小强真快乐",strlen("维新真培训"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","小强说",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);//该函数执行时会投递一个WM_QUIT消息,当GetMessage获得的是WM_QUIT时,GetMessage的返回值是'0',即为假,其循环结束,WinMain结束
break;
default: //该句是必不可少的,其DefWindowProc对该函数不感兴趣的消息进行了缺省处理
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
这里不能上传图片,要不还可以看一下运行结果,想看的自己可以粘贴然后运行一下吧,挺有意思的,当你看明白这段小程序之后你就了解了一些最基本应用程序的窗口编程了。
程序后面的文字是我自己加释的,这个对C++的应用基本没有,只是应用到基本的Windows应用程序的编程原理,凡是有一点点C语言基础的基本都可以看明白。