您的位置:首页 > 其它

[Win32SDK基本]Static Control(1)Text Static Control 和 WM_CTLCOLORSTATIC

2015-06-23 13:42 399 查看
本文由CSDN用户zuishikonghuan所作,转载请注明出处/article/9672501.html
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基本] 窗口详解(超详细)”(地址:/article/9672496.html)为模板,进一步编写。

先建立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;
}


lParam是子窗口句柄(不是ID)

但是要注意,这几个设置颜色的函数只能在这个消息里有效,另外需要返回一个画刷句柄,用于绘制static control的背景(这里我把它的颜色和文字的背景颜色设为同一个颜色了),这个句柄无须手动释放,系统会自动关闭句柄的。

效果图:



注意:如果是多窗口的程序,窗口关闭后应销毁画刷
case WM_DESTROY://窗口已经销毁
DeleteObject(hbrBkgnd2);

PostQuitMessage(0);//退出消息循环,结束应用程序
return 0;
break;



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: