Visual C++ Windows Programming 第六章 分裂視窗及多文件視窗. 大綱 分裂視窗的建立 多文件視窗的建立.

Slides:



Advertisements
Similar presentations
Chapter 10 馬可夫鏈 緒言 如果讀者仔細觀察日常生活中所發生的 諸多事件,必然會發現有些事件的未來 發展或演變與該事件現階段的狀況全然 無關,這種事件稱為獨立試行過程 (process of independent trials) ;而另一些 事件則會受到該事件現階段的狀況影響。
Advertisements

布林代數的應用--- 全及項(最小項)和全或項(最大項)展開式
第 10 章 Java 的執行緒 10-1 執行緒的基礎 10-2 Java 執行緒的使用方法 10-3 Java 執行緒的同步 10-4 管道串流的執行緒.
第七章 抽樣與抽樣分配 蒐集統計資料最常見的方式是抽查。這 牽涉到兩個問題: 抽出的樣本是否具有代表性?是否能反應出母體的特徵?
Advanced Chemical Engineering Thermodynamics
What is static?. Static? 靜態 ? class Test { static int staticX; int instanceX; public Test(int var1, int var2) { this.staticX = var1; this.instanceX =
建立靜態資料成員 關鍵字: static 靜態資料成員不屬於特定物件,而是該類物件 所共同擁有的,可做為類別範圍裡的靜態變數。
第 13 章 常數、靜態成員與朋友關 係 13-1 常數物件與成員 13-1 常數物件與成員 13-2 物件成員與巢狀類別 13-2 物件成員與巢狀類別 13-3 靜態成員資料與函數 13-3 靜態成員資料與函數 13-4 朋友關係 13-4 朋友關係.
1. 假設以下的敘述為一未提供 “ 捷徑計算 ” 能力的程式段,試用程 式設計的技巧,使此敘述經此改 寫的動作後,具有與 “ 捷徑計算 ” 之 處理方法相同之處理模式。 if and then E1 else E2 endif.
例外處理. 內 容 大 綱 例外的產生 捕捉例外 丟出例外 例外的產生 (1/4) 一般常見的執行時期錯誤包括整數除法分母為 0(divide by zero) ,陣列索引值越限 (array index out of range) ,輸入輸出錯誤 (I/O error) 、檔案 不存在或無法存取.
JAVA 程式設計與資料結構 第十四章 Linked List. Introduction Linked List 的結構就是將物件排成一列, 有點像是 Array ,但是我們卻無法直接經 由 index 得到其中的物件 在 Linked List 中,每一個點我們稱之為 node ,第一個 node.
第 18 章 名稱空間與例外處理 18-1 名稱空間 18-1 名稱空間 18-2 例外處理 18-2 例外處理.
系統分析與設計【第八版】 第六章 物件塑模.
Monte Carlo Simulation Part.2 Metropolis Algorithm Dept. Phys. Tunghai Univ. Numerical Methods C. T. Shih.
第 7 章 程序與函數 7-1 模組化程式設計 7-1 模組化程式設計 7-2 VB.NET 的程序與函數 7-2 VB.NET 的程序與函數 7-3 程序與函數的變數範圍 7-3 程序與函數的變數範圍 7-4 VB.NET 常用的內建函數 7-4 VB.NET 常用的內建函數 7-5 遞迴函數 7-5.
具備人臉追蹤與辨識功能的一個 智慧型數位監視系統 系統架構 在巡邏模式中 ,攝影機會左右來回巡視,並 利用動態膚色偵測得知是否有移動膚色物體, 若有移動的膚色物體則進入到追蹤模式,反之 則繼續巡視。
© The McGraw-Hill Companies, Inc., 2008 第 6 章 製造流程的選擇與設計.
第 1 章 PC 的基本構造. 本章提要 PC 系統簡介 80x86 系列 CPU 及其暫存器群 記憶體: Memory 80x86 的分節式記憶體管理 80x86 的 I/O 結構 學習組合語言的基本工具.
Chapter 13 塑模靜態觀點:物件圖 Static View : Object Diagram.
Introduction to Java Programming Lecture 17 Abstract Classes & Interfaces.
24-6 設定開始與結束場景中的 程式 最後我們要替這個遊戲收個尾, 幫它把開始 的等待畫面跟結束畫面處理一下。
: The largest Clique ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11324: The largest Clique 解題者:李重儀 解題日期: 2008 年 11 月 24 日 題意: 簡單來說,給你一個 directed.
3-3 使用幾何繪圖工具 Flash 的幾何繪圖工具包括線段工具 (Line Tool) 、橢圓形工具 (Oval Tool) 、多邊星形 工具 (Rectangle Tool) 3 種。這些工具畫出 來的幾何圖形包括了筆畫線條和填色區域, 將它們適當地組合加上有技巧地變形與配 色, 不但比鉛筆工具簡單,
Matlab Assignment Due Assignment 兩個 matlab 程式 : Eigenface : Eigenvector 和 eigenvalue 的應用. Fractal : Affine transform( rotation, translation,
Chapter 20 塑模動態觀點:狀態圖 Statechart Diagram. 學習目標  說明狀態圖的目的  定義狀態圖的基本記號  展示狀態圖的建構  定義活動、內部事件及遞延事件的狀態 圖記號.
Ubiquitous News(Unews) 的設計與實作 指導教授:黃毅然 教授 學生:葉雅琳 系別:資訊工程學系.
第12章 建立多表單與模組的應用程式 12-1 Visual Basic的方案與專案 12-2 模組化Visual Basic應用程式
第三章 自動再裝載運用篇 使用時機:裝載計劃完成時,尚有剩餘空 間的情形,維持已固定計劃而繼續做裝載 最佳化。以支持次日裝載計劃而提前調整 作業模式。 裝載物品設定和裝載容器設定如前兩章介 紹,於此不再重複此動作,直接從裝載計 劃設定開始,直接從系統內定的物品和容 器選取所需.
Fourier Series. Jean Baptiste Joseph Fourier (French)(1763~1830)
從此處輸入帳號密碼登入到管理頁面. 點選進到檔案管理 點選「上傳檔案」上傳資料 點選瀏覽選擇電腦裡的檔案 可選擇公開或不公開 為平台上的資料夾 此處為檔案分類,可顯示在展示頁面上,若要參加 MY EG 競賽,做品一律上傳到 “ 98 MY EG Contest ” 點選此處確定上傳檔案.
資料結構實習-一 參數傳遞.
6-2 認識元件庫與內建元件庫 Flash 的元件庫分兩種, 一種是每個動畫專 屬的元件庫 (Library) ;另一種則是內建元 件庫 (Common Libraries), 兩者皆可透過 『視窗』功能表來開啟, 以下即為您說明。
第二章第二章 Statistica 的工具欄. 本章目標:工具欄之使用 介紹 STATISTICA 是一個非常好用的統計軟體,只 要你對微軟的 Office 套裝軟體有較熟悉的瞭解, 那對 STATISTICA 的工具欄就非常容易掌握。 STATISTICA 的文件組織有四種類型,即 Workbook.
Advance Window Programming 游子宜. MFC 類別函式庫 MFC(Microsoft Foundation Class Library) 是一套 整合在 VC++ 中供開發視窗程式用的類別函式庫, 提供了豐富的類別函式供程式設計師來開發各類 的視窗應用程式。
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2008.
第 9 章 TSR 程式基本教練. 本章提要 TSR 程式 以熱鍵 (Hot key) 叫用 TSR 程式 Clock 中斷 int 08h 、 int 1ch DOS reentrant 的問題 有用的 TSR 程式.
Section 4.2 Probability Models 機率模式. 由實驗看機率 實驗前先列出所有可能的實驗結果。 – 擲銅板:正面或反面。 – 擲骰子: 1~6 點。 – 擲骰子兩顆: (1,1),(1,2),(1,3),… 等 36 種。 決定每一個可能的實驗結果發生機率。 – 實驗後所有的實驗結果整理得到。
函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈, 無法停止(只能按 Ctrl-C ) 這給我們一個暗示:函式的遞迴呼叫可以 達到部分迴圈的效果.
JAVA 程式設計與資料結構 第二十章 Searching. Sequential Searching Sequential Searching 是最簡單的一種搜尋法,此演 算法可應用在 Array 或是 Linked List 此等資料結構。 Sequential Searching 的 worst-case.
演算法 8-1 最大數及最小數找法 8-2 排序 8-3 二元搜尋法.
2010 MCML introduction 製作日期: 2010/9/10 製作人 : 胡名霞.
Chapter 6 線性規劃 緒言 如何在有限的經濟資源下進行最有效的調配與 選用,以求發揮資源的最高效能。此問題愈來 愈受到重視,也就是以最低的代價,獲取最大 的效益。 茲列舉如下: – 決定緊急設備與人員的地點,使反應時間最短化。 – 決定飛機、飛行員、地勤人員的飛航最佳日程安排。
Chapter 3 Entropy : An Additional Balance Equation
845: Gas Station Numbers ★★★ 題組: Problem Set Archive with Online Judge 題號: 845: Gas Station Numbers. 解題者:張維珊 解題日期: 2006 年 2 月 題意: 將輸入的數字,經過重新排列組合或旋轉數字,得到比原先的數字大,
Structural Equation Modeling Chapter 6 CFA 根據每個因素有多重指標,以減少 測量誤差並可建立問卷的構念效度 驗證性因素分析.
第 17 章 樣板 17-1 樣板的基礎 17-1 樣板的基礎 17-2 樣板函數 17-2 樣板函數 17-3 樣板類別 17-3 樣板類別 17-4 非型態參數的樣板類別 17-4 非型態參數的樣板類別 17-5 樣板類別的繼承 17-5 樣板類別的繼承 17-6 特化樣板與靜態成員 17-6 特化樣板與靜態成員.
Learning Method in Multilingual Speech Recognition Author : Hui Lin, Li Deng, Jasha Droppo Professor: 陳嘉平 Reporter: 許峰閤.
Chapter 10 m-way 搜尋樹與B-Tree
第12章 多重表單與模組的應用程式 12-1 VB.NET的方案與專案 12-2 模組化VB.NET應用程式 12-3 多重表單的應用程式
演算法課程 (Algorithms) 國立聯合大學 資訊管理學系 陳士杰老師 Course 7 貪婪法則 Greedy Approach.
JAVA 程式設計與資料結構 第十六章 Hash Tables. Introduction Hash Tables 結構為一個 Array ,稱之為 Bucket array 。 如果想要新增一個物件,要根據這個物件的特性 將其加入 Hash Table 內。 Bucket Array 用 A 來代替,其.
概念性產品企劃書 呂學儒 李政翰.
第 10 章 視窗應用程式的工具列與 功能表 10-1 功能表控制項 10-1 功能表控制項 10-2 快顯功能表控制項 10-2 快顯功能表控制項 10-3 工具列控制項 10-3 工具列控制項 10-4 狀態列控制項 10-4 狀態列控制項 10-5 字型與色彩對話方塊 10-5 字型與色彩對話方塊.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2009.
連續隨機變數 連續變數:時間、分數、重量、……
McGraw-Hill/Irwin © 2003 The McGraw-Hill Companies, Inc.,All Rights Reserved. 壹 企業研究導論.
Visual C++重點複習.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2010.
Microsoft Excel.
第五章IIR數位濾波器設計 濾波器的功能乃對於數位信號進行處理﹐ 以滿足系統的需求規格。其作法為設計一 個系統的轉移函數﹐或者差分方程式﹐使 其頻率響應落在規格的範圍內。本章探討 的是其中一種方法﹐稱為Infinite impulse register(IIR)。 IIR架構說明。 各種不同頻帶(Band)濾波器的設計方法。
Introduction to Java Programming Lecture 16 Super and Sub Classes.
著作權所有 © 旗標出版股份有限公司 第 14 章 製作信封、標籤. 本章提要 製作單一信封 製作單一郵寄標籤.
Ch 11 建立研究工具的效度與信度.
幼兒行為觀察與記錄 第八章 事件取樣法.
1 Chemical and Engineering Thermodynamics Chapter 1 Introduction Sandler.
第 1 章 PC 的基本構造. 本章提要 PC 系統簡介 80x86 系列 CPU 及其暫存器群 記憶體: Memory 80x86 的分節式記憶體管理 80x86 的 I/O 結構 學習組合語言的基本工具.
McGraw-Hill/Irwin © 2003 The McGraw-Hill Companies, Inc.,All Rights Reserved. 肆 資料分析與表達.
Visual C++ Windows Programming 第十章 Modaless 對話盒. 大綱 Modaless 對話盒的設計 對話盒應用程式的使用.
Visual C++ Windows Programming
Presentation transcript:

Visual C++ Windows Programming 第六章 分裂視窗及多文件視窗

大綱 分裂視窗的建立 多文件視窗的建立

分裂視窗的建立 具有捲軸的視窗 – 當圖形可繪製區域大於視窗客戶區時,會有 資料顯示的問題,而將捲軸加到視窗之上, 即可有效解決這個問題。 –MFC 具有 CScrollView 的 Class ,此為衍生 於 CView 的 Class ,同時具有捲軸。利用 CScrollView ,就可以建立具有捲軸的視窗程 式。

物理座標系統與邏輯座標系統 – 對於視窗程式而言,存在著一個物理座標系 統 (physical coordinate) ,與另一個邏輯座標 系統 (logical coordinate) 。 – 在一個沒有捲軸的視窗程式之下,物理座標 與邏輯座標是相同的﹔但在一個具有捲軸的視 窗程式之下,物理座標和邏輯座標滿足 – 要取得捲軸的座標,須呼叫 CScrollView::GetScrollPosition 函式。 分裂視窗的建立 ( 續 )

CSplitterWnd – 在許多情形下,我們希望能夠同時檢視同一 文件的不同部分。這通常是使用視窗分裂的 方法來達成。 – 視窗分裂分為動態分裂與靜態分裂的兩種類 型。不論是動態分裂或者靜態分裂,我們都 可以利用 CSplitterWnd 類別來達成。

CSplitterWndCScrollView

分裂視窗的建立 ( 續 ) 動態分裂視窗所必須完成的三件工作: 1. 在視窗框架類別 (CFrameWnd, etc) 中增加 CSplitterWnd 物件為其屬性。 2. 過載 CFrameWnd::OnCreateClient 函式,並 在其中呼叫 CSplitterWnd::Create 函式。 3. 建立維持各子視窗同步更新的機制。

#include #include "resource.h" class CGObject : public CObject { public: int shapenum; BOOL fill; COLORREF FillColor, LineColor; int width; CPoint StartPnt, EndPnt; CGObject() { } CGObject(int shapenum, BOOL fill, COLORREF FillColor, COLORREF LineColor, int width, CPoint StartPnt, CPoint EndPnt) : shapenum(shapenum), fill(fill), FillColor(FillColor), LineColor(LineColor), width(width), StartPnt(StartPnt), EndPnt(EndPnt) { } CGObject(CGObject &g) : shapenum(g.shapenum), fill(g.fill), FillColor(g.FillColor), LineColor(g.LineColor), width(g.width), StartPnt(g.StartPnt), EndPnt(g.EndPnt) { } CGObject & operator = (CGObject &g) { shapenum = g.shapenum; fill = g.fill; FillColor = g.FillColor; LineColor = g.LineColor; width = g.width; StartPnt = g.StartPnt; EndPnt = g.EndPnt; return *this; } } ;

class Shape { protected: CPoint StartPnt, EndPnt; int shapenum; friend class CMyView; public: Shape(CPoint StartPnt, CPoint EndPnt, int shapenum) : StartPnt(StartPnt), EndPnt(EndPnt), shapenum(shapenum) { } Shape(Shape &s) : StartPnt(s.StartPnt), EndPnt(s.EndPnt), shapenum(s.shapenum) { } Shape() { } Shape & operator = (Shape &s) { StartPnt = s.StartPnt; EndPnt = s.EndPnt; return *this; } virtual void draw(CDC &aDC, COLORREF color, COLORREF fcolor, int width, BOOL Filled = false) = 0; int GetShapeNum() { return shapenum; } void SetPoint(CPoint SPnt, CPoint EPnt) { StartPnt = SPnt; EndPnt = EPnt; } } ; class Line : public Shape { public: friend class CMyView; Line() { shapenum = 0; } Line(CPoint StartPnt, CPoint EndPnt) : Shape(StartPnt, EndPnt, 0) { } Line(Line &l) : Shape(l.StartPnt, l.EndPnt, 0) { } Line & operator = (Line &l) { StartPnt = l.StartPnt; EndPnt = l.EndPnt; return *this; }

void draw(CDC &dc, COLORREF color, COLORREF fcolor, int width, BOOL Filled = false) { CPen pen(PS_SOLID, width, color); CPen *oldPen = dc.SelectObject(&pen); dc.MoveTo(StartPnt); dc.LineTo(EndPnt); dc.SelectObject(oldPen); } } ; class ellipse : public Shape { public: friend class CMyView; ellipse() { shapenum = 1; } ellipse(CPoint StartPnt, CPoint EndPnt) : Shape(StartPnt, EndPnt, 1) { } ellipse(ellipse &e) : Shape(e.StartPnt, e.EndPnt, 1) { } ellipse & operator = (ellipse &e) { StartPnt = e.StartPnt; EndPnt = e.EndPnt; return *this; } void draw(CDC &dc, COLORREF color, COLORREF fcolor, int width, BOOL Filled = false) { CRect rect(StartPnt, EndPnt); CPen pen(PS_SOLID, width, color); CPen *oldPen = dc.SelectObject(&pen); dc.SelectStockObject(NULL_BRUSH); dc.Ellipse(rect); dc.SelectObject(oldPen); } } ;

class rectangle : public Shape { public: friend class CMyView; rectangle() { shapenum = 2; } rectangle(CPoint StartPnt, CPoint EndPnt) : Shape(StartPnt, EndPnt, 2) { } rectangle(rectangle &r) : Shape(r.StartPnt, r.EndPnt, 2) { } rectangle & operator = (rectangle &r) { StartPnt = r.StartPnt; EndPnt = r.EndPnt; return *this; } void draw(CDC &dc, COLORREF color, COLORREF fcolor, int width, BOOL Filled = false) { CRect rect(StartPnt, EndPnt); CPen pen(PS_SOLID, width, color); CPen *oldPen = dc.SelectObject(&pen); dc.SelectStockObject(NULL_BRUSH); dc.Rectangle(rect); dc.SelectObject(oldPen); } } ; class CMyDocument : public CDocument { private: CArray gArray; public: void AddObject(CGObject &g) { gArray.Add(g); } CGObject & GetObject(int i) { return gArray[i]; } int GetSize() { return gArray.GetSize(); } DECLARE_DYNCREATE(CMyDocument) DECLARE_MESSAGE_MAP() } ;

IMPLEMENT_DYNCREATE(CMyDocument, CDocument) BEGIN_MESSAGE_MAP(CMyDocument, CDocument) END_MESSAGE_MAP() class CMyFrame : public CFrameWnd { protected: CSplitterWnd DynSplit; CMenu *menu; public: CToolBar RGBBar, ShapeBar; CStatusBar statusbar; CMyFrame() { } ~CMyFrame() { } BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext *pContext) { return DynSplit.Create(this, 2, 2, CSize(1, 1), pContext); } afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CFrameWnd::OnCreate(lpCreateStruct)) return -1; RGBBar.Create(this); RGBBar.LoadToolBar(IDR_TBRGB); RGBBar.EnableDocking(CBRS_ALIGN_ANY); RGBBar.SetBarStyle(RGBBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); ShapeBar.Create(this); ShapeBar.LoadToolBar(IDR_TBSHAPE); ShapeBar.EnableDocking(CBRS_ALIGN_ANY); ShapeBar.SetBarStyle(RGBBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&RGBBar); DockControlBar(&ShapeBar); static UINT indicators[] = { ID_SEPARATOR, IDS_RED, IDS_LINE } ; statusbar.Create(this); statusbar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT)); return 0; } DECLARE_DYNCREATE(CMyFrame) DECLARE_MESSAGE_MAP() } ; IMPLEMENT_DYNCREATE(CMyFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd) ON_WM_CREATE() END_MESSAGE_MAP() class CMyView : public CScrollView { private: COLORREF lcolor, fcolor; Shape *aShape; Shape *rdShape; int width; HCURSOR hcursor; public: CMyView() { lcolor = RGB(255, 0, 0); aShape = new Line; fcolor = RGB(0, 0, 0); width = 2; } ~CMyView() { }

void LogicalCoor(CPoint *point) { CPoint Origin = GetScrollPosition(); point->x = Origin.x + point->x; point->y = Origin.y + point->y; } void PhysicalCoor(CPoint *point) { CPoint Origin = GetScrollPosition(); point->x = point->x - Origin.x; point->y = point->y - Origin.y; } afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CScrollView::OnCreate(lpCreateStruct) == -1) return -1; CSize DCSize(800, 800); SetScrollSizes(MM_TEXT, DCSize); return 0; } void OnUpdate(CView *pSender, LPARAM lHint, CObject *pHint) { if(pHint != NULL) { CRect rect((CRect *)pHint); PhysicalCoor(&rect.TopLeft()); PhysicalCoor(&rect.BottomRight()); rect.NormalizeRect(); rect.InflateRect(rect.Width()/2+1, rect.Height()/2+1); InvalidateRect(&rect); } else CScrollView::OnUpdate(pSender, lHint, pHint); } afx_msg void OnEllipse() { CString resstr;

aShape = new ellipse; resstr.LoadString(IDS_ELLIPSE); ((CMyFrame *) GetParentFrame())->statusbar.SetPaneText(2, resstr.GetBuffer(80)); } afx_msg void OnRect() { CString resstr; aShape = new rectangle; resstr.LoadString(IDS_RECTANGLE); ((CMyFrame *) GetParentFrame())->statusbar.SetPaneText(2, resstr.GetBuffer(80)); } afx_msg void OnLine() { CString resstr; aShape = new Line; resstr.LoadString(IDS_LINE); ((CMyFrame *) GetParentFrame())->statusbar.SetPaneText(2, resstr.GetBuffer(80)); } afx_msg void OnDraw(CDC *aDC) { CMyDocument *doc = (CMyDocument *) GetDocument(); int num = doc->GetSize(); CView::OnDraw(aDC); int i; for(i = 0; i < num; i++) { CGObject *object = &(doc->GetObject(i)); switch(object->shapenum) { case 0: rdShape = new Line; break;

case 1: rdShape = new ellipse; break; case 2: rdShape = new rectangle; break; } rdShape->SetPoint(object->StartPnt, object->EndPnt); rdShape->draw((*aDC), object->LineColor, object->FillColor, object->width); delete rdShape; } afx_msg void OnLButtonDown(UINT, CPoint point) { SetCapture(); if(this == GetCapture()) { LogicalCoor(&point); (*aShape).StartPnt = (*aShape).EndPnt = point; switch((*aShape).shapenum) { case 0: hcursor = AfxGetApp()->LoadCursor(IDC_LINE); ::SetCursor(hcursor); break; case 1: hcursor = AfxGetApp()->LoadCursor(IDC_ELLIPSE); ::SetCursor(hcursor); break; case 2: hcursor = AfxGetApp()->LoadCursor(IDC_RECT); ::SetCursor(hcursor); break; }

afx_msg void OnMouseMove(UINT, CPoint point) { if(this == GetCapture()) { CClientDC aDC(this); aDC.SetROP2(R2_NOT); OnPrepareDC(&aDC); LogicalCoor(&point); (*aShape).draw(aDC, lcolor, fcolor, width); (*aShape).EndPnt = point; (*aShape).draw(aDC, lcolor, fcolor, width); } afx_msg void OnLButtonUp(UINT, CPoint point) { if(this == GetCapture()) { LogicalCoor(&point); CClientDC aDC(this); OnPrepareDC(&aDC); (*aShape).EndPnt = point; (*aShape).draw(aDC, lcolor, fcolor, width); CGObject object(aShape->GetShapeNum(), true, fcolor, lcolor, width, aShape->StartPnt, aShape->EndPnt); CMyDocument *doc = (CMyDocument *) GetDocument(); doc->AddObject(object); ReleaseCapture(); } afx_msg void OnRed() { CString resstr; lcolor = RGB(255, 0, 0); resstr.LoadString(IDS_RED); ((CMyFrame *) GetParentFrame())->statusbar.SetPaneText(1, resstr.GetBuffer(80)); }

afx_msg void OnGreen() { CString resstr; lcolor = RGB(0, 255, 0); resstr.LoadString(IDS_GREEN); ((CMyFrame *) GetParentFrame())->statusbar.SetPaneText(1, resstr.GetBuffer(80)); } afx_msg void OnBlue() { CString resstr; lcolor = RGB(0, 0, 255); resstr.LoadString(IDS_BLUE); ((CMyFrame *) GetParentFrame())->statusbar.SetPaneText(1, resstr.GetBuffer(80)); } afx_msg void OnUpdateEllipse(CCmdUI *aCmdUI) { aCmdUI->SetCheck((*aShape).shapenum == 1); } afx_msg void OnUpdateRect(CCmdUI *aCmdUI) { aCmdUI->SetCheck((*aShape).shapenum == 2); } afx_msg void OnUpdateLine(CCmdUI *aCmdUI) { aCmdUI->SetCheck((*aShape).shapenum == 0); } afx_msg void OnUpdateRed(CCmdUI *aCmdUI) { aCmdUI->SetCheck(lcolor == RGB(255, 0, 0)); } afx_msg void OnUpdateGreen(CCmdUI *aCmdUI) { aCmdUI->SetCheck(lcolor == RGB(0, 255, 0)); } afx_msg void OnUpdateBlue(CCmdUI *aCmdUI) { aCmdUI->SetCheck(lcolor == RGB(0, 0, 255)); }

DECLARE_DYNCREATE(CMyView) DECLARE_MESSAGE_MAP() } ; IMPLEMENT_DYNCREATE(CMyView, CScrollView) BEGIN_MESSAGE_MAP(CMyView, CScrollView) ON_WM_CREATE() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() ON_COMMAND(IDM_RED, OnRed) ON_COMMAND(IDM_GREEN, OnGreen) ON_COMMAND(IDM_BLUE, OnBlue) ON_COMMAND(IDM_LINE, OnLine) ON_COMMAND(IDM_ELLIPSE, OnEllipse) ON_COMMAND(IDM_RECTANGLE, OnRect) ON_UPDATE_COMMAND_UI(IDM_RED, OnUpdateRed) ON_UPDATE_COMMAND_UI(IDM_GREEN, OnUpdateGreen) ON_UPDATE_COMMAND_UI(IDM_BLUE, OnUpdateBlue) ON_UPDATE_COMMAND_UI(IDM_LINE, OnUpdateLine) ON_UPDATE_COMMAND_UI(IDM_ELLIPSE, OnUpdateEllipse) ON_UPDATE_COMMAND_UI(IDM_RECTANGLE, OnUpdateRect) END_MESSAGE_MAP() class CMyApp : public CWinApp { public: BOOL InitInstance() { CDocument *aDOC; CSingleDocTemplate *aDocTemplate; aDocTemplate = new CSingleDocTemplate(IDR_MENU, RUNTIME_CLASS(CMyDocument), RUNTIME_CLASS(CMyFrame), RUNTIME_CLASS(CMyView));

AddDocTemplate(aDocTemplate); aDOC = aDocTemplate->CreateNewDocument(); CFrameWnd *Frame = aDocTemplate->CreateNewFrame(aDOC, NULL); m_pMainWnd = Frame; aDocTemplate->InitialUpdateFrame(Frame, aDOC); Frame->ShowWindow(SW_SHOW); return true; } } ; CMyApp a_app;

分裂視窗的建立 ( 續 ) 靜態分裂視窗需要完成的工作: 1. 在視窗框架類別中增加 CSplitterWnd 物件 為其屬性。 2. 過載 CFrameWnd::OnCreateClient 函式,並 在該函式中呼叫 CSplitterWnd::CreateStatic 函式,建立靜態分裂視窗。 3. 呼叫 CSplitterWnd::CreateView 函式,建立 每個分裂視窗中的 View 物件。

多文件視窗程式的建立 MDI –MDI 程式在架構上與 SDI 程式基本上是差不多的, 不同的地方有下列三點: 1. 建立 MDI 視窗程式架構的樣板類別為 CMultiDocTemplate 。 2. 建立 MDI 視窗程式時,所使用的視窗框架物件,不是建立 應用程式的視窗框架類別,而是另行為 MDI 視窗定義的子 視窗框架類別,該類別衍生於 CMDIChildWnd 類別。 3. 應用程式所使用的視窗框架物件衍生於 CMDIFrameWnd 類 別。

#include #include "resource.h" class CMyMDIChild : public CMDIChildWnd { DECLARE_DYNCREATE(CMyMDIChild) DECLARE_MESSAGE_MAP() } ; IMPLEMENT_DYNCREATE(CMyMDIChild, CMDIChildWnd) BEGIN_MESSAGE_MAP(CMyMDIChild, CMDIChildWnd) END_MESSAGE_MAP() class CGObject : public CObject { public: int shapenum; BOOL fill; COLORREF FillColor, LineColor; int width; CPoint StartPnt, EndPnt; CGObject() { } CGObject(int shapenum, BOOL fill, COLORREF FillColor, COLORREF LineColor, int width, CPoint StartPnt, CPoint EndPnt) : shapenum(shapenum), fill(fill), FillColor(FillColor), LineColor(LineColor), width(width), StartPnt(StartPnt), EndPnt(EndPnt) { } CGObject(CGObject &g) : shapenum(g.shapenum), fill(g.fill), FillColor(g.FillColor), LineColor(g.LineColor), width(g.width), StartPnt(g.StartPnt), EndPnt(g.EndPnt) { }

CGObject & operator = (CGObject &g) { shapenum = g.shapenum; fill = g.fill; FillColor = g.FillColor; LineColor = g.LineColor; width = g.width; StartPnt = g.StartPnt; EndPnt = g.EndPnt; return *this; } } ; class Shape { protected: CPoint StartPnt, EndPnt; int shapenum; friend class CMyView; public: Shape(CPoint StartPnt, CPoint EndPnt, int shapenum) : StartPnt(StartPnt), EndPnt(EndPnt), shapenum(shapenum) { } Shape(Shape &s) : StartPnt(s.StartPnt), EndPnt(s.EndPnt), shapenum(s.shapenum) { } Shape() { } Shape & operator = (Shape &s) { StartPnt = s.StartPnt; EndPnt = s.EndPnt; //shapenum = s.shapenum; return *this; }

virtual void draw(CDC &aDC, COLORREF color, COLORREF fcolor, int width, BOOL Filled = false) = 0; int GetShapeNum() { return shapenum; } void SetPoint(CPoint SPnt, CPoint EPnt) { StartPnt = SPnt; EndPnt = EPnt; } } ; class Line : public Shape { public: friend class CMyView; Line() { shapenum = 0; } Line(CPoint StartPnt, CPoint EndPnt) : Shape(StartPnt, EndPnt, 0) { } Line(Line &l) : Shape(l.StartPnt, l.EndPnt, 0) { } Line & operator = (Line &l) { StartPnt = l.StartPnt; EndPnt = l.EndPnt; return *this; } void draw(CDC &dc, COLORREF color, COLORREF fcolor, int width, BOOL Filled = false) { CPen pen(PS_SOLID, width, color); CPen *oldPen = dc.SelectObject(&pen); dc.MoveTo(StartPnt); dc.LineTo(EndPnt); dc.SelectObject(oldPen); } } ; class ellipse : public Shape { public: friend class CMyView; ellipse() { shapenum = 1; } ellipse(CPoint StartPnt, CPoint EndPnt) : Shape(StartPnt, EndPnt, 1) { } ellipse(ellipse &e) : Shape(e.StartPnt, e.EndPnt, 1) { }

ellipse & operator = (ellipse &e) { StartPnt = e.StartPnt; EndPnt = e.EndPnt; return *this; } void draw(CDC &dc, COLORREF color, COLORREF fcolor, int width, BOOL Filled = false) { CRect rect(StartPnt, EndPnt); CPen pen(PS_SOLID, width, color); CPen *oldPen = dc.SelectObject(&pen); dc.SelectStockObject(NULL_BRUSH); dc.Ellipse(rect); dc.SelectObject(oldPen); } } ; class rectangle : public Shape { public: friend class CMyView; rectangle() { shapenum = 2; } rectangle(CPoint StartPnt, CPoint EndPnt) : Shape(StartPnt, EndPnt, 2) { } rectangle(rectangle &r) : Shape(r.StartPnt, r.EndPnt, 2) { } rectangle & operator = (rectangle &r) { StartPnt = r.StartPnt; EndPnt = r.EndPnt; return *this; }

void draw(CDC &dc, COLORREF color, COLORREF fcolor, int width, BOOL Filled = false) { CRect rect(StartPnt, EndPnt); CPen pen(PS_SOLID, width, color); CPen *oldPen = dc.SelectObject(&pen); dc.SelectStockObject(NULL_BRUSH); dc.Rectangle(rect); dc.SelectObject(oldPen); } } ; class CMyDocument : public CDocument { private: CArray gArray; public: void AddObject(CGObject &g) { gArray.Add(g); } CGObject & GetObject(int i) { return gArray[i]; } int GetSize() { return gArray.GetSize(); } DECLARE_DYNCREATE(CMyDocument) DECLARE_MESSAGE_MAP() } ; IMPLEMENT_DYNCREATE(CMyDocument, CDocument) BEGIN_MESSAGE_MAP(CMyDocument, CDocument) END_MESSAGE_MAP() class CMyFrame : public CMDIFrameWnd { protected: CMenu *menu; public: CToolBar RGBBar, ShapeBar; CStatusBar statusbar;

CMyFrame() { } ~CMyFrame() { } afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CMDIFrameWnd::OnCreate(lpCreateStruct)) return -1; RGBBar.Create(this); RGBBar.LoadToolBar(IDR_TBRGB); RGBBar.EnableDocking(CBRS_ALIGN_ANY); RGBBar.SetBarStyle(RGBBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); ShapeBar.Create(this); ShapeBar.LoadToolBar(IDR_TBSHAPE); ShapeBar.EnableDocking(CBRS_ALIGN_ANY); ShapeBar.SetBarStyle(RGBBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&RGBBar); DockControlBar(&ShapeBar); static UINT indicators[] = { ID_SEPARATOR, IDS_RED, IDS_LINE } ; statusbar.Create(this); statusbar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT)); return 0; } afx_msg void OnExit() { DestroyWindow(); } DECLARE_DYNCREATE(CMyFrame) DECLARE_MESSAGE_MAP() } ; IMPLEMENT_DYNCREATE(CMyFrame, CMDIFrameWnd) BEGIN_MESSAGE_MAP(CMyFrame, CMDIFrameWnd) ON_WM_CREATE() ON_COMMAND(IDM_EXIT, OnExit) END_MESSAGE_MAP()

class CMyView : public CScrollView { private: COLORREF lcolor, fcolor; Shape *aShape; Shape *rdShape; int width; HCURSOR hcursor; public: CMyView() { lcolor = RGB(255, 0, 0); aShape = new Line; fcolor = RGB(0, 0, 0); width = 2; } ~CMyView() { } afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CScrollView::OnCreate(lpCreateStruct)==-1) return -1; CSize DCSize(800,800); SetScrollSizes(MM_TEXT,DCSize); return 0; } void LogicalCoor(CPoint* point) { CPoint Origin=GetScrollPosition(); point->x=Origin.x+point->x; point->y=Origin.y+point->y; }

void PhysicalCoor(CPoint* point) { CPoint Origin=GetScrollPosition(); point->x=point->x-Origin.x; point->y=point->y-Origin.y; } afx_msg void OnEllipse() { CString resstr; aShape = new ellipse; resstr.LoadString(IDS_ELLIPSE); ((CMyFrame *) AfxGetMainWnd())->statusbar.SetPaneText(2, resstr.GetBuffer(80)); } afx_msg void OnRect() { CString resstr; aShape = new rectangle; resstr.LoadString(IDS_RECTANGLE); ((CMyFrame *) AfxGetMainWnd())->statusbar.SetPaneText(2, resstr.GetBuffer(80)); } afx_msg void OnLine() { CString resstr; aShape = new Line; resstr.LoadString(IDS_LINE); ((CMyFrame *) AfxGetMainWnd())->statusbar.SetPaneText(2, resstr.GetBuffer(80)); }

