前提
Visual c++でウィンドウ上にグループボックスを自分が指定した位置に作成しようとしています。
関数CreateWindowの引数を変更することによってグループボックスの位置を調整できるという理解なのですが、望んだ位置に作成することができません。
原因と解決策を知りたいです。
実現したいこと
・子ウィンドウ(ここではグループボックス)を親ウィンドウ上の指定した位置に作成したい。
発生している問題・エラーメッセージ
このソースコードでは、グループボックスの右下の座標を(Winsize.right-500, Winsize.bottom-500)と指定しています。
Winsizeの定義からこれは(500, 200)になると思います。
ですが、添付した画像内のグループボックスの右下の座標を見ると明らかにこの座標に作成できていないと思います(特にx座標)。
自分は何か勘違いをしているのでしょうか。
該当のソースコード
#include<windows.h> #include<tchar.h> #define STRLEN 256 #define ID_GROUPBOX 11 LRESULT CALLBACK windowfunc(HWND, UINT, WPARAM, LPARAM); static const TCHAR szWinName[] = _T("Test1"); HINSTANCE hInst; // メインウィンドウの定義 HWND CreateMainWindow(HWND, HINSTANCE, int, const TCHAR szWinName[], const int, const int); // クライアント領域のサイズ設定 static RECT Winsize = { 0,0, 1000, 700 }; //WinMain関数 int WINAPI WinMain(_In_ HINSTANCE hThisInst, _In_opt_ HINSTANCE hPrevInst, _In_ LPSTR lpszArgs, _In_ int nWinMode) { HWND hwnd = NULL; MSG msg; // クライアント領域のサイズ調整 AdjustWindowRectEx(&Winsize, WS_OVERLAPPEDWINDOW, TRUE, 0); // メインウィンドウの作成 CreateMainWindow(hwnd, hThisInst, nWinMode, szWinName, Winsize.right - Winsize.left, Winsize.bottom - Winsize.top); //インスタンスハンドルの保存 hInst = hThisInst; //メッセージループの生成 while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return((int)msg.wParam); } LRESULT CALLBACK windowfunc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { HDC hdc; PAINTSTRUCT ps; static int width = 0, height = 0; static TCHAR strSize[STRLEN]; const char *str = "plase press 1 or 2 or 3 or 4..."; const char *str1 = "--> 1 was pressed!"; const char* str2 = "--> 2 was pressed!"; const char* str3 = "--> 3 was pressed!"; const char* str4 = "--> 4 was pressed!"; switch (msg) { case WM_CREATE: // グループボックス CreateWindow( _T("BUTTON"), _T("test"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 300,150, Winsize.right -500, Winsize.bottom - 500, hwnd, (HMENU)ID_GROUPBOX, ((LPCREATESTRUCT)(lparam))->hInstance, NULL ); break; case WM_SIZE: width = LOWORD(lparam); height = HIWORD(lparam); break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); wsprintf(strSize, "width = %d ; height = %d", width, height); // クライアント領域のサイズ表示 TextOut(hdc, 20, 20, strSize, lstrlen(strSize)); EndPaint(hwnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hwnd, msg, wparam, lparam)); } } HWND CreateMainWindow(HWND hwnd, HINSTANCE hThisInst, int nWinMode, const TCHAR szWinName[], const int nWidth, const int nHeight) { WNDCLASSEX wcl; //ウィンドウクラスの定義 wcl.cbSize = sizeof(WNDCLASSEX); //WNDCLASSEX構造体のサイズ wcl.style = 0; //ウィンドウクラススタイル wcl.lpfnWndProc = windowfunc; //ウィンドウ関数 wcl.cbClsExtra = 0; //ウィンドウクラスのエキストラ wcl.cbWndExtra = 0; //ウィンドウインスタンスのエキストラ wcl.hInstance = hThisInst; //このプログラムのインスタンスへのハンドル wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION); //アイコンへのハンドル wcl.hCursor = LoadCursor(NULL, IDC_ARROW); //カーソルへのハンドル wcl.hbrBackground = (HBRUSH)COLOR_WINDOW; //背景ブラシへのハンドル wcl.lpszMenuName = NULL; //メニュー wcl.lpszClassName = szWinName; //ウィンドウクラス名 wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO); //スモールアイコンへのハンドル //ウィンドウクラスの登録 if (!RegisterClassEx(&wcl)) { return(0); } //ウィンドウの生成 hwnd = CreateWindow( szWinName, //ウィンドウクラス名 szWinName, //ウィンドウ名 WS_OVERLAPPEDWINDOW, //ウィンドウスタイル CW_USEDEFAULT, //x座標 CW_USEDEFAULT, //y座標 nWidth, //幅 nHeight, //高さ HWND_DESKTOP, //親ウィンドウへのハンドル NULL, //メニューへのハンドル hThisInst, //このプログラムのインスタンスへのハンドル NULL //追加引数 ); //ウィンドウの表示 ShowWindow(hwnd, nWinMode); UpdateWindow(hwnd); return hwnd; }
出力先ウィンドウ
補足情報(FW/ツールのバージョンなど)
OS: Windows 10
開発環境: Visual Studio 2019
言語: c++

回答2件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/12/16 07:29