注:本工程是在地图基本操作工程MapOperation基础上进行的查询,它的一些实现步骤和MapOperation相同,故这里只简要介绍实现步骤和对应的实现方法,详细内容参见工程源码,源码中都有详细的注释。 |
1、新建一个单文档界面的工程,命名为Query; |
2、改造原有的菜单,按 “三、说明及约定”中第一条所说的设置; |
3、改造原有的工具条,按 “三、说明及约定”中第一条所说的设置; |
4、添加两个类,CDlgQuery、CDlgObjectProperty,其中: CDlgQuery是一个查询对话框类,如下图所示: 定义变量: |
 |
//与对话框中的控件相对应的变量
CListCtrl m_lstLayers; //图层名列表框
CComboBox m_cmbOperators; //操作符组合框
CComboBox m_cmbFields; //字段组合框
double m_dDistance; //缓冲半径
double m_dMaxX; //bound最大X
double m_dMaxY; //bound最大Y
double m_dMinX; //bound最小X
double m_dMinY; //bound最小Y
CString m_strSQL; //SQL查询语句
//自定义的变量
CSeRecordset *m_pQueryRecord; //记录查询结果
CSeMapWnd *m_pMapWnd; //地图显示指针【传入】
CImageList m_ImageList; //图像列表
int m_nQueryMode; /*查询方式 0 SQL 查询
1 对象缓冲 查询
2 范围 查询
3 范围复合 查询
4 缓冲复合 查询 */
CString m_strLayerName; //记录要查询的图层名
成员函数:
//与对话框和对话框中的控件相对应的函数
virtual BOOL OnInitDialog(); //初始化对话框
afx_msg void OnClickListLayers(NMHDR* pNMHDR, LRESULT* pResult); //点击图层列表框事件
afx_msg void OnSelchangeComboFields(); //当选择字段名时,SQL查询语句+字段名
virtual void OnOK(); //根据查询模式开始查询
virtual void OnCancel(); //取消查询
afx_msg void OnSelchangeComboOperator(); //当选择操作符时,SQL语句+操作符
//自定义函数
void SetDialogStatus(); //根据查询模式设置查询对话框内控件的状态
void AddLayerName(); //在列表框中填入图层名
使用说明:
1) 当点击“查询—SQL查询”菜单,就弹出该对话框,这时可以选择要查询的图层、选择要查询的字段和操作符等,在SQL文本框中完成最后的SQL语句的输入,点击“查询”按钮就可以进行查询。
2) 点击“查询—范围查询”菜单,在地图中用鼠标画出要查询的矩形,之后弹出该对话框,这时,对话框中的bound的四个值就是鼠标所选择的bound值,选择图层后点击“查询”按钮就可以查询。
3) 在地图中选择一个几何对象,点击“查询—对象缓冲查询”,再按下鼠标左键即弹出该对话框,填入缓冲半径就可以进行查询。
4) 点击“查询—范围复合查询”菜单,在地图中用鼠标画出要查询的矩形,之后弹出该对话框,这时,对话框中的bound的四个值就是鼠标所选择的bound值,选择图层和确定SQL语句后点击“查询”按钮就可以查询。
5) 在地图中选择一个几何对象,点击“查询—缓冲复合查询”,再按下鼠标左键即弹出该对话框,填入缓冲半径和确定SQL语句就可以进行查询。 重要方法:具体的查询功能都是在OnOk()中实现的
|
CDlgObjectProperty是对象属性对话框类,如下图所示: 成员变量: |
 |
CEdit m_Edit; //控制字段修改值文本框
CListCtrl m_lstProperty; //对象属性列表
BOOL m_bModify; //是否修改字段值
CString m_strLayerName; //几何对象所在的图层名
long m_nID; //几何对象的ID
CString m_strFieldName; //要修改的字段名字
CString m_strValue; //字段修改值
//记录要显示属性的对象
CSeRecordset *m_pRecordset;
成员函数:
//创建列表框的行
void BuildRows(int nRows, CString *pcValue);
//创建列表框的列
void BuildColumns(int nCols, int *nWidth, CString *csCol);
//在列表框中添加对象属性
void AddObjectProperty();
//初始化对话框
virtual BOOL OnInitDialog();
//响应点击列表框操作
afx_msg void OnClickListProperty(NMHDR* pNMHDR, LRESULT* pResult);
//当修改字段值检查框是否选中时,字段名和字段值文本框的状态
afx_msg void OnCheckModify();
//当文本框编辑失去焦点,即编辑完成时
afx_msg void OnKillfocusEditProperty();
//关闭该对话框
afx_msg void OnDestroy();
使用说明:点击菜单“查询—对象属性”和“工具条—对象属性”,选择要显示属性的对象,就弹出该对话框,除了可以查看对象的属性外,选中修改字段值还可以进行对象属性值的修改,
重要方法:修改对象的属性是在OnKillfocusEditProperty()方法中。 |
5、在QueryView.h文件中声明一些用于查询的变量及常量,并在构造函数中初始化:
CSeMapWnd m_MapWnd; //文件:用于地图显示
CSeRecordset *m_pRecordset; //文件:记录查询结果
BOOL m_bFileOpened; //文件:记录地图是否打开
CArray<CPoint,CPoint> m_arrPoint; //量算:保存系列点坐标!
CRect m_rcBounds; //查询:矩形查询的矩形区域
int m_nUserAction; //用户动作,如查询、量算、对象属性等
//定义用户动作
const int USER_ACTION_NONE =-1; //什么也不做
const int USER_ACTION_QUERY_BY_SQL =0; //SQL查询
const int USER_ACTION_QUERY_BY_DISTANCE =1; //对象缓冲查询
const int USER_ACTION_QUERY_BY_BOUNDS =2; //矩形区域查询
const int USER_ACTION_QUERY_BY_BOUNDS_COMPOUND =3; //矩形复合查询
const int USER_ACTION_QUERY_BY_BUFFER_COMPOUND =4; //缓冲复合查询
const int USER_ACTION_MEASURE_DISTANCE =10; //距离量算
const int USER_ACTION_MEASURE_AREA =11; //面积量算
const int USER_ACTION_OBJECT_PROPERTY =12; //显示对象属性
初始化变量:
CQueryView::CQueryView()
|
6、在QueryView.cpp文件中实现查询功能(按照菜单):
查询—SQL查询
void CQueryView::OnQueryBySql()
void CQueryView::OnUpdateQueryBySql(CCmdUI* pCmdUI)
查询—范围查询
void CQueryView::OnQueryByBounds()
void CQueryView::OnUpdateQueryByBounds(CCmdUI* pCmdUI)
查询—对象缓冲查询
void CQueryView::OnQueryByDistance()
void CQueryView::OnUpdateQueryByDistance(CCmdUI* pCmdUI)
查询—范围复合查询
void CQueryView::OnQueryByCompound1()
void CQueryView::OnUpdateQueryByCompound1(CCmdUI* pCmdUI)
查询—缓冲复合查询
void CQueryView::OnQueryByCompound2()
void CQueryView::OnUpdateQueryByCompound2(CCmdUI* pCmdUI)
查询—距离量算
void CQueryView::OnMeasureDistance()
void CQueryView::OnUpdateMeasureDistance(CCmdUI* pCmdUI)
查询—面积量算
void CQueryView::OnMeasureArea()
void CQueryView::OnUpdateMeasureArea(CCmdUI* pCmdUI)
查询—对象属性
void CQueryView::OnObjectProperty()
|
7、在QueryView.cpp文件中查询记录查看工具条功能的实现:
void CQueryView::OnRecordFirst() //显示查询出来的第一个记录
void CQueryView::OnRecordLast() //显示查询出来的最后一个记录
void CQueryView::OnRecordNext() //显示查询出来的当前记录的下一个记录
void CQueryView::OnRecordPrev() //显示查询出来的当前记录的前一个记录
void CQueryView::OnRecordStop() //释放查询记录,并隐藏查询结果查看工具条
//设置工具条是否可用
void CQueryView::OnUpdateRecordFirst(CCmdUI* pCmdUI)
void CQueryView::OnUpdateRecordLast(CCmdUI* pCmdUI)
void CQueryView::OnUpdateRecordNext(CCmdUI* pCmdUI)
void CQueryView::OnUpdateRecordPrev(CCmdUI* pCmdUI)
|
8、在QueryView.cpp文件中重要的重载函数
//重载,实现面积和长度的量算
void CQueryView::OnLButtonDblClk(UINT nFlags, CPoint point)
//重载,实现记录鼠标点、查询等功能
void CQueryView::OnLButtonDown(UINT nFlags, CPoint point)
//重载,实现范围查询和范围复合查询
void CQueryView::OnLButtonUp(UINT nFlags, CPoint point)
//重载,矩形区域查询时,将鼠标选中的区域显示出来,鼠标移动时,在状态栏内显示点坐标
void CQueryView::OnMouseMove(UINT nFlags, CPoint point)
|
9、辅助函数
//获取坐标系参数
BOOL CQueryView::GetSysCoorParam(long& nUnits, double& dRatio,long& nDisUnits);
//获取大地坐标系参数
BOOL CQueryView::GetEarthParam(double& dEarthRadius/*地球半径*/);
//显示查询结果
void CQueryView::ShowResult();
详细内容可参见Query工程。 |