当 static 控件或具有 ES_READONLY 风格的 edit 控件被绘制时,会向父窗口发送 WM_CTLCOLORSTATIC 消息。如果我们在窗口过程中处理该消息,就必须返回一个画刷句柄,Windows 会使用该画刷来绘制控件背景(子窗口背景)。
也就是说,改变 static 控件的背景颜色只有这一种方式,就是处理 WM_CTLCOLORSTATIC 消息。WM_CTLCOLORSTATIC 消息就是用来设置背景画刷的。
改变 static 控件的背景颜色
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;//定义设备环境句柄
static TCHAR szBuffer[128];
//TEXTMETRIC tm;
// SCROLLINFO si;
PAINTSTRUCT ps;
size_t iStrLength;
static int cxChar, cyChar, cxClient, cyClient;
static HWND hStatic;//静态文本框
static HFONT hFont[6]; //声明一个逻辑字体句柄为静态变量
static HBRUSH hBrush; //画刷
int i,n;
//size_t iLength;
static int iClick = 0;
static TCHAR szFont[10][6] = {
TEXT("微软雅黑"), TEXT("宋体"), TEXT("黑体"), TEXT("楷体"), TEXT("幼圆"), TEXT("隶书") };
switch (message)
{
case WM_SIZE://窗体大小改变
hdc = GetDC(hWnd);
//GetClientRect(hwnd, &rect);
cxClient = LOWORD(lParam);//当前x像素
cyClient = HIWORD(lParam);//当前y像素
StringCchPrintf(szBuffer, 128, TEXT("当前客户区的分辨率:%d * %d px"), cxClient, cyClient);
StringCchLength(szBuffer, 128, &iStrLength);
SetTextAlign(hdc, TA_CENTER | TA_TOP);
TextOut(hdc, cxClient / 2, 0, szBuffer, iStrLength);
ReleaseDC(hWnd, hdc);
return 0;
case WM_CREATE:
//创建画刷
hBrush = CreateSolidBrush(RGB(0x41, 0x96, 0x4F)); //翠绿色
//创建6个字体
for (i = 0; i < 6; i++)
{
hFont[i] = CreateFont(
-20/*高度*/, -10/*宽度*/, 0/*不用管*/, 0/*不用管*/, 400,//设置字体粗细程度一般这个值设为400,
FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/,
DEFAULT_CHARSET, //这里我们使用默认字符集,还有其他以 _CHARSET 结尾的常量可用
OUT_CHARACTER_PRECIS, //输出精度
CLIP_CHARACTER_PRECIS, //剪裁精度
DEFAULT_QUALITY, //默认输出质量
FF_DONTCARE, //不指定字体族*/
szFont[i] //字体名
);
}
hStatic = CreateWindow(
TEXT("static"), //静态文本框的类名
TEXT("我其实是一个静态文本框"), //控件的文本
WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/ | SS_CENTER /*水平居中*/ | SS_CENTERIMAGE /*垂直居中*/