视窗产生的过程

mac2022-06-30  30

视窗产生的过程说明图测试程式: #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); } }
最新回复(0)