
qlDataAdapter是 DataSet和 SQL Server之间的桥接器,用于检索和保存数据。SqlDataAdapter通过对数据源使用适当的Transact-SQL语句映射 Fill(它可更改DataSet中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet中的数据)来提供这一桥接。当SqlDataAdapter填充 DataSet时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。
Sqlcommand表示要对 SQL Server 数据库执行的一个 Transact-SQL 语句或存储过程。无法继承此类。
快速入门
第一章 hmap开发的基本环境和工具
11 基本环境
由于嵌入式开发的特殊性,使得它的开发不象开发其它应用软件一样具有相同的开发运行环境,因而嵌入式软件的开发与运行的环境不一定保持一致性
111 硬件环境:
Pentium级处理器的桌面计算机,建议使用Pentium 150-MHz或更高档次的处理器
符合桌面计算机规范要求的CD-ROM驱动器
VGA或具备更高解析度的显示器建议使用Super VGA显示器
鼠标或其它兼容指点设备
足够的硬盘空间
最小化安装方式(包括eMbedded Visual C++和一个SDK)所需磁盘空间:360 MB
完全安装方式(包括eMbedded Visual Basic,eMbedded Visual C++和三个SDK)所需磁盘空间:720 MB
6) 如果 *** 作系统为Windows 98 Second Edition,应至少配备24 MB内存(建议使用48 MB);如果 *** 作系统为Windows NT Workstation 40或Windows 2000,则应至少配备32MB内存(建议使用48 MB)
112 软件环境:
1)Microsoft Windows 2000 Professional/配备SP5的Microsoft Windows NT Workstation 40,Internet Explorer 501及MDAC 21;或Microsoft Windows 98 Second Edition
2)Microsoft eMbedded Visual Tools 30及其以上版本
3)hMap类库
12 开发工具
开发工具主要是一些嵌入式的开发工具,主要是Microsoft eMbedded Tools和Windows CE Tools两个工具,Microsoft eMbedded Tools提供集成开发环境,Windows CE Tools提供SDK及其模拟器环境
121 开发工具安装
Microsoft eMbedded Tools的安装程序一般与Windows CE Tools的安装程序绑在一起,因此两款工具常常是同时安装下面对Microsoft eMbedded Tools 30和Windows CE Tools 30安装的过程给出一个简要步骤:
启动Microsoft eMbedded Tools 30安装程序,开始安装(见图1211)
根据界面提示 *** 作,当输入产品ID后会d出安装组件对话框(见图1212),然后安装文件将分选中的选项进行相应的安装,因此会出现多次的安装对话框
根据界面提示 *** 作默认 *** 作,出现Microsoft eMbedded Tools的安装选择对话框(将图1213)
然后进行Microsoft eMbedded Tools并显示进度条,完成后开始Windows CE Platform SDK (H/PC Pro) 安装(见图1214)
选择默认值,H/PC Pro安装完成后开始Windows CE Platform SDK (Palm-size PC 12)的安装(见图1215)
选择默认值,Palm-size PC 12安装完成后开始Windows CE Platform SDK (Pocket PC )的安装(见图1216)
图1211 点击setupexe开始安装,点击Next按钮
图1212 选择需要安装的组件选择后点击"Next"按钮
图1213 选择相应安装组件或选择"Select All",然后点击"Continue"按钮
图1214 开始安装Windows CE Platform SDK (H/PC Pro)
图1215 准备开始安装Windows CE Platform SDK (Palm-size PC 12)
图1216 准备开始安装Windows CE Platform SDK (Pocket PC)
122 Microsoft eMbedded Tools 30简介
Microsoft eMbedded Visual C++ 30是微软公司为开发Windows CE应用程序而专门开发的一个集成开发环境利用这个集成开发环境,可以快速开发出具体的应用程序它与Microsoft Visual C++一样,都是功能强大,应用灵活的开发工具,界面也很相似与Visual C++60不同的是Microsoft eMbedded Visual C++ 30不支持多文档界面,不支持非32位的函数,其它Windows下面的 API函数不一定支持,只支持Unicode字符,除此之外,它的编译和调试选项也是不一样的,见图1221
由于在Windows CE系统下运行的程序,不仅同设备类型有关,还同具体设备的CPU类型有关,不同的CPU类型,需要不同的编译代码,因此在编码和调试过程中,要注意选择对应的设备类型,CPU类型和运行环境
123 Windows CE Tools 30简介
Windows CE Tools 30的安装主要是为了安装嵌入式开发的模拟环境,让开发的程序如同在相应的嵌入式设备上一样调试和运行它是一个开放的可扩展的32位 *** 作系统
Windows CE针对不同的windows应用平台提供了不同的模拟器系统,如Pocket PC emulation针对Pocket PC ,CH/PC Pro emulation针对CH/PC Pro,Palm-size PC 12 emulation针对Palm-size PC 12,他们的界面如图1231,图1232,图1233所示
Windows CE给程序开发者提供了与Microsoft Win32API,ActiveX控制,信息队列机制(MSMQ),对象组件模型(COM),动态模板库(ATL),MFC库相似的环境,同时Windows CE还提供了一种同步设备ActiveSync,无论对串行式通信,红外线接口通信或是网络线路的通信都提供台式设备与嵌入式设备连接上的方便
图1231 Palm-size PC 12模拟器界面 图1231 Pocket PC模拟器界面
图1233 H/PC Pro模拟器界面
124运行环境
对一个嵌入式应用程序来讲,其主要目的是为了应用,因此只有在最终的运行环境下,它才能发挥它的一些功能的作用运行环境包括了软件环境和硬件环境软件环境包括了Windows CE(V30或者其升级版本,如Windows CE,硬件环境如Palm Size PC,Handheld PC Pro(H/PC Pro),Pocket PC等掌上电脑嵌入式设备,内存需求为16M及其相匹配的设备,如GPS终端等
第二章 hmap控件及其相关设置
21 hmap控件简介
hMap(Hand Map)是基于COM模型的嵌入式GIS(Embedded GIS)开发平台随着移动信息设备(MID)的发展,GIS逐步进入后PC发展阶段,嵌入式GIS应用不断增加,迫切需要基础性开发平台,hMap是满足这一市场需求的基础性软件,利用它可以为移动信息设备快速地开发和构建各种GIS/GPS/RS应用系统,如PDA上的GIS应用和卫星导航终端应用等
22 数据准备
221 数据格式
hMap具有精练的内核和极高的浏览速度,高效的数据压缩比,有效解决了地图数据量与各种移动信息设备存储空间有限的矛盾,在PDA上采用DS3的压缩格式,占用的存储空间更小,有效地解决PDA设备普遍的相对内存较小的问题,系统能够更加稳定快速地运行采集后的数据可转成电力自动化管理软件的标准格式Hmap的数据包含了两种类型的数据:不可修改数据和可修改数据,在hMap中将他们分别放入各自的数据层中,各自管理相应类型的数据
数据类型
层内数据存储格式
是否可编辑
是否进行内存缓冲
不可修改
SP3
DB3
SPX
否
否
图形文件
属性文件
索引文件
可修改
DS3
DB3
是
是
图形文件
属性文件
222 数据目录设置
将数据拷贝到wce300\MS Pocket PC\emulation\palm300\My Documents目录下
23 通用字符串类型环境
Windows CE是基于Unicode的 *** 作系统,Windows NT和Windows 2000同时支持Unicode和ANSI,而Windows 9x则是基于ANSI的 *** 作系统考虑到这一情况,基于hMap的程序开发既不能使用LPWSTR之类的Unicode字符串类型,因为Windows 9x不支持;也不能使用char, LPSTR之类的ANSI字符串类型,因为Windows CE不支持所以必须使用通用字符串类型通用字符串类型是根据目标 *** 作系统的不同,在编译程序时映射为正确的字符集(ANSI或Unicode)的宏这些可以使用的字符串类型包括:TCHAR,TCHAR,LPTSTR,LPCTSTR当然,也可以使用MFC CString类程序中的硬代码字符串必须包含在TEXT宏,L宏或者_T宏中与此同时,还需要选用正确的RTL(运行时库)字符串处理函数,而不能使用ANSI或者Unicode的函数
24 控件类库文件设置和库编译文件设置
241 控件类库文件设置
当新建了一个基于控件的工程后,要使用控件hmap,必须将控件的hmaph,hmapwndh,hmapcpp,hmapwndcpp拷贝到刚建立的工程目录下,然后将其引入到工程中,以便能使用控件的相应功能,具体使用见下面的基于hMap开发示范工程一章
242 库编译文件设置
应用程序的编译和调试运行需要连接动态库,不管是Debug版还是Release版均需要mfcce300dll,olece300dll这两个动态链接库文件(两个文件中的"300"代表对应的WindowsCE的版本),因此需要设置这两个文件的目录,方法有如下两种:
1)将mfcce300dll,olece300dll两个文件拷贝到如下路径的目录下:\Windows CE Tools\wce300\MS Pocket PC\emulation\ palm300\windows即完成设置
2)在建立了新的工程后,直接编译工程,这时Microsoft eMbedded Visual C++会自动搜寻并连接两个文件,即完成设置
25 控件注册
控件在使用之前必须被编译环境应用,因此需进行hmap控件的注册,方式如下:
将hmapocx拷贝如下路径的目录下:\Windows CE Tools\wce300\MS Pocket PC\emulation\ palm300\windows
在同一目录下搜索regsvrceexe文件,运行后d出注册窗口(见图231)
填入hmapocx,Action选项选择"Register",软后点击"ok",如果注册成功则d出注册成功窗口(见图232),否则d出出错窗口(见图233),检查后重新注册即可
图231 注册窗口
图233 注册失败
图232 控件成功注册
第三章 基于hMap的示例工程开发
了解了以上一些基本的开发环境和相关的设置之后,我们来进行具体工程的开发以此来对基于hMap的开发有一个更清晰的理解
31 实现功能
演示如何打开设置好的地图,如何进行放大,缩小,漫游,退出等基本功能 *** 作
32 具体工程范例
首先,我们将创建一个新的工程,然后实现基本的 *** 作功能
321 工程创建
启动eMbedded Visual C++ 30,选择File/new,d出"new"对话框(见图3211)键入工程存储路径"D:\work\"和工程名MapZoom,点击"OK"按钮
在step1选择单文档和语言设置,点击"Next"按钮(见图3212)
在step2选择上ActiveX Controls,点击"Next"按钮(见图3213)
然后在余下的几步中选择默认设置(见图3214~图3215),工程创建完毕
在创建好的工程中进行WCE configulation设置(设置见图3216),编译工程使其自动链接mfcce300dll,olece300dll或者按照第二章的252节进行设置
6)引入hmap类库文件到工程中(见图3216~图3218), 将hmaph,hmapwndh,hmapcpp,hmapwndcpp拷贝到刚建立的工程目录下,然后将其引入到工程中 要使用这四个文件中的相应功能,必须按照323节中进行头文件的包含
到此,一个基于hmap开发的新的工程建立成功可以按照下一节的步骤实现基本功能 *** 作
图3211 设置工程路径和工程名
图3212 选择单文档
图3213 源文件和MFC库设置
图3214 创建的类
图3215 点击"OK"工程创建完毕
图3216 WCE configulation设置
图3216 控件类库文件类库文件引入
图3217 选择要引入的文件
图3218 文件引入后的Workspace栏
322 数据和控件设置
将例子数据整个数据文件夹(wuhan)及控件hmapocx按照第二章中23节和24节的方式进行拷贝和注册
323 头文件添加与控件对象创建
1,在stdafxh后部中添加
#include "hmaph"
#include "hmapwndh"
2,在MapZoomViewh中添加
#include "hmapwndh"
3,在MapZoomViewh中声明
// Implementation
_DHMap m_hMapCtl; //声明对象
UINT m_nCurTool;//定义光标
4,在Resourceh中定义对象IDC_hMapCtl的ID值:
IDC_hMapCtl ×××
("×××"代表ID值,它依据Resourceh中的ID列表设置)
5,在MapZoomViewcpp中创建控件对象
int CMapZoomView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
//创建hmap控件
CRect rectClient;
GetClientRect(&rectClient);
if (!m_hMapCtlCreate(_T("hello"), WS_VISIBLE,
rectClient, this, IDC_hMapCtl,NULL,FALSE,NULL))
{
DestroyWindow();
return FALSE;
}
return 0;
}
创建方法是Class Wizard-Objects ID\CMPDAView-Messages\WM_CREATE-Member -functions\W OnCreate然后编辑代码,添加如下代码:
//创建hmap控件
CRect rectClient;
GetClientRect(&rectClient);
if (!m_hMapCtlCreate(_T("hello"), WS_VISIBLE,
rectClient, this, IDC_hMapCtl,NULL,FALSE,NULL))
{
DestroyWindow();
return FALSE;
}
这些代码就可以了
以上使控件对象的定义和创建,下面几个小节将实现基本功能
324 基本功能实现
3241 退出功能实现
增加退出菜单按钮,直接将 退出的ID设置为ID_APP_EXIT就可以了
菜单项增加步骤如下:
在Workspace中打开ResourceView标签窗口,选择Menubar中的IDR_MAINFRAME,并鼠标双击它(见图32311)
在右边的工作区下部有菜单创建栏显示,双击空白菜单项,d出Menu Item Properties窗口(见图32312)
在General标签项填入ID和Caption项(ID:ID_APP_EXIT Caption :Exit)(见图32313)
关闭Menu Item Properties窗口,Exit菜单项创建完毕(见图32314)
图32311 Workspace中ResourceView标签窗口
图32312 Menu Item Properties窗口
图32313 填写ID和Caption
图32314 创建号的Exit菜单项
3242 打开地图功能实现
菜单创建:创建方法同3241节中菜单项增加步骤,不同之处在将第三步的ID和Caption项,他们为ID:ID_ZOOM_OPENMAP Caption :Openmap
方法响应:Class Wizard-Objects ID\IDR_FILE_OPENMAP-Messages\CAMMNDd出对话框点OK(如果已经有了函数则在Member functions中会有函数兰色显示或自己选择已经存在的函数)然后在MapZoomViewcpp中编辑代码:
//打开地图
void CMapZoomView::OnZoomOpenmap()
{
CWaitCursor wait; //Do the lengthProcessing
waitRestore(); //Restore the Wait cursor
IEmLayers layers(m_hMapCtlGetLayers());
//lyrriverSetGeoDataset(TEXT("\\My Documents\\xiamen\\水系ds3"));
{
IEmMapLayer lyr;
lyrCreateDispatch(TEXT("hMapMapLayer"));
lyrSetGeoDataset(TEXT("\\My Documents\\Wuhan\\背景ds3"));
layersAdd(lyr);
}
{
IEmMapLayer lyr;
lyrCreateDispatch(TEXT("hMapMapLayer"));
lyrSetGeoDataset(TEXT("\\My Documents\\Wuhan\\道路ds3"));
layersAdd(lyr);
}
IEmRectangle emRect(m_hMapCtlGetFullExtent());
emRectScaleRectangle(03);
m_hMapCtlSetExtent(emRect);
}
3243 放大功能实现
菜单创建:创建方法同3241节中菜单项增加步骤,不同之处在将第三步的ID和Caption项,他们为ID:ID_ZOOM_ZOOMIN Caption :Zoomin
方法响应:Class Wizard-Objects ID\IDR_FILE_ Zoomin-Messages\CAMMNDd出对话框点OK(如果已经有了函数则在Member functions中会有函数兰色显示或自己选择已经存在的函数)然后在MapZoomViewcpp中编辑代码:
void CMapZoomView::OnZoomZoomin()
{
IAwryRectangle emRect(m_hMapCtlGetAwryExtent());
emRectScaleReactangle(06);
m_hMapCtlSetAwryExtent(emRect);
}
它实质上是将CMapZoomView::OnZoomOpenmap()中的最后三行代码改写
3244 缩小功能实现
菜单创建:创建方法同3241节中菜单项增加步骤,不同之处在将第三步的ID和Caption项,他们为ID:ID_ZOOM_ZOOM OUT Caption :Zoomout
方法响应:与放大功能实现相似在MapZoomViewcpp中编辑代码
void CMapZoomView::OnZoomZoomout()
{
IAwryRectangle emRect(m_hMapCtlGetAwryExtent());
emRectScaleReactangle(15);
m_hMapCtlSetAwryExtent(emRect);
}
3245 漫游功能实现
菜单创建:创建方法同3241节中菜单项增加步骤,不同之处在将第三步的ID和Caption项,他们为ID:ID_ZOOM_ZOO MPAN Caption :Pan
方法函数响应:需要响应事件,要添加响应事件的函数(对每个事件来讲都需要增加响应事件的函数)
在MapZoomViewh中增加一个声明
class CMapZoomView: public CView
{
……
protected:
……
//响应事件
afx_msg void OnEmMouseDown(OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
DECLARE_EVENTSINK_MAP()
};
在CMapZoomViewcpp加入如下代码
//响应事件
#define DISPID_EMMOUSEDOWN 6L
BEGIN_EVENTSINK_MAP(CMapZoomView, CView)
ON_EVENT(CMapZoomView, IDC_hMapCtl, DISPID_EMMOUSEDOWN, OnEmMouseDown, VTS_XPOS_PIXELS VTS_YPOS_PIXELS)
END_EVENTSINK_MAP()
在CMapZoomViewcpp定义OnZoomPan
void CMapZoomView::OnZoomPan()
{
m_nCurTool = 1;//给出漫游的状态
}
在CMapZoomViewcpp定义OnEmMouseDown事件
//响应事件
void CMapZoomView::OnEmMouseDown(OLE_XPOS_PIXELS x,
OLE_YPOS_PIXELS y)
{
if(m_nCurTool == 1)
m_hMapCtlPan();
}
到此,你已经能够运用EVC工具进行简单的基于hMap的嵌入式开发,实现比较简单的功能,当然随着学习的深入,你将会发现hMap强大而神奇的功能
第四章 地图查询
鉴于地图查询功能比第三章的基本功能重要且复杂,本入门中将地图查询作为单独一章对它加以介绍
地图查询包括了图形属性和属性查询
图形到属性的查询包括:点查询,矩形查询,多边形查询,圆形查询等
属性到图形的查询主要是模糊查询
41 属性查询
调用层中的接口SearchExpression,返回记录集
例如:
IemLayer lyr;
lyrSearchExpression(expression)
expression = "NAME = 红杉" 或
expression = "NAME like 红杉"
42 图形查询
相应MouseDown事件得到一个点,线,面,矩形,圆(多边形表示)等图形对象
调用hmap中的TrackLine,TrackRectangle,TrackCircle,TrackPolygon
调用层中的接口SearchShape(步骤1中得到的图形对象),返回记录集
例如:
//矩形查找
void RectQuery(_DHMap& hMapCtl, CMapSelection& ASelection)
{
IEmLayers layers(hMapCtlGetLayers());
IEmRectangle emRect(hMapCtlTrackRectangle());
if(emRectm_lpDispatch == NULL)
{
hMapCtlRefreshNoRedraw();
return;
}
HMAPSELECTED selectObject;
for(int i = 0; i < layersGetCount();i++)
{
IEmMapLayer lyr(layersItem(COleVariant((short)i)));
LPDISPATCH pIUnknown = lyrSearchShape(emRect, TEXT(""));
if(pIUnknown == NULL)
continue;
IRecordset recs(pIUnknown);
long nNameFieldIndex = recsGetFieldIndex(TEXT("NAME"));
if(nNameFieldIndex 0)
ASelectionAdd(selectObject);
}
}
hMapCtlRefreshNoRedraw();
}
第五章 常见问题
51 问:Microsoft eMbedded Visual Tools 30到底是什么
答:eMbedded Visual Tools 30是一套供嵌入式开发商在Microsoft Windows CE *** 作系统上面向新一代32位设备编写软件应用程序的相关工具它提供了Microsoft eMbedded Visual C++ 30开发系统完全版,Microsoft eMbedded Visual Basic 30开发系统完全版,SDK,远程工具及相关文档
52 问:eMbedded Visual Tools 30可面向哪些微处理器提供支持
答:eMbedded Visual C++提供了针对下列微处理器类型的编译器:ARM720,SA1100,MIPS,MIPS16,MIPSFP,PPC,SH3,SH4,THUMB,x86,x86设备模拟器
53 问:eMbedded Visual Tools 30是否支持模拟 *** 作
答:是的不过,只有在运行于Microsoft Windows 2000 Professional或Microsoft Windows NT Workstation 40之下时才会支持模拟 *** 作
54 问:是否可在Windows 98或Windows 98 第二版下运行eMbedded Visual Tools 30
答:eMbedded Visual Tools 30无法安装在Windows 98之下在运行于Windows 98 Second Edition平台上时,将无法执行模拟 *** 作;但具备其它功能
55 问:哪里可以得到eMbeddedVisual Tools30
答:访问Microsoft Developer's Toolbox site
下载网址:>
这是比较典型的MFC封装问题。
实际上,在到达文档类的OnOpenDocument的时候,大部分之前的关联、文件对话框的工作已经做完了,而函数的参数,实际就是CFileDialog获取到的文件名。
封装的过程比较复杂,都是在MFC的基类代码中实现的(大部分为开源,可以在安装目录找到),处理关联是在APP基类,处理绑定是在文档模板类(注意不是文档类),处理工具条消息响应是在框架类基类。这些处理过程,除了模板类的只能完全替换,其它的都可以通过重载来定制。
而你说的“LPCTSTR lpcPathName这个参数我并没有定义它到哪个位置”,描述并不准确。参数是不需要提前进行定义的,只是传递的过程是封装在模板类中。
打开VC程序——文件——新建——工程中的MFC AppWizard(exe),在工程下面的框中输入工程名(假定工程名为111),点确定——选多重文档,点下一个——后面都点下一个直到完成确定,基本框架就完成了,下面就加代码。
这时VC界面上左边框的下面有三个按钮:ClassView、ResourceView和FileView,ClassView里面是工程111的类:CAdoutDlg、CChildFrame、CMy111App、CMy111Doc、CMy111View和Globals;点ResourceView里面是资源类:Accelerator、Dialog、Icon、Menu、String Table、Toolbar和Version;点开FileView里面是文件类:Source File、Header Files、Resource Files和ReadMetxt。
点界面的“工程”按钮——添加工程——新建——选C++ Source File,在文件下面的框里输入文件名(如DIBAPI),点“结束”,这样在FileView中的Source Files里面就多了一个DIBAPIcpp文件,所有的代码都加在该文件中。再点界面的“工程”按钮——添加工程——新建——选C/C++ Header File,在文件下面的框里输入文件名(和前面的文件名必须一致),点“结束”,这样在FileView中的Header Files里面就多了一个DIBAPIh文件,该文件是DIBAPIcpp的头文件。
点开DIBAPIh文件,里面是空白的,把如下代码考入文件中:
//DIBAPIh
#ifndef _INC_DIBAPI
#define _INC_DIBAPI
DECLARE_HANDLE(HDIB);
#define PALVERSION 0x300
#define IS_WIN30_DIB(lpbi) (((LPDWORD)(lpbi))==sizeof(BITMAPINFOHEADER))
#define RECTWIDTH(lpRect) ((lpRect)->right-(lpRect)->left)
#define RECTHEIGHT(lpRect) ((lpRect)->bottom-(lpRect)->top)
#define WIDTHBYTES(bits) (((bits)+31)/324)
#define DIB_HEADER_MARKER ((WORD)('M'<<8)|'B')
BOOL WINAPI PaintDIB(HDC,LPRECT,HDIB,LPRECT,CPalette pPal);
BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette cPal);
LPSTR WINAPI FindDIBBits(LPSTR lpbi);
DWORD WINAPI DIBWidth(LPSTR lpDIB);
DWORD WINAPI DIBHeight(LPSTR lpDIB);
WORD WINAPI PaletteSize(LPSTR lpbi);
WORD WINAPI DIBNumColors(LPSTR lpbi);
HGLOBAL WINAPI CopyHandle(HGLOBAL h);
BOOL WINAPI SaveDIB(HDIB hDib,CFile& file);
HDIB WINAPI ReadDIBFile(CFile& file);
//在此处输入自己的函数声明
#endif//!_INC_DIBAPI
上面这些函数是实现图像的读取、存储等图像处理的基本功能的,你将自己需要的函数也输入到“//在此处输入自己的函数声明”的下面。
点开DIBAPIcpp文件,里面是空白的,将如下代码加入其中:
//DIBAPIcpp
#include "stdafxh"
#include "DIBAPIh"
WORD WINAPI DIBNumColors(LPSTR lpbi)
{
WORD wBitCount;
if(IS_WIN30_DIB(lpbi))
{
DWORD dwClrUsed;
dwClrUsed=((LPBITMAPINFOHEADER)lpbi)->biClrUsed;
if(dwClrUsed)
return (WORD)dwClrUsed;
}
if(IS_WIN30_DIB(lpbi))
wBitCount=((LPBITMAPINFOHEADER)lpbi)->biBitCount;
else
wBitCount=((LPBITMAPCOREHEADER)lpbi)->bcBitCount;
switch(wBitCount)
{
case 1:
return 2;
case 4:
return 16;
case 8:
return 256;
default:
return 0;
}
}
WORD WINAPI PaletteSize(LPSTR lpbi)
{
if(IS_WIN30_DIB(lpbi))
return (WORD)(DIBNumColors(lpbi)sizeof(RGBQUAD));
else
return (WORD)(DIBNumColors(lpbi)sizeof(RGBTRIPLE));
}
LPSTR WINAPI FindDIBBits(LPSTR lpbi)
{
return (lpbi+(LPDWORD)lpbi+::PaletteSize(lpbi));
}
DWORD WINAPI DIBWidth(LPSTR lpDIB)
{
LPBITMAPINFOHEADER lpbmi;
LPBITMAPCOREHEADER lpbmc;
lpbmi=(LPBITMAPINFOHEADER)lpDIB;
lpbmc=(LPBITMAPCOREHEADER)lpDIB;
if(IS_WIN30_DIB(lpDIB))
return lpbmi->biWidth;
else
return (DWORD)lpbmc->bcWidth;
}
DWORD WINAPI DIBHeight(LPSTR lpDIB)
{
LPBITMAPINFOHEADER lpbmi;
LPBITMAPCOREHEADER lpbmc;
lpbmi=(LPBITMAPINFOHEADER)lpDIB;
lpbmc=(LPBITMAPCOREHEADER)lpDIB;
if(IS_WIN30_DIB(lpDIB))
return lpbmi->biHeight;
else
return (DWORD)lpbmc->bcHeight;
}
BOOL WINAPI PaintDIB(HDC hDC,LPRECT lpDCRect,HDIB hDIB,LPRECT lpDIBRect,CPalette pPal)
{
LPSTR lpDIBHdr;
LPSTR lpDIBBits;
BOOL bSuccess=FALSE;
HPALETTE hPal=NULL;
HPALETTE hOldPal=NULL;
if(hDIB==NULL)
return FALSE;
lpDIBHdr=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
lpDIBBits=FindDIBBits(lpDIBHdr);
if(pPal!=NULL)
{
hPal=(HPALETTE)pPal->m_hObject;
hOldPal=::SelectPalette(hDC,hPal,TRUE);
}
::SetStretchBltMode(hDC,COLORONCOLOR);
if((RECTWIDTH(lpDCRect)==RECTWIDTH(lpDIBRect))&&(RECTHEIGHT(lpDCRect)==RECTHEIGHT(lpDIBRect)))
{
bSuccess=::SetDIBitsToDevice(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\
(int)DIBHeight(lpDIBHdr)-lpDIBRect->top-RECTHEIGHT(lpDIBRect),0,(WORD)DIBHeight(lpDIBHdr),\
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS);
}
else
{
bSuccess=::StretchDIBits(hDC,lpDCRect->left,lpDCRect->top,RECTWIDTH(lpDCRect),RECTHEIGHT(lpDCRect),lpDIBRect->left,\
lpDIBRect->top,RECTWIDTH(lpDIBRect),RECTHEIGHT(lpDIBRect),\
lpDIBBits,(LPBITMAPINFO)lpDIBHdr,DIB_RGB_COLORS,SRCCOPY);
}
::GlobalUnlock((HGLOBAL)hDIB);
if(hOldPal)
::SelectPalette(hDC,hOldPal,TRUE);
GlobalUnlock(hDIB);
return bSuccess;
}
BOOL WINAPI CreateDIBPalette(HDIB hDIB,CPalette pPal)
{
LPLOGPALETTE lpPal;
HANDLE hLogPal;
HPALETTE hPal=NULL;
LPSTR lpbi;
LPBITMAPINFO lpbmi;
LPBITMAPCOREINFO lpbmc;
BOOL bWinStyleDIB;
int i;
WORD wNumColors;
BOOL bResult=FALSE;
if(hDIB==NULL)
return FALSE;
lpbi=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
lpbmi=(LPBITMAPINFO)lpbi;
lpbmc=(LPBITMAPCOREINFO)lpbi;
wNumColors=DIBNumColors(lpbi);
bWinStyleDIB=IS_WIN30_DIB(lpbi);
if(wNumColors!=0)
{
hLogPal=::GlobalAlloc(GHND,sizeof(LOGPALETTE)+sizeof(PALETTEENTRY)wNumColors);
if(hLogPal==0)
{
::GlobalUnlock((HGLOBAL)hDIB);
return FALSE;
}
lpPal=(LPLOGPALETTE)::GlobalLock(hLogPal);
lpPal->palVersion=PALVERSION;
lpPal->palNumEntries=(WORD)wNumColors;
bWinStyleDIB=IS_WIN30_DIB(lpbi);
for(i=0;i<(int)wNumColors;i++)
{
if(bWinStyleDIB)
{
lpPal->palPalEntry[i]peRed=lpbmi->bmiColors[i]rgbRed;
lpPal->palPalEntry[i]peGreen=lpbmi->bmiColors[i]rgbGreen;
lpPal->palPalEntry[i]peBlue=lpbmi->bmiColors[i]rgbBlue;
lpPal->palPalEntry[i]peFlags=0;
}
else
{
lpPal->palPalEntry[i]peRed=lpbmc->bmciColors[i]rgbtRed;
lpPal->palPalEntry[i]peGreen=lpbmc->bmciColors[i]rgbtGreen;
lpPal->palPalEntry[i]peBlue=lpbmc->bmciColors[i]rgbtBlue;
lpPal->palPalEntry[i]peFlags=0;
}
}
bResult=pPal->CreatePalette(lpPal);
::GlobalUnlock((HGLOBAL)hLogPal);
::GlobalFree((HGLOBAL)hLogPal);
}
::GlobalUnlock((HGLOBAL)hDIB);
return bResult;
}
HGLOBAL WINAPI CopyHandle(HGLOBAL h)
{
if(h==NULL)
return NULL;
DWORD dwLen=::GlobalSize((HGLOBAL)h);
HGLOBAL hCopy=::GlobalAlloc(GHND,dwLen);
if(hCopy!=NULL)
{
void lpCopy=::GlobalLock((HGLOBAL)hCopy);
void lp=::GlobalLock((HGLOBAL)h);
memcpy(lpCopy,lp,dwLen);
::GlobalUnlock(hCopy);
::GlobalUnlock(h);
}
return hCopy;
}
BOOL WINAPI SaveDIB(HDIB hDib,CFile& file)
{
BITMAPFILEHEADER bmfHdr;
LPBITMAPINFOHEADER lpBI;
DWORD dwDIBSize;
if(!hDib)
return FALSE;
lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib);
if(lpBI==NULL)
return FALSE;
if(!IS_WIN30_DIB(lpBI))
{
::GlobalUnlock((HGLOBAL)hDib);
return FALSE;
}
bmfHdrbfType=DIB_HEADER_MARKER;
dwDIBSize=(LPDWORD)lpBI+::PaletteSize((LPSTR)lpBI);
if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4))
dwDIBSize+=lpBI->biSizeImage;
else
{
DWORD dwBmBitsSize;
dwBmBitsSize=WIDTHBYTES((lpBI->biWidth)((DWORD)lpBI->biBitCount))lpBI->biHeight;
dwDIBSize+=dwBmBitsSize;
lpBI->biSizeImage=dwBmBitsSize;
}
bmfHdrbfSize=dwDIBSize+sizeof(BITMAPFILEHEADER);
bmfHdrbfReserved1=0;
bmfHdrbfReserved2=0;
bmfHdrbfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+::PaletteSize((LPSTR)lpBI);
TRY
{
fileWrite((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER));
fileWriteHuge(lpBI,dwDIBSize);
}
CATCH(CFileException,e)
{
::GlobalUnlock((HGLOBAL)hDib);
THROW_LAST();
}
END_CATCH
::GlobalUnlock((HGLOBAL)hDib);
return TRUE;
}
HDIB WINAPI ReadDIBFile(CFile& file)
{
BITMAPFILEHEADER bmfHeader;
DWORD dwBitsSize;
HDIB hDIB;
LPSTR pDIB;
dwBitsSize=fileGetLength();
if(fileRead((LPSTR)&bmfHeader,sizeof(bmfHeader))!=sizeof(bmfHeader))
return NULL;
if(bmfHeaderbfType!=DIB_HEADER_MARKER)
return NULL;
hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize);
if(hDIB==0)
return NULL;
pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
if(fileReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!=dwBitsSize-sizeof(BITMAPFILEHEADER))
{
::GlobalUnlock((HGLOBAL)hDIB);
::GlobalFree((HGLOBAL)hDIB);
return NULL;
}
::GlobalUnlock((HGLOBAL)hDIB);
return hDIB;
}
//在此处输入自己的函数定义
上面是DIBAPIh头文件中声明的函数的定义,你将自己的函数定义加到“//在此处输入自己的函数定义”后面。
下面加相应的消息映射函数,点Ctrl+W键,会出现MFC ClassWizard对话框,点Message Maps,在Class name下面的框中选择CMy111Doc,在Messages里面选中OnOpenDocument,然后点击Add Function按钮就加入了相应的消息映射函数,同样的方法以此加入OnSaveDocument、DeleteContents、CanCloseFrame相应的消息函数,点“确定”即可。
点开111Doccpp文件,里面有相应的消息映射函数定义位置,在函数CMy111Doc::CMy111Doc()里输入以下代码:
m_refColorBKG=0x00808080;
m_hDIB=NULL;
m_palDIB=NULL;
m_sizeDoc=CSize(1,1);
在函数CMy111Doc::~CMy111Doc()里输入以下代码:
if(m_hDIB!=NULL)
::GlobalFree((HGLOBAL)m_hDIB);
if(m_palDIB!=NULL)
delete m_palDIB;
在函数BOOL CMy111Doc::OnOpenDocument(LPCTSTR lpszPathName)里/ TODO: Add your specialized creation code here下面添加如下代码:
CFile file;
CFileException fe;
if(!fileOpen(lpszPathName,CFile::modeRead|CFile::shareDenyWrite,&fe))
{
ReportSaveLoadException(lpszPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
return FALSE;
}
DeleteContents();
BeginWaitCursor();
TRY
{
m_hDIB=::ReadDIBFile(file);
}
CATCH(CFileException,eLoad)
{
fileAbort();
EndWaitCursor();
ReportSaveLoadException(lpszPathName,eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
m_hDIB=NULL;
return FALSE;
}
END_CATCH
InitDIBData();
EndWaitCursor();
if(m_hDIB==NULL)
{
CString strMsg;
strMsg="读取图像时出错!可能是不支持该类型的图像文件!";
MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);
return FALSE;
}
SetPathName(lpszPathName);
SetModifiedFlag(FALSE);
在函数BOOL CMy111Doc::OnSaveDocument(LPCTSTR lpszPathName)里// TODO: Add your specialized code here and/or call the base class后面添加如下代码:
CFile file;
CFileException fe;
if(!fileOpen(lpszPathName,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe))
{
ReportSaveLoadException(lpszPathName,&fe,TRUE,AFX_IDP_INVALID_FILENAME);
return FALSE;
}
BOOL bSuccess=FALSE;
TRY
{
BeginWaitCursor();
bSuccess=::SaveDIB(m_hDIB,file);
fileClose();
}
CATCH(CException,eSave)
{
fileAbort();
EndWaitCursor();
ReportSaveLoadException(lpszPathName,eSave,TRUE,AFX_IDP_FAILED_TO_SAVE_DOC);
return FALSE;
}
END_CATCH
EndWaitCursor();
SetModifiedFlag(FALSE);
if(!bSuccess)
{
CString strMsg;
strMsg="无法保存BMP图像";
MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);
}
点开ClassView,右键点击CMy111Doc类,点Add Member Variable出现添加成员变量对话框,在Variable Type下的框中输入变量类型名HDIB,在Variable Name中输入变量名m_hDIB,在Access中选中Public就在CMy111Doc中加入了公共成员变量m_hDIB;同样加入int类型的m_nColorIndex、COLORREF类型的m_refColorBKG公共成员变量,再添加保护成员变量(在Access中选中Protected)CSize类的m_sizeDoc、CPalette类的m_palDIB变量。右键点击CMy111Doc类,点Add Member Function出现添加成员函数对话框,在Function Type下的框中输入函数类型名void,在Function Declaration中输入函数名InitDIBData(),在Access中选中Public就在CMy111Doc中加入了公共成员函数InitDIBData();同样方法加入void类型的公共成员函数ReplaceHDIB(HDIB hDIB)。在111Doccpp中加入函数的代码,InitDIBData()里加如下代码:
if(m_palDIB!=NULL)
{
delete m_palDIB;
m_palDIB=NULL;
}
if(m_hDIB==NULL)
return;
LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB);
if(::DIBWidth(lpDIB)>INT_MAX||::DIBHeight(lpDIB)>INT_MAX)
{
::GlobalUnlock((HGLOBAL)m_hDIB);
::GlobalFree((HGLOBAL)m_hDIB);
m_hDIB=NULL;
CString strMsg;
strMsg="BMP图像太大!";
MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);
return;
}
m_sizeDoc=CSize((int)::DIBWidth(lpDIB),(int)::DIBHeight(lpDIB));
::GlobalUnlock((HGLOBAL)m_hDIB);
m_palDIB=new CPalette;
if(m_palDIB==NULL)
{
::GlobalFree((HGLOBAL)m_hDIB);
m_hDIB=NULL;
return;
}
if(::CreateDIBPalette(m_hDIB,m_palDIB)==NULL)
{
delete m_palDIB;
m_palDIB=NULL;
return;
}
在函数ReplaceHDIB(HDIB hDIB)中加入如下代码:
if(m_hDIB!=NULL)
::GlobalFree((HGLOBAL)m_hDIB);
m_hDIB=hDIB;
在CMy111doch的
// Attributes
public:
下面加入如下代码:
HDIB GetHDIB() const
{
return m_hDIB;
}
CPalette GetDocPalette() const
{
return m_palDIB;
}
CSize GetDocSize() const
{
return m_sizeDoc;
}
注意要在111Doch前加上#include "DIBAPIh"语句(在class CMy111Doc:public CDocument语句前)
下面为CMy111View中的函数 void CMy111View::OnDraw(CDC pDC)中添加如下代码:
BeginWaitCursor();
CMy111 pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
HDIB hDIB=pDoc->GetHDIB();
if(hDIB!=NULL)
{
LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
int cxDIB=(int)::DIBWidth(lpDIB);
int cyDIB=(int)::DIBHeight(lpDIB);
::GlobalUnlock((HGLOBAL)hDIB);
CRect rcDIB;
rcDIBtop=rcDIBleft=0;
rcDIBright=cxDIB;
rcDIBbottom=cyDIB;
CRect rcDest;
if(pDC->IsPrinting())
{
int cxPage=pDC->GetDeviceCaps(HORZRES);
int cyPage=pDC->GetDeviceCaps(VERTRES);
int cxInch=pDC->GetDeviceCaps(LOGPIXELSX);
int cyInch=pDC->GetDeviceCaps(LOGPIXELSY);
rcDesttop=rcDestleft=0;
rcDestbottom=(int)(((double)cyDIBcxPagecyInch)/((double)cxDIBcxInch));
rcDestright=cxPage;
int temp=cyPage-(rcDestbottom-rcDesttop);
rcDestbottom+=temp/2;
rcDesttop+=temp/2;
}
else
{
rcDest=rcDIB;
}
::PaintDIB(pDC->m_hDC,&rcDest,pDoc->GetHDIB(),&rcDIB,pDoc->GetDocPalette());
}
EndWaitCursor();
以上是关于图像打开、显示、保存的有关步骤和代码。
在111cpp文件的InitInstance()函数的ParseCommandLine(cmdInfo);语句下输入语句
cmdInfom_nShellCommand = CCommandLineInfo::FileNothing;
则启动时不自动打开一个空文档。
private void btn_Login_Click(object sender, EventArgs e)
{
try
{
//把窗体文本设置为正在验证
thisText = "正在验证";
//设置鼠标状态为忙碌
thisCursor = SystemWindowsFormsCursorsWaitCursor;
//构造sql语句查处用户名为 txtUserNameText的文本名
string sqlStr = "";
sqlStr = "select userPassword,userPurview from tbl_User where UserName='"
+ txtUserNameTextTrim() + "'";
//实例化DataSet对象
DataSet myDataset = new DataSet();
//创建数据适配器对象用来链接数据库
SqlDataAdapter adapter = new SqlDataAdapter(sqlStr, sqlConnection1);
//将取得的数据放到dataset中
adapterFill(myDataset, "tabel1");
//如果找到符合记录的数据符合密码 表示认证成功
if (myDatasetTables[0]Rows[0]ItemArray[0]ToString() ==
txtUserPasswordTextTrim())
{
//实例化新窗体
frmMain ob_FrmMain = new frmMain();
//CShared对象
CShareduserInfo[0] = txtUserNameTextTrim();
CShareduserInfo[1] = myDatasetTables[0]Rows[0]ItemArray[1]ToString();
thisCursor = SystemWindowsFormsCursorsArrow;
//显示新窗口
ob_FrmMainShow();
//隐藏当前窗口
thisHide();
}
else
{
//用户名密码错误处理
MessageBoxShow("用户名或密码错误,请重新输入!");
thisCursor = SystemWindowsFormsCursorsArrow;
txtUserNameText = "";
txtUserPasswordText = "";
txtUserNameFocus();
}
}
catch
{
MessageBoxShow("用户名或者密码错误");
}
}
以上就是关于请问这两个连接数据库有什么区别全部的内容,包括:请问这两个连接数据库有什么区别、HMAP是什么、MFC中文档类的 OnOpenDocument是怎样打开文件的呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)