2017-06-03 177 views
0

在MFC不应状态栏自动调整当父窗口更新?是否有丢失的设置,我需要使用来实现这一目标?CStatusBarCtrl自动调整大小

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

只需扫描MFC代码...(不能让我的调试器此刻步,哎呀)

的CFrameWnd的类中,有一个名为RecalcLayout功能。 MSDN说:

由框架调用时的标准控制杆或关闭时或当调整大小框架窗口切换。

RecalcLayout使得到的CWnd :: RepositionBars通话。该函数内部有一个评论:

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

它看起来像通知经WM_SIZEPARENT消息进行:

一)CControlBar类有WM_SIZEPARENT

B)CStatusBarCtrl的来源的消息处理程序来自CWnd,而不是CControlBar,因此不会收到消息

解决方案:我会按照应用程序向导的方式执行此操作 - 将状态栏成员变量设置为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的:筛上部分()'任何自定义调整大小后 – Ronnie