工具欄,狀態欄(VC_MFC)


目錄

工具欄
狀態欄

(本章節中例子都是用 VS2005 編譯調試的)


工具欄

[對話框][單/多文檔]

相關類:     CToolBar   ,  CToolBarCtrl

 

 

對話框

相關函數:

操作步驟:

菜單索引:

代碼示例:

[加載工具欄][加載自定義位圖的工具欄]

加載工具欄

在對話框中添加工具欄,首先添加一個工具欄資源(資源 ID 為 IDR_TOOLBAR1),工具欄資源和對話框資源,資源視圖如下:

然后為對話框添加一個 CToolBar 對象變量名為 m_tbar,然后在對話框初始化函數(即 OnInitDialog 函數)中添加實現代碼,代碼如下:

View Code
//創建 ToolBar 和加載資源
if(m_tbar.Create(this) && m_tbar.LoadToolBar(IDR_TOOLBAR1))
{
    /* 前期准備工作 *************************************************************************/
    CRect rcClientOld;
    CRect rcClientNew;
    // 用 rcClientOld 獲取客戶區間
    GetClientRect(rcClientOld); 
    // 用 rcClientNew 獲得除了 ToolBar 區的對話框客戶區
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNew);
    //獲得在加入 ToolBar 后控件應該移動的偏移偏移量
    CPoint ptOffset(rcClientNew.left-rcClientOld.left,rcClientNew.top-rcClientOld.top);

    /* 重新設置對話框的窗體區間 *************************************************************/
    //得到對話框窗體區間 
    CRect rcWindow;
    GetWindowRect(rcWindow);
    //修改對話框寬度和高度,即讓對話框添加上 ToolBar 的高度和適應 ToolBar 的高度
    rcWindow.right += rcClientOld.Width() - rcClientNew.Width();   
    rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();
    //移動對話框
    MoveWindow(rcWindow,FALSE);   

    /* 調整控件位置 *************************************************************************/
    CRect rcChild;
    //獲得窗口控件    
    CWnd* pwndChild = GetWindow(GW_CHILD); 
    //遍歷控件
    while(pwndChild) 
    {
        //獲得控件區間
        pwndChild->GetWindowRect(rcChild);
        //將屏幕坐標轉換為客戶區坐標
        ScreenToClient(rcChild);
        //將控件移動相對位置
        rcChild.OffsetRect(ptOffset);
        //移動控件
        pwndChild->MoveWindow(rcChild,FALSE);
        //獲得下個控件句柄
        pwndChild = pwndChild->GetNextWindow();
    }
    //顯示 ToolBar
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
}

運行結果:

加載自定義位圖的工具欄

在對話框中添加工具欄,首先添加一個位圖資源(資源 ID 為 IDB_BITMAP1),位圖資源和對話框資源,資源視圖如下:

然后為對話框添加一個 CToolBar 對象變量名為 m_tbar,然后在對話框初始化函數(即 OnInitDialog 函數)中添加實現代碼,(具體代碼和添加工具欄中的相似)代碼如下:

