郑州大学地理信息系统 MFC上机练习Word格式文档下载.docx
- 文档编号:3861598
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:19
- 大小:33.88KB
郑州大学地理信息系统 MFC上机练习Word格式文档下载.docx
《郑州大学地理信息系统 MFC上机练习Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《郑州大学地理信息系统 MFC上机练习Word格式文档下载.docx(19页珍藏版)》请在冰点文库上搜索。
{
pdc->
FillRect(rcBounds,CBrush:
FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
Ellipse(rcBounds);
pdc->
TextOut(10,10,"
我是控件!
"
);
;
}
/******************************************************************************
通过CDC对象的成员函数进行所有的绘图。
成员函数:
Ellipse(intx1,inty1,intx2,inty2);
绘制椭圆。
参数x1指定椭圆的外接矩形左上角的x坐标;
参数y1指定椭圆的外接矩形左上角的y坐标;
参数x2指定椭圆的外接矩形右下角的x坐标;
参数y2指定椭圆的外接矩形右下角的y坐标;
TextOut(intx,inty,constCString&
str);
使用当前选择的字体在指定位置输出文本。
FillRect()该函数用指定的画刷填充矩形.
***************************************************************************/
OnLButtonDown(UINTnFlags,CPointpoint)
CClientDCdc(this);
//CClientDC:
(继承于CDC类)用于客户区的输出,与特定窗口关联,可以让开
//发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包含了ReleaseDC。
intx=point.x;
inty=point.y;
dc.Ellipse(x-10,y-10,x+10,y+10);
COleControl:
OnLButtonDown(nFlags,point);
longHYK_ActiveXCtrl:
Add(longn0,longn1)
returnn0+n1;
测试程序代码
HYK_ActiveX_TestView.h
#include"
HYK_ActiveX.h"
classHYK_ActiveX_TestView:
publicCView
public:
CTempX*m_pTempX;
HYK_ActiveX_Test_View.cpp
voidCHYK_ActiveX_TestView:
OnDraw(CDC*pDC)
CRectrC;
GetClientRect(&
rC);
pDC->
FillSolidRect(rC,COLORREF(RGB(255,255,0)));
/*GetClientRect(&
rC)该函数获取窗口客户区的坐标。
客户区坐标指定客户区的左上角和右下角。
由于客户区坐标是相对窗口客户区的左上角而言的,因此左上角坐标为(0,0)
FillSolidRect与CDC:
FillRect类似,FillSolidRect只能使用固体色(由COLORREF参数决定)。
但FillRect带有画刷,因此可以为矩形填充固体色、抖动色、阴影或使用调色板。
FillRect通常比FillSolidRect慢。
*/
intCHYK_ActiveX_TestView:
OnCreate(LPCREATESTRUCTlpCreateStruct)
if(CView:
OnCreate(lpCreateStruct)==-1)
return-1;
m_pTempX=newCTempX();
m_pTempX->
Create(_T("
abcd"
),WS_CHILD|WS_VISIBLE,CRect(10,10,100,100),this,2000);
//实例化控件
return0;
OnDestroy()
CView:
OnDestroy();
deletem_pTempX;
if(m_pTempX)
{
longnResult=m_pTempX->
Add(1,2);
}
CHYK_ActiveX_TestView:
OnSize(UINTnType,intcx,intcy)
OnSize(nType,cx,cy);
//OnSize(nType,cx,cy)在窗口的大小更改后,框架调用该成员函数。
//nType:
指定请求的调整大小的类型。
//cx指定工作区的新的宽度
//cy指定工作区的新的高度。
if(m_pTempX&
&
GetSafeHwnd()!
=0)
{//MoveWindow()用来改变控件的位置和大小
m_pTempX->
MoveWindow(0,0,cx,cy);
//创建与客户区大小相同的控件
OnAdd()
2、扩展动态库ExtendDll(隐式链接)
1、使用向导创建一个扩展库。
新建、MFCAppWizard(dll)工程名为HYK_ExtendDll
2、在预编译头文件里定义一个宏#defineHANYAKUI
3、插入、新建类窗体。
选择GenericClass类名为CPointEx。
新建一个头文件到当前工程,名为Export.h
4、在CpointEx.h中添加代码,在预编译头文件里添加#include“Export.h”
5、在Export.h中添加代码(这里是重点)
以上为dll部分
6、建立测试程序步骤………
Export.h
#ifndefMY_EXTERN_DLL
#defineMY_EXTERN_DLL
#ifdefHANYAKUI
#definehan_declspec(dllexport)
#else
#definehan_declspec(dllimport)
#pragmacomment(lib,"
..\\HYK_ExtendDll\\Debug\\HYK_ExtendDll.lib"
)
//可以让链接器在链接时查找这个指定的库
#endif
PointEx.h"
#endif
/*在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。
依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
StdAfx.h
#defineHANYAKUI
Export.h"
PointEX.h
classhanCPointEX
CPointEX();
virtual~CPointEX();
intx,y;
};
HYK_ExternDll_Test\StdAfx.h
..\\HYK_ExtendDll\\Export.h"
TestView.h
vector"
usingnamespacestd;
classCHYK_ExternDll_TestView:
vector<
CPointEX>
m_vPt;
TestView.cpp
voidCHYK_ExternDll_TestView:
CPointEXptT;
ptT.x=point.x;
ptT.y=point.y;
m_vPt.push_back(ptT);
copy.\Debug\HYK_ExternDll_Test.exe..\Bin
copy.\Debug\HYK_ExtendDll.dll..\Bin
3、常规动态库RegularDll(动态加载)
可以在需要的时候动态加载动态链接库,隐式链接在程序启动时所有dll都被加载,占内存.
新建、MFCAppWizard(dll)工程名为HYK_RegularDll
2、创建以个名为Math.cpp文件添加代码声明一个AddEx函数
3、在模块定义文件.def文件下指定AddEx为导出函数并其编号
以上为常规库的定义,把常规库的.lib和.dll拷贝到测试工程目录下
4建立测试程序在鼠标左键响应函数添加代码(重点下面写的比较详细!
CHYK_RegularDLL\Math.cpp
StdAfx.h"
intMyAdd(intn0,intn1)
CHYK_RegularDLL.def
DataType.def:
DeclaresthemoduleparametersfortheDLL.
LIBRARY"
DataType"
DESCRIPTION'
DataTypeWindowsDynamicLinkLibrary'
EXPORTS
;
Explicitexportscangohere
MyAdd@1
CHYK_RegularDLL_TestView.cpp
intAddEx(intn0,intn1);
voidCHYK_RegularDLL_TestView:
//1装载动态库LoadLibrary返回dll的句柄
HINSTANCEhIns=:
LoadLibrary("
DataTypeD.dll"
if(hIns==0)return;
//2GetProcAddress获取常规库导出函数地址
typedefint(abcd)(int,int);
abcd*pProc=(abcd*):
GetProcAddress(hIns,"
AddEx"
if(pProc==0)return;
//3使dll导出的用函数
intnResult=(*pProc)(1,2);
//4释放动态库
:
FreeLibrary(hIns);
4、对话框数据的交换机制
voidCMyEditBoxDlg:
OnSum3()
UpdateData(TRUE);
m_num9=m_num7+m_num8;
UpdateData(FALSE);
OnSum4()
intnum1,num2,num3;
charch10[10],ch11[10],ch12[10];
m_edit10.GetWindowText(ch10,10);
m_edit11.GetWindowText(ch11,10);
num3=atoi(ch10)+atoi(ch11);
itoa(num3,ch12,10);
m_edit12.SetWindowText(ch12);
5、Com组件
说明:
设计一个Com组件很困难,VC++提供了ActiveX模板库ATL。
使用ATL可以很方便地设计各种Com组件
1、创建一个组件工程。
新建、ATLComAppWizard工程名为TempMath
2、插入com对象。
选择菜单insert、newATLObject选项。
选择
SimpleObject点击Next
3、在出现的ATLObjectWizard属性对话框的shortname栏中添加组件名MathEx,其余属性系统自动添加。
4、在接口中加入方法。
在ClassView选项卡中选中接口ImathEx单击右键。
在弹出的窗口中填写方法名Add参数为[in]longn0,[in]longn1,[out]long*n01
5、实现方法。
在MathEx.cpp中完善Add函数。
组件编写完毕。
6、编写测试程序。
新建一个test.exe工程添加鼠标左键响应函数。
第一步导入类型库,#import“路径\.tlb”,点击bulid。
这时会在测试程序的Debug目录下生成**.tlh
7、包括代理头文件#include“Debug\**.tlh”
8、创建智能指针……略(重点下面写的比较详细)
AtlCom\TempMath\TempMath.dsp
MathEx.h
classATL_NO_VTABLECMathEx:
STDMETHOD(Add)(/*[in]*/longn0,/*[in]*/longn1,/*[out]*/long*n01);
MathEx.cpp
STDMETHODIMPCMathEx:
Add(longn0,longn1,long*n01)
*n01=n1+n0;
returnS_OK;
AtlCom\Test\TestView.cpp
//第一步导入类型库
#import"
F:
\数据库\\AtlCom\TempMath\tempmath.tlb"
//第二步包括代理头文件
Debug/TempMath.tlh"
voidCTestView:
CoInitialize(0);
//通常在构造函数里面初始化
//第三步创建智能指针
TEMPMATHLib:
IMathExPtrabc;
//ProgId为TempMath.MathEx.1
abc.CreateInstance("
TempMath.MathEx.1"
//用.创建实例
longnResult;
abc->
Add(1,2,&
nResult);
//用->
调用函数
CoUninitialize();
//通常在析构函数里面注销
6、序列化
步骤比较简单这里不再介绍,重点介绍及各类
FILE类
格式
HYK_SerializeView.h
classCPointEx
voidSave(FILE*fp)
fprintf(fp,"
%d,%d\n"
x,y);
//保存点坐标
voidSerialize(CArchive&
ar)
if(ar.IsStoring())//判断是否为写操作
ar<
<
x;
y;
Else//为读操作
ar>
>
CArchive&
operator<
(CArchive&
ar,CPointEx&
t);
operator>
classCHYK_SerializeView:
CPointEx>
m_vpT;
}:
HYK_SerializeView.cpp
voidCHYK_SerializeView:
//捕获鼠标焦点位置信息将坐标存入数组
CPointExptT;
m_vpT.push_back(ptT);
Invalidate();
OnTextWrite()
//将数组中的点信息存入txt文件中
FILE*fp=fopen("
D:
\\data.txt"
"
wt"
if(fp==0)
return;
intnCount=m_vpT.size();
fprintf(fp,"
%d\n"
nCount);
//将点的个数存入文件
for(inti=0;
i<
nCount;
i++)
CPointEx&
ptEx=m_vpT[i];
//将数组中的点信息依次读出
ptEx.Save(fp);
//调用CPointEx的Save方法吧点信息存入文件
fclose(fp);
OnTextRead()
//从文件中读出点信息存入数组
rt"
intnCount;
fscanf(fp,"
%d"
&
nCount);
CPointExptEx;
fscanf(fp,"
%d,%d"
ptEx.x,&
ptEx.y);
//将点信息读出赋给CPointEx的实例再存入数组
m_vpT.push_back(ptEx);
operator<
(CArchive&
ar,CPointEx&
t)
t.Serialize(ar);
returnar;
CArchive&
operator>
(CArchive&
ar,CPointEx&
t)
t.Serialize(ar);
OnBinWrite()
/*********************************************************************/
/*文件打开模式可组合使用,用“|”隔开,常用的有以下几种:
CFile:
modeCreate:
以新建方式打开,如果文件不存在,新建;
如果文件已存在,
把该文件长度置零,即清除文件原有内容。
modeNoTruncate:
以追加方式打开,如果文件存在,打开并且不将文件长
度置零,如果文件不存在,会抛出异常。
一般与CFile:
modeCreate一起使
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 郑州大学地理信息系统 MFC上机练习 郑州大学 地理信息系统 MFC 上机 练习