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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ふりかけ

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

#1

投稿記事 by ふりかけ » 14年前

コード:

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

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#2

投稿記事 by ISLe » 14年前

クライアント領域の背景が消去されないからですね。
TextOutで描画される文字の背景は塗り潰されますが、それ以外の部分はそのまま残ります。
SetBkModeでTRANSPARENTを指定すると文字の背景を塗り潰さなくなるので分かりやすいですよ。

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

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

ふりかけ

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

#3

投稿記事 by ふりかけ » 14年前

ISLeさん 早くその上優しく回答してくださってありがとうございます。
一晩も考えてこんな馬鹿な質問をしてしまった自分が恥ずかしいです。

閉鎖

“C言語何でも質問掲示板” へ戻る