タイトルバーがないウィンドウのサイズ変更について質問です。
タイトルバーがあるウィンドウでは、
ウィンドウの端にマウスカーソルを合わせると
サイズ変更のカーソルに変わってサイズ変更が出来ますけど、
タイトルバーがないウィンドウでは出来ないのですが、
どうすればサイズ変更が出来るようになるのでしょうか?
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ExcelのBOOKが消えた!
-
ラジオボタンの初期指定
-
検索の画面がでなくなってしま...
-
Excelの上下を固定したい
-
VBA .Value=.Value ?
-
Alt+P,Alt+NをPostmessageで送...
-
Vba LongPtrについて教えてくだ...
-
最大化と最小化ボタン
-
ゲームでは結局どっちが良いの?
-
Excelの「ウィンドウ枠の固定」...
-
エクセルで保存したものを開く...
-
ボタンのハンドルウィンド取得...
-
[VBA] UserForm を Excel の W...
-
win32apiにおける終了処理について
-
ダイアログをスクロールさせるには
-
勝手にウィンドウが開いて止ま...
-
コンソールアプリケーションで...
-
他アプリケーション’(ウィンド...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
勝手にウィンドウが開いて止ま...
-
ゲームでは結局どっちが良いの?
-
検索の画面がでなくなってしま...
-
VBA .Value=.Value ?
-
Excelの上下を固定したい
-
ExcelのBOOKが消えた!
-
他のアプリケーションの終了処理
-
Vba LongPtrについて教えてくだ...
-
「&HFFFF」「&H1A」とは?
-
MFC ダイアログ上のID取得につ...
-
作成したウインドウのサイズを...
-
[VBA] UserForm を Excel の W...
-
ラジオボタンの初期指定
-
【VB2008】 マウス操作の一時的...
-
ExcelVBAでAPIを使って外部ウイ...
-
VBAで単一ブック複数窓を閉じる...
-
EnumChildWindowsの使い方(VBA)
-
隠れたウィンドウの画面をキャ...
おすすめ情報