【MFC】状态栏随对话框的改变而改变
00. 目錄
文章目錄
- 00. 目錄
- 01. 案例概述
- 02. 開發環境
- 03. 關鍵技術
- 04. 程序設計
- 05. 秘笈心法
- 06. 源碼下載
- 07. 附錄
01. 案例概述
在對話框中創建一個狀態欄,當窗口大小發生改變時,默認情況下,狀態欄是不會發生改變的。但在實際應用中,需要狀態欄隨對話框大小改變而改變。效果如下圖所示。
02. 開發環境
系統環境:Windows 10
開發環境:Visual Studio 2019
03. 關鍵技術
對話框的大小發生變化后,對話框類的OnSize方法可以接收到消息,在OnSize方法內根據窗體改變后的大小來重新設置狀態欄的大小。狀態欄大小的改變使用CStatusBar類的SetPaneInfo方法實現。
SetPaneInfo方法
該方法用來設置指定狀態欄標識面板的ID屬性值、樣式和寬度。語法如下:
void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth );參數: nIndex 要設置其風格的指示器窗格的索引。 nID 該指示器窗格的新ID。 nStyle 該指示器窗格的新風格。 cxWidth 該指示器窗格的新寬度。 說明: 此成員函數用來設置指示器窗格的新ID,風格和寬度。 下面的指示器風格是被支持的: · SBPS_NOBORDERS 在窗格周圍沒有3-D邊框。 · SBPS_POPOUT 反轉邊界以使文字“凸出來”。 · SBPS_DISABLED 不繪制文本。 · SBPS_STRETCH 擴大窗格以填充不用的空白空間。沒有狀態條只能有一個窗格具有這種風格。 · SBPS_NORMAL 沒有擴展,邊界或“凸出來”。04. 程序設計
(1)新建一個基于對話框的工程
(2)在CMy1StatusDlg類中聲明CStatusBar類對象。
(3)為CMy1StatusDlg類添加WM_SIZE消息的處理函數,在該函數中實現對狀態欄大小的改變,函數實現代碼如下。
BEGIN_MESSAGE_MAP(CMy1StatusDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_TIMER()ON_WM_SIZE() END_MESSAGE_MAP()// CMy1StatusDlg 消息處理程序BOOL CMy1StatusDlg::OnInitDialog() {CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。 當應用程序主窗口不是對話框時,框架將自動// 執行此操作SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標m_StatusBar.CreateEx(this, SBARS_SIZEGRIP);UINT panels[6];CRect rect;GetClientRect(rect);int width = rect.Width() / 6;m_StatusBar.SetIndicators(panels, 6);for (int i = 0; i < 6; i++){m_StatusBar.SetPaneInfo(i, 1000 + i, 0, width);}//設置面板信息m_StatusBar.SetPaneText(0, TEXT("提示"));m_StatusBar.SetPaneText(2, TEXT("當前用戶"));m_StatusBar.SetPaneText(4, TEXT("當前時間"));//獲取當前時間CTime time;time = CTime::GetCurrentTime();m_StatusBar.SetPaneText(5, time.Format("%H:%M:%S"));RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);//設置定時器SetTimer(1, 1000, NULL);return TRUE; // 除非將焦點設置到控件,否則返回 TRUE }void CMy1StatusDlg::OnTimer(UINT_PTR nIDEvent) {// TODO: 在此添加消息處理程序代碼和/或調用默認值CTime time;time = CTime::GetCurrentTime();m_StatusBar.SetPaneText(5, time.Format("%H:%M:%S"));CDialogEx::OnTimer(nIDEvent); }void CMy1StatusDlg::OnSize(UINT nType, int cx, int cy) {CDialogEx::OnSize(nType, cx, cy);//判斷狀態欄是否被創建if (IsWindow(m_StatusBar.m_hWnd)){CRect rect;GetClientRect(rect);int width = rect.Width() / 6;for (int i = 0; i < 6; i++){m_StatusBar.SetPaneInfo(i, 1000 + i, 0, width);}RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);}// TODO: 在此處添加消息處理程序代碼 }05. 秘笈心法
應用程序中控件位置的變化
在開發應用程序過程中,將控件設置為隨對話框的改變而改變,可以增加應用程序的靈活性,例如將編輯框設置為隨對話框的改變而改變,當編輯框中顯示的數據比較多時,通過改變對話框的大小來讓編輯框顯示更多的數據,同樣狀態欄隨對話框大小改變而改變可以增加程序的美觀程度,如果對話框大小發生變化了,狀態欄還以原有的大小和位置顯示在哪里,會造成界面的混亂。
06. 源碼下載
下載:【MFC】狀態欄隨對話框的改變而改變.rar
07. 附錄
參考: 《Visual C++從入門到精通(項目案例版)》
總結
以上是生活随笔為你收集整理的【MFC】状态栏随对话框的改变而改变的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MFC】显示系统时间的状态栏
- 下一篇: 【MFC】带进度条的状态栏