これ何て呼びますか

タイトルバーがないウィンドウのサイズ変更について質問です。

タイトルバーがあるウィンドウでは、
ウィンドウの端にマウスカーソルを合わせると
サイズ変更のカーソルに変わってサイズ変更が出来ますけど、
タイトルバーがないウィンドウでは出来ないのですが、
どうすればサイズ変更が出来るようになるのでしょうか?

CreateWindowEx()には、
拡張ウィンドウスタイルには、
WS_EX_TOOLWINDOW | WS_EX_LAYERED | WS_EX_ACCEPTFILES
ウィンドウスタイルには、
WS_POPUPWINDOW | WS_BORDER
を渡しています。

開発環境
XP
Visual Studio 2005
C、C++

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

出来ました。

色々調べて原因を調べたのですが分からず、
書いて下さったソースを見直した際に、
「WM_NCHITTEST」が書かれていなかったので、
「DefWindowProc(hWnd, uMsg, wParam, lParam);」を
返さないといけないのかもしれないと思い、
やってみた結果出来ました。

今までは、「HTCAPTION」を返していました。

「WS_SIZEBOX」で枠は出来ていたのですが、
リサイズが出来ない状態でした。

ありがとうございます。

お礼日時:2009/05/21 15:17

 こんばんは。


 タイトルバー無しのポップアップウィンドウに、リサイズ枠を持たせたいと言う事でしょうか。
 でしたら、

 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でする場合は、
どうすればいいのでしょうか?

補足日時:2009/05/20 22:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!