一、原理
一个windows对话框程序分为三部分:
- 入口函数;
对话框资源;
- resource.h;
- 控件ID和消息传递时的对应关系。
对话框创建过程。
windows对话框程序的生命周期
二、程序
- windows窗口创建过程
xx.cpp
#include <stdafx.h>
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//定义GUI程序入口函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR lpCmdLine, int nShowCmd)
{
//得到程序当前实例的句柄:
hInstance = GetModuleHandle(NULL);
nShowCmd = SW_SHOW;
//定义程序实例的窗口类:实际窗口以此为模版创建
static THCAR szAppName[] = TEXT("WindowsUI");
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;//当外部动作导致窗口高度和宽度变化,重绘之
wndclass.lpfnWndProc = wndProc;//指向窗口过程的指针
wndclass.cbClsExtra = 0;//window类结构后分配的内存大小
wndclass.cbWndExtra = 0;//window实例后分配的内存大小
wndclass.hInstance = hInstance;//包含类窗口过程的实例句柄
wndclass.hIcon = LoadIcon(NULL, (LPCTSTR)ID_ICON);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = szAppName;//菜单资源的名字
wndclass.lpszClassName = szAppName;//定义窗口类名
//注册窗口类:把窗口过程(本例中为wndProc)和窗口类型信息同要登记的窗口类(wndclass)关联起来,同时存取atom表
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("This program requires NT!"), szAppName, MB_ICONERROR);
return 0;
}
//返回新窗口句柄或空(创建失败时)
hwnd = CreateWindow(szAppName,/*窗口类名*/
TEXT("TBioslogo"),/*窗口标题*/
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,/*窗口初始水平位置.忽略*/
CW_USEDEFAULT,/*窗口初始垂直位置.忽略*/
CW_USEDEFAULT,/*窗口宽度*/
CW_USEDEFAULT,/*窗口高度*/
NULL,
NULL,/*菜单句柄。使用了菜单类,为NULL*/
hInstance,/*与窗口相关联的模块实例句柄*/
NULL/*传递给窗口WM_CREATE消息*/);
ShowWindow(hwnd, nShowCmd);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
窗口处理函数
xx.h
#include "stdafx.h"
#include<windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
static HINSTANCE hInstance;
switch (message)
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
return 0;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_FILE_OPEN:
case ID_TODO_ALL:
DialogBox(hInstance, TEXT("AboutBox"),MAKEINTRESOURCE(IDD_DIALOG2), hwnd, (DLGPROC)AboutDlgProc);
case IDM_APP_ABOUT:
DialogBox(hInstance, /*TEXT("AboutBox")*/(LPCTSTR)AboutBox, hwnd, (DLGPROC)AboutDlgProc);
break;
case ID_APP_EXIT:
DestroyWindow(hwnd);
break;
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, TEXT(""), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message,wParam,lParam);
}