View Code
//創建工具欄
if(m_tbar.Create(this,WS_CHILD|WS_VISIBLE|CBRS_SIZE_FIXED|CBRS_TOP|CBRS_TOOLTIPS))
{
    /* 創建自定義位圖的工具欄初始化工作 ***************************************************/
    //定義工具欄上的按鈕的所對應的標識
    static UINT BASED_CODE DockTool[]={IDOK,IDCANCEL};

    //加載工具欄要用的位圖
    CBitmap bitmap;
    bitmap.LoadBitmapW(IDB_BITMAP1);
    //建立工具欄中的圖片列表
    static CImageList m_ilToolBar;
    m_ilToolBar.Create(100,100,ILC_COLOR32,0,0);//以寬 100,長 100 像素來切割圖片
    m_ilToolBar.Add(&bitmap,(CBitmap*)NULL);
    //設置工具欄按鈕圖片
    m_tbar.GetToolBarCtrl().SetImageList(&m_ilToolBar);

    //設置工具欄的按鈕大小,和按鈕中位圖大小(注意: 按鈕大小必須大於按鈕中位圖大小)
    SIZE sbutton,sImage;
    sbutton.cx= 110;
    sbutton.cy=110;
    sImage.cx=100;
    sImage.cy=100;
    m_tbar.SetSizes(sbutton,sImage);
    //設置工具欄上按鈕的所對應的標識,和按鈕個數
    m_tbar.SetButtons(DockTool,(UINT)2);

    /* 前期准備工作 *************************************************************************/
    CRect rcClientOld;
    CRect rcClientNew;
    // 用 rcClientOld 獲取客戶區間
    GetClientRect(rcClientOld); 
    // 用 rcClientNew 獲得除了 ToolBar 區的對話框客戶區
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNew);
    //獲得在加入 ToolBar 后控件應該移動的偏移偏移量
    CPoint ptOffset(rcClientNew.left-rcClientOld.left,rcClientNew.top-rcClientOld.top);

    /* 重新設置對話框的窗體區間 *************************************************************/
    //得到對話框窗體區間 
    CRect rcWindow;
    GetWindowRect(rcWindow);
    //修改對話框寬度和高度,即讓對話框添加上 ToolBar 的高度和適應 ToolBar 的高度
    rcWindow.right += rcClientOld.Width() - rcClientNew.Width();   
    rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();
    //移動對話框
    MoveWindow(rcWindow,FALSE);   

    /* 調整控件位置 *************************************************************************/
    CRect rcChild;
    //獲得窗口控件    
    CWnd* pwndChild = GetWindow(GW_CHILD); 
    //遍歷控件
    while(pwndChild) 
    {
        //獲得控件區間
        pwndChild->GetWindowRect(rcChild);
        //將屏幕坐標轉換為客戶區坐標
        ScreenToClient(rcChild);
        //將控件移動相對位置
        rcChild.OffsetRect(ptOffset);
        //移動控件
        pwndChild->MoveWindow(rcChild,FALSE);
        //獲得下個控件句柄
        pwndChild = pwndChild->GetNextWindow();
    }
    //顯示 ToolBar
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
}

運行結果:

 

單/多文檔

相關函數:

操作步驟:

菜單索引:

代碼示例:

[加載工具欄][加載帶自定義位圖工具欄][顯示/隱藏工具欄]

加載工具欄

在文檔中添加工具欄,這個功能只能在框架類中完成(即 CFrameWnd 類),由於一生成 單文檔/多文檔 工程時候,會為程序添加一個默認的工具欄(資源 ID 為).這里用的是單文檔工程這個工具欄的資源視圖如下:

這個工具欄的添加在框架類的初始化(即 OnCreate 函數)中,具體代碼如下(省略了無關代碼):

View Code
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    //創建一個工具欄
    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
        | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("未能創建工具欄\n");
        return -1;      // 未能創建
    }

    ...

    //使工具欄可以停靠
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar);

    ...
}

運行結果:

加載自定義位圖的工具欄

在文檔中添加工具欄,這個功能只能在框架類中完成(即 CFrameWnd 類),這里生成的是單文檔工程,然后為文檔添加一個位圖資源,資源視圖如下:

然后為框架類添加一個 CToolBar 對象變量名為 m_Mytbar,在框架類的初始化(即 OnCreate 函數)中,添加相關的實現代碼,具體代碼如下:

