• 文本不克不及主动换行,超越窗口规模会被隐蔽;

  • 每次更改文本都要先擦除配景再从新输入,比拟费事。


实践开辟中普通运用静态文本框控件来输入文本。静态文本框是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 //一个指向某数值的指针 );

几点阐明:
1) 关于参数 lpClassName 和 lpWindowName,普通运用宽字符,请加前缀L或运用TEXT()。
lpClassName 为窗口类的名字,可所以 RegisterClass 注册的类名,也可所以 Windows 预界说的控件类名。
假如你创立的是自力窗口,则 lpWindowName 应传入窗口的题目,若你愿望创立控件,则应传入控件的文本。
2) dwStyle 表现窗口款式或控件款式。窗口款式以 WS 扫尾,概况请检查《CreateWindow窗口作风取值》。这些款式既可以用于自力窗口,也可以用于控件(子窗口)。
除了窗口款式,分歧的控件也有本人特有的款式。关于 static 控件,它的款式以 SS 扫尾,常用的有:

款式阐明
SS_LEFT文本居左。
SS_RIGHT文本居右。
SS_CENTER文本居中。
SS_CENTERIMAGE文本垂直居中。设置该款式后只能显示一行文本,即便有 '\n' 也不会换行。
SS_LEFTNOWORDWRAP文本居左,不主动换行(有 '\n' 才会换行),超越控件规模的文本将被隐蔽。
SS_SIMPLE只显示一行文本(有 '\n' 也不换行),且不主动换行,超越控件规模的文本将被隐蔽。


3) 关于参数 hWndParent,假如是自力窗口,那么为 NULL,假如是控件,那么就需求父窗口的句柄。
4) 参数 hMenu 非常主要,在后续引见的需求处置控件音讯的控件中,这是他们的独一标识符。每一个控件的 hMenu 参数值都应分歧,而且需求强迫转换到 HMENU 类型,如 (HMENU)1 ,再次强调,每一个控件的(HMENU)后的值都应分歧,可以从1往下递推。
下面的代码,会在 WM_CREATE 事情中创立 static 控件:

			//窗口进程 LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; HWND hStatic; switch (message){ case WM_CREATE: hStatic = CreateWindow( L"static", //静态文本框的类名 L"C言语中文网", //控件的文本 WS_CHILD /*子窗口*/ | WS_VISIBLE /*创立时显示*/ | WS_BORDER /*带边框*/| SS_CENTER /*程度居中*/ | SS_CENTERIMAGE /*垂直居中*/, 20 /*X坐标*/, 20 /*Y坐标*/, 200 /*宽度*/, 100 /*高度*/, hWnd, //父窗口句柄 (HMENU)1, //为控件指定一个独一标识符 hInst, //以后程序实例句柄 NULL); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO:  在此添加恣意画图代码... EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd, message, wParam, lParam) ; }

运转后果:

完好代码下载:http://pan.baidu.com/s/1eQo8kNK    暗码:excr
给 CreateWindow 函数传入的第三个参数为窗口款式或控件款式(子窗口款式)。分歧的控件款式普通分歧,而窗口款式则大同小异:

  • WS_CHILD:标明是一个子窗口,也就是控件,不是自力窗口。

  • WS_VISIBLE:创立时显示,假如没有该款式,则需求挪用 ShowWindow 函数来显示。

  • WS_BORDER:带边框。


给 CreateWindow 函数传入的倒数第二个参数为 hInst,表现以后程序的实例句柄。hInst 在 WndProc 函数中并不存在,由于以后实例句柄是经过 WinMain 函数的参数传入的,所以必需要界说一个全局变量 hInst,然后在 WinMain 中给它赋值后才干运用。如下所示:

			#include <windows.h> HINSTANCE hInst; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ // TODO: 其他代码 hInst = hInstance; // TODO: 其他代码 }

别的,你也可以经过((LPCREATESTRUCT)lParam)->hInstance语句取得以后程序实例句柄,有兴味的冤家请自行Google或百度。

获取、修正控件文本

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);


下面的例子用来显示鼠标点击的次数:

			//窗口进程 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 控件句柄 switch (message){ case WM_CREATE: hStatic = CreateWindow( L"static", //静态文本框的类名 L"C言语中文网", //控件的文本 WS_CHILD /*子窗口*/ | WS_VISIBLE /*创立时显示*/ | WS_BORDER /*带边框*/| SS_CENTER /*程度居中*/ | SS_CENTERIMAGE /*垂直居中*/, 20 /*X坐标*/, 20 /*Y坐标*/, 200 /*宽度*/, 100 /*高度*/, hWnd, //父窗口句柄 (HMENU)1, //为控件指定一个独一标识符 hInst, //以后程序实例句柄 NULL); 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) ; }

运转程序后,在客户区单击鼠标检查后果。下面是一张截图:

完好代码下载:http://pan.baidu.com/s/1bnudUVH    提取暗码:5pea
几点阐明:
1) WM_LBUTTONDOWN 为鼠标左键单击音讯。
2) wsprintf 与C言语中的 printf 相似,多是格局化输入函数,不外 wsprintf 普通将字符串输入到缓冲区,而 printf 输入到掌握台。它的原型为:

			int wsprintf( LPTSTR lpBuffer, //接纳字符串的缓冲区的指针 LPCTSTR lpFormat, //格局掌握字符串 [paramList] //参数列表 );


3) 声明 static 变量的目标是使部分变量耐久化。第一次履行窗口函数会发生 WM_CREATE 音讯,初始化 hStatic 变量。假如不声明为 static,那么当函数履行完毕后 hStatic 变量就会被烧毁,接下来单击鼠标履行窗口函数时,再也不会发生 WM_CREATE 音讯,也就意味着 hStatic 变量不会被赋值,将无法运用。
关于窗口函数中的变量,假如是在 WM_CREATE 音讯中赋值,但在其他音讯中运用,那么普通声明为静态变量,如许下次履行窗口函数时仍然无效。
更多关于 static 变量的内容请检查:C言语static变量和函数
4) 我们将在《修正static控件配景色彩和文字色彩》一节中解说 static 控件配景色彩和文字色彩的修正。