在 Windows 编程中,"Static" 控件是一种常见的用户界面元素,用于显示静态文本或图像,而无法进行用户交互。它通常用于显示标签、标题、说明文本或静态图像等信息。Static 控件是一种静态的、只读的显示元素,不接受用户的输入或操作。
本节必须掌握的知识点:
静态类
第51练:静态文本控件
8.2.1 静态类
用CreateWindow函数和“静态” (static)窗口类来创建静态子窗口控件。静态类子窗口控件不接受鼠标或键盘输入,也不会向其父窗口发送WM_COMMAND 消息。
在使用 Win32 API 进行开发时,可以使用 CreateWindow 函数创建 Static 控件。需要指定控件的类名为 "STATIC",样式为 SS_LEFT 或 SS_CENTER 等来控制文本对齐方式。
HWND hStatic = CreateWindow("STATIC", "Static Text", WS_CHILD | WS_VISIBLE, x, y,
width, height, hParent, NULL, hInstance, NULL);
当你在一个静态子窗口上移动或单击鼠标时,子窗口会俘获WM_NCHITTEST消息 并向Windows返回HTTRANSPARENT值。这会导致Windows向其底层窗口(通常是其父窗口)发送相同的WM_NCHITTEST消息。父窗口通常将该消息传给DefWindowProc,在那里它会被转换为客户区鼠标消息。
■静态窗口样式
前6个静态窗口样式只是简单地在子窗口的客户区内画一个矩形或框架。“RECT”静
态样式(左栏)是填充的矩形;三个“FRAME”样式(右栏)是内部没有被填充的矩形边框。
SS_BLACKRECT SS_GRAYFRAME
SS_WHITERECT SS_BLACKFRAME
SS_GRAYRECT SS WHITEFRAME
“BLACK”、“GRAY”和“WHITE”并不意味实际的黑色、灰色和白色。它们更多的是基于下表所示的系统颜色。
静态控件 | 系统颜色 |
BLACK | COLOR_3DDKSHADOW |
GRAY | COLOR_BTNSHADOW |
WHITE | COLOR_BTNHIGHLIGHT |
对于这些样式,CreateWindow调用的窗口文本字段将被忽略。矩形左上角的x和y 坐标是相对于父窗口的。也可以使用SS_ETCHEDHORZ ,SS_ETCHEDVERT或 SS_ETCHEDFRAME样式来用白色和灰色创建一个阴影框架。
静态类还包括三个文本样式:SS_LEFT,SS_RIGHT和SS_CENTER。这些样式会创建左对齐、右对齐和居中对齐的文本。相应的文本由CreateWindow函数的窗口文本参数指定,可以被SetWindowText修改。当静态控件的窗口过程显示此文本时,它会使用 DT_WORDBREAK, DT_NOCLIP 和 DT_EXPANDTABS 等参数来调用 DrawText 函数。 子窗口矩形框具有文本自动换行功能。
这三个文本样式子窗口的背景颜色通常是COLOR_BTNFACE,文本本身颜色是 COLOR_WINDOWTEXT。你可以俘获 WM_CTLCOLORSTATIC 消息,调用 SetTextColor 和SetBkColor分别改变文本颜色和背景颜色,同时返回背景画刷的句柄。
最后,静态类还包括两个窗口样式,分别为SS_ICON和SS_USERITEM。然而,当它们被用来作为子窗口控件时,这些样式是毫无意义的。我们会在讨论对话框的时候再次讨论它们。
样式 | 说明 |
SS_BLACKRECT/SS_BLACKFRAME | 填充矩形或画边框,分别对应的系统颜色为COLOR_3DDSHADOW、COLOR_BTNSHADOW、COLOR_BTNHIGHLIGHT。在CreateWindow调用的窗口文本字段将被忽略(因为被填充了)。坐标是相对于父窗口的 |
SS_GRAYRECT / SS_GRAYRECT | |
SS_WHITERECT/SS_WHITEFRAME | |
SS_ETCHEDHORZ | 用白色和灰色,建立一个边框,并将顶端边框设置为浮雕风格 |
SS_ETCHEDVERT | 用白色和灰色,建立一个边框,并将左侧边框设置为浮雕风格 |
SS_ETCHEDFRAME | 建立一个浮雕边框(阴影边框) |
SS_LEFT | 文本的对齐方式,相应的文本由CreateWindow的文本参数指定,可通过SetWindowsText修改。窗口过程内部使用DrawText函数带DT_WORDBREAK、DT_NOCLIP、DT_EXPANDTABS参数来显文本 |
SS_RIGHT | |
SS_CENTER | |
SS_ICON | 作为子窗口控件时,该样式是无意义的。 |
SS_USERITEM |
8.2.2 第51练:静态文本控件
/*------------------------------------------------------------------
051 WIN32 API 每日一练
第51个例子STATIC_TEXT.C:静态文本控件
SetWindowText函数
(c) www.bcdaren.com, 2020
----------------------------------------------------------------*/
#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 szAppName[] = TEXT("Static Demo");
…(略)
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 控件句柄
static RECT rect;
static cxClient,cyClient;
switch (message)
{
case WM_CREATE:
//获取窗口客户区宽和高
GetClientRect(hWnd,&rect);
hStatic = CreateWindow(
TEXT("static"), //静态文本框的类名
TEXT("编程达人"), //控件的文本
WS_CHILD| WS_VISIBLE| WS_BORDER|
SS_CENTER| SS_CENTERIMAGE /*垂直居中*/,
rect.left+50 /*X坐标*/, rect.top+50 /*Y坐标*/,
rect.right/2/*宽度*/, rect.bottom/2 /*高度*/,
hWnd, //父窗口句柄
(HMENU)1, //为控件指定一个唯一标识符
hInst, //当前程序实例句柄
NULL
);
break;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
//调整窗口 MoveWindow(hStatic,rect.left+cxClient/20,rect.top+cyClient/20,
cxClient/2,cyClient/2,TRUE);
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) ;
}
/******************************************************************************
SetWindowText函数:更改指定窗口标题栏的文本(如果有的话)。如果指定的窗口是控件,则更改控件的文本。
BOOL SetWindowTextA(
HWND hWnd, //要更改其文本的窗口或控件的句柄。
LPCSTR lpString//新标题或控件文本
);
*/
运行结果:
图8-4 静态文本控件
总结
实例STATIC_TEXT.C的窗口过程在处理WM_CREATE消息时调用CreateWindow函数创建一个“static”子窗口控件。窗口类名使用Windows预定义的静态类”static”,静态类子窗口控件的样式为“WS_CHILD| WS_VISIBLE| WS_BORDER| SS_CENTER| SS_CENTERIMAGE”,WS_CHILD表示子窗口样式,WS_VISIBLE表示可见的,WS_BORDER表示带边框的,SS_CENTER表示文本在窗口客户区内水平方向居中对齐,SS_CENTERIMAGE表示IMAGE图像在窗口客户区内水平垂直居中。CreateWindow返回子窗口控件句柄。使用菜单项ID值1标识静态文本子窗口控件ID。
WM_SIZE消息调整子窗口控件大小。
WM_PAINT消息可以在子窗口内绘图。
M_LBUTTONDOWN消息中,调用SetWindowText指定在静态文本控件中显示鼠标点击次数。
需要注意的是,Static 控件是一种只读的静态显示元素,无法接收用户的输入或操作。如果需要与用户进行交互,例如允许用户输入文本或点击操作,需要使用其他类型的控件,如 TextBox、Button 等。