Last Updated 2004/08/18
Visual C++ MFC 他のコントロール
コントロールボタン無効
2004/08/18

クローズボタンを無効にする.

    MFC
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    pSysMenu->EnableMenuItem(SC_CLOSE, MF_GRAYED);

    SDK
    EnableMenuItem( GetSystemMenu(Handle, NULL), SC_CLOSE, MF_GRAYED);

タイトルバー右端のボタンはシステムメニューと連動している.
SC_CLOSE 以外は以下のとおり.

SC_MAXIMIZE 最大化
SC_MINIMIZE 最小化
SC_SIZE     サイズ変更

また, EnableMenuItem() などに渡すフラグの種類は以下のとおり.

MF_GRAYED   無効化グレー表示
MF_DISABLED 無効化(色変更なし)
MF_DELETE   削除



しかし,最大化ボタンは上記の方法では無効に出来ない.

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    pSysMenu->EnableMenuItem(SC_CLOSE, MF_GRAYED);
    // 最大化を無効化
    pSysMenu->EnableMenuItem(SC_MAXIMIZE, MF_GRAYED);    // これが無理


最大化ボタンを無効化するには以下の様にする.

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    if( !CFrameWnd::PreCreateWindow(cs) )
        return FALSE;
    cs.style &= ~WS_MAXIMIZEBOX;

    return TRUE;
}

プログラムの途中で無効化する場合は以下の様にする.

    HWND hWnd = AfxGetMainWnd()->m_hWnd;
    LONG lStyle = GetWindowLong(hWnd, GWL_STYLE);
    lStyle &= ~WS_MAXIMIZEBOX;
    SetWindowLong(hWnd, GWL_STYLE, lStyle);

上記では最大化が消去されそうであるが,実際にはグレーダウンする.


参照
MDI 子ウィンドウの閉じるボタン無効
MDI 子ウィンドウの最大化ボタン無効
最大化などの無効
前後のTips
コントロールボタン無効

DSS ProgrammingTipsCGI Ver1.02