实际开发中一般使用静态文本框控件来输出文本。静态文本框是Windows 的一种标准控件,可以用来在窗口上显示一段文本,并且文本容易受到控制。除了静态文本框,Windows的标准控件还有很多种,例如按钮、下拉菜单、单选按钮、复选框等。
其实,控件也是一种窗口,也使用 CreateWindow 函数来创建。但是它们使用的窗口类的名字比较特殊,是由Windows预定义的;静态文本框控件的窗口类名是static。
与前面创建的独立窗口不同,控件是子窗口,创建时必须指定父窗口,这样控件才能有“归属”。
我们先来回顾一下 CreateWindow 函数的原型:
HWND CreateWindow(
LPCWSTR lpClassName, //窗口类名
LPCWSTR lpWindowName, //窗体标题(或控件文本)
DWORD dwStyle, //窗口/控件样式
int x, //窗口相对桌面(或子窗口相对父窗口)的 X 坐标
int y, //窗口相对桌面(或子窗口相对父窗口)的 Y 坐标
int nWidth, //窗体宽度
int nHeight, //窗体高度
HWND hWndParent, //父窗口句柄
HMENU hMenu, //菜单句柄
HINSTANCE hInstance, //当前程序实例句柄
LPVOID lpParam //一个指向某数值的指针
);
几点说明:
lpClassName 为窗口类的名字,可以是 RegisterClass 注册的类名,也可以是 Windows 预定义的控件类名。
如果你创建的是独立窗口,则 lpWindowName 应传入窗口的标题,若你希望创建控件,则应传入控件的文本。
SS_LEFT 文本居左。
SS_RIGHT 文本居右。
SS_CENTER 文本居中。
SS_CENTERIMAGE 文本垂直居中。设置该样式后只能显示一行文本,即使有 ‘\n’ 也不会换行。
SS_LEFTNOWORDWRAP 文本居左,不自动换行(有 ‘\n’ 才会换行),超出控件范围的文本将被隐藏。
SS_SIMPLE 只显示一行文本(有 ‘\n’ 也不换行),且不自动换行,超出控件范围的文本将被隐藏。
对于参数 hWndParent,如果是独立窗口,那么为 NULL,如果是控件,那么就需要父窗口的句柄。
参数 hMenu 十分重要,在后续介绍的需要处理控件消息的控件中,这是他们的唯一标识符。每个控件的 hMenu 参数值都应不同,并且需要强制转换到 HMENU 类型,如 (HMENU)1 ,再次强调,每个控件的(HMENU)后的值都应不同,可以从1往下递推。
下面的代码,会在 WM_CREATE 事件中创建 static 控件:
case WM_CREATE:
//创建蓝色实心画刷,保存句柄到 hSolidBrush 变量
hSolidBrush = CreateSolidBrush(RGB(0, 0, 255));
//创建绿色交叉阴影画刷,保存句柄到 hHatchBrush 变量
hHatchBrush = CreateHatchBrush(HS_DIAGCROSS, RGB(0, 255, 0));
CreateWindow(L"static", L"大家好,我是Ty\n 中国加油",
WS_CHILD /*子窗口*/ | WS_VISIBLE /*创建时显示*/ | WS_BORDER /*带边框*/ | SS_LEFTNOWORDWRAP,
20, 30, 120, 60, hwnd, (HMENU)1, m_hinst,0);
break;
给 CreateWindow 函数传入的第三个参数为窗口样式或控件样式(子窗口样式)。不同的控件样式一般不同,而窗口样式则大同小异:
WS_CHILD:表明是一个子窗口,也就是控件,不是独立窗口。
WS_VISIBLE:创建时显示,如果没有该样式,则需要调用 ShowWindow 函数来显示。
WS_BORDER:带边框。
获取、修改控件文本
GetWindowText 函数用于将指定窗口的标题文本(如果存在)拷贝到一个缓存区内;如果指定的窗口是一个控件,则拷贝控件的文本。它的原型为:
Int GetWindowText(
HWND hWnd, //窗口/控件句柄
LPTSTR lpString, //指向接收文本的缓冲区指针
Int nMaxCount //要保存在缓冲区内的字符的最大个数
);
说明:
nMaxCount 指定要保存在缓冲区内的字符的最大个数,其中包含NULL字符。如果文本超过界限,它就被截断。
函数执行成功,返回拷贝的字符的个数。
代码举例:
//定义缓冲区
TCHAR szStaticBuf[100];
//获取 static 控件的文本
GetWindowText(hStatic, szStaticBuf, 100);
类似的,SetWindowText 函数可以用来设置窗口标题或控件文本,它的原型为:
BOOL SetWindowText(
HWND hwnd,
LPCTSTR lpString
);