Windows API学习-static静态文本框控件(4)
- 简 介
- 下 载
- 留 言
- 说 明
几点说明

1) WM_LBUTTONDOWN 为鼠标左键单击消息。
2) wsprintf 与C语言中的 printf 类似,都是格式化输出函数,不过 wsprintf 一般将字符串输出到缓冲区,而 printf 输出到控制台。它的原型为:
int wsprintf( LPTSTR lpBuffer, //接收字符串的缓冲区的指针 LPCTSTR lpFormat, //格式控制字符串 [paramList] //参数列表 );
3) 声明 static 变量的目的是使局部变量持久化。第一次执行窗口函数会产生 WM_CREATE 消息,初始化 hStatic 变量。如果不声明为 static,那么当函数执行结束后 hStatic 变量就会被销毁,接下来单击鼠标执行窗口函数时,再也不会产生 WM_CREATE 消息,也就意味着 hStatic 变量不会被赋值,将无法使用。
对于窗口函数中的变量,如果是在 WM_CREATE 消息中赋值,但在其他消息中使用,那么一般声明为静态变量,这样下次执行窗口函数时依然有效。
上节完整代码:
#include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE hInst; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow ){ static TCHAR szClassName[] = TEXT("Win32Demo"); //窗口类名 HWND hwnd; //窗口句柄 MSG msg; //消息 WNDCLASS wndclass; //窗口类 hInst = hInstance; /**********第①步:注册窗口类**********/ //为窗口类的各个字段赋值 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);; //窗口背景画刷(白色) wndclass.lpszMenuName = NULL ; //窗口菜单 wndclass.lpszClassName= szClassName; //窗口类名 //注册窗口 RegisterClass(&wndclass); /*****第②步:创建窗口(并让窗口显示出来)*****/ hwnd = CreateWindow( szClassName, //窗口名字 TEXT("www.fanrong.team"), //窗口标题(出现在标题栏) WS_OVERLAPPEDWINDOW, //窗口风格 CW_USEDEFAULT, //初始化时x轴的位置 CW_USEDEFAULT, //初始化时y轴的位置 500, //窗口宽度 300, //窗口高度 NULL, //父窗口句柄 NULL, //窗口菜单句柄 hInstance, //当前窗口的句柄 NULL //不使用该值 ); //显示窗口 ShowWindow (hwnd, iCmdShow); //更新(绘制)窗口 UpdateWindow (hwnd); /**********第③步:消息循环**********/ while( GetMessage(&msg, NULL, 0, 0) ){ TranslateMessage(&msg); //翻译消息 DispatchMessage (&msg); //分派消息 } return msg.wParam; } //窗口过程 LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ){ PAINTSTRUCT ps; HDC hdc; //必须被设置为静态变量 static int iClick = 0; //鼠标单击次数 static TCHAR szTextBuf[20]; //static 控件文本 static HWND hStatic; //static 控件句柄 switch (message){ case WM_CREATE: hStatic = CreateWindow( L"static", //静态文本框的类名 L"欢迎来到泛容", //控件的文本 WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/| SS_CENTER /*水平居中*/ | SS_CENTERIMAGE /*垂直居中*/, 20 /*X坐标*/, 20 /*Y坐标*/, 200 /*宽度*/, 100 /*高度*/, hWnd, //父窗口句柄 (HMENU)1, //为控件指定一个唯一标识符 hInst, //当前程序实例句柄 NULL ); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 在此添加任意绘图代码... EndPaint(hWnd, &ps); break; case WM_LBUTTONDOWN: iClick++; wsprintf(szTextBuf, TEXT("鼠标被单击%d次"), iClick); SetWindowText(hStatic, szTextBuf); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, message, wParam, lParam) ; }