程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 在類VC的界面實現中加入目錄樹

在類VC的界面實現中加入目錄樹

編輯:關於VC++

前言

本文是在《輕松類VC界面》的基礎上寫的,初次寫文章,表義不清之處,請諒解!如果書歸正傳,開始……。

程序運行結果如下圖:左邊、底下有兩個可浮動、可變大小的控制窗口 ,在左邊一個Tab頁中,可以顯示系統目錄。

一、實現原理

圖中兩個窗口的實現類是從CControlBar派生出來的,王駿先生將CSizingControlBar類修改了一下並命名為CCoolBar,我所要做的是應用該類。左邊窗口中的目錄樹,是從類CdirTreeCtrl派生出來的,我們只要引用就可以,詳見代碼。

二、應用示例

1、建立一個基於SDI的工程,工程命名為:009 。(我的工程中命名基本是008,007)

2、將文件夾SplitClass下的sizecbar.h sizecbar.cpp scbarg.h

scbarg.cpp 四個文件復制到工程目錄下。在菜單Project->Add to project->Files將四個文件加入工程中,此時在ClassView中將出現了一個稱為CCoolBar的類。

在stdafx.h文件中加上

#include "sizecbar.h"
#include "scbarg.h"

2.1、為CMainFrame增加成員變量:

CCoolBar m_LeftCtrBar; //左面的控制窗口
CCoolBar m_BottomCtrBar; //最下面的控制窗口

2.2、在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加以下代碼:

//-----------1.創建ControlBar--------
if(!(m_LeftCtrBar.Create(_T("我的控制條1"), this, CSize(230,260),TRUE, 123)))
{
  TRACE0("Failed to create m_LeftCtrBar\n");
  return -1;
}
if(!(m_BottomCtrBar.Create(_T("我的控制條2"), this, CSize(100, 100), TRUE, 124)))
{
  TRACE0("Failed to cretae m_BottomCtrBar\n");
  return -1;
}   

2.3、停靠控制:

