過去ログで、MFCでのやりかたは見つけたのですが、自分はMFCを使っていないため解決できま
せんでした。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060098.txt
要は、タイトルバーにテキストと「×」ボタンのみを表示させたいのです。
環境は
VC++2005
Win32プロジェクト(←これってPlatformSDKって言った方がいい?)
現状としては、
ウィンドウスタイルに、
WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE,
を指定してウィンドウを作成
MFCのサンプルを参考に、以下を追加
HMENU hSysMenu = GetSystemMenu( hWnd, FALSE );
RemoveMenu( hSysMenu, SC_MINIMIZE, FALSE );
RemoveMenu( hSysMenu, SC_MAXIMIZE, FALSE );
SetClassLong( hWnd, GCL_HICONSM, NULL );
これで一応最小化、最大化ボタンは消えたのですが、左上のアイコンが消えません。(デフォルトっ
ぽいアイコンが表示される)
デフォルトっぽいアイコンというのは、まあこんな感じのやつです。
拡張スタイルに、WS_EX_TOOLWINDOW を指定すると一応望み通りの機能を得られますが、タイトル
バーの外観が変わるのが気に入りません。
よろしくおねがいします。
透明なアイコンを設定するとか
それってそっくり参照先のスレッドで質問者が陥っている状況では?
同じ方法で解決できそうな気がしますが、駄目でしたか?
返信ありがとうございます。
参照先スレッドの解決法はいくつかあるようですが、
たぶんこれですかね?
> AppendMenuで必要なシステムメニューを追加して回避する方法
MFC用の回答みたいですが、一応参考にしてやってみました。
位置は
OnInitDialogがないのでWM_CREATE:
あと、ModifyStyleっていう関数の代用としてGetWindowLongとSetWindowLongを使ってみました
まず、ウィンドウスタイルに、
WS_POPUP | WS_CAPTION | WS_VISIBLE,
>WS_SYSMENUは除去
を指定してウィンドウを作成
-----------------------------------------------------
case WM_CREATE:
{
HMENU hSysMenu = GetSystemMenu( hWnd, FALSE );
if( hSysMenu )
{
AppendMenu( hSysMenu, MF_STRING, SC_CLOSE, _T(閉じる(&C)) );
u_int style = GetWindowLong( hWnd, GWL_STYLE ) & ~WS_THICKFRAME;
SetWindowLong( hWnd, GWL_STYLE, style );
}
}
------------------------------------------------------
いまいち回答者さんの意図が理解できてないのですがこんな感じですかね?
で、結果はシステムメニューが全部消えました。(タイトルバーとテキストは残ってる)
最初SC_SIZEで試してうまくいかなかったのでSC_CLOSEも試してみましたがダメでした。
うーん、もうちょっと試してみます。
ウィンドウスタイルを変えてみたり、
> GetWindowLong( hWnd, GWL_STYLE ) & ~WS_THICKFRAME;
を
GetWindowLong( hWnd, GWL_STYLE ) | WS_THICKFRAME;
をにしてみたり
GetWindowLongとSetWindowLongの呼び出すタイミングをGetSystemMenuより前にしてみたりとか
いろいろやってみたんですが、すべて不発に終わりました。
他の部分でなにかしないとダメなんですかね?
CreateWindowでもできるかどうか知りませんけど
ダイアログを使うのはダメなんでしょうか?
リソースを使いたくないということであれば、
CreateDialogIndirect or DialogBoxIndirectで
とりあえず空のダイアログを作ることも可能ですけど。
以下、サイズ変更を可能にしてもアイコンは出ませんでした。
#include <windows.h>
#include <tchar.h>
INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int)
{
BYTE dlgtemplate[sizeof(DLGTEMPLATE) + 10] = {0};
LPDLGTEMPLATE pt = reinterpret_cast<LPDLGTEMPLATE>(&dlgtemplate);
pt->style = DS_MODALFRAME | WS_CAPTION | WS_SYSMENU |
WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE;
pt->cx = 200;
pt->cy = 200;
DialogBoxIndirect(hInstance, pt, NULL, DialogProc);
return 0;
}
INT_PTR CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
if(message == WM_COMMAND) {
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
return FALSE;
}
subaruさん返信ありがとうございます。
サンプルコードを少し書き換えて実行してみたところ「×」ボタンのみのシステムメニューにすること
ができました。
これを参考にCreateWindowでもやってみたのですが、ダメでした。
何が違うんですかね・・・・
> ダイアログを使うのはダメなんでしょうか?
やはり、CreateWindowを使いたいです。
というのも、幾つか理由があって
まず使い慣れてること。
サイズがピクセル単位でないこと
> pt->cx = 200;
> pt->cy = 200;
だと実際には200*200のウィンドウはできず、前にピクセルからこの値を算出する方法を調べてみた
ことがあるんですが、いまいち不明でした。(数ピクセル単位で誤差
ピクセル単位で配置等を行いたいタイプなのでこれだと少し問題があります。
後、単純にダイアログの動作が迷惑。
TABや矢印キーなどのキー操作の動作が違う(直す方法がある?)とか、
背景カラーをSetClassLongで変えられないとか、その辺いろいろ
ということで、引き続きよろしくおねがいします。
>位置は
>OnInitDialogがないのでWM_CREATE:
OnInitDialog → WM_INITDIALOG でいいと思いますが....
ただ話の内容からして「WM_CREATE」で正解だと思います。
後は、なぜ「WM_CREATE」で駄目なのかですが、よく分りませんが、
ウインドウスタイル(拡張も含めて)の設定で何か違うのでしょうか?
WNDCLASSのhIcon=0,CreateWindowExでWS_EX_DLGMODALFRAME, WS_OVERLAPPEDWINDOW
これでらしいのが出来ました。(WS_POPUPは試してません)
出来ました。
ありがとうございます。
正直あきらめてました。
WS_EX_DLGMODALFRAME
が、ポイントみたいですね。
後は普通に
// ウィンドウスタイル
WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
WM_CREATE:
// 最大化、最小化ボタン除去
hSysMenu = GetSystemMenu( hWnd, FALSE );
RemoveMenu( hSysMenu, SC_MINIMIZE, FALSE );
RemoveMenu( hSysMenu, SC_MAXIMIZE, FALSE );
break;
無事解決しました。
ロマさんどうもです。