タイトルバーがないウィンドウのサイズ変更について質問です。
タイトルバーがあるウィンドウでは、
ウィンドウの端にマウスカーソルを合わせると
サイズ変更のカーソルに変わってサイズ変更が出来ますけど、
タイトルバーがないウィンドウでは出来ないのですが、
どうすればサイズ変更が出来るようになるのでしょうか?
CreateWindowEx()には、
拡張ウィンドウスタイルには、
WS_EX_TOOLWINDOW | WS_EX_LAYERED | WS_EX_ACCEPTFILES
ウィンドウスタイルには、
WS_POPUPWINDOW | WS_BORDER
を渡しています。
開発環境
XP
Visual Studio 2005
C、C++
No.2ベストアンサー
- 回答日時:
こんにちは。
補足頂きました。すんません、WM_NCHITTESTについて、チョッと間違えてしまったと事があります。対応したウィンドウスタイルを持たないと、反応してくれない様です。
要するに、WM_NCHITTESTでリサイズを返したい場合、ウィンドウにはリサイズ枠のスタイルが無いと出来ないと言う事になります。
ただし、HTCAPTIONはタイトルバー無しでも出来ます(其の為か検索すると良く出てくるが、HTCAPTION以外のフラグになると中々使用例が出てこなくなる)。
ですので、WM_NCHITTESTでポップアップウィンドウを簡単にリサイズするのは無理かもしれません。
それで、先ずは確認なのですが、WS_SIZEBOX等でリサイズ枠が出て来ないとの事なのですが、以下のコードでも無理でしょうか。
レイヤードウィンドウにしているとの事なので、その辺も疑って見たのですが、特に問題無くリサイズ枠が出て来ました。
#include<windows.h>
#include<tchar.h>
//ウィンドウクラス登録
static ATOM Regist(LPCTSTR szClassName, WNDPROC wndProc)
{
WNDCLASSEX wndclass = {sizeof(wndclass)};
wndclass.hCursor= ::LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon= NULL;
wndclass.lpszMenuName= NULL;
wndclass.lpszClassName= szClassName;
wndclass.hbrBackground= (HBRUSH)::GetStockObject(WHITE_BRUSH);
wndclass.hInstance= ::GetModuleHandle(NULL);
wndclass.style= 0;
wndclass.lpfnWndProc= wndProc;
wndclass.cbClsExtra= 0;
wndclass.cbWndExtra= 0;
return ::RegisterClassEx(&wndclass);
}
//ウィンドウを作成して開く
static HWND OpenWindow(LPCTSTR szClassName, LPCTSTR szTitleName, INT w, INT h)
{
HINSTANCE hInst = ::GetModuleHandle(NULL);
HWND hWnd = ::CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_LAYERED | WS_EX_ACCEPTFILES, szClassName, szTitleName,
WS_POPUPWINDOW | WS_SIZEBOX | WS_BORDER,
CW_USEDEFAULT,CW_USEDEFAULT, w, h,
NULL, NULL,
hInst, NULL);
return hWnd;
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
SetLayeredWindowAttributes(hWnd, 0, 128, LWA_ALPHA);
return 0;
case WM_CLOSE:
::PostQuitMessage(0);
::DestroyWindow(hWnd);
return 0;
case WM_DESTROY:
return 0;
}
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
//確認
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInstancePrev, LPSTR lpCmdLine, int nShowCmd)
{
MSG msg;
TCHAR tstrClassName[] = _T("test resize frame");
TCHAR tstrTitleName[] = _T("title");
//ウィンドウクラスの登録
::Regist(tstrClassName, &::WndProc);
//ウィンドウを作成して開く
HWND hWnd = ::OpenWindow(tstrClassName, tstrTitleName, 800, 600);
//ウィンドウの表示
::ShowWindow(hWnd, SW_SHOW);
//メッセージ回転
while(::GetMessage(&msg, NULL, 0, 0) == TRUE)
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
//終了
return msg.wParam;
}
出来ました。
色々調べて原因を調べたのですが分からず、
書いて下さったソースを見直した際に、
「WM_NCHITTEST」が書かれていなかったので、
「DefWindowProc(hWnd, uMsg, wParam, lParam);」を
返さないといけないのかもしれないと思い、
やってみた結果出来ました。
今までは、「HTCAPTION」を返していました。
「WS_SIZEBOX」で枠は出来ていたのですが、
リサイズが出来ない状態でした。
ありがとうございます。
No.1
- 回答日時:
こんばんは。
タイトルバー無しのポップアップウィンドウに、リサイズ枠を持たせたいと言う事でしょうか。
でしたら、
WS_POPUPWINDOW | WS_BORDER | WS_THICKFRAME
又は、
WS_POPUPWINDOW | WS_BORDER | WS_SIZEBOX
でリサイズ枠が出て来ると思います。
それ以外の方法では、WM_NCHITTEST
http://msdn.microsoft.com/en-us/library/ms645618 …
と言うメッセージを処理する事で出来ます。
その他、マウスをキャプチャして、MoveWindow()やSetWindowPos()で無理矢理引き伸ばす等の手法も在ります(此れに関してはかなり強引です)。
この回答への補足
WS_THICKFRAME又はWS_SIZEBOXで
リサイズ出来なかったのですが、
何か原因があるのでしょうか?
(サイズ変更のカーソルにも変わりませんでした。)
それとも、他にも何かしないといけないのでしょうか?
WM_NCHITTESTでする場合は、
どうすればいいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- モニター・ディスプレイ パソコンでスクリーンショットしたもの(HP)を印刷しました。 3 2022/07/03 16:39
- Windows 10 (続き)2つのウィンドウ選択時の表示について 6 2023/08/13 15:05
- Word(ワード) Microsoft Word2023で、修正箇所を表示させたい 1 2023/02/09 10:07
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- Chrome(クローム) (win10)ショートカットの開き方について 1 2023/02/19 18:55
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- その他(OS) エクスプローラのアクティブウィンドウのタイトルバーに色がつかない 3 2023/07/18 18:34
- その他(ソフトウェア) 画像の拡大率を固定したまま次の画像を表示出来るビューアを探しています 2 2022/05/13 17:19
- その他(ソフトウェア) Figma 1 2023/06/23 14:22
- Windows 10 プレビューウインドウに表示されたメッセージについて 1 2022/04/13 13:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
Excelの上下を固定したい
-
名前を付けて保存のウィンドウ...
-
EXCEL2016で新しいウィンドウを...
-
[VBA] UserForm を Excel の W...
-
VBAで単一ブック複数窓を閉じる...
-
ウィンドウのサイズ変更について
-
ウィンドウハンドルって途中で...
-
CreateWindowの方法
-
Console.WriteLine で表示されない
-
ラジオボタンの初期指定
-
ゲームでは結局どっちが良いの?
-
WebBrowserでOfficeファイル等...
-
他のアプリケーションの終了処理
-
SendMessage関数がうまく動作し...
-
エクセルで1行目から3行目が消...
-
ウィンドウ名を知るには
-
OutlookでRSSフィードやメモの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ゲームでは結局どっちが良いの?
-
検索の画面がでなくなってしま...
-
勝手にウィンドウが開いて止ま...
-
VBA .Value=.Value ?
-
ラジオボタンの初期指定
-
作成したウインドウのサイズを...
-
Vba LongPtrについて教えてくだ...
-
Excelの上下を固定したい
-
他のアプリケーションの終了処理
-
【VB2008】 マウス操作の一時的...
-
「&HFFFF」「&H1A」とは?
-
VBで外部プログラムを位置のみ...
-
ExcelのBOOKが消えた!
-
Alt+P,Alt+NをPostmessageで送...
-
UWSCで特定のChromeのタブをア...
-
Console.WriteLine で表示されない
-
MFC ダイアログ上のID取得につ...
-
最大化と最小化ボタン
おすすめ情報