//-------------------2.停靠控制-----------------------------------
m_LeftCtrBar.SetBarStyle(m_LeftCtrBar.GetBarStyle() | CBRS_TOOLTIPS
             | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_BottomCtrBar.SetBarStyle(m_BottomCtrBar.GetBarStyle() | CBRS_TOOLTIPS
             | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_LeftCtrBar.EnableDocking(CBRS_ALIGN_ANY);
m_BottomCtrBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
DockControlBar(&m_LeftCtrBar, AFX_IDW_DOCKBAR_LEFT);   //停靠在左邊
DockControlBar(&m_BottomCtrBar, AFX_IDW_DOCKBAR_BOTTOM); //停靠在底部   

運行一下,看一下效果圖如何。

2.4、添加控件:

這個問題看似有些麻煩其實相當簡單:我們只要在創建這些控件時將控制條窗口指針作為父窗口指針賦值給這些控件即可!請看如下例子(需要注意的是以下列舉的幾種形式,你只能選擇其一,同時往一個控制條窗口添加多個子窗口將導致失敗!)(作者原話)

2.4.1 添加最下面的Edit控件

在CMainFrame類中添加成員變量:

CEdit m_BottomEdit; //加在最下面的控制欄中的Edit

在創建ControlBar後創建編輯控件:  

//------------3.m_BottomEdi上的EditBox, 一定要加在創建ControlBar之後--------------------
m_BottomEdit.Create(WS_VSCROLL | WS_CHILD | WS_VISIBLE | ES_AUTOVSCROLL
  | ES_MULTILINE | ES_WANTRETURN,  //指定編輯控件的風格,
  CRect(0,0,0,0),   //Specifies the edit control''s size and position
  &m_BottomCtrBar, //Specifies the edit control''s parent window, it must not be null.
  101);       //Specifies the edit control''s ID
m_BottomEdit.ModifyStyleEx(0, WS_EX_CLIENTEDGE);   

再運行,瞧一下!

2.4.2 在左邊的控制欄中,添加Tab控件,目錄樹Tree,並且把目錄樹放到對話框中。

制作目錄樹:

將文件夾DirectoryTree下的DirTreeCtrl.h ,DirTreeCtrl.cpp SortStringArray.h, SortStringArray.cpp四個文件復制到工程目錄下。在菜單Project->Add to project->Files將四個文件加入工程中。這些東東是我們要用來顯示系統目錄樹用的。

在ResourceView中,添加一個對話框,其ID為IDD_DIRTREEDLG,在其屬性中設置Style下的=>Style為Child, Border為None,並用這個對話框生成一個類CtreeDlg類。

Notice:

從文檔類,框架窗口類和視圖類派生自己的類時,一般都得在類中加個DECLARE_DYNCREATE(),然後在類外加個IMPLEMENT_DYNCREATE()(至於為什麼請看附錄A的鏈接)。所以在 CtreeDlg.h加上DECLARE_DYNCREATE(CTreeDlg),在其相應的.cpp中加上IMPLEMENT_DYNCREATE(CTreeDlg, CDialog)。在CtreeDlg.h中添加成員變量:

CDirTreeCtrl m_DirTreeCtrl;

在CtreeDlg.cpp中增加WM_INITDIAOG消息事件。在OnitDialog()中添加如下代碼:

TCHAR szWorkDir[MAX_PATH];
if (!m_DirTreeCtrl.m_hWnd)
{
  if ( m_DirTreeCtrl.SubclassDlgItem(IDC_TREE1, this))
  {      
    m_DirTreeCtrl.DisplayTree( NULL , TRUE );        
         _getcwd( szWorkDir, 256 ); //得到當前工作目錄
    // set the Path to the current Work-Directory
    m_DirTreeCtrl.SetSelPath( szWorkDir );
  }
}   

這樣目錄樹便可在對話框上可見,但是現在還不能行。

下面要加的是Tab控件,將Tab控件放入左面的控制欄中,首先要將工程目錄TabCtrl文件下的.h,.cpp文件用上面的方面添加到工程。在CMainFrame類中添加成員變量:

CCoolTabCtrl m_TabCtrl;

在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中添加以下代碼:

//---------------7.Create TabCtrl---------
m_TabCtrl.Create(TCS_DOWN | WS_CHILD | WS_VISIBLE,
     CRect(0,0,100,100), &m_LeftCtrBar, 125); //將TabCtrl加入到左面的控制欄中。   

把我們的對話框放入TabCtrl中,代碼如下:

//----------------8.將Dialog加入到TabCtrl中--------------------------
//將樹型控件加入到TabCtrl中
m_TabCtrl.AddPage(RUNTIME_CLASS(CTreeDlg), IDD_DIRTREEDIG, "目錄", IDI_ICON1);
m_TabCtrl.AddPage(RUNTIME_CLASS(CDialogSecond), IDD_DIALOG2, "第二頁", IDI_ICON2);
m_TabCtrl.AddPage(RUNTIME_CLASS(CDialog1), IDD_DIALOG1, "第三頁", IDI_ICON3);
m_TabCtrl.UpdateWindow();

三、更加高級的話題(摘自《輕松實現類VC界面》)

3.1 該ControlBar在浮動的時候頂部的把手會消失,變成了普通的ToolWindow類型的標題欄。為了避免這種情況,我們需要在CMainFrame::OnCreate()中,在EnableDocking()後加入:

#ifdef _SCB_REPLACE_MINIFRAME
m_pFloatingFrameClass = RUNTIME_CLASS(CSCBMiniDockFrameWnd);
#endif //_SCB_REPLACE_MINIFRAME

並在stdafx.h中加上#define _SCB_REPLACE_MINIFRAME

3.2 該類的另外一種風格可以在stdafx.h中加上 #define _SCB_STYLE_FLAT 產生,您不妨試試!

3.3 如何將兩個ControlBar停靠在同一行中

DockControlBar(&m_wndMyBar1, AFX_IDW_DOCKBAR_BOTTOM);///停靠在底部
RecalcLayout();
CRect rect;
m_wndMyBar1.GetWindowRect(rect);
rect.OffsetRect(1, 0);//偏移一個位置
DockControlBar(&m_wndMyBar2, AFX_IDW_DOCKBAR_BOTTOM,rect);///也停靠在底部

3.4 如何將兩個ControlBar停靠在同一列中

DockControlBar(&m_wndMyBar1, AFX_IDW_DOCKBAR_RIGHT);///停靠在右邊
RecalcLayout();
CRect rect;
m_wndMyBar1.GetWindowRect(rect);
rect.OffsetRect(0, 1);//看到這裡的區別了嗎
DockControlBar(&m_wndMyBar2, AFX_IDW_DOCKBAR_RIGHT,rect);///也停靠在右邊

後語:

這是我第一次寫文章,錯誤之處希望大家批評指正!最後,讓我們再次感謝浙江省溫嶺電信局--王駿先生,為我們提供了如此好用的 CcoolBar 類。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved