CreateWindowで作成したウィンドウに、アイコンはつけないで×「閉じる」ボタンだけつけるには? – プログラミング – Home

CreateWindowで作成したウィ...
 
通知
すべてクリア

[解決済] CreateWindowで作成したウィンドウに、アイコンはつけないで×「閉じる」ボタンだけつけるには?


Tome
 Tome
(@Tome)
ゲスト
結合: 18年前
投稿: 36
Topic starter  

過去ログで、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 を指定すると一応望み通りの機能を得られますが、タイトル
バーの外観が変わるのが気に入りません。

よろしくおねがいします。


引用未解決
トピックタグ
es
 es
(@es)
ゲスト
結合: 22年前
投稿: 17
 

透明なアイコンを設定するとか


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

それってそっくり参照先のスレッドで質問者が陥っている状況では?
同じ方法で解決できそうな気がしますが、駄目でしたか?


返信引用
Tome
 Tome
(@Tome)
ゲスト
結合: 18年前
投稿: 36
Topic starter  

返信ありがとうございます。
参照先スレッドの解決法はいくつかあるようですが、

たぶんこれですかね?
> 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も試してみましたがダメでした。

うーん、もうちょっと試してみます。


返信引用
Tome
 Tome
(@Tome)
ゲスト
結合: 18年前
投稿: 36
Topic starter  

ウィンドウスタイルを変えてみたり、
> GetWindowLong( hWnd, GWL_STYLE ) & ~WS_THICKFRAME;

GetWindowLong( hWnd, GWL_STYLE ) | WS_THICKFRAME;
をにしてみたり
GetWindowLongとSetWindowLongの呼び出すタイミングをGetSystemMenuより前にしてみたりとか
いろいろやってみたんですが、すべて不発に終わりました。

他の部分でなにかしないとダメなんですかね?


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

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;
}


返信引用
Tome
 Tome
(@Tome)
ゲスト
結合: 18年前
投稿: 36
Topic starter  

subaruさん返信ありがとうございます。
サンプルコードを少し書き換えて実行してみたところ「×」ボタンのみのシステムメニューにすること
ができました。

これを参考にCreateWindowでもやってみたのですが、ダメでした。
何が違うんですかね・・・・

> ダイアログを使うのはダメなんでしょうか?
やはり、CreateWindowを使いたいです。
というのも、幾つか理由があって

まず使い慣れてること。

サイズがピクセル単位でないこと
> pt->cx = 200;
> pt->cy = 200;
だと実際には200*200のウィンドウはできず、前にピクセルからこの値を算出する方法を調べてみた
ことがあるんですが、いまいち不明でした。(数ピクセル単位で誤差
ピクセル単位で配置等を行いたいタイプなのでこれだと少し問題があります。

後、単純にダイアログの動作が迷惑。
TABや矢印キーなどのキー操作の動作が違う(直す方法がある?)とか、
背景カラーをSetClassLongで変えられないとか、その辺いろいろ

ということで、引き続きよろしくおねがいします。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>位置は
>OnInitDialogがないのでWM_CREATE:
OnInitDialog → WM_INITDIALOG でいいと思いますが....
ただ話の内容からして「WM_CREATE」で正解だと思います。
後は、なぜ「WM_CREATE」で駄目なのかですが、よく分りませんが、
ウインドウスタイル(拡張も含めて)の設定で何か違うのでしょうか?


返信引用
ロマ
 ロマ
(@ロマ)
ゲスト
結合: 18年前
投稿: 170
 

WNDCLASSのhIcon=0,CreateWindowExでWS_EX_DLGMODALFRAME, WS_OVERLAPPEDWINDOW
これでらしいのが出来ました。(WS_POPUPは試してません)


返信引用
Tome
 Tome
(@Tome)
ゲスト
結合: 18年前
投稿: 36
Topic starter  

出来ました。
ありがとうございます。

正直あきらめてました。

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;

無事解決しました。
ロマさんどうもです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました