MAPGIS編程基礎(chǔ)知識_第1頁
MAPGIS編程基礎(chǔ)知識_第2頁
MAPGIS編程基礎(chǔ)知識_第3頁
MAPGIS編程基礎(chǔ)知識_第4頁
MAPGIS編程基礎(chǔ)知識_第5頁
已閱讀5頁,還剩149頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

刖百

MAPGIS是武漢中地信息工程有限公司研制的具有自主版權(quán)的大型基礎(chǔ)地理信息系統(tǒng)

平臺。它是一個集當(dāng)代最先進的圖形、圖像、地質(zhì)、地理、遙感、測繪、人工智能、計算

機科學(xué)于一體的大型智能軟件系統(tǒng),是集數(shù)字制圖、數(shù)據(jù)庫管理及空間分析為一體的空間

信息系統(tǒng),是進行現(xiàn)代化管理和決策的先進工具。MAPGIS連續(xù)四年在全國GIS測評中名列

第一,并成為唯一連續(xù)四年獲得國家科技部向社會推薦的國產(chǎn)GIS軟件平臺。

中地軟件叢書之MAPGIS二次開發(fā)培訓(xùn)教程是根據(jù)最新推出的MAPGIS軟件平臺編寫而

成,主要介紹進行MAPGIS二次開發(fā)必須具備的基礎(chǔ)知識、主流開發(fā)工具以及MAPGIS系統(tǒng)

的基本概念、結(jié)構(gòu)體系和操作方法。該教程分為三個部分,共十一講。其中:

第一部分(即第一講的內(nèi)容):介紹Windows編程的概念。包括類與數(shù)據(jù)封裝、繼承、

重載、虛擬函數(shù)與多態(tài)性以及內(nèi)存管理。該部分為可視化編程的基礎(chǔ),有可視化編程經(jīng)驗

的讀者可以略過此講,直接進入下一部分的學(xué)習(xí)。

第二部分(即第二講的內(nèi)容):編程工具VC。對于在VC這樣一個編程環(huán)境中開發(fā)應(yīng)用

程序所應(yīng)熟悉的概念,術(shù)語和最基本的框架、構(gòu)件實現(xiàn)過程等知識做了一個簡明扼要的介

紹。已掌握一定VC編程基礎(chǔ)知識的讀者可以略過該部分。

第三部分(即第三講至第十一講的內(nèi)容):詳細講述了地理信息系統(tǒng)的基本概念(包括

GIS原理概述、空間數(shù)據(jù)類型、空間數(shù)據(jù)庫、空間數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)管理等內(nèi)容);MAPGIS

的基本概念和體系結(jié)構(gòu)(簡要描述了MAPGIS二次開發(fā)的基本概念、術(shù)語、工作區(qū)、空間實

體及其數(shù)據(jù)、C++類組織和開發(fā)環(huán)境介紹的內(nèi)容);MAPGIS空間數(shù)據(jù)存取和屬性編輯(包括

工作區(qū)、空間實體和屬性的操作及其網(wǎng)絡(luò)介紹);圖形顯示輸出及窗口操作、圖形編輯、類

庫和控件開發(fā);矢量空間分析和屬性查詢;投影變換、圖框生成和工程管理;圖庫管理和

查詢系統(tǒng)(包括基于圖庫的應(yīng)用程序開發(fā)、MAPGIS圖庫介紹、開發(fā)的一般步驟以及結(jié)合圖

庫顯示說明圖庫主要函數(shù)的功能等方面的內(nèi)容)以及圖象分析與處理。這一部分為本教程

的主要部分,能使大家從了解到熟練掌握這個部分的內(nèi)容也是我們編制本書的主要目的,

同時它還可被作為MAPGIS二次開發(fā)過程中的參考來使用。

參加本書編寫的人員主要是本系統(tǒng)的軟件開發(fā)人員以及長期從事MAPCAD和MAPGIS培

訓(xùn)的教師。由于時間倉促,書中難免存在錯誤和不當(dāng)之處,敬請廣大用戶及讀者提出寶貴

意見和建議,以利改進。

中地軟件叢書編委會

2001年10月

目錄

第一講基于WINDOWS編程的基礎(chǔ)知識...............................................1

1.1引言.....................................................................1

1.2類與數(shù)據(jù)封裝.............................................................1

1.3繼承.....................................................................2

1.4重載....................................................................4

1.5虛擬函數(shù)與多態(tài)性.........................................................5

第二講編程工具VC......................................................................................................................................8

2.1熟悉VC開發(fā)環(huán)境.........................................................8

2.2消息與命令.............................................................8

2.3文檔、視結(jié)構(gòu)..........................................................10

2.4圖形設(shè)備接口..........................................................11

2.5對話框和控件...........................................................12

2.6編程規(guī)范...............................................................13

第三講地理信息系統(tǒng)基本概念....................................................15

3.1GIS原理概述...........................................................15

3.2GIS空間數(shù)據(jù)類型.......................................................17

3.3GIS數(shù)據(jù)管理...........................................................18

3.4空間分析...............................................................20

3.5地理信息系統(tǒng)發(fā)展......................................................20

第四講MAPGIS的基本概念和體系結(jié)構(gòu).............................................22

4.1MAPGIS二次開發(fā)的基本概念.............................................22

4.2MAPGIS基本術(shù)語.......................................................23

4.3MAPGIS的數(shù)據(jù)管理(工作區(qū))...........................................25