afx_msg void OnDraw(CDC *aDC) { CMyDocument *doc = (CMyDocument *) GetDocument(); int num = doc->GetSize(); CView::OnDraw(aDC); int i; for(i = 0; i < num; i++) { CGObject *object = &(doc->GetObject(i)); switch(object->shapenum) { case 0: rdShape = new Line; break; case 1: rdShape = new ellipse; break; case 2: rdShape = new rectangle; break; } rdShape->SetPoint(object->StartPnt, object->EndPnt); rdShape->draw((*aDC), object->LineColor, object->FillColor, object->width); delete rdShape; }

afx_msg void OnLButtonDown(UINT, CPoint point) { SetCapture(); if(this == GetCapture()) { LogicalCoor(&point); (*aShape).StartPnt = (*aShape).EndPnt = point; switch((*aShape).shapenum) { case 0: hcursor = AfxGetApp()->LoadCursor(IDC_LINE); ::SetCursor(hcursor); break; case 1: hcursor = AfxGetApp()->LoadCursor(IDC_ELLIPSE); ::SetCursor(hcursor); break; case 2: hcursor = AfxGetApp()->LoadCursor(IDC_RECT); ::SetCursor(hcursor); break; } afx_msg void OnMouseMove(UINT, CPoint point) { if(this == GetCapture()) { CClientDC aDC(this); aDC.SetROP2(R2_NOT); OnPrepareDC(&aDC); LogicalCoor(&point); (*aShape).draw(aDC, lcolor, fcolor, width); (*aShape).EndPnt = point; (*aShape).draw(aDC, lcolor, fcolor, width); }

afx_msg void OnLButtonUp(UINT, CPoint point) { if(this == GetCapture()) { LogicalCoor(&point); CClientDC aDC(this); (*aShape).EndPnt = point; // (*aShape).draw(aDC, lcolor, fcolor, width); CGObject object(aShape->GetShapeNum(), true, fcolor, lcolor, width, aShape->StartPnt, aShape->EndPnt); CMyDocument *doc = (CMyDocument *) GetDocument(); doc->AddObject(object); PhysicalCoor(&aShape->StartPnt); PhysicalCoor(&aShape->EndPnt); CRect rect(aShape->StartPnt,aShape->EndPnt); rect.NormalizeRect(); rect.InflateRect(5,5); InvalidateRect(&rect); GetDocument()->UpdateAllViews(this); ReleaseCapture(); } afx_msg void OnRed() { CString resstr; lcolor = RGB(255, 0, 0); resstr.LoadString(IDS_RED); ((CMyFrame *) AfxGetMainWnd())->statusbar.SetPaneText(1, resstr.GetBuffer(80)); }

afx_msg void OnGreen() { CString resstr; lcolor = RGB(0, 255, 0); resstr.LoadString(IDS_GREEN); ((CMyFrame *) AfxGetMainWnd())->statusbar.SetPaneText(1, resstr.GetBuffer(80)); } afx_msg void OnBlue() { CString resstr; lcolor = RGB(0, 0, 255); resstr.LoadString(IDS_BLUE); ((CMyFrame *) AfxGetMainWnd())->statusbar.SetPaneText(1, resstr.GetBuffer(80)); } afx_msg void OnUpdateEllipse(CCmdUI *aCmdUI) { aCmdUI->SetCheck((*aShape).shapenum == 1); } afx_msg void OnUpdateRect(CCmdUI *aCmdUI) { aCmdUI->SetCheck((*aShape).shapenum == 2); } afx_msg void OnUpdateLine(CCmdUI *aCmdUI) { aCmdUI->SetCheck((*aShape).shapenum == 0); } afx_msg void OnUpdateRed(CCmdUI *aCmdUI) { aCmdUI->SetCheck(lcolor == RGB(255, 0, 0)); } afx_msg void OnUpdateGreen(CCmdUI *aCmdUI) { aCmdUI->SetCheck(lcolor == RGB(0, 255, 0)); } afx_msg void OnUpdateBlue(CCmdUI *aCmdUI) { aCmdUI->SetCheck(lcolor == RGB(0, 0, 255)); }

DECLARE_DYNCREATE(CMyView) DECLARE_MESSAGE_MAP() } ; IMPLEMENT_DYNCREATE(CMyView, CScrollView) BEGIN_MESSAGE_MAP(CMyView, CScrollView) ON_WM_CREATE() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() ON_COMMAND(IDM_RED, OnRed) ON_COMMAND(IDM_GREEN, OnGreen) ON_COMMAND(IDM_BLUE, OnBlue) ON_COMMAND(IDM_LINE, OnLine) ON_COMMAND(IDM_ELLIPSE, OnEllipse) ON_COMMAND(IDM_RECTANGLE, OnRect) ON_UPDATE_COMMAND_UI(IDM_RED, OnUpdateRed) ON_UPDATE_COMMAND_UI(IDM_GREEN, OnUpdateGreen) ON_UPDATE_COMMAND_UI(IDM_BLUE, OnUpdateBlue) ON_UPDATE_COMMAND_UI(IDM_LINE, OnUpdateLine) ON_UPDATE_COMMAND_UI(IDM_ELLIPSE, OnUpdateEllipse) ON_UPDATE_COMMAND_UI(IDM_RECTANGLE, OnUpdateRect) END_MESSAGE_MAP()

class CMyApp : public CWinApp { public: BOOL InitInstance() { CMultiDocTemplate *aDocTemplate; aDocTemplate = new CMultiDocTemplate(IDR_ChildMENU, RUNTIME_CLASS(CMyDocument), RUNTIME_CLASS(CMyMDIChild), RUNTIME_CLASS(CMyView)); AddDocTemplate(aDocTemplate); CMyFrame *Frame = new CMyFrame; m_pMainWnd = Frame; Frame->LoadFrame(IDR_MENU); Frame->ShowWindow(SW_SHOW); if (m_lpCmdLine[0]=='\0') OnFileNew(); return true; } DECLARE_MESSAGE_MAP() } ; BEGIN_MESSAGE_MAP(CMyApp, CWinApp) ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) END_MESSAGE_MAP() CMyApp a_app;