拖放操作
Ultimate Grid具有拖放功能。本教程的目的是说明如何开发具有拖放功能的网格应用程序。
使用MFC应用程序向导,启动一个新的项目。项目名为dragex,在向导的步骤1中选择对话框选项。
第1步 – 构造一个对话框界面
点击资源文件标签页。Visual C++有如下屏幕图像的出现:
接着,双击IDD_DRAGEX_DIALOG。把当前界面修改为类似于如下图的样子。
控件的名字参考下表
IDC_GRID1 |
上面的Static控件 |
IDC_GRID2 |
下面的Static控件 |
第2步 – 包含必要的头文件
在dragex.cpp和dragexDlg.cpp的文件中包含'mycug.h'
- // dragex.cpp : Defines the class behaviors for the application.
- //
- #include "stdafx.h"
- #include "mycug.h" //新加的头文件
- #include "dragex.h"
- #include "dragexDlg.h"
包含UltimateGrid源文件如下图:
第3步 – 实例化两个网格对象
既然要在界面上显示两个网格,那么我们就要先创建两个网格对象。这个可以在dragexDlg.h文件中进行。
// dragexDlg.h : 头文件
- #if !defined(AFX_DRAGEXDLG_H__E985DE67_5BD5_11D1_848D_0080C859586F__INCLUDED_)
- #define AFX_DRAGEXDLG_H__E985DE67_5BD5_11D1_848D_0080C859586F__INCLUDED_
- #if _MSC_VER >= 1000
- #pragma once
- #endif // _MSC_VER >= 1000
- // CDragexDlg dialog
- class CDragexDlg : public CDialog
- {
- // Construction
- public:
- CDragexDlg(CWnd* pParent = NULL);
- MyCug m_grid1, m_grid2 ; //创建两个新的对象
第4步 – 在对话框界面上建立两个网格
打开DragexDlg:: OnInitDialog函数并且添加下面两行代码。
- BOOL CDragexDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- m_grid1.AttachGrid(this, IDC_GRID1);
- m_grid2.AttachGrid(this, IDC_GRID2) ;
- // Add "About..." menu item to system menu.
打开MyCug::OnSetup函数并且添加下面两行代码。
- void MyCug::OnSetup()
- {
- SetNumberCols(5);
- SetNumberRows(5);
- }
编译执行
现在你有两个网格的对话框程序,只是还不具有拖放功能,但是这些功能将在后面实现。下图显示了两个网格的对话框程序。
第5步 – 添加OLE头文件
在<stdafx.h>文件中添加下列代码。
- #include <afxwin.h> // MFC core and standard components
- #include <afxext.h> // MFC extensions
- #include <afxdisp.h> // MFC OLE automation classes
- #include <afxole.h> //新添加的头文件
这个头文件决定了对象链接和嵌入的成功
第6步 – 再添加一行代码
在CDradexApp::InitInstance函数中添加下面一行代码,对OLE DLLs进行初始化。
- BOOL CDragexApp::InitInstance(){
- AfxOleInit() ; //新的代码行
- AfxEnableControlContainer();
第7步 – 设置拖放能力
在CDragexDlg::InitDialog()函数中(非对话框程序可以用MyCug::OnSetup()函数), 你必须对每个网格设置拖放功能,
由于这个例子中用了两个网格,所以两个网格都必须设置。
- /************************************************************************************/
- BOOL CDragexDlg::OnInitDialog(){
- CDialog::OnInitDialog();
- m_grid1.AttachGrid(this, IDC_GRID1);
- m_grid2.AttachGrid(this, IDC_GRID2) ;
- //******* 设置第一个网格
- m_grid1.SetMultiSelectMode(TRUE);
- m_grid1.DragDropTarget(TRUE);
- //*******设置第二个网格
- m_grid2.SetMultiSelectMode(TRUE);
- m_grid2.DragDropTarget(TRUE);
- }
新的代码行以粗体显示。每个网格对象都必须对两个函数进行调用。
两个函数'SetMultiSelectMode'和'DragDropTarget'必须传入'True'值。
第8步 – 修改返回值
改变MyCug类的三个消息函数的返回值。默认值是DROPEFFECT_NONE。该值必须更改为DROPEFFECT_COPY。
这三个函数是:
- MyCug::OnDragDrop()
- MyCug::OnDragEnter()
- MyCug::OnDragOver()
- MyCug::OnDragDrop(COleDataObject* pDataObject, int col,long row){
- return DROPEFFECT_COPY //新的返回值
- }
- MyCug:: OnDragEnter (COleDataObject* pDataObject, int col,long row){
- return DROPEFFECT_COPY //新的返回值
- }
- MyCug:: OnDragOver (COleDataObject* pDataObject, int col,long row){
- return DROPEFFECT_COPY //新的返回值
- }
第9步 – 在OnLClicked消息函数中编码
**拖放的事件是鼠标左键事件。因此添加以下几行代码到MyCug::OnLClicked():
- /************************************************************************************/
- void MyCug::OnLClicked(int col,long row,int updn,RECT *rect, POINT *point, int processed){
- StartDragDrop() ; // 新添加的代码行
- }
第10步 – 测试拖放属性
为了测试这个应用程序,我们必须将文字输入到网格里,这可以通过添加StartEdit()函数到MyCug::OnDClicked()。
- void MyCug::OnDClicked(int col,long row, RECT *rect, POINT *point, int processed){
- StartEdit() ; //添加这行代码
- }
现在你可以双击任一单元格,将产生一个编辑光标,你可以输入文字,然后当光标变为箭头时,你可以在文字上按住
鼠标左键移动拖放到任何一个网格内。本例显示请参看下图。
Ultimate Grid具有拖放功能。本教程的目的是说明如何开发具有拖放功能的网格应用程序。
使用MFC应用程序向导,启动一个新的项目。项目名为dragex,在向导的步骤1中选择对话框选项。
第1步 – 构造一个对话框界面
点击资源文件标签页。Visual C++有如下屏幕图像的出现:
接着,双击IDD_DRAGEX_DIALOG。把当前界面修改为类似于如下图的样子。
控件的名字参考下表
IDC_GRID1 |
上面的Static控件 |
IDC_GRID2 |
下面的Static控件 |
第2步 – 包含必要的头文件
在dragex.cpp和dragexDlg.cpp的文件中包含'mycug.h'
- // dragex.cpp : Defines the class behaviors for the application.
- //
- #include "stdafx.h"
- #include "mycug.h" //新加的头文件
- #include "dragex.h"
- #include "dragexDlg.h"
包含UltimateGrid源文件如下图:
第3步 – 实例化两个网格对象
既然要在界面上显示两个网格,那么我们就要先创建两个网格对象。这个可以在dragexDlg.h文件中进行。
// dragexDlg.h : 头文件
- #if !defined(AFX_DRAGEXDLG_H__E985DE67_5BD5_11D1_848D_0080C859586F__INCLUDED_)
- #define AFX_DRAGEXDLG_H__E985DE67_5BD5_11D1_848D_0080C859586F__INCLUDED_
- #if _MSC_VER >= 1000
- #pragma once
- #endif // _MSC_VER >= 1000
- // CDragexDlg dialog
- class CDragexDlg : public CDialog
- {
- // Construction
- public:
- CDragexDlg(CWnd* pParent = NULL);
- MyCug m_grid1, m_grid2 ; //创建两个新的对象
第4步 – 在对话框界面上建立两个网格
打开DragexDlg:: OnInitDialog函数并且添加下面两行代码。
- BOOL CDragexDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- m_grid1.AttachGrid(this, IDC_GRID1);
- m_grid2.AttachGrid(this, IDC_GRID2) ;
- // Add "About..." menu item to system menu.
打开MyCug::OnSetup函数并且添加下面两行代码。
- void MyCug::OnSetup()
- {
- SetNumberCols(5);
- SetNumberRows(5);
- }
编译执行
现在你有两个网格的对话框程序,只是还不具有拖放功能,但是这些功能将在后面实现。下图显示了两个网格的对话框程序。
第5步 – 添加OLE头文件
在<stdafx.h>文件中添加下列代码。
- #include <afxwin.h> // MFC core and standard components
- #include <afxext.h> // MFC extensions
- #include <afxdisp.h> // MFC OLE automation classes
- #include <afxole.h> //新添加的头文件
这个头文件决定了对象链接和嵌入的成功
第6步 – 再添加一行代码
在CDradexApp::InitInstance函数中添加下面一行代码,对OLE DLLs进行初始化。
- BOOL CDragexApp::InitInstance(){
- AfxOleInit() ; //新的代码行
- AfxEnableControlContainer();
第7步 – 设置拖放能力
在CDragexDlg::InitDialog()函数中(非对话框程序可以用MyCug::OnSetup()函数), 你必须对每个网格设置拖放功能,
由于这个例子中用了两个网格,所以两个网格都必须设置。
- /************************************************************************************/
- BOOL CDragexDlg::OnInitDialog(){
- CDialog::OnInitDialog();
- m_grid1.AttachGrid(this, IDC_GRID1);
- m_grid2.AttachGrid(this, IDC_GRID2) ;
- //******* 设置第一个网格
- m_grid1.SetMultiSelectMode(TRUE);
- m_grid1.DragDropTarget(TRUE);
- //*******设置第二个网格
- m_grid2.SetMultiSelectMode(TRUE);
- m_grid2.DragDropTarget(TRUE);
- }
新的代码行以粗体显示。每个网格对象都必须对两个函数进行调用。
两个函数'SetMultiSelectMode'和'DragDropTarget'必须传入'True'值。
第8步 – 修改返回值
改变MyCug类的三个消息函数的返回值。默认值是DROPEFFECT_NONE。该值必须更改为DROPEFFECT_COPY。
这三个函数是:
- MyCug::OnDragDrop()
- MyCug::OnDragEnter()
- MyCug::OnDragOver()
- MyCug::OnDragDrop(COleDataObject* pDataObject, int col,long row){
- return DROPEFFECT_COPY //新的返回值
- }
- MyCug:: OnDragEnter (COleDataObject* pDataObject, int col,long row){
- return DROPEFFECT_COPY //新的返回值
- }
- MyCug:: OnDragOver (COleDataObject* pDataObject, int col,long row){
- return DROPEFFECT_COPY //新的返回值
- }
第9步 – 在OnLClicked消息函数中编码
**拖放的事件是鼠标左键事件。因此添加以下几行代码到MyCug::OnLClicked():
- /************************************************************************************/
- void MyCug::OnLClicked(int col,long row,int updn,RECT *rect, POINT *point, int processed){
- StartDragDrop() ; // 新添加的代码行
- }
第10步 – 测试拖放属性
为了测试这个应用程序,我们必须将文字输入到网格里,这可以通过添加StartEdit()函数到MyCug::OnDClicked()。
- void MyCug::OnDClicked(int col,long row, RECT *rect, POINT *point, int processed){
- StartEdit() ; //添加这行代码
- }
现在你可以双击任一单元格,将产生一个编辑光标,你可以输入文字,然后当光标变为箭头时,你可以在文字上按住
鼠标左键移动拖放到任何一个网格内。本例显示请参看下图。