4.4MAPGIS的空間實體及其數(shù)據(jù)組織.........................................27

4.5MAPGIS的C++類組織....................................................29

4.6MAPGIS的VC++開發(fā)環(huán)境介紹............................................30

第五講MAPGIS空間數(shù)據(jù)存取和屬性編輯...........................................32

5.1工作區(qū)操作.............................................................32

5.2空間實體操作..........................................................34

5.3屬性(屬性結(jié)構(gòu))操作..................................................37

5.4網(wǎng)絡(luò)介紹...............................................................44

第六講圖形顯示輸出及窗口處理.................................................45

6.1圖形顯示輸出..........................................................45

6.2窗口處理................................................................49

6.3類庫開發(fā)中的圖形顯示和窗口處理.........................................51

第七講圖形編輯、類庫和控件開發(fā)................................................53

7.1圖形編輯開發(fā)概要........................................................53

7.2圖形編輯API函數(shù)開發(fā)...................................................53

7.3MAPGIS類庫開發(fā).........................................................54

7.4MAPGIS控件開發(fā).......................................................60

第八講矢量空間分析和屬性查詢.................................................66

8.1矢量空間分析..........................................................66

8.2屬性查詢檢索..........................................................71

第九講投影變換和圖框生成......................................................73

9.1投影變換(projdll.h、cordcvt.h)........................................73

9.2圖框生成(frmdn32.h)..................................................83

第十講圖庫管理和工程管理......................................................91

10.1MAPGIS圖庫簡介......................................................91

10.2基于圖庫的應(yīng)用程序的開發(fā)..............................................92

10.3結(jié)合圖庫的顯示說明圖庫中主要函數(shù)的功能..............................92

10.4工程管理(prj_disp.h和map_prj.h).....................................96

第H■■一講MAPGIS圖象處理和分析................................................101

11.1遙感圖象處理的基本知識..............................................101

11.2處理方法.............................................................101

11.3主要API介紹.........................................................99

11.4組件介紹.............................................................107

11.5在VC中的開發(fā)過程(結(jié)合示例程序講解)..............................108

11.6示例程序說明........................................................109

附錄MAPGIS二次開發(fā)問題集錦.................................................110

1.屬性和屬性結(jié)構(gòu).........................................................110

2.空間實體操作問題......................................................123

3.顯示、編輯問題........................................................124

4.空間分析問題..........................................................131

5.數(shù)字高程模型...........................................................131

6.安裝問題...............................................................134

7.工程問題...............................................................135

8.輸出問題...............................................................136

9.其它...................................................................138

第一講基于WINDOWS編程的基礎(chǔ)知識

第一講基于WINDOWS編程的基礎(chǔ)知識

11引言

1.1.1過程化(proceduralprogramming):

程序被認(rèn)為是在一個數(shù)據(jù)集合上進行的一系列操作。

1.1.2結(jié)構(gòu)化(structuredprogramming):

主要思想是:功能分解并逐步求精。

1.1.3面向?qū)ο蟮某绦蛟O(shè)計(object-orientedprogramming):

實質(zhì)是把數(shù)據(jù)和處理這些數(shù)據(jù)的過程合并為一個單獨的“對象”-----個具有確定特

性的自完備的實體。

1.1.4面向?qū)ο蟪绦蛟O(shè)計的特征:

1)封裝

2)繼承

3)多態(tài)

1.2類與數(shù)據(jù)封裝

1.2.1什么是類?

簡單的說,類就是一種用戶定義的數(shù)據(jù)類型,跟結(jié)構(gòu)類似:并且,類具有自己的成員

變量和成員函數(shù)(方法),通過它們可以對類自身進行操作。如:汽車可以看作是發(fā)動機、

車輪、座椅等諸如此類的集合。也可以從功能的角度來研究,譬如,能移動,加速,減速,

剎車等。

例如:

classCMyClassl

(

protected:

CMyClassl();

public:

virtual~CMyClassl();

}

1.2.2封裝(encapsulation)

定義:指能夠把一個實體的信息、功能、響應(yīng)都裝入一個單獨的對象中的特性。封裝

的優(yōu)點如下:

1)封裝允許類的客戶不必關(guān)心類的工作機理就可以使用它。就象駕駛員不必了解

發(fā)動機的工作原理就可以駕駛汽車一樣,類的客戶在使用一個類時也不必了解它是如

何工作的,而只需了解它的功能即可。

2)所有對數(shù)據(jù)的訪問和操作都必須通過特定的方法,否則便無法使用,從而達到

數(shù)據(jù)隱藏的目的。

1.2.3對象

對象就是類的實例。類與對象的關(guān)系就如類型和變量的關(guān)系,所有對類的操作都必須

-1-

第一講基于WINDOWS編程的基礎(chǔ)知識

通過對象來實現(xiàn)。當(dāng)一個類定義了多個對象時.,每個對象擁有各自的成員數(shù)據(jù)。

1.2.4類的三種成員類型

1)私有成員(private):缺省情況下,一個類中的所有成員都是私有的。私有成員只

能被類本身的成員函數(shù)訪問。并且不具有繼承性。

2)公有成員(public):公有成員可以被類成員函數(shù)和外部函數(shù)使用。

3)保護成員(protected):類的保護成員能被類及其派生類的成員函數(shù)和友員函數(shù)使

用,具有繼承性。

1.2.5構(gòu)造函數(shù)與析構(gòu)函數(shù)

