Static Control是最常用的win32控件之一,它可以显示文字,图片或图标
本篇先介绍关于显示文字的Static Control
MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/bb760769(v=vs.85).aspx
关于创建子窗口,子窗口一般都是在父窗口的消息中创建的,也是用函数,但是和创建窗口有不同的地方,首先,类名不再是自己注册的,而是指定的,第二,需要指定父窗口句柄,第三,需要定义一个唯一的子窗口ID。最重要的是,子窗口要有WS_CHILD风格,同时推荐加上WS_VISIBLE风格,不然还需要手动显示
还是以我的博客“[Win32SDK基本] 窗口详解(超详细)”(地址:http://blog.csdn.net/zuishikonghuan/article/details/46378475)为模板,进一步编写。
先建立2个全局变量,保存2个Static Control的句柄
HWND static1 = 0; HWND static2 = 0;
再建立一个全局变量,用于保存static2的画刷
HBRUSH hbrBkgnd2=NULL;
在消息里添加一下代码,即可创建Text Static Control
case WM_CREATE: static1 = CreateWindow(TEXT("STATIC"), TEXT("这是一个Text Static Control"), WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 10, 150, 30, hwnd, (HMENU)1, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); static1 = CreateWindow(TEXT("STATIC"), TEXT("第二个Text Static Control "), WS_CHILD | WS_VISIBLE | SS_LEFT, 150, 120, 200, 30, hwnd, (HMENU)2, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); return 0;
CreateWindow就比CreateWindowEx少了一个扩展风格,注意需要:父窗口句柄(利用的回调函数发来的hwnd),子窗口ID((HMENU)1和(HMENU)2))和实例句柄(从父窗口获取的(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE))
效果图:
列举几个常用的样式,其他样式参见MSDN
SS_LEFT:文本左对齐
SS_CENTER:文本居中
SS_BITMAP:显示一个位图
SS_ICON:显示一个图标(MSDN: If the control is created via CreateWindow or a related function, the text is the name of an icon (not a filename) defined in the resource file associated with the module specified by the hInstance parameter to CreateWindow. 翻译:如果控件通过 CreateWindow 或有相关的函数创建的文本是图标 (而不是文件名) 在与 CreateWindow 的 hInstance 参数所指定的模块关联的资源文件中定义的名称)
SS_REALSIZECONTROL:调整位图以适应静态控件的大小
SS_CENTERIMAGE:位图或图标居中
SS_SIMPLE:只显示一行文字,不允许自动换行
关于字体问题
直接创建的 Text Static Control 的字体实在不敢恭维,我以后会写一篇关于字体的文章,但这里特别提一个如何将字体设置为系统默认字体的方法,即通过获取默认字体,再通过WM_SETFONT设置字体
代码如下,在create后直接调用即可
static1 = CreateWindow(TEXT("STATIC"), TEXT("这是一个Text Static Control"), WS_CHILD | WS_VISIBLE | SS_LEFT, 10, 10, 150, 30, hwnd, (HMENU)1, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); SendMessage(static1, WM_SETFONT, (WPARAM)GetStockObject(17), 0); static2 = CreateWindow(TEXT("STATIC"), TEXT("第二个Text Static Control "), WS_CHILD | WS_VISIBLE | SS_LEFT, 150, 120, 200, 30, hwnd, (HMENU)2, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL); SendMessage(static2, WM_SETFONT, (WPARAM)GetStockObject(17), 0);
效果图:
关于如何取得Text和如何设置Text的问题
使用SetWindowText/GetWindowText函数,将于edit control那一篇中详细说
关于如何修改前景色(文字颜色)和背景色的问题——利用WM_CTLCOLORSTATIC消息
MSDN:https://msdn.microsoft.com/en-us/library/bb787524(VS.85).aspx
代码如下
case WM_CTLCOLORSTATIC://设置静态控件颜色 { if ((HWND)lParam == static2){ HDC hdcStatic = (HDC)wParam; SetTextColor(hdcStatic, RGB(140, 255, 255));//文字前景色 SetBkColor(hdcStatic, RGB(0, 0, 0));//文字背景色 if (hbrBkgnd2==NULL){ hbrBkgnd2 = CreateSolidBrush(RGB(0, 0, 0));//创建一个画刷,用于返回这个消息,系统使用这个画刷绘制控件的背景 } return (LRESULT)hbrBkgnd2; } else return 0; }
但是要注意,这几个设置颜色的函数只能在这个消息里有效,另外需要返回一个画刷句柄,用于绘制static control的背景(这里我把它的颜色和文字的背景颜色设为同一个颜色了),这个句柄无须手动释放,系统会自动关闭句柄的。
效果图:
case WM_DESTROY://窗口已经销毁 DeleteObject(hbrBkgnd2); PostQuitMessage(0);//退出消息循环,结束应用程序 return 0; break;