質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1616閲覧

子ウィンドウを親ウィンドウ上の指定した位置に作成したい。

yama_07

総合スコア4

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/12/16 07:05

前提

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++

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

cpp

1 CreateWindow( 2 _T("BUTTON"), 3 _T("test"), 4 WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 5 300,150, 6 Winsize.right -500, Winsize.bottom - 500,

Winsize.right -500, Winsize.bottom - 500, はウィンドウのサイズ指定です。右座標下座標ではありません。それらが右下になるようにしたいのだったら、左上座標を引きましょう。

投稿2022/12/16 07:17

int32_t

総合スコア21207

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yama_07

2022/12/16 07:29

解決しました。ご丁寧にありがとうございます。
guest

0

基本的に、Windowsでは、ウィンドウの位置情報というのは左上が基準となります

投稿2022/12/16 07:15

y_waiwai

総合スコア87849

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yama_07

2022/12/16 07:29

解決しました。回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問