1)構(gòu)造函數(shù)

a.是特殊的成員函數(shù);在創(chuàng)建對象時首先由系統(tǒng)自動調(diào)用。它的作用是為新創(chuàng)建

的對象分配空間,或為該對象的成員變量賦值等;

b.構(gòu)造函數(shù)名必須與其類名稱完全相同,并且不允許有返回值。

2)析構(gòu)函數(shù)

a.析構(gòu)函數(shù)是構(gòu)造函數(shù)的逆操作;

b.析構(gòu)函數(shù)在類名之前加~來命名,它不允許有返回值,也不允許帶參數(shù),并且

?個類只能有一個析構(gòu)函數(shù)。

1.3繼承

1.3.1傳統(tǒng)程序設(shè)計的缺點:

增加功能對程序所作的修改工作量非常大。

1.3.2繼承的優(yōu)點:

繼承的方法允許在不改動原程序的基礎(chǔ)上對其進行擴充,這樣使得原功能得以保存,

而新功能也得以擴展。這有利于減少重復(fù)編碼,提高軟件的開發(fā)效率。

1.3.3基類與派生類

1)一個類可以繼承其它類的成員,被繼承的類叫基類或父類;繼承類叫派生類或子

2)派生類不但擁有自己的成員變量和成員函數(shù),還擁有父類的成員變量和成員函數(shù)。

1.3.4類的保護成員(protected)

前面介紹了類的私有成員只能被類的成員函數(shù)和友員函數(shù)使用;類的保護成員能被類

及其派生類的成員函數(shù)和友員函數(shù)使用。也就是說,類的保護成員具有繼承性,而類的私

有成員不具有繼承性。

1.3.5公用基類和私有基類

1)公用基類中的所有public成員在派生類中仍是public成員,所有protected成員

在派生類中仍是protected成員。

2)私有基類中的public成員和protected成員在派生類中均變成private成員。

1.3.6多重繼承

1)多重繼承的定義方法

例子:

classA

public:

inti;

-2-

第一講基于WINDOWS編程的基礎(chǔ)知識

voidfund();

);

classB

public:

inti;

voidfund();

};

classC:publicA,B

(

voidShow()

);

缺省情況下基類被定義為private;因此基類B為私有基類。

2)繼承的不確定性

例子:

classC:publicA,B

voidShow()

(

j=i*i;

fund();

)

);

由于基類A和B中同時擁有數(shù)據(jù)成員i和成員函數(shù)fund,類C引用基類的成員

時,系統(tǒng)無法分辨是調(diào)用哪一基類的成員而發(fā)生錯誤;

3)解決多重繼承的不確定性:

使用域操作符指明要調(diào)用的基類,即可解決不確定性問題。

classC:publicA,B

intj;

voidShow()

(

j=A::i*B::i;

A::funcl();

-3-

第一講基于WINDOWS編程的基礎(chǔ)知識

);

1.3.7多層繼承

定義:所謂多層繼承指的是從一個類派生出另一個類,然后以派生類作為基類,派生

出另?個類,直到最后生成的派生類滿足需要為止(見MSDN中的HierarchyChart)。

1.3.8派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)

在繼承關(guān)系下,派生類的構(gòu)造函數(shù)負(fù)責(zé)調(diào)用基類的構(gòu)造函數(shù)來設(shè)置基類數(shù)據(jù)成員值。

例:

classbase

{//基類

public:

inti;

base(intj)

{〃構(gòu)造函數(shù)

i=j;

}

);

classderived:publicbase

{〃派生類

public:

doublef;

derived(int,double);

);

derived::derived(intk,double1):base(k)

{〃派生類構(gòu)造函數(shù)

f=1;

)

1.3.9構(gòu)造函數(shù)的調(diào)用順序

1)在定義派生類對象時,系統(tǒng)首先調(diào)用基類的構(gòu)造函數(shù),然后調(diào)用派生類的構(gòu)造函數(shù);

在上例中,derived類首先調(diào)用base類的構(gòu)造函數(shù),然后調(diào)用自身的構(gòu)造函數(shù)。

2)析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)的調(diào)用順序相反。

1.4重載

14.1函數(shù)重載

1)如果函數(shù)有相同的名稱和返回值,而有不同的參數(shù)個數(shù)或參數(shù)類型,則這些函數(shù)就

是重載函數(shù)。

2)派生類繼承了基類的某一函數(shù),并且又自定義了一個同名函數(shù),有相同的返回值,

不同的參數(shù)類型或參數(shù)個數(shù)。這種情況不屬于重載。因為它們屬于不同的域。

-4-

第一講基于WINDOWS編程的基礎(chǔ)知識

3)例:

classbase

(

voidfunc(inti)

(

)

voidfunc(doublef)

(

}

voidfunc(doublef,longq)

(

)

);

1.4.2操作符重載

重載操作符的定義:返回值類型operatorop(參數(shù)表);其中,op為重載操作符,

它必須是VC++中所定義的運算符。然后像定義函數(shù)一樣定義重載操作符函數(shù)。

例子:

classperson

(

intage;

voidoperator++();

);

voidperson::operator++()

(

age++;

)

1.5虛擬函數(shù)與多態(tài)性

多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的精髓之所在,也是C++中最難理解和掌握的部分。在C++

中,多態(tài)性是建立在虛擬函數(shù)基礎(chǔ)上的,虛擬函數(shù)的使用使類的成員函數(shù)表現(xiàn)出多態(tài)性。