View Code
//創建自定義工具欄
if (m_Mytbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
    | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
{
    //定義工具欄上的按鈕的所對應的標識
    static UINT BASED_CODE DockTool[]={ID_FILE_NEW,ID_FILE_OPEN};

    //加載工具欄要用的位圖
    CBitmap bitmap;
    bitmap.LoadBitmapW(IDB_BITMAP1);
    //建立工具欄中的圖片列表
    static CImageList ilToolBar;
    ilToolBar.Create(100,100,ILC_COLOR32,0,0);//以寬 100,長 100 像素來切割圖片
    ilToolBar.Add(&bitmap,(CBitmap*)NULL);
    //設置工具欄按鈕圖片
    m_Mytbar.GetToolBarCtrl().SetImageList(&ilToolBar);

    //設置工具欄的按鈕大小,和按鈕中位圖大小(注意: 按鈕大小必須大於按鈕中位圖大小)
    SIZE sbutton,sImage;
    sbutton.cx= 110;
    sbutton.cy=110;
    sImage.cx=100;
    sImage.cy=100;
    m_Mytbar.SetSizes(sbutton,sImage);
    //設置工具欄上按鈕的所對應的標識,和按鈕個數
    m_Mytbar.SetButtons(DockTool,(UINT)2);

    //設置工具欄使其可以停靠在框架窗口上
    m_Mytbar.EnableDocking(CBRS_ALIGN_ANY);
    //把工具欄停靠在框架窗口上
    DockControlBar(&m_Mytbar);
}

運行結果:

工具欄的顯示與隱藏

接着上個代碼示例,為文檔程序在主菜單欄上添加個 顯示/隱藏工具欄 的菜單項,完成 顯示/隱藏工具欄 的這個功能.菜單資源(菜單資源 ID 為 IDR_MAINFRAME,菜單項 ID 為 ID_TB)視圖如下:

為菜單項 顯示/隱藏工具欄 在框架類中添加事件響應函數,后在事件響應函數中添加相關操作,具體代碼如下:

if(m_Mytbar.IsWindowVisible())
    ShowControlBar(&m_Mytbar,false,false);
else
    ShowControlBar(&m_Mytbar,true,false);

運行結果:

 


狀態欄

[對話框][單/多文檔]

相關類:   CStatusBar  ,  CStatusBarCtrl

 

對話框

相關函數:

具體步驟:

代碼示例:

在對話框中添加狀態欄,首先添加兩個圖標資源(資源 ID 為 IDI_ICON1,IDI_ICON2),圖標資源和對話框資源,資源視圖如下:

然后為對話框添加一個 CStatusBar 對象變量名為 m_StatBar,然后在對話框初始化函數(即 OnInitDialog 函數)中添加實現代碼,具體代碼如下:

View Code
//創建狀態欄
if(m_StatBar.Create(this))
{
    // 狀態行指示器對應 ID
    static UINT indicators[] =
    {
        ID_SEPARATOR,           
        ID_INDICATOR_CAPS,
        ID_INDICATOR_NUM,
        ID_INDICATOR_SCRL,
    };

    // 設置狀態欄指示器 ID 和指示器個數
    m_StatBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));
    
    // 設置狀態欄指示器文本
    m_StatBar.SetPaneText(0,L"指示器1",0);
    m_StatBar.SetPaneText(1,L"指示器2",0);
    m_StatBar.SetPaneText(2,L"指示器3",0);
    m_StatBar.SetPaneText(3,L"指示器4",0);
    
    // 設置狀態欄指示器屬性
    m_StatBar.SetPaneInfo(0,ID_SEPARATOR,SBPS_NORMAL   ,100);
    m_StatBar.SetPaneInfo(1,ID_INDICATOR_CAPS,SBPS_NORMAL   ,100);
    m_StatBar.SetPaneInfo(2,ID_INDICATOR_NUM,SBPS_NORMAL   ,100);
    m_StatBar.SetPaneInfo(3,ID_INDICATOR_SCRL,SBPS_NORMAL   ,100);

    //為狀態欄指示器添加圖標
    HICON icon[2];
    icon[0] = AfxGetApp()->LoadIcon (IDI_ICON1);
    icon[1] = AfxGetApp()->LoadIcon (IDI_ICON2);
    m_StatBar.GetStatusBarCtrl().SetIcon(0,icon[0]);
    m_StatBar.GetStatusBarCtrl().SetIcon(1,icon[1]);
    m_StatBar.GetStatusBarCtrl().SetIcon(2,icon[0]);
    m_StatBar.GetStatusBarCtrl().SetIcon(3,icon[1]);
    //設置狀態欄高度
    m_StatBar.GetStatusBarCtrl().SetMinHeight(50);
    
    /* 前期准備工作 *************************************************************************/
    CRect rcClientOld;
    CRect rcClientNew;
    // 用 rcClientOld 獲取客戶區間
    GetClientRect(rcClientOld); 
    // 用 rcClientNew 獲得除了 CStatusBar 區的對話框客戶區
    
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rcClientNew);
    /* 這里要注意下如果你在對話框中添加了工具欄和狀態欄,那么這里獲得的是這些控制欄的矩形區,即高度是控制欄(工具欄加狀態欄)的總和,寬度是控制欄中最寬的那個..********/

    /* 重新設置對話框的窗體區間 *************************************************************/
    // 得到對話框窗體區間 
    CRect rcWindow;
    GetWindowRect(rcWindow);
    // 修改對話框寬度和高度,即讓對話框添加上 CStatusBar 的高度和適應 CStatusBar 的寬度
    rcWindow.right += rcClientOld.Width() - rcClientNew.Width();   
    rcWindow.bottom += rcClientOld.Height() - rcClientNew.Height();
    // 移動對話框
    MoveWindow(rcWindow,FALSE);   

    // 顯示狀態欄
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
}

