按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
832
…………………………………………………………Page 895……………………………………………………………
16 ponents & ActiveX Controls
第 章 站眾的肩膀 使用
afx_msg void OnSelChangeGrid();
DECLARE_EVENTSINK_MAP()
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
GRIDDLG。CPP
BEGIN_MESSAGE_MAP(CGridDlg; CDialog)
//{{AFX_MSG_MAP(CGridDlg)
ON_BN_CLICKED(IDC_UPDATEVALUE; OnUpdatevalue)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
////////////////////////////////////////////////////////////////////////
/////
// CGridDlg message handlers
BEGIN_EVENTSINK_MAP(CGridDlg; CDialog)
//{{AFX_EVENTSINK_MAP(CGridDlg)
ON_EVENT(CGridDlg; IDC_GRID; 2 /* SelChange */; OnSelChangeGrid; VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
BOOL CGridDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CGridDlg::OnOK()
{
// TODO: Add extra validation here
CDialog::OnOK();
}
void CGridDlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
833
…………………………………………………………Page 896……………………………………………………………
第篇 深入 MFC 程式設計
}
void CGridDlg::OnUpdatevalue()
{
// TODO: Add your control notification handler code here
}
void CGridDlg::OnSelChangeGrid()
{
// TODO: Add your control notification handler code here
}
为对话框加上一些变量
进入ClassWizard,进入【Member Variables 】附页,选按其中的【Add Variable 】钮,为
OcxTest 加上两笔成员变量。其中一笔用来储存目前被选中的电子表格方格内容,另一笔
资料用来做为Grid 对象,其变量类型是CGridCtrl:
这两个动作为我们带来这样的程序代码:
GRIDDLG。H
class CGridDlg : public CDialog
{
// Dialog Data
//{{AFX_DATA(CGridDlg)
enum { IDD = IDD_GRID };
834
…………………………………………………………Page 897……………………………………………………………
16 ponents & ActiveX Controls
第 章 站眾的肩膀 使用
CGridCtrl m_OcxGrid;
CString m_cellValue;
//}}AFX_DATA
。。。
};
GRIDDLG。CPP
CGridDlg::CGridDlg(CWnd* pParent /*=NULL*/)
: CDialog(CGridDlg::IDD; pParent)
{
//{{AFX_DATA_INIT(CGridDlg)
m_cellValue = _T(〃〃);
//}}AFX_DATA_INIT
}
void CGridDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGridDlg)
DDX_Control(pDX; IDC_GRID; m_OcxGrid);
DDX_Text(pDX; IDC_VALUE; m_cellValue);
//}}AFX_DATA_MAP
}
新增一个菜单项目
利用资源编辑器,将菜单修改如下:
注意,我所改变的菜单是IDR_MAINFRAME ,这是在没有任何子窗口存在时才会出现的
菜单。所以如果你要执行OcxTest 并看到Grid 组件,你必须先将所有的子窗口关闭。
现在利用ClassWizard 在主窗口的消息映射表中拦截它的命令消息:
835
…………………………………………………………Page 898……………………………………………………………
第篇 深入 MFC 程式設計
获得对应的程序代码如下:
MA INFRM。H
class CMainFrame : public CMDIFrameWnd
{
。。。
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnGridTest();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
MAINFRM。CPP
BEGIN_MESSAGE_MAP(CMainFrame; CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_MAND(ID_GridTest; OnGridTest)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
836
…………………………………………………………Page 899……………………………………………………………
16 ponents & ActiveX Controls
第 章 站眾的肩膀 使用
void CMainFrame::OnGridTest()
{
// TODO:
}
为了让这个新增菜单命令真正发挥效用,将Grid 对话窗唤起,我在OnGridTest 函数加
两行:
#include 〃GridDlg。h〃
。。。
void CMainFrame::OnGridTest()
{
CGridDlg dlg; // constructs the dialog
dlg。DoModal(); // starts the dialog
}
现在,将OcxTest 编译连结一遍,得到一个可以顺利执行的程序,但Grid 之中全无内容。
Grid 相关程序设计
现在我要开始设计Grid 相关函数。我的主要的工作是:
准备一个二维(7x14 )的DWORD 数组,用来储存Grid 的方格内容。
程序初始化时就把二维数组的初值设定好(本例不进行文件读写),并产生Grid
对话框。
对话框一出现,程序立刻把电子表格的行、列、宽、高,以及字段名称都设定好,
并且把二维数组的数值放到对应方格中。初值的总和也一并计算出来。
把计算每一列每一行总和的工作独立出来,成立一个puteSums 函数。
为了放置电子表格内容,必须设计一个7x14 二维数组。虽然电子表格中某些方格(如列标
题或行标题)不必有内容,不过为求简化,还是完全配合电子表格的大小来设计数值数组
好了。注意,不能把这个变量放在AFX_DATA 之内,因为我并非以ClassWizard 加入此
变量。
837
…………………………………………………………Page 900……………………………………………………………
第篇 深入 MFC 程式設計
GRIDDLG。H
#define MAXCOL 7
#define MAXROW 14
class CGridDlg : public CDialog
{
。。。
// Dialog Data
double m_dArray'MAXCOL''MAXROW';
private:
void puteSums();
};
为了设定Grid 中的表头以及初值,我在OnInitDialog 中先以一个for loop 设定横列表
头再以一个for loop 设定纵行表头,最后再以巢状(两层)for loop 设定每一个方格内
容,然后才调用puteSums 计算总和。
当使用者选择一个方格,其值就被OnSelchangeGrid 拷贝一份到edit 字段中,这时候就
可以开始输入了。
OnUpdatevalue (【Update Value 】按钮的处理例程)有两个主要任务,一是把edit 字段
内容转化为数值放到目前被选择的方格上,一是修正总和。
OnOk 必须能够把每一个方格内容(一个字符串)取出,利用atof 转换为数值,然后储存
到m_dArray 二维数组中。