1.5.1虛擬函數(shù)

1)函數(shù)的定義:在定義類時在其成員函數(shù)前加上關(guān)鍵字virtual;

2)如果基類中成員函數(shù)定義為虛函數(shù),則派生類中與其定義完全相同的成員函數(shù),編

譯器自動將其視為虛函數(shù);

3)只有類的成員函數(shù)才能定義為虛函數(shù)。

-5-

第一講基于WINDOWS編程的基礎(chǔ)知識

4)虛擬成員函數(shù)的存取要看首次定義它的類中,該函數(shù)是public還是private。

例:

classInsect

(

virtualboolCanFly();

);

boolInsect::CanFly()

(

returnFALSE;

)

classButterfly:publicInsect

boolCanFly();

};

boolButterfly::CanFly()

returnTRUE;

1.5.2虛函數(shù)的調(diào)用

1)根據(jù)對象的不同而去調(diào)用不同類的虛擬函數(shù)

2)可以使用基類對象調(diào)用派生類對象,即將派生類對象或指針賦值給基類對象或指

針。

3)反方向的賦值(將基類的對象或指針賦給派生類的對象或指針)是危險的。

例:

boolrtn;

Insectincl,*plnc;

Butterflybtfly;

pine=&.incl;〃plnc指針指向Insect對象

rtn=pInc->CanFly();〃返回FALSE

pine=&btfly;〃plnc指針指向Butterfly對象

rtn=pInc->CanFly();//返回TRUE

1.5.3虛擬函數(shù)與重載函數(shù)的區(qū)別

1)形式上,重載函數(shù)要求有相同的返回值類型和函數(shù)名,并有不同的參數(shù)序列;而虛

擬函數(shù)要求三者完全相同。

2)重載函數(shù)可以是成員函數(shù)或非成員函數(shù);而虛擬函數(shù)必須是成員函數(shù)。

3)調(diào)用方法上,重載函數(shù)根據(jù)所傳遞的參數(shù)序列的差別作為調(diào)用的依據(jù);而虛擬函數(shù)

則根據(jù)調(diào)用對象的不同而去調(diào)用不同類的函數(shù)。

4)虛擬函數(shù)在運行時表現(xiàn)出多態(tài)功能;而重載函數(shù)不具有這一功能。

1.5.4純虛函數(shù)

-6-

第一講基于WINDOWS編程的基礎(chǔ)知識

定義:virtualtypefuncname(parameter)=0;

C++中有時設(shè)計基類就是為了被繼承,而基類中的虛擬函數(shù)不做任何工作,這種情況下

可以將基類中的虛擬函數(shù)定義為純虛函數(shù)。包含純需函數(shù)的類叫抽象類。抽象類不能定義

對象,但可以定義指向它的指針。

習(xí)題:

1.1什么是類?

1.2理解封裝、繼承和多態(tài)。

-7-

第一講基于WINDOWS編程的基礎(chǔ)知識

第二講編程工具VC

2.1熟悉VC開發(fā)環(huán)境

2.1.1VC向?qū)峁┑膸椭?/p>

以前Windows編程需要程序員編寫大量的框架代碼,這對初學(xué)者來說簡直就是一個噩

夢;并且這些框架代碼基本相同,因此Microsoft提供了向?qū)ppWizard幫助生成框架代

碼,這極大的方便了我們編寫程序。

2.1.2VC向?qū)Э梢陨傻墓こ填愋?/p>

ATLCOMAppWizard

CustomAppWizard

DatabaseProject

ISAPIExtensionWizard

Makefile

MFCActiveXControWizard

MFCAppWizard(DLL)

MFCDatabaseWizard

Win32Application

Win32ConsoleApplication

Win32DLL

Win32StaticLibrary

2.1.3建立第一個應(yīng)用程序:

使用向?qū)ppWizard生成典型的應(yīng)用程序——基于多文檔的可執(zhí)行程序。

2.1.4如何獲取幫助?

Microsoft的MSDN提供了編程所需的絕大部分信息,使用F1鍵可以打開MSDN幫助。

2.2消息與命令

2.2.1消息

消息是Windows編程不同于其它編程方式的地方,如DOS環(huán)境下編程。消息就是操作

系統(tǒng)通知應(yīng)用程序某事已發(fā)生的一種方式,如:用戶已輸入、已單擊或移動鼠標(biāo)、打印機

己空暇等。

2.2.2消息傳遞

1)盡管操作系統(tǒng)用整數(shù)來引用消息,但所有消息都通過它們的名字來引用。一個巨大

的#define語句將消息名同數(shù)值聯(lián)系起來。不同消息由操作系統(tǒng)或應(yīng)用程序的不同部分處

理。如,當(dāng)用戶在窗口上移動鼠標(biāo)時,窗口得到一個WMJ10USEM0VE消息,它幾乎全部傳送

給操作系統(tǒng)去處理。

2)MFC允許程序員忽略底層消息,并使得在單獨類級別上聲明每個類處理哪些消息更

容易。

2.2.3消息循環(huán)

-8-

第二講編程工具VC

1)任何windows程序的核心是消息循環(huán),這通常包含在WinMainO例程中。

2)MFC通過消息映射來保持消息處理函數(shù)與消息處理信息的一致。

2.2.4消息映射

消息映射是進行windows編程的一部分MFC方法,用來代替編寫向用戶的WinProc()

