輕鬆實現類VC介面並加上目錄樹

2021-05-31 23:03:08 字數 3635 閱讀 5582

一、實現原理

圖中兩個視窗的實現類是從ccontrolbar派生出來的,我們並不需要從頭到尾實現該類,因為cristi posea先生已經為我們實現了乙個稱為csizingcontrolbar的類,而且做得相當完美!我們所要做的便是好好地利用該類,為了盡可能地簡潔,筆者將csizingcontrolbar類修改了一下並命名為ccoolbar,接下來我們將詳細介紹如何利用該類實現我們所需的介面。

二、實現步驟示例

[1]前期準備

新建乙個名為bardemo的mfc工程,sdi介面,其它選項預設。

將本文示例**中的sizecbar.h sizecbar.cpp scbarg.h scbarg.cpp 四個檔案複製到工程目錄下。

在選單project->add to project->files將四個檔案加入工程中,此時在classview中將出現了乙個稱為ccoolbar的類。

在stdafx.h檔案中加上

#include "sizecbar.h"

#include "scbarg.h"

[2]開始編碼

2.1 為cmainframe增加成員變數

ccoolbar m_wndmybar1;///我們將它作為左邊的視窗

ccoolbar m_wndmybar2;///停靠在下方的視窗

以下**需要新增到cmainframe::oncreate中,方法與普通工具條的建立沒有太大的區別!

2.2 建立controlbar

if (!m_wndmybar1.create(_t("我的控制條"),this,123))

if (!m_wndmybar2.create(_t("我的控制條2"),this,csize(100,100),true,124))

2.3 停靠控制

m_wndmybar1.setbarstyle(m_wndmybar1.getbarstyle() | cbrs_tooltips |

cbrs_flyby | cbrs_size_dynamic);

m_wndmybar2.setbarstyle(m_wndmybar2.getbarstyle() | cbrs_tooltips |

cbrs_flyby | cbrs_size_dynamic);

m_wndmybar1.enabledocking(cbrs_align_any);

m_wndmybar2.enabledocking(cbrs_align_any);

dockcontrolbar(&m_wndmybar1, afx_idw_dockbar_left);///停靠在左邊

dockcontrolbar(&m_wndmybar2, afx_idw_dockbar_bottom);///停靠在右邊

此時我們已經生成了兩個控制條視窗,但視窗中還沒有任何東西!讓我們來做最後一件事情:往視窗新增所需部件!

2.4 新增我的控制項

這個問題看似有些麻煩其實相當簡單:我們只要在建立這些控制項時將控制條視窗指標作為父視窗指標賦值給這些控制項即可!

請看如下例子(需要注意的是以下列舉的幾種形式,你只能選擇其一,同時往乙個控制條視窗新增多個子視窗將導致失敗!)

(1)將編輯控制項放入下面那個控制條視窗中

在cmainframe類中新增成員變數cedit   m_wndedit;在建立controlbar後建立編輯控制項

m_wndedit.create(ws_vscroll|ws_child|ws_visible|es_autovscroll|

es_multiline|es_wantreturn,crect(0,0,0,0),&m_wndmybar2,101);

m_wndedit.modifystyleex(0,ws_ex_clientedge);

m_wndvckbase.create(idd_dialogbar,&m_wndmybar1);

m_wndvckbase.showwindow(sw_show);

(4)將tabctrl放入左邊的控制條

本文的示例**中提供了乙個稱為ccooltabctrl的封裝類,我們用它可以簡單地建立出tabctrl,先請看如下**

m_tabctrl.updatewindow(); ///更新tabcontrol

需要注意的是希望新增到tabcontrol中的對話方塊,在其類定義,類實現檔案中必須新增如下資訊:

例如cvckbasedlg類,在vckbasedlg.h中新增 declare_dyncreate(cvckbasedlg) class cvckbasedlg : public cdialog

{// construction

public:

cvckbasedlg(cwnd* pparent = null);   // standard constructor

declare_dyncreate(cvckbasedlg)

在.cpp中增加 implement_dyncreate(cvckbasedlg, cdialog)

至此我們已經大功告成!我們可以編譯執行一下看看兩個控制條有沒有建立成功。

哇噻!只用這幾行**就實現了夢寐以求的介面!

三、更加高階的話題

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);///也停靠在右邊

//對於以上只能新增乙個控制項的結論,如果不是呼叫作者的類,而是直接呼叫cristi posea先生先生的類,則不存在這種情形,可以隨意新增控制項。

如果希望浮動視窗不能響應滑鼠操作,固定不動,只要將響應的訊息處理注釋即可。

Java介面(繼承父類並實現多個介面)

使用介面的時候,需要注意 1.介面是沒有靜態 塊或者構造方法的。2.乙個類的直接父類是唯一的,但是乙個類可以同時實現多個介面。格式 public class myinte ceimpl implements myinte cea,myinte ceb3.如果實現類所實現的多個介面當中,存在重複的抽象...

繼承父類並實現多個介面

package cn.ly.day.seven.twentytwo 使用介面的時候,需要注意 1.介面是沒有靜態 塊或者構造方法。2.乙個類的直接父類是唯一的,但是乙個類可以同時實現多個介面。格式 public class myinte ceimpl implements myinte cea,my...

設計類並實現介面與繼承

看到作業的時候想了一下,也不想搞太複雜的東西,所以在huang這個包裡就建立乙個父類,定義了乙個介面,然後在同乙個檔案裡繼承父類並實現介面 說明我真的太懶了 父類 evildoer是恐怖者的意思,scold是辱罵的意思 package com.huang class evildoer 定義的介面 p...