2008-08-13 20 views
6

私はMFCアプリケーションを開発していますが、最近、Windowsのタイトルバーからアイコンを削除するための良い方法を探していますが、閉じるボタンは保持しています。 2つの明らかな候補ソリューションは、システムメニュースタイルをオフにするか、ツールウィンドウスタイルを使用していますが、システムメニューを無効にしたり、縮小したツールウィンドウタイトルバーを使用しないことをお勧めします。多くのMFCアプリケーションにはこの機能があります。標準的な方法がありませんか?クローズボタンやシステムメニューを削除せずに、Windowsのタイトルバーからアイコンを削除しますか?

答えて

2

ユーザーがあなたのキャプションを右クリックしたかどうかを検出するためにWM_NCRBUTTONDOWNを使用して、システムメニューを表示することができます。

0

システムメニューを削除してから別の場所に戻すのはどうでしょうか(クローズボタンなどの隣に)?

0

アイコンがないと、ユーザがシステムメニューにアクセスするための唯一の方法は、タイトルバーを右クリックすることです。

これが念頭に置いていたのであれば、メインフレームでWM_RBUTTONDOWNを処理し、右クリックがタイトルバーにあるかどうかを計算できます。

int clickX = GET_X_LPARAM(lParam); 
int clickY = GET_Y_LPARAM(lParam); 

CRect frameRect; 
mainFrame.GetWindowRect(&frameRect); 

int titleBarHeight = GetSystemMetrics(SM_CYCAPTION); 

if (clickX >= frameRect.left && 
    clickX <= frameRect.right && 
    clickY >= frameRect.top && 
    clickY <= frameRect.top + titleBarHeight) 
{ 
    TrackPopupMenu(m_systemMenu); 
} 
4

セットWS_EX_DLGMODALFRAME拡張スタイル。

+0

これは答えであったはずです。 – c00000fd

2

完全に透明なアイコンを使用できます。

0

アイコンを削除し、Delphiでのサンプルコード:

const 
    WM_ResetIcon = WM_APP - 1; 

type 
    TForm1 = class(TForm) 
    procedure FormShow(Sender: TObject); 
    protected 
    procedure WMResetIcon(var Message: TMessage); message WM_ResetIcon; 
    end; 

implementation 

procedure TForm1.FormShow(Sender: TObject); 
begin 
    PostMessage(Handle, WM_ResetIcon, 0, 0); 
end; 

procedure TForm1.WMResetIcon(var Message: TMessage); 
const 
    ICON_SMALL = 0; 
    ICON_BIG = 1; 
begin 
    DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_BIG, 0)); 
    DestroyIcon(SendMessage(Handle, WM_SETICON, ICON_SMALL, 0)); 
end; 

同様のコードはMFCのために働くべきです。基本的には、正しい場所でNULLにWM_SETICONする必要があります。

関連する問題