發(fā)送消息的WinMainO函數(shù),及編寫檢查消息類型的WinProcO函數(shù)。用戶只需編寫處理

消息的函數(shù),并且在用戶的類中增加一個消息映射即可,其它一切由MFC處理。

2.2.5消息映射宏

在類聲明的結(jié)尾部分,使用宏DECLARE_MESSAGE_MAP來聲明在類定義部分需要消息映

射。在*.CPP文件中使用宏BEGIN_MESSAGE_MAP和END_MESSAGE_MAP來聲明消息映射,在

兩個宏之間聲明消息的映射函數(shù)。2.2.6常用消息映射宏

ON_COMMAND用于將特定命令的處理委派給類的一個成員函數(shù)。

ON_MESSAGE用于將用戶自定義消息的處理委派給類的一個成員函數(shù)。

2.2.7使用ClassWizard幫助用戶捕獲消息

1)帶標(biāo)簽的ClassWizard對話框

通過選擇View,Classwizard或按Ctrl+W可以顯示主Classwizard對話框。在對話框

的頂部有兩個下拉列表框,一個用于提示正在處理的工程文件(本例是),另外一個用于提

示哪?個類擁有正在進行編輯的消息映射。在這兩個組合框下面是一個列表框。左邊的框列

出了類本身和用戶局面可以產(chǎn)生的所有命令。右邊的框列出了這個類可以捕獲的所有

Windows消息,也列出了許多捕獲常用消息的虛函數(shù)。

在這些框的右邊是一些按鈕,它們的作用分別是向工程文件增加新類、向類中增加一函

數(shù)以捕獲被高亮顯示的消息、刪除正在捕獲消息的函數(shù),以及為捕獲高亮顯示消息的函數(shù)打

開源代碼口通常,用戶選中一個類,選中一個消息,并單擊AddFunction來捕獲消息。下

面就是AddFunction按鈕所做的事情:

a)將一個骨架函數(shù)添加到應(yīng)用程序源文件的末尾。

b)在源文件的消息映射中增加一個入口。

c)在包含文件中的消息映射中增加一個入口。

d)更新對話框中的消息和成員函數(shù)列表。

2)添加Windows消息處理函數(shù)對話框

還有另外一種捕獲消息的方法。用戶可以右擊ClassView中的類名,然后從出現(xiàn)的快捷

-9-

第二講編程工具VC

菜單中選擇AddWindowsMessageHandler。這時將出現(xiàn)如下圖所示的對話框。

2.2.8命令

命令是一種特殊的消息類型。用戶在任何時候選擇?個菜單項,單擊一個按鈕或告訴系

統(tǒng)做什么,windows都將產(chǎn)生一個命令。ClassWizard可幫助用戶捕獲命令。運行界面與

消息捕獲類似。

命令消息都通過被選擇的菜單或被單擊的按鈕的資源ID與相應(yīng)的處理函數(shù)進行關(guān)聯(lián)。只

有從CWnd派生的對象可以接收消息。每個資源ID僅關(guān)聯(lián)兩個消息:COMMAND和

UPDATE_COMMAND_UI?第一?個消息允許增加處理用戶選中菜單選項或單擊按鈕的函數(shù)一也

就是說,捕獲命令。第二個使用戶可增加一個設(shè)置菜單項、按鈕或者其他控件的狀態(tài)的函數(shù),

就像操作系統(tǒng)即將顯示它們一樣一一也就是說,更新命令。單擊AddFunction來增加一個

捕獲或更新包含額外步驟的命令。

2.3文檔、視結(jié)構(gòu)

2.3.1簡介

MFC的文檔/視圖結(jié)構(gòu)把應(yīng)用程序的數(shù)據(jù)從用戶實際瀏覽和操縱數(shù)據(jù)的方法中分離開

來。簡單的說,文檔對象負(fù)責(zé)存儲、加載和保存數(shù)據(jù),而視圖對象允許用戶在屏幕上查看數(shù)

據(jù),并用適合于應(yīng)用程序的方法編輯數(shù)據(jù)。

2.3.2了解文檔

CDocument類

?個文檔代表了一個數(shù)據(jù)集合,典型情況下一個文檔由用戶通過FileOpen命令打開并

通過FileSave命令保存。用戶通過與文檔關(guān)聯(lián)的CView對象操作文檔。一個文檔可以有

多個視圖關(guān)聯(lián)。

2.3.3了解視圖

視圖是顯示存儲在文檔對象中的數(shù)據(jù),并允許用戶修改這些數(shù)據(jù)。視圖對象保持了一個

文檔對象的指針。為了顯示和修改數(shù)據(jù),視圖對象可用這個指針訪問文檔的成員變量。一個

視圖對象只能與一個文檔對象關(guān)聯(lián)。調(diào)用OnUpdateO函數(shù)可以更新一個視圖。所有的屏幕

顯示操作可在從CView繼承的派生類的OnDraw成員函數(shù)中完成。

-10-

第二講編程工具VC

CView類的派生類:

CCtrlView實現(xiàn)常用控件的視圖

CEditView提供基本的文本編輯功能

CRichEditView提供復(fù)雜的文本編輯功能

CFormView通過使用對話框資源實現(xiàn)窗體式窗口

CRecordView提供了顯示數(shù)據(jù)庫記錄的功能

CDaoRecordView一般與DAO數(shù)據(jù)庫類一起使用,其余與CRecordView相同。

CScrollView提供滾動功能

CListView在窗口中顯示CListView控件

