2017-06-03 4 views
0

In MFC sollte eine Statusleiste nicht automatisch skaliert werden, wenn das übergeordnete Fenster aktualisiert wird Gibt es eine fehlende Einstellung, die ich verwenden muss, um dies zu erreichen?CStatusBarCtrl automatische Größenanpassung

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() 

Antwort

1

einfach den Code MFC Scannen ... (nicht mein Debugger zur Zeit, um durch bekommen, argh)

Innerhalb der CFrameWnd-Klasse gibt es eine Funktion RecalcLayout genannt. MSDN sagt:

Wird vom Framework aufgerufen, wenn die Standardsteuerleisten ein- oder ausgeschaltet sind oder wenn die Größe des Rahmenfensters geändert wird.

RecalcLayout ruft CWnd :: RepositionBars auf. Innerhalb der Funktion ist ein Kommentar:

// walk kids in order, control bars get the resize notification 
// which allow them to shrink the client area 

Es sieht aus wie die Benachrichtigung über die WM_SIZEPARENT Meldung erfolgt:

a) Die CControlBar Klasse hat einen Meldungshandler für WM_SIZEPARENT

b) CStatusBarCtrl abgeleitet von CWnd, nicht von CControlBar, und daher nicht die Nachricht

Lösung: Ich würde es einfach so tun, wie der App-Assistent es tut - machen Sie Ihre Statusleiste Mitgliedsvariable eine CtatusBar. (abgeleitet von CControlBar) Von dort können Sie GetStatusBarCtrl() aufrufen.

// .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

Dies funktioniert, aber nur als Referenz, haben Sie entweder die 'WM_SIZE' Handler vollständig zu entfernen und lassen Sie MFC die sich Updates alle tun oder rufen Sie' CFrameWnd :: OnSize() 'nach alle benutzerdefinierten komprimiert die Größe – Ronnie

Verwandte Themen