设备,它的设备坐标称为窗口设备坐标,它把某窗口的客户区当作将要绘图的设备,该坐标系以窗口客户区左下角为原点,右手坐标系。
窗口坐标:原点在指定窗口客户区左上角的坐标,以象素为单位,左手坐标系。 屏幕坐标:原点在屏幕左上角的坐标,以象素为单位,左手坐标系。2. 各坐标系之间的坐标转换:
(1)逻辑坐标<====>设备坐标:
_LpToDp如果函数要求使用设备坐标,而当前数据是逻辑坐标,则需要调用将逻辑坐标转换为设备坐标再调用;
_DpToLp如果函数要求使用逻辑坐标,而当前数据是设备坐标,则需要调用将设备坐标转换为逻辑坐标再调用;
(2)窗口坐标<====>设备坐标:_WpToDp、_DpToWp (3)窗口坐标<====>逻辑坐标:_WpToLp、_LpToWp
(4)窗口坐标<====>屏幕坐标: 这两个坐标系之间的转换比较简单,不需要专门的函数,只需获取应用程序窗口在屏幕上的相对位置,然后进行简单的平移计算即可。
2)HDC、MyDC
DC、HDC:熟悉Windows编程的人,对DC、HDC的概念一定不会陌生。设备描述表(DC)不仅描述了设备对象、设备对象的属性以及图形显示模式;同时,还指向了一个实际的物理输出设备,包括设备名称、设备驱动程序以及其他一些信息。实际用GDI函数进行编程时,我们经常使用的是一个指向DC的句柄HDC。利用HDC,我们就可以避开千变万化的外部输出设备,以一种透明、简便的方式实现对图形设备的控制,最终达到我们所要实现的目的。在开始绘图前,如果您调用Windows API绘图函数,首先需获取当前绘图窗口的HDC。绘图结束后应释放该DC。
MyDC: MAPGIS引入一个新的概念——显示对象(MyDC),有时侯也称显示设备句柄,类似于Windows中的HDC。在显示对象中集成了Windows的DC和MAPGIS基本显示处理的函数,MAPGIS的所有显示函数都是针对某一个显示对象的,即所有显示都显示在这个对象所联系的窗口上。每个窗口都对应不同的显示对象,都可以设置不同的图形模式和显示参数。 在开始绘图前,如果您使用MAPGIS API绘图函数,首先需调用_GetMyDC获取当前绘图窗口的MyDC。绘图结束后应调用_DeleteMyDC释放该DC。
3)显示模式、显示参数、显示范围;
显示模式:MAPGIS的显示模式概念与Windows的显示模式概念类似。显示模式将决定最终的显示效果。函数_SetMyDCMode将显示对象设置为多边形交错填充模式、设备左下角为原点、右手坐标系。
显示参数:定义了视口原点坐标,x、y方向的缩放比例,显示角度等信息。通过对显示参数的设置,可实现地图的移动、放大、缩小等操作。函数_SetDispParam实现显示参数的设置。函数_GetDispParam实现显示参数的读取。
显示范围:窗口所显示的地图的范围。函数_SetDispRect实现显示范围的设置。函数_GetDispRect实现显示范围的读取。
4)还原显示、坐标点显示;
还原显示:当还原显示状态为真时,显示图元的函数按模拟输出的标准显示,所用的线型、图案等都显示出来,在这个状态下显示速度较慢。在非还原显示状态时,线型、图案等都不显示,汉字显示等函数也作了简化处理,故显示速度较快。可用_SetOriginalDisp函数来设置还原显示或非还原显示状态。
坐标点显示:在坐标点显示状态下,显示图元的函数在图元的坐标点处显示一个小的红
十字,在编辑时可作为参考。可用_SetCoordPntDisp函数来设置坐标点显示或非坐标点显示状态。
5)调色板、笔、刷子;
调色板:MAPGIS有一套自己的调色板,该调色板是针对地图着色而设计的。调用_SetMyDCPalette函数可以将原来的Windows逻辑调色板替换为MAPGIS调色板。 笔:定义了画笔的颜色、笔宽、模式等信息。使用前,需用_SetPen函数来定义画笔;使用结束,应用函数_CleanPen来清除画笔。画线、画圆、画弧、显示字符串等函数多用到画笔。
刷子:定义了刷子的颜色、填充图案、笔宽、模式等信息。使用前,需用_SetBrush函数来定义刷子;使用结束,应用函数_CleanBrush来清除刷子。与画笔不同的是,刷子多用于与填充有关的函数。
1.2图形显示输出基本函数
1)显示对象句柄的获取和删除:
MyDC _GetMyDC(HWND hwnd,PAINTSTRUCT *lpps=NULL);
void _DeleteMyDC(MyDC mdc); 2)设置显示对象图形模式
void _SetMyDCMode(MyDC mdc); 3)设置设备调色板
void _SetMyDCPalette(MyDC mdc);
4)显示参数的获取和设置:
short _SetDispParam(MyDC mdc,double fx0,double fy0,double fScalex,double fScaley = 0,double fAngle = 0);
short _GetDispParam(MyDC mdc,double *pfx0,double *pfScalex,double *pfScaley= NULL,double *pfAngle=NULL);
5)显示范围的获取和设置:
short _SetDispRect(MyDC mdc,D_RECT frc); short _GetDispRect(MyDC mdc,D_RECT *frc); 6)设置特殊显示状态:
short _SetOriginalDisp(MyDC mdc,short Origif); short _SetCoordPntDisp(MyDC mdc,short sCoord); short _SetMessageDisp(MyDC mdc,short Dispif); 7)颜色的锁定与解除:
void _LockColor(MyDC mdc,COLORREF col); void _UnLockColor(MyDC mdc); short _GetLockState(MyDC mdc); 8)绘图工具设置:
void _SetPen(MyDC mdc,int penno,int color);
void _CleanPen(MyDC mdc);
void _SetBrush(MyDC mdc,long bcol, short pno=0, double phei=1,long pcol=0); void _CleanBrush(MyDC mdc);
void _SetPenColor(MyDC mdc, COLORREF clr); void _CleanPenColor(MyDC mdc);
int _SetPenMode(MyDC mdc,int nMode); int _GetPenMode(MyDC mdc);
*pfy0,double
9)逻辑坐标(或图形坐标)与设备坐标互换:
void _LpToDp(MyDC mdc,D_DOT *pdP);
void _DpToLp(MyDC mdc,double *pfx,double *pfy); 10)显示输出整个工作区:
short _DispPntArea(MyDC mdc,short ai,short layon=0); short _DispLinArea(MyDC mdc,short ai,short layon=0); short _DispRegArea(MyDC mdc,short ai,short layon=0); 11)在用户坐标系下显示输出实体:
short _DispLin(MyDC mdc,short ai,long gno,long col=0); short _DispLin(MyDC mdc,short ai,long gno,long col=0); short _DispReg(MyDC mdc,short ai,long gno,long col=0); 12)在设备坐标系下显示输出实体 :
void _DrawLine(MyDC mdc,POINT *xy,long len, long col=0);
void _RegionFill(MyDC mdc,POINT *xy,int *ne, int regnum,int col=0); short _DispString(MyDC mdc,double x,double y,float h, float w,char *str,short zt,short zx,float ang, float sp,char pl,long col=0);
short _DispText(MyDC mdc,double x,double y,float px, float py,float h,float w,char *str,short zt, short zx, float ang, float sp,float ls,char pl,long col);
short _DispSubgr(MyDC mdc,long subno,double x,double y,double hei,double wid,double ang,long col=0);
13)基本绘图函数 :
void _Line(MyDC mdc,double x1,double y1, double x2,double y2); void _LineTo(MyDC mdc,double x,double y); void _MoveTo(MyDC mdc,double x,double y);
void _Arc(MyDC mdc,double r,double ang1, double ang2); void _Circle(MyDC mdc,double rad); void _CircleFill(MyDC mdc,long rad);
void _PolyLine(MyDC mdc,D_DOT *lxy,long *ne, int na); void _PolyGon(MyDC mdc,D_DOT *lxy,long *ne,int na);
void _Rect(MyDC mdc,double x1,double y1, double x2,double y2); 14)取符号数
short _GetPatternNum(void);
取图案数
short _GetLineStyleNum(void); 取线型数 short _GetColorNum(void); 取颜色数 short _GetSubGraphNum(void); 取子图数 15)取某线型的辅助线型数 Short _GetFltpNum(int ltp)
16)取子图的最小范围
short _GetSubGraphRect(int subno,double x,double y,float hei,float wid,float ang,D_RECT* rc);
17)RGB对应的MAPGIS颜色阶
short _FindNearColor(int r,int g,int b); 18)MAPGIS颜色阶对应的RGB值
short _GetAColorRGBValue(int cno,int *r,int *g,int *b);
19)MAPGIS颜色阶对应的CMYK值
short _GetAColorCMYKValue(int cno,int *k,int *c,int *m,int *y);
2. 窗口处理
2.1窗口处理的主要作用
窗口处理函数的作用主要表现在两个方面:
1)用于优化窗口消息的处理效率,跟踪记录窗口状态。当窗口处于非活动状态时,记录窗口无效范围,并保存窗口被遮挡的画面,需要时快速更新窗口显示内容。
2)自动记录跟踪当前窗口所对应的用户图形范围,完成图形坐标、设备坐标、窗口坐标间的转换,自动实现对窗口图形的放大、缩小、复位等操作。
这里讲解的函数全部是基于窗口句柄的API函数,如果用户在开发中使用MFC(Microsoft Foundation Class)框架,建议使用MAPGIS提供的MFC类,如CGisView、CgisEditView等,它们的使用要简单得多。
2.2窗口显示参数
窗口操作用到下面的窗口显示参数结构WIN_ORG: typedef struct { double x0,y0; //视口左下角(原点)
D_RECT frc; //显示范围 double r; //显示比例
}WIN_ORG; x0,y0为窗口原点对应的图形坐标,窗口原点为左下角,frc为显示范围的图形坐标,r为显示比例,即屏幕窗口上的距离与图上距离之比。 2.3窗口处理基本函数
1)窗口显示内容的保存和快速显示:
SetPaintFunction _OwnerDraw ProcSYSCOMMAND ProcACTIVATE ProcPAINT VscrollMap HscrollMap
DelWinParam PopupWinImage
2)窗口显示范围的管理 :
short _GetWinDispParam(HWND hwnd,WIN_ORG *wxy); short _SetWinDispParam(HWND hwnd,WIN_ORG wxy); short _GetWinDispRect(HWND hWnd,D_RECT *frc); short _ResetWinDispRange(HWND hwnd,D_RECT rc); short short short short
_ResetWinDispRate(HWND hwnd,double rate); _GetWinMapRange(HWND hwnd,D_RECT *frc); _ResetWinMapRange(HWND hwnd,D_RECT *frc); _OpenWindowRc(HWND hWnd,RECT *rc);
short _EnlargeWindow(HWND hwnd, long x,long y); short _ReduceWindow(HWND hwnd, long x,long y); short _RestoreWindow(HWND hwnd,short…ahInst=0); short _PrevWindow(HWND hwnd);
short _ MoveWindow (HWND hWnd, long dx,long dy); 2.4CGisView显示原理
1)将所有CView替换为CGisVew;
(当然,需包含#include “CGisVew.h”头文件。) 2)在C*View::OnDraw()函数中,在最后加入
“CGisVew:: OnDraw();”; 3)重载“CGisVew:: _OwnerDraw(MyDc myDC);”函数;
a)在头文件中,加入
“virtual void _OwnerDraw(MyDC myDC);”
b)在.cpp文件中,具体实现
“void C*View::_OwnerDraw(MyDC myDC)”
第七讲 图形编辑、类库和控件开发
1.图形编辑开发概要
MAPGIS平台的二次开发根据用户的工作需求和复杂程度提供三种不同的开发方案。 1)基本API函数开发:MAPGIS以标准c的接口形式,封装了MAPGIS所有的基本数
据结构和功能函数;这种方法功能最强,应用环境也最广,但是相对而言,编程量也最多。
2)类库(MFC)开发:这种方法主要是针对VC开发的用户,因为MAPGIS是用VC++开发出来的平台,因此对于图形显示和编辑用MFC派生了几个视类对象,封装了MAPCAD的绝大部分功能。利用这些基本视类可以快速高效地实现编辑功能,而且在此基础上还能灵活地增加自己特定的功能,编程量较少。
3)控件开发:这是一种更高和更通用的应用接口,使得在可视化程度很高的开发环境下(例VB 和DELPHI)进行二次开发更加方便和简单。
2.图形编辑API函数开发
MAPGIS图形编辑函数是运用面向对象技术开发的API函数库。在这个函数库中,我们提供了MAPGIS图形编辑系统的所有功能函数,用户可以应用这个函数库开发一个完整图形编辑系统,也可以在自己开发的应用系统中添加MAPGIS的编辑功能。
MAPGIS图形编辑函数库是一个Windows动态连接库,库中所有函数均按C标准命名方式命名,函数的原型说明在mapedit.h中。
2.1基本概念及初始化
MAPGIS图形编辑函数库是基于面向对象技术的函数库,它将窗口和编辑方法封装在一起,形成了编辑窗口对象(EDITWND)。所有的编辑功能都是基于编辑窗口对象(EDITWND)的。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库二次开发初级培训班培训讲义(6)在线全文阅读。
相关推荐: