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

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

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(VS.85).aspx

 と言うメッセージを処理する事で出来ます。
 その他、マウスをキャプチャして、MoveWindow()やSetWindowPos()で無理矢理引き伸ばす等の手法も在ります(此れに関してはかなり強引です)。

この回答への補足

WS_THICKFRAME又はWS_SIZEBOXで
リサイズ出来なかったのですが、
何か原因があるのでしょうか?
(サイズ変更のカーソルにも変わりませんでした。)
それとも、他にも何かしないといけないのでしょうか?

WM_NCHITTESTでする場合は、
どうすればいいのでしょうか?

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q作成したウインドウのサイズを固定するには?

現在私はWin32APIの勉強中です><
現在参考書を片手に、
まず最初に真っ白の何もしないウインドウを作成してみました。

この作成したウインドウでは、マウスでウインドウの角をクリックしながらドラッグすると、ウインドウのサイズを自由に変更できます。

しかし、私はこのウインドウのサイズをこのようにマウス操作で変更することができないようにしたいのですが、どのようにしたらよいのでしょうか?
ご教授よろしくお願いいたします><

Aベストアンサー

前置き。
今のところスケルトンプログラム(ただウインドウを表示するプログラム)しか出来ないようでしたら、下の関数で、
まあ、とりあえず詳しく説明します。^_^


HWND CreateWindow(
LPCTSTR lpClassName, // 登録されているクラス名
LPCTSTR lpWindowName, // ウィンドウ名
DWORD dwStyle, // ウィンドウスタイル
int x, // ウィンドウの横方向の位置
int y, // ウィンドウの縦方向の位置
int nWidth, // ウィンドウの幅
int nHeight, // ウィンドウの高さ
HWND hWndParent, // 親ウィンドウまたはオーナーウィンドウのハンドル
HMENU hMenu, // メニューハンドルまたは子ウィンドウ ID
HINSTANCE hInstance, // アプリケーションインスタンスのハンドル
LPVOID lpParam // ウィンドウ作成データ
);

今、あなたが変更したいとおっしゃっているのは
上の
CreateWindow() 関数のウインドウスタイルという
3番目に DWORD dwStyle, // ウィンドウスタイル
と記述されているところを変えなければなりません。

大体は下のようなものが使われています。
WS_OVERLAPPEDWINDOW | WS_VISIBLE

WS_OVERLAPPEDWINDOW は、まあ現在表示されている
ウインドウになるまさしく犯人です。
もう一つの方は気にしないでください。
後、 | はたし算みたいな
記号と覚えておきましょう。
効果は WS_OVERLAPPEDWINDOW の機能に WS_VISIBLE の
機能を加えるみたいな感じです。

積もり積もった前置きはこのぐらいにして
回答。
WS_OVERLAPPEDWINDOW | WS_VISIBLE この部分を
WS_OVERLAPPED | WS_SYSMENU これにすると
閉じるボタン(×)だけ表示されウインドウのサイズは
変更できません。
WS_OVERLAPPEDWINDOW ^ WS_MAXIMIZEBOX ^ WS_THICKFRAME | WS_VISIBLE
こちらにすると
最小化は出来ますが、最大化およびサイズの変更は出来ません。

 ^ これについては、さっきの足し算とは逆に
引き算です。

まあ、他にも色々組み合わせはあるのですが希望
のものだと思います。
がんばってください。^_^

前置き。
今のところスケルトンプログラム(ただウインドウを表示するプログラム)しか出来ないようでしたら、下の関数で、
まあ、とりあえず詳しく説明します。^_^


HWND CreateWindow(
LPCTSTR lpClassName, // 登録されているクラス名
LPCTSTR lpWindowName, // ウィンドウ名
DWORD dwStyle, // ウィンドウスタイル
int x, // ウィンドウの横方向の位置
int y, // ウィンドウの縦方向の位置
int nWidth, // ウィンドウの幅
int n...続きを読む


人気Q&Aランキング

おすすめ情報