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