Windows应用程序开发笔记
Win32 Application开发步骤
1. 包含开发头文件如Windows.h和stdio.h以及其他头文件
2. 定义宏 如#define 变量 值
3. 确定消息处理函数,可以是一个或者多个消息处理函数 如:
声明处理函数:LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
4. Win32程序入口是WinMain()函数 如:
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
5. 窗口类定义 WNDCLASS wndclas,并且给窗口类赋值
wndclass.style = CS_HREDRAW | CS_VREDRAW ;//窗口类型
wndclass.lpfnWndProc= WndProc ;//窗口消息处理函数
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;//窗口实例
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;//窗口左上角图标
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;//加载鼠标样式
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;//窗口背景,这里的返回值不是HBRUSH,所以需要在前面进行强制转换
wndclass.lpszMenuName= NULL ;//菜单名
wndclass.lpszClassName= szAppName ;//窗口类名,以及窗口名
6. 注册窗口类
if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
7. 定义窗口实例句柄HWND hwnd,并建立窗口
hwnd = CreateWindow (szAppName, TEXT ("Device Capabilities"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
8. 显示窗口 ShowWindow (hwnd, iCmdShow) ;
9. 更新窗口 UpdateWindow (hwnd) ;
10. 消息队列循环
while (GetMessage (&msg, NULL, 0, 0)) //从消息队列中取得消息
{
TranslateMessage (&msg) ;//转译消息,将KEY_DOWN等消息转换为WM_CHAR或其他消息
DispatchMessage (&msg) ;//分发消息给消息处理函数
}
11.返回消息发生的位置或者其他参数给WinMain() 函数 return msg.wParam ;到这里WinMain函数就结束了。
11. 接下来就要定义消息处理函数了,前面我已经声明了。
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
static int cxChar, cxCaps, cyChar ;
TCHAR szBuffer[10] ;
HDC hdc ;//图形设备句柄
int i ;
PAINTSTRUCT ps ; 在画图中的一个参数
TEXTMETRIC tm ;
switch (message) //消息处理结构
{
case WM_CREATE://窗口创建消息
hdc = GetDC (hwnd) ;
GetTextMetrics (hdc, &tm) ;
cxChar= tm.tmAveCharWidth ;
cxCaps= (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
cyChar= tm.tmHeight + tm.tmExternalLeading ;
ReleaseDC (hwnd, hdc) ;
return 0 ;
case WM_PAINT: //窗口绘制消息
hdc = BeginPaint (hwnd, &ps) ;
for (i = 0 ; i < NUMLINES ; i++)
{
TextOut ( hdc, 0, cyChar * i,
devcaps[i].szLabel,
lstrlen (devcaps[i].szLabel)) ;
TextOut ( hdc, 14 * cxCaps, cyChar * i,
devcaps[i].szDesc,
lstrlen (devcaps[i].szDesc)) ;
SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
TextOut (hdc, 14*cxCaps+35*cxChar, cyChar*i, szBuffer,
wsprintf (szBuffer, TEXT ("%5d"),
GetDeviceCaps (hdc, devcaps[i].iIndex))) ;
SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
}
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY://窗口销毁消息
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;//系统默认消息处理
}
到这里就介绍了基本的Win32程序的开发步骤,至于其他还要继续学习。第一课我就讲到这里了,这是我边学边讲,不到之处还请原谅。
下面讲下在程序中常用的函数:
BeginPaint()与EndPaint//图形设备调用和销毁
GetDC()与ReleaseDC() //适用与非WM_PAINT消息
CreateDC()与DeleteDC()
TextOut//输出文字
MessageBox//消息对话框
DrawText//文字输出
GetSystemMetrics
GetTextMetrics取得文字属性
InvalidateRect使对象区域无效,一边重新产生WM_PAINT消息