视窗产生的过程说明图测试程式:
#include <windows.h>
#include "mmsystem.h"
#pragma comment(lib,"winmm.lib")//多媒体播放库
LRESULT CALLBACK pfnWndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, //程式执行实体句柄
HINSTANCE hPrevInstance, //前一个程式执行实体句柄
PSTR szCmdLine, //程式命令行参数
int iCmdShow) //窗口显示信息
{
MSG stMsg;
memset(&stMsg, 0, sizeof (stMsg));
HWND stHwnd;
memset(&stHwnd, 0, sizeof (stHwnd));
WNDCLASS stWndClass;
memset(&stWndClass, 0, sizeof (stWndClass));
const TCHAR szAppName[] = TEXT("FrameUI");
stWndClass.style = CS_HREDRAW | CS_VREDRAW; //窗口样式
stWndClass.lpfnWndProc = pfnWndProc;//窗口消息处理函数
stWndClass.cbClsExtra = 0;
stWndClass.cbWndExtra = 0;//扩展预留
stWndClass.hInstance = hInstance;//窗口执行实体句柄
stWndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//加载图标样式
stWndClass.hCursor = LoadCursor(NULL, IDC_ARROW);//加载鼠标样式
stWndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景画刷
stWndClass.lpszMenuName = NULL;//Menu名
stWndClass.lpszClassName = szAppName;//程式名称
if (!RegisterClass(&stWndClass))//注册视窗超类
{
MessageBox(NULL, TEXT("Regiester failure"), szAppName, MB_ICONERROR);
return 0;
}
stHwnd = CreateWindow(szAppName, //窗口类名
TEXT("FrameUI"), //窗口标题
WS_OVERLAPPEDWINDOW, //窗口样式WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
CW_USEDEFAULT, //窗口X位置坐标
CW_USEDEFAULT, //窗口Y位置坐标
CW_USEDEFAULT, //窗口宽
CW_USEDEFAULT, //宽口高
NULL, //父窗口句柄
NULL, //窗口菜单句柄
hInstance, //程式执行实体句柄
NULL); //传递给WM_CREATE的参数信息
ShowWindow(stHwnd, iCmdShow); //显示窗口
UpdateWindow(stHwnd); //更新窗口
while (GetMessage(&stMsg, NULL, 0, 0))
{
TranslateMessage(&stMsg);
DispatchMessage(&stMsg);
}
return stMsg.wParam;
}
LRESULT CALLBACK pfnWndProc(HWND stHwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
HDC stHdc;
memset(&stHdc, 0, sizeof (stHdc));
PAINTSTRUCT stPs;
memset(&stPs, 0, sizeof (stPs));
RECT stRect;
memset(&stRect, 0, sizeof (stRect));
switch (uiMsg)
{
case WM_CREATE:
PlaySound(TEXT("C:\\Users\\Administrator\\Desktop\\1.wav"), NULL, SND_ASYNC | SND_NODEFAULT | SND_LOOP);
return 0;
#if 0 //视窗创建完成进入正常的消息轮循后,拖动窗口边框可产生该消息
case WM_SIZE:
return 0;
#endif
case WM_PAINT:
stHdc = BeginPaint(stHwnd, &stPs);
GetClientRect(stHwnd, &stRect); //获取客户区的区域(不包含标题栏,窗口边框)
DrawText(stHdc, TEXT("FrameUI"), -1, &stRect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(stHwnd, &stPs);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(stHwnd, uiMsg, wParam, lParam);
}
}