クライアント領域のサイズが期待通りにならない

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

クライアント領域のサイズが期待通りにならない

#1

投稿記事 by みそ油 » 5年前

クライアント領域を 640 * 480 にしたいのですが、630 * 470 になってしまいます。
Aero が有効になっているせいだと思い、 DwmGetWindowAttribute 関数を用いてウィンドウサイズを修正してみましたが、結果は変わりませんでした。
どのようにすればクライアント領域を思い通りの大きさにできますでしょうか。ご教示いただければ幸いです。

コード:

HWND createMyWindow(HINSTANCE hInst)
{
	WNDCLASSEX wc;

	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WndProc;
	wc.cbClsExtra = 0L;
	wc.cbWndExtra = 0L;
	wc.hInstance = hInst;
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;
	wc.lpszClassName = ClassName;
	wc.hIconSm = NULL;

	if (RegisterClassEx(&wc) == 0)
		return 0;

	RECT deskRect;
	int width = APPWINDOW_W + GetSystemMetrics(SM_CXFIXEDFRAME) * 2;
	int height = APPWINDOW_H + GetSystemMetrics(SM_CXFIXEDFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION);
	GetWindowRect(GetDesktopWindow(), &deskRect);

	HWND hWnd = CreateWindowEx(
		0,
		ClassName,
		TEXT("神経衰弱"),
		WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX,
		deskRect.right / 2 - width / 2,
		deskRect.bottom / 2 - height / 2,
		width,
		height,
		NULL,
		NULL,
		hInst,
		NULL
	);

	// debug
	RECT debugsize;
	GetClientRect(hWnd, &debugsize);
	// ------------

	RECT windowsize;
	DwmGetWindowAttribute(hWnd, DWMWA_EXTENDED_FRAME_BOUNDS, &windowsize, sizeof(RECT));

	// ウィンドウサイズの調整(+= の右辺が0になり、効果なし)
	width += (windowsize.right - windowsize.left) - width;
	height += (windowsize.bottom - windowsize.top) - height;
	SetWindowPos(hWnd, HWND_TOP, deskRect.right / 2 - width / 2, deskRect.bottom / 2 - height / 2, width, height, NULL);

	return hWnd;
}
APPWINDOW_W, APPWINDOW_H は、それぞれ 640, 480 の定数です。

Rittai_3D
記事: 525
登録日時: 7年前

Re: クライアント領域のサイズが期待通りにならない

#2

投稿記事 by Rittai_3D » 5年前

AdjustWindowRectEx() を使ってみてはいかがでしょう。
初心者です

みそ油

Re: クライアント領域のサイズが期待通りにならない

#3

投稿記事 by みそ油 » 5年前

>Rittai 3D さん
回答ありがとうございます。おっしゃったように、 AdjustWindowRectEx 関数を使ったところ、クライアント領域の大きさが期待通りになりました。ありがとうございました。
この質問は解決とさせていただきます。

コード:

HWND createMyWindow(HINSTANCE hInst)
{
	WNDCLASSEX wc;

	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = WndProc;
	wc.cbClsExtra = 0L;
	wc.cbWndExtra = 0L;
	wc.hInstance = hInst;
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = NULL;
	wc.lpszClassName = ClassName;
	wc.hIconSm = NULL;

	if (RegisterClassEx(&wc) == 0)
		return 0;

	RECT windowsize;
	RECT deskRect;
	windowsize.left = 0;
	windowsize.top = 0;
	windowsize.right = 640;
	windowsize.bottom = 480;
	AdjustWindowRectEx(&windowsize, WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, FALSE, 0);
	int width = windowsize.right - windowsize.left;
	int height = windowsize.bottom - windowsize.top;
	GetWindowRect(GetDesktopWindow(), &deskRect);

	return CreateWindowEx(
		0,
		ClassName,
		TEXT("神経衰弱"),
		WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX,
		deskRect.right / 2 - width / 2,
		deskRect.bottom / 2 - height / 2,
		width,
		height,
		NULL,
		NULL,
		hInst,
		NULL
	);
}

閉鎖

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