ウィンドウテキスト


テキストを変更する

ウィンドウには、CreateWindow() で指定した名前がついています
この名前はタイトルバーやボタンテキストなどで使用されていますね

通常、一度設定すれば十分であるケースが多いのですが
プログラムによっては、ボタンのテキストなどを変更したいことがあるでしょう
ウィンドウのテキストを変更するには SetWindowText() を用います

BOOL SetWindowText(HWND hWnd , LPCTSTR lpString);

hWnd には、テキストを変更するウィンドウのハンドルを
lpString は、NULL で終わる文字列へのポインタを指定します

関数が成功すれば 0 以外、失敗すれば 0 が返ります
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	static HWND button;
	static CONST LPSTR strTaruto = TEXT("Magical nyan nyan TARUTO");

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		button = CreateWindow(
			TEXT("BUTTON") , TEXT("変更") ,
			WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
			0 , 0 , 100 , 30 ,
			hwnd , (HMENU)1 ,
			 ((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		return 0;
	case WM_COMMAND:
		SetWindowText(hwnd , strTaruto);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
	return msg.wParam;
}


ボタンを押すと、タイトルバーの文字が変化します
ボタンなどのコントロールのテキストを変更する場合も方法は同じです

また、プログラムが現在のウィンドウテキストを得たい場合もあるでしょう
そのときは GetWindowText() ファンクションを使用します

int GetWindowText(HWND hWnd , LPTSTR lpString , int nMaxCount);

hWnd は、対象となるウィンドウやコントロールのハンドル
lpString は取得したテキストを格納するための文字列バッファ
nMaxCount は、バッファの長さを指定します
バッファの長さが足りない場合、その分のテキストが切り捨てられます

関数が成功すれば、終端文字を含まないコピーした文字列の数が
失敗した場合はハンドルが無効の場合は 0 が戻り値として返ります

ウィンドウが何文字のテキスト保有しているかわからない場合
これだけでは、確実にテキストを取得することができません (切り捨てられる可能性がある)
ウィンドウテキストが何文字なのかを知るためには
GetWindowTextLength() 関数を使って文字数を調べます

int GetWindowTextLength(HWND hWnd);

hWnd には、テキストの長さを調べたいウィンドウのハンドルを指定します
戻り値として、ウィンドウのテキストの文字数を返します
ただし、 実際のテキスト長よりも多い数 になることがあります

これは、ANSI と Unicode の特定数の混在で起こるものなのです
しかし、実際のテキスト長よりも短くなることは決してないので
バッファを割り当てるには十分な長さを返してくれるでしょう
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	static LPSTR strText;

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		strText = (LPSTR)malloc(GetWindowTextLength(hwnd) + 2);
		if(strText) {
			GetWindowText(hwnd , strText , GetWindowTextLength(hwnd) + 2);
			MessageBox(hwnd , strText , TEXT("") , MB_OK);
		}
		free(strText);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
	return msg.wParam;
}
このプログラムでは、文字列へのポインタを用意し
ポインタに文字数と NULL 文字分のサイズを確保したメモリのアドレスを格納します

プログラムを実行すると、すぐにウィンドウテキストを表示したメッセージボックスが出現します


SetWindowText()

BOOL SetWindowText(HWND hWnd , LPCTSTR lpString);

ウィンドウのタイトル、またはコントロールのテキストを設定します

hWnd - ウィンドウ (またはテキストを持つコントロール) のハンドルを指定します
lpString - 設定する NULL で終わる文字列へのポインタを指定します

戻り値 - 関数が成功すると 0 以外、失敗すると 0

GetWindowText()

int GetWindowText(HWND hWnd , LPTSTR lpString , int nMaxCount);

ウィンドウのタイトル、またはコントロールのテキストを取得します

hWnd - ウィンドウ (またはテキストを持つコントロール) のハンドルを指定します
lpString - 取得する NULL で終わる文字列へのポインタを指定します
nMaxCount - lpString のバッファサイズ。終端文字も含む

戻り値 - コピーされた文字列の文字数(終端の NULL 文字は含まない)、失敗すると 0

GetWindowTextLength()

int GetWindowTextLength(HWND hWnd);

ウィンドウのタイトル、またはコントロールのテキストをの文字数を取得します

hWnd - ウィンドウ (またはテキストを持つコントロール) のハンドルを指定します

戻り値 - 文字数。テキストがない場合は 0



前のページへ戻る次のページへ