《VC++深入详解—孙鑫》Lesson1—Windows窗口应用函数
一、编写一个Windows窗口应用函数
1、创建窗口 CreateWindow()函数
- 具体的格式可以直接复制MSDN Library中的函数格式
- 句柄很重要,类似指针,找到资源
- 不会就查MSDN Library!!!
2、消息循环(操作系统--应用程序--消息队列的关系)
- 操作系统接收应用程序的窗口消息,将其投放到消息队列中
- 应用程序通过GetMessage()函数调用消息队列中的消息
- 应用程序调用DispatchMessage,将消息传给操作系统
- 系统利用WNDCLASS结构体中的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程函数,对消息进行处理
3、窗口过程函数 LRESULT CALLBACK WinSunProc()函数
(1)需要注意其中的VM_CLOSE和VM_DESTROY消息的区别
-
- VM_CLOSE把窗口关了,但是其后台还在运行
- VM_DESTROY把窗口关闭的同时,也关闭了后台的运行
(2)在处理VM_LBUTTONDOWN消息时,记得要释放DC,否则会造成内存泄露
(3)使用if语句做判断时,可以把常量写在前面(x=1,1=x会报错,1==x)

二、代码
#include <windows.h>
#include <stdio.h>
//窗口过程函数
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window,句柄--资源标识符
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
//WinMain函数
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW | CS_VREDRAW;//窗口样式
wndclass.lpfnWndProc=WinSunProc;//函数指针,指向窗口函数过程,窗口过程函数是一个回调函数
wndclass.cbClsExtra=0;//附加值设为0
wndclass.cbWndExtra=0;//附加值设为0
wndclass.hInstance=hInstance;//指向包含窗口过程的程序的实例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);//图标
wndclass.hCursor=LoadCursor(NULL,IDC_CROSS);//光标
wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//窗口的背景,需要做一个强制类型转换
wndclass.lpszClassName="Weixin2003";//指定菜单资源的名字
wndclass.lpszMenuName=NULL;//指定窗口类的名字
RegisterClass(&wndclass);//注册窗口类
//创建窗口,定义一个变量保存成功创建窗口后的句柄
HWND hwnd;
hwnd = CreateWindow("Weixin2003","XX大学",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 msg.wParam;
}
//编写窗口过程函数
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[20];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"char",0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked","weixin",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"编写一个WinMain窗口界面",strlen("编写一个WinMain窗口界面"));
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"VC++学习第一课",strlen("VC++学习第一课"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否可以结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);//GetMessage函数只有在收到WM_DESTROY消息时才返回0,此时结束消息循环
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
浙公网安备 33010602011771号