CTreeView在窗口中顯示CTreeView控件

2.4圖形設(shè)備接口

2.4.1理解設(shè)備環(huán)境

1)戶能夠顯示任何形式的數(shù)據(jù),因為窗口中顯示的所有東西,不論是文字、表格、位

圖或是其它任何類型的數(shù)據(jù),都是以圖形方式顯示的。

2)MFC通過將windows的GDI函數(shù)和對象封裝到其設(shè)備環(huán)境(DC)類中來幫助用戶顯

示數(shù)據(jù)。

3)一個設(shè)備環(huán)境(DC)就是一個數(shù)據(jù)結(jié)構(gòu),它對窗口的繪制表面的屬性保持跟蹤。這

些屬性包括當(dāng)前選擇的畫筆、畫刷和用來在屏幕上繪制的字體。一個DC一次只能有一種畫

筆一種畫刷和一種字體。設(shè)備環(huán)境對象封裝了畫線、寫文本等API函數(shù),所有的畫圖操作都

通過DC對象進行。

4)DC幫助Windows實現(xiàn)了設(shè)備無關(guān)性。DC能用來輸出到屏幕、打印機和元文件。

什么是元文件(metafile)元文件就是由一系列可變長度結(jié)構(gòu)組成的數(shù)組,圖片以設(shè)備無關(guān)

的格式存儲在結(jié)構(gòu)中。當(dāng)元文件的記錄被轉(zhuǎn)換成設(shè)備命令并被合適的設(shè)備處理時,元文件被

顯示。

5)CDC類。CDC就是設(shè)備環(huán)境對象類。CDC對象提供了操作DC的成員函數(shù)??梢酝ㄟ^

CDC對象類的成員函數(shù)來進行所有的繪圖操作。

6)CPaintDC類

a.CPaintDC類繼承CDC類;

b.CPaintDC類的構(gòu)造函數(shù)自動調(diào)用OnPaint函數(shù),接著就可以在DC中繪圖;類

的析構(gòu)函數(shù)自動調(diào)用EndPaint函數(shù)。

c.BeginPaint函數(shù)準(zhǔn)備繪圖的窗口;EndPaint函數(shù)表明結(jié)束窗口的繪圖。

d.在視圖類的OnDraw函數(shù)中,CPaintDC已經(jīng)由系統(tǒng)準(zhǔn)備好,可以直接在OnDraw中

繪圖。并且CPaintDC由系統(tǒng)自動釋放。

7)CClientDC類

CClientDC對象封裝了所有對,Windows客戶區(qū)DC的操作。CClientDC通過調(diào)用GetDC函數(shù)得

到,通過ReleaseDC函數(shù)釋放。

8)CWindowDC類

CWindowDC對象封裝了對整個window窗口,包括框架的操作。

9)CMetaFileDC類

CMetaFileDC對象封裝了對一個Windows元文件的繪圖操作。但是必須自己調(diào)用

OnPrepareDC函數(shù),來準(zhǔn)備設(shè)備環(huán)境。

2.4.2圖形對象(GraphicObject)

-11-

第二講編程工具VC

Windows提供了多種在DC中使用的圖形對象類。這些類與WindowsGDI的句柄類型相

對應(yīng)。

圖形對象類Windows句柄類型

CPenHPEN

CBrushHBRUSH

CFontHFONT

CBitmapHBITMAP

CPaletteHPALETTE

CRgnHRGN

使用圖形對象的一般步驟:

1)定義圖形對象,使用圖形對象類的Create函數(shù)如CreatePen創(chuàng)建對應(yīng)的對象。

2)將創(chuàng)建的圖形對象選進當(dāng)前設(shè)備環(huán)境(DC)中,并保存I日的圖形對象。

3)完成使用當(dāng)前圖形對象后,將原圖形對象選回DC中。

4)保證分配的圖形對象在結(jié)束使用后被刪除。

注意:如果要反復(fù)的使用一個圖形對象,可以只申請一次,然后在需要的時候?qū)⑵溥x入

DC中。但是必須確保在不再需要使用圖形對象的時候,刪除它。

2.5對話框和控件

2.5.1對話框

Windows應(yīng)用程序可能有多個對話框,對于每一個對話框,必須開發(fā)兩個實體:對話框

資源和對話框類。對話框資源用于定義在屏幕上顯示的對話框和它的控件的大小和位置等信

息。對話框類是對話框和它的控件的對應(yīng)代碼。用戶可以用資源編輯器建立對話框資源,向

其中增加控件和對它們進行調(diào)整。對話框及在對話框上的控件都必須有一個用于標(biāo)識的ID。

ClassWizard幫助用戶建立一個對話框類,通常由MFC類CDialog派生而來,并將資源和類

相連。

通常對話框上的每一個控件對應(yīng)類中的一個成員變量。要顯示對話框,可調(diào)用類的成員

函數(shù)。可以在顯示對話框前為控件設(shè)置缺省值,或使用控件對應(yīng)的成員變量設(shè)定控件值。使

用ClassWizard中的MemberVariables可以為對話框上的控件本身或控件值建立對應(yīng)的類

成員變量。

單擊上圖中的AddVariable按鈕,將彈出如下圖所示的AddMemberVariable對話框。

-12-

第二講編程工具VC

在這個對話框的Category和Variabletype下拉式組合框中可以選擇控件對應(yīng)成員變

量的類型:Value或Control類型,以及它們確切對應(yīng)的類型。然后,在程序中就可以使用