運行結果:

 

單/多文檔

相關函數:

代碼示例:

在文檔中添加狀態欄,這個功能只能在框架類中完成(即 CFrameWnd 類),由於一生成 單文檔/多文檔 工程時候,會為程序添加一個默認的狀態欄.為了希望在這個默認的狀態欄上添加資源圖標(資源 ID 為 IDI_ICON1,IDI_ICON2),定義的兩個圖標資源視圖如下:

這個狀態欄的添加在框架類的初始化(即 OnCreate 函數)中,而窗格的索引值在框架類的實現文件頭出定義,具體代碼如下(省略了無關代碼):

View Code
...
// 狀態行指示器對應 ID
static UINT indicators[] =
{
    ID_SEPARATOR,           // 狀態行指示器
    ID_INDICATOR_CAPS,
    ID_INDICATOR_NUM,
    ID_INDICATOR_SCRL,
};

...

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    ...

    if (!m_wndStatusBar.Create(this) ||
        !m_wndStatusBar.SetIndicators(indicators,
          sizeof(indicators)/sizeof(UINT)))
    {
        TRACE0("未能創建狀態欄\n");
        return -1;      // 未能創建
    }

    /* 以下是我為狀態欄添加圖標的實現代碼 *****************/
    //為狀態欄指示器添加圖標
    HICON icon[2];
    icon[0] = AfxGetApp()->LoadIcon (IDI_ICON1);
    icon[1] = AfxGetApp()->LoadIcon (IDI_ICON2);
    m_wndStatusBar.GetStatusBarCtrl().SetIcon(0,icon[0]);
    m_wndStatusBar.GetStatusBarCtrl().SetIcon(1,icon[1]);
    m_wndStatusBar.GetStatusBarCtrl().SetIcon(2,icon[0]);
    m_wndStatusBar.GetStatusBarCtrl().SetIcon(3,icon[1]);
    //設置狀態欄高度
    m_wndStatusBar.GetStatusBarCtrl().SetMinHeight(50);

    // 設置狀態欄指示器屬性
    m_wndStatusBar.SetPaneInfo(0,ID_SEPARATOR,SBPS_NORMAL   ,100);
    m_wndStatusBar.SetPaneInfo(1,ID_INDICATOR_CAPS,SBPS_NORMAL   ,100);
    m_wndStatusBar.SetPaneInfo(2,ID_INDICATOR_NUM,SBPS_NORMAL   ,100);
    m_wndStatusBar.SetPaneInfo(3,ID_INDICATOR_SCRL,SBPS_NORMAL   ,100);

    return 0;
}

....

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM