2017-06-03 36 views
0

親ウィンドウが更新されたときに、MFCがステータスバーのサイズを自動的に変更しないようにするにはどうすればいいですか?ただ、CFrameWndのクラス内(なんてこった、私のデバッガは、現時点でステップ実行するために取得することはできません)...CStatusBarCtrl自動サイズ変更

をMFCコードをスキャン

class Mainwindow { 
public: 
    MainWindow() { 
     Create(NULL, _T("Main Window")); 
} 
afx_msg int OnCreate(LPCREATESTRUCT lp) { 
     // Status bar 
     CRect rc; 
     this->GetClientRect(&rc); 
     std::array<int, 3> sb = { rc.right/3,rc.right/3 * 2,-1 }; 
     status_bar.Create(WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP, CRect(0, 0, 0, 0), this, IDS_STATUSBARCTRL); 
     status_bar.SetParts(3, sb.data()); 
     status_bar.SetTipText(1, _T("Tooltip text")); 
     status_bar.SetText(_T("Left"), 0, SBT_POPOUT); 
     status_bar.SetText(_T("Middle"), 1, 0); 
     status_bar.SetText(_T("Right"), 2, 0); 
     return TRUE; 
    } 

// This resizes the status bar fine, but shouldn't MFC handle it? 
     afx_msg void OnSize(UINT, int cx, int cy) { 
     status_bar.SendMessage(WM_SIZE, 0, 0); 
    } 

    DECLARE_MESSAGE_MAP() 

private: 
    CStatusBarCtrl status_bar; 
}; 


BEGIN_MESSAGE_MAP(MainWindow,CFrameWnd) 
    ON_WM_CREATE() 
    ON_WM_SIZE() 
END_MESSAGE_MAP() 

答えて

1

、RecalcLayoutと呼ばれる機能があります。 MSDNは

標準のコントロールバーがオンまたはオフに切り替えられたとき、またはフレームウィンドウのサイズが変更されたときにフレームワークによって呼び出されます。

RecalcLayoutは、CWnd :: RepositionBarsを呼び出します。関数内のコメントです:

通知はWM_SIZEPARENTメッセージを介して行われているように見えます
// walk kids in order, control bars get the resize notification 
// which allow them to shrink the client area 

CControlBarクラスはWM_SIZEPARENT

B)CStatusBarCtrlが導出されるためのメッセージハンドラを持っA) CControlBarではなくCWndから返されます。したがって、メッセージを受け取ることはありません。

解決方法:私はアプリケーションウィザードのやり方と同じ方法で、ステータスバーのメンバー変数をCStatusBarにします。 (CControlBarから派生)そこからGetStatusBarCtrl()を呼び出すことができます。

// .h 
CStatusBar status_bar; 

// .cpp 
if (!status_bar.Create(this)) 
{ 
    TRACE0("Failed to create status bar\n"); 
    return -1; 
} 

auto& statusBarCtrl = status_bar.GetStatusBarCtrl(); 
statusBarCtrl.SetParts(3, sb); 
// etc. 
+0

これは動作しますが、あくまでも参考のために、あなたは完全に 'WM_SIZE'ハンドラを削除し、MFCはすべての更新自体またはお電話' CFrameWndの:: OnSize関数() 'の後に任意のカスタムサイズ変更を行うようにするのどちらか持っています – Ronnie

関連する問題