定義的變量來操縱控件了。

2.5.2控件

1)基本控件

Windows常用控件MFC對應(yīng)的類

按鈕控件CButton

編輯框控件Cedit

復(fù)選框控件CCheck

列表框控件CListBox

進度條控件(Progressbar)CProgressCtrl

滑塊控件CSliderCtrl

上下控件CSpinButtonCtrl

圖象列表(imagelist)ClmageList

列表視圖控件(listview)CListCtrl

樹形控件(treeview)CTreeCtrl

RichEdit控件CrichEditCtrl

2)添加自定義控件

在應(yīng)用程序中可以添加一些自己生成的或由他人提供的控件。方法如下:

首先,選擇菜單project,AddToProject,ComponentsAndControls,彈出對話框

MComponentsAndControlGalley”對話框,選擇"RegisteredActiveXControls”。

然后,選擇準(zhǔn)備插入的控件(如“GisAttEditContro"),按Insert按鈕,會在程序中

生成控件對應(yīng)的類。

接著,就可以像使用標(biāo)準(zhǔn)控件一樣使用插入的控件了。

2.6編程規(guī)范

2.6.1書寫風(fēng)格

大括號的對齊,鋸齒狀對齊、縮進;使用空白(空字符,空行)以增加可讀性。

2.6.2命名規(guī)范

-13-

第二講編程工具VC

匈牙利記法:變量具有一個描述性的名字,如ClassName,名字用大寫字母開始;如果

變量是一多詞名則每個單詞詞頭需大寫。然后,在描述性名稱前,加上表示變量類型的字母

——如,nCount為一整型變量,bFlag為一Boolean型變量。

前綴變量注釋

aArray

bBoolean

dDouble

hHandle

IInteger“indexinto”

1Long

lpLongpointerto

IpfnLongpointertofunction

mMembervariable

nIntegernumberof”

PPointerto

sString

szZeroterminatedstring

uUnsignedinteger

CClass

2.6.3注釋規(guī)則

1)函數(shù)注釋函數(shù)開頭必須注明函數(shù)功能、參數(shù)、返回值

2)變量注釋應(yīng)說明變量的作用

3)其它注釋每個功能模塊應(yīng)加注釋,如一個循環(huán)體、一個判斷等都需要加注釋。

習(xí)題:

2.1建立一個基于多文檔的應(yīng)用程序,添加自己的菜單項,使用ClassVizard進行消息映射。

2.2在上題基礎(chǔ)上,使用圖形設(shè)備接口,在窗口上繪圖。要求每按下一次鼠標(biāo)左鍵,就以鼠

標(biāo)所點坐標(biāo)為中心,畫一個圓。

2.3建立一個基于對話框的應(yīng)用程序。使用幾個基本控件,如:編輯框、按鈕、組合框等,

并生成對應(yīng)的變量,然后,通過這些變量控制控件的值。

-14-

第二講編程工具VC

第三講地理信息系統(tǒng)基本概念

3.1GIS原理概述

3.1.1GIS概念

地理信息系統(tǒng)(GIS)是在計算機軟硬件支持下,以采集、存貯、管理、檢索、分析和

描述空間物體的地理分布數(shù)據(jù)及與之相關(guān)的屬性,并回答用戶問題等為主要任務(wù)的技術(shù)系

統(tǒng)。

3.1.2GIS發(fā)展

1)起始發(fā)展階段(60年代)

1963年由加拿大測量學(xué)家R.F.Tomlinson提出并建立的世界上第一個地理信息系統(tǒng)是

加拿大地理信息系統(tǒng)(CGIS)。

1963年美國哈佛大學(xué)城市建筑和規(guī)劃師HowardT.Fisher設(shè)計和建立了SYMAP系統(tǒng)軟

件。

1966年美國成立了城市和區(qū)域信息系統(tǒng)協(xié)會(URISA),1968年國際地理聯(lián)合會(IGU)設(shè)

立了地理數(shù)據(jù)收集委員會(CGDSP)。

1969年,又建立起州信息系統(tǒng)國協(xié)會(NASIS)?

2)發(fā)展鞏固階段(70年代)

70年代,GIS朝實用方向發(fā)展。各國對GIS的研究均投入了大量人力、物力、財力。不

同規(guī)模、不同專題的信息系統(tǒng)得到很大發(fā)展。從1970年到1976年美國地質(zhì)調(diào)查局發(fā)展了

50多個地理信息系統(tǒng)。GIS受到政府、商業(yè)和學(xué)校的普遍重視。

3)推廣應(yīng)用階段(80年代)

80年代,GIS在全世界范圍內(nèi)全面推廣應(yīng)用,應(yīng)用領(lǐng)域不斷擴大,開始用于全球性的問

題。開展GIS工作的國家更為廣泛,國際合作H益加強。GIS軟件開發(fā)具有突破性的進展,

僅1989年市場上有報價的軟件達70多個。代表性的有ARC/INFO(美國)、GENAMAP(澳大

利亞)、SPANS(拿加大)、MAPINFO(美國)、MGE(美國)、System9(瑞士/美國)、ERDAS(美

國。

4)蓬勃發(fā)展階段(90年代以后)

90年代,隨著地理信息產(chǎn)生的建立和數(shù)字化信息產(chǎn)品在全世界的普及,GIA已成為確定

性的產(chǎn)業(yè),投入使用的GIS系統(tǒng),每2?3年就翻一番,GIS市場的年增長率為35%以匕從

