ページ 11

WM_NCHITTEST中にマウスの座標を表示すると桁がずれてしまう

Posted: 2011年11月21日(月) 17:27
by ふりかけ

コード:

case WM_NCHITTEST:	
		    pt.x = LOWORD(lParam);
			pt.y = HIWORD(lParam);
			wsprintf(str, TEXT("%s : X = %d, Y = %d"),TEXT("LBUTTON"), pt.x, pt.y);

			hdc = GetDC(hWnd);
			TextOut(hdc, 0, 0, str, lstrlen(str));
			ReleaseDC(hWnd, hdc);

			return DefWindowProc(hWnd, uMsg, wParam, lParam);
<やりたいこと>
本に載っているコードのままなのですが
WM_NCHITTESTメッセージを処理中にマウスの座標をlParamから調べて
wsprintf関数で文字列にして TextOut関数で表示します

<問題点>
実行すると表示の最後の文字 ここではY座標の桁が多く表示されてしまいます(X座標の桁が変わる時におかしくなる
例:X = 1000 → X = 999)

文字列の終端がおかしいので wsprintf もしくは lstrlen 関数に問題がありそうですが、
それ以上の調べ方も対策も分かりません。よろしくお願いします。

<全コード>

コード:

#include <windows.h>

#define APP_NAME TEXT("Sample_MainWindow")

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){

	HDC hdc;
	WCHAR str[255];
	LRESULT result;
	POINT pt;

	switch(uMsg){
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;

		case WM_NCHITTEST:
			pt.x = LOWORD(lParam);
			pt.y = HIWORD(lParam);
			wsprintf(str, TEXT("%s : X = %d, Y = %d"),TEXT("LBUTTON"), pt.x, pt.y);

			hdc = GetDC(hWnd);
			TextOut(hdc, 0, 0, str, lstrlen(str));
			ReleaseDC(hWnd, hdc);

			return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){

	WNDCLASS wc;
	MSG msg;

	wc.style			= CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc		= WindowProc;
	wc.cbClsExtra		= 0;
	wc.cbWndExtra		= 0;
	wc.hInstance		= hInstance;
	wc.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground	= (HBRUSH)COLOR_BACKGROUND + 1;
	wc.lpszMenuName		= NULL;
	wc.lpszClassName	= APP_NAME;

	if(!RegisterClass(&wc)) return 0;

	if(CreateWindow(APP_NAME, TEXT("__FILE__"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) == NULL) return 0;

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

Re: WM_NCHITTEST中にマウスの座標を表示すると桁がずれてしまう

Posted: 2011年11月21日(月) 18:04
by ISLe
クライアント領域の背景が消去されないからですね。
TextOutで描画される文字の背景は塗り潰されますが、それ以外の部分はそのまま残ります。
SetBkModeでTRANSPARENTを指定すると文字の背景を塗り潰さなくなるので分かりやすいですよ。

TextOutの前に自前で塗り潰してください。
あるいは文字列の長さを一定にしましょう。

Invalidateで更新リージョンを設定してWM_PAINTのハンドラで描画すればクライアント領域の背景描画も自動で行われます。

Re: WM_NCHITTEST中にマウスの座標を表示すると桁がずれてしまう

Posted: 2011年11月21日(月) 18:13
by ふりかけ
ISLeさん 早くその上優しく回答してくださってありがとうございます。
一晩も考えてこんな馬鹿な質問をしてしまった自分が恥ずかしいです。