事GIS的廠家已超過300家。GIS已滲透到各行各業(yè),涉及千家萬戶,成為人們生產(chǎn)、生活、

學(xué)習(xí)和工作中不可缺少的工具和助手。

3.1.3GIS組成

1)數(shù)據(jù)輸入和檢驗

2)數(shù)據(jù)存儲和管理

3)數(shù)據(jù)變換

4)數(shù)據(jù)輸出和表示

5)用戶接口

3.1.4GIS功能

1)數(shù)據(jù)采集與輸入

數(shù)據(jù)采集與輸入,即在數(shù)據(jù)處理系統(tǒng)中將系統(tǒng)外部的原始數(shù)據(jù)傳輸給系統(tǒng)內(nèi)部,并將這

-15-

第三講地理信息系統(tǒng)基本概念

些數(shù)據(jù)從外部格式轉(zhuǎn)換為系統(tǒng)便于處理的內(nèi)部格式的過程。主要有圖形數(shù)據(jù)輸入,如管網(wǎng)圖

輸入;柵格數(shù)據(jù)輸入,如遙感圖像的輸入;測量數(shù)據(jù)輸入,如全球定位系統(tǒng)(GPS)數(shù)據(jù)的

輸入;屬性數(shù)據(jù)輸入,如數(shù)字和文字的輸入。

2)數(shù)據(jù)編輯與更新

數(shù)據(jù)編輯主要包括圖形編輯和屬性編輯。屬性編輯主要與數(shù)據(jù)庫管理結(jié)合在一起完成,

圖形編輯主要包括拓?fù)潢P(guān)系建立、圖形編輯、圖形整飾、圖幅拼接、圖形變換、投影變換、

誤差校正等功能。數(shù)據(jù)更新即以新的數(shù)據(jù)項或記錄來替換數(shù)據(jù)文件或數(shù)據(jù)庫中相對應(yīng)的數(shù)據(jù)

項或記錄,它是通過刪除、修改、插入等一系列操作來實現(xiàn)的。

3)數(shù)據(jù)存貯與管理

屬性數(shù)據(jù)管理一般直接利用商用關(guān)系數(shù)據(jù)庫軟件,如ORACLE、ACCESS.FoxBase、FoxPro

等進行管理??臻g數(shù)據(jù)管理是GIS數(shù)據(jù)管理的核心,各種圖形或圖像信息都以嚴(yán)密的邏輯結(jié)

構(gòu)存放在空間數(shù)據(jù)庫中。

4)空間查詢與分析

空間查詢與分析是GIS核心,主要包括數(shù)據(jù)操作運算、數(shù)據(jù)查詢檢索與數(shù)據(jù)綜合分析。

包括矢量數(shù)據(jù)疊合、柵格數(shù)據(jù)迭加等操作、算術(shù)運算、關(guān)系運算、邏輯運算、函數(shù)運算等。

綜合分析主要包括信息量測、屬性分析、統(tǒng)計分析、二維模型分析、三維模型分析、多要素

綜合分析等。

5)數(shù)據(jù)顯示與輸出

數(shù)據(jù)顯示是中間處理過程和最終結(jié)果的屏幕顯示,通常以人機交互方式來選擇顯示的對

象與形式,對于圖形數(shù)據(jù)根據(jù)要素的信息量和密集程度,可選擇放大或縮小顯示。GIS不僅

可以輸出全要素地圖,也可以根據(jù)用戶需要,分層輸出各種專題圖、各類統(tǒng)計圖、圖表及數(shù)

據(jù)等。

3.1.5GIS應(yīng)用

1)資源清查

2)城鄉(xiāng)規(guī)劃

3)災(zāi)害監(jiān)測

4)土地調(diào)查

5)環(huán)境管理

6)城市管網(wǎng)

7)作戰(zhàn)指揮

8)宏觀決策

3.2GIS空間數(shù)據(jù)類型

3.2.1柵格數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu)

將工作區(qū)域的平面表象按一定分解力作行和列的規(guī)則劃分,形成許多格網(wǎng),每個網(wǎng)格單

元稱為象素,柵格數(shù)據(jù)結(jié)構(gòu)實際上就是象元陣列,即象元按矩陣形式的集合,柵格中的每個

象元是柵格數(shù)據(jù)中最基本的信息存儲單元,其坐標(biāo)位置可以用行號和列號確定。

3.2.2矢量數(shù)據(jù)數(shù)據(jù)結(jié)構(gòu)

矢量數(shù)據(jù)就是代表地圖圖形的各離散點平面坐標(biāo)(x,y)的有序集合。

拓?fù)潢P(guān)系是指網(wǎng)結(jié)構(gòu)元素結(jié)點、弧段、面域之間的空間關(guān)系,主要表現(xiàn)為下列三種關(guān)系:

拓?fù)溧徑雨P(guān)系、拓?fù)潢P(guān)聯(lián)關(guān)系、拓?fù)浒P(guān)系

3.2.3矢柵一體化數(shù)據(jù)結(jié)構(gòu)

用填滿線性目標(biāo)路徑和充滿面狀目標(biāo)空間的表達方法作為一體化數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),每個

-17-

第三講地理信息系統(tǒng)基本概念

線性目標(biāo)除記錄原始取樣點外,還記錄路徑所通過的柵格,每個面狀地物除記錄它的多邊形

周邊以外,還包括中間的面域柵格。無論是點、線

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論