low=j;
}
doubletp;
tp=temp[i];
temp[i]=temp[low];
temp[low]=tp;
}
第八,定义函数CChild:
:
OnButton4()和CChild:
:
OnButton5()进行表格数据的存储和读取。
第九,程序的优化:
建立函数CShezhi:
:
OnOK(),使表格的行列数可以自行定义。
其主要内容如下:
CDialog:
:
OnOK();
CChilddlg;
dlg.row=m_row;
dlg.col=m_col;
dlg.DoModal();
4.2程序代码
#include"stdafx.h"
#include"excel.h"
#include"Child.h"
#include"ExcelDoc.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
voidCChild:
:
OnClickMsflexgrid1()//打印表格
{
charc[10];
for(inti=1;i<=col;i++)
{
c[1]='\0';
c[0]=65+(i-1)%26;
m_FlexGrid.SetTextMatrix(0,i,c);//行输出A~Z
};
charq[]="和";
charw[]="最大值";
chare[]="最小值";
charr[]="平均值";
m_FlexGrid.SetTextMatrix(0,col+1,q);//输出字符串“和”
m_FlexGrid.SetTextMatrix(0,col+2,w);//输出字符串“最大值”
m_FlexGrid.SetTextMatrix(0,col+3,e);//输出字符串“最小值”
m_FlexGrid.SetTextMatrix(0,col+4,r);//输出字符串“平均值”
for(i=1;i<=row;i++)
{
gcvt(i,10,c);
m_FlexGrid.SetTextMatrix(i,0,c);//列输出A~Z
}
m_FlexGrid.SetTextMatrix(row+1,0,q);//输出字符串“和”
m_FlexGrid.SetTextMatrix(row+2,0,w);//输出字符串“最大值”
m_FlexGrid.SetTextMatrix(row+3,0,e);//输出字符串“最小值”
m_FlexGrid.SetTextMatrix(row+4,0,r);//输出字符串“平均值”
/*****使表格成为可编辑状态*****/
longlCol=m_FlexGrid.GetColSel();//获取点击的行号
longlRow=m_FlexGrid.GetRowSel();//获取点击的列号
if(lRow>m_FlexGrid.GetRows()||lRow==0)//判断点击是否有效
return;
CRectrect;
m_FlexGrid.GetWindowRect(&rect);//获取FlexGrid控件的窗口矩形
ScreenToClient(&rect);//转换为客户区矩形
CDC*pDC=GetDC();
//MSFlexGrid控件的函数的长度单位是“缇(twips)”,需要将其转化为像素,1440缇=1英寸
//计算象素点和缇的转换比例
intnTwipsPerDotX=1440/pDC->GetDeviceCaps(LOGPIXELSX);
intnTwipsPerDotY=1440/pDC->GetDeviceCaps(LOGPIXELSY);
//计算选中格的左上角的坐标(象素为单位)
longy=m_FlexGrid.GetRowPos(lRow)/nTwipsPerDotY;
longx=m_FlexGrid.GetColPos(lCol)/nTwipsPerDotX;
//计算选中格的尺寸(象素为单位)。
加1是实际调试中,发现加1后效果更好
longwidth=m_FlexGrid.GetColWidth(lCol)/nTwipsPerDotX+1;
longheight=m_FlexGrid.GetRowHeight(lRow)/nTwipsPerDotY+1;
//形成选中个所在的矩形区域
CRectrc(x,y,x+width,y+height);
//转换成相对对话框的坐标
rc.OffsetRect(rect.left+1,rect.top+1);
CStringstrValue=m_FlexGrid.GetTextMatrix(lRow,lCol);//获取单元格内容
m_Edit.ShowWindow(SW_SHOW);//显示控件
m_Edit.MoveWindow(rc);//改变大小并移到选中格位置
m_Edit.SetWindowText(strValue);//显示文本
m_Edit.SetFocus();//获取焦点
}
/*****输入完毕后使edit空间隐藏,并返回值*****/
voidCChild:
:
OnKillfocusEdit1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringstrInput;
GetDlgItemText(IDC_EDIT1,strInput);//获取输入框内容
m_FlexGrid.SetText(strInput);//设置单元格内容
m_Edit.ShowWindow(SW_HIDE);
}
/*****求和*****/
voidCChild:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere//求和
doublesum=0;
chart[10];
longcurrent_col=m_FlexGrid.GetCol();
longcurrent_row=m_FlexGrid.GetRow();
if(col+1==current_col)//行求和
{//用col+1判断是行还是列需要求和
for(inti=1;i<=col;i++)
sum+=atof(m_FlexGrid.GetTextMatrix(current_row,i));
//atof是将字符转换成浮点数的函数
gcvt(sum,10,t);//gcvt是将浮点数转换成字符的函数
m_FlexGrid.SetTextMatrix(current_row,col+1,t);//求和结束后将结果显示
};
if(row+1==current_row)//列求和
{//用row+1判断是行还是列需要求和
sum=0;
for(inti=1;i<=row;i++)
sum+=atof(m_FlexGrid.GetTextMatrix(i,current_col));
//atof是将字符转换成浮点数的函数
gcvt(sum,10,t);//gcvt是将浮点数转换成字符的函数
m_FlexGrid.SetTextMatrix(row+1,current_col,t);//求和结束后将结果显示
};
}
/*****求最大值*****/
voidCChild:
:
OnButton2()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
doublemax;
chart[10];
longcurrent_col=m_FlexGrid.GetCol();
longcurrent_row=m_FlexGrid.GetRow();
inti=1;
if(col+2==current_col)//指向当前行,求最大值
{//用col+2判断是行还是列需要求最大值
max=atof(m_FlexGrid.GetTextMatrix(i,current_col));
//将当前的第一个值赋给max
for(i=1;i<=row;i++)
{
if(max//max与后面的数进行比较
max=atof(m_FlexGrid.GetTextMatrix(current_row,i));
//如果max小于后面的数,则将该数重新赋给max
}
gcvt(max,10,t);
m_FlexGrid.SetTextMatrix(current_row,col+2,t);//将max显示
}
elseif(row+2==current_row)//指向当前列,求最大值
{//用row+2判断是行还是列需要求最大值
i=1;
max=atof(m_FlexGrid.GetTextMatrix(current_row,i));
//将当前的第一个值赋给max
for(i=1;i<=col;i++)
{
if(max//max与后面的数进行比较
max=atof(m_FlexGrid.GetTextMatrix(i,current_col));
//如果max小于后面的数,则将该数重新赋给max
}
gcvt(max,10,t);
m_FlexGrid.SetTextMatrix(row+2,current_col,t);//将max显示
};
}
/*****最小值*****/
voidCChild:
:
OnButton3()
{
doublemin;
chart[10];
longcurrent_col=m_FlexGrid.GetCol();
longcurrent_row=m_FlexGrid.GetRow();
inti=1;//指向当前行,求最小值
if(col+3==current_col)//用col+3判断是行还是列需要求最小值
{
min=atof(m_FlexGrid.GetTextMatrix(i,col));//将当前的第一个值赋给min
for(i=1;i<=col;i++)
{
if(min>atof(m_FlexGrid.GetTextMatrix(current_row,i)))
//min与后面的数进行比较
min=atof(m_FlexGrid.GetTextMatrix(current_row,i));
//如果min小于后面的数,则将该数重新赋给min
}
gcvt(min,10,t);
m_FlexGrid.SetTextMatrix(current_row,current_col,t);//将min显示
}
elseif(row+3==current_row)//指向当前列,求最小值
{//用row+3判断是行还是列需要求最小值
i=1;
min=atof(m_FlexGrid.GetTextMatrix(i,current_col));
//将当前的第一个值赋给min
for(i=1;i<=row;i++)
{
if(min>atof(m_FlexGrid.GetTextMatrix(i,current_col)))
//min与后面的数进行比较
min=atof(m_FlexGrid.GetTextMatrix(i,current_col));
//如果min小于后面的数,则将该数重新赋给min
}
gcvt(min,10,t);
m_FlexGrid.SetTextMatrix(current_row,current_col,t);//将min显示
}
}
/*****读取存储的值*****/
voidCChild:
:
OnButton4()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
externdoublemem[20][20];//将数组的值一次存入表格
externdoublem_r;
externdoublem_c;
chart[10];
for(inti=1;i<=m_r;i++)
for(intj=1;j<=m_c;j++)
{
gcvt(mem[i][j],10,t);
m_FlexGrid.SetTextMatrix(i,j,t);
}
}
/*****存储表格的值******/
voidCChild:
:
OnButton5()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
externdoublemem[20][20];
externdoublem_r;
externdoublem_c;
for(inti=1;i<=row;i++)
for(intj=1;j<=col;j++)
mem[i][j]=atof(m_FlexGrid.GetTextMatrix(i,j));
m_r=row;//用全局变量记录表格的行列数
m_c=col;
EndDialog(0);
}
/*****列排序*****/
voidCChild:
:
OnButton6()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
longcurrent_col=m_FlexGrid.GetCol();//获取鼠标所在的列的值
doubletemp[20];
chart[10];
for(intk=1;k<=row;k++)//将所在列的所有值存入temp数组
temp[k]=atof(m_FlexGrid.GetTextMatrix(k,current_col));
for(inti=1;i{
intlow=i;
for(intj=row;j>i;j--)
{
if(temp[j]low=j;//用选择排序排列
}
doubletp;
tp=temp[i];
temp[i]=temp[low];
temp[low]=tp;
}
for(intm=1;m<=row;m++)
{
gcvt(temp[m],10,t);//将排好序的数组的值重新传回表格
m_FlexGrid.SetTextMatrix(m,current_col,t);
}
}
/*****行排序*****/
voidCChild:
:
OnButton7()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
longcurrent_row=m_FlexGrid.GetRow();//获取表格所在的行
doubletemp[20];
chart[10];
for(intk=1;k<=col;k++)
temp[k]=atof(m_FlexGrid.GetTextMatrix(current_row,k));
//将所在行的值存入数组
for(inti=1;i<=col;i++)
{
intlow=i;
for(intj=col;j>i;j--)
{
if(temp[j]low=j;
}
doubletp;
tp=temp[i];
temp[i]=temp[low];
temp[low]=tp;
}
for(intm=1;m<=col;m++)
{
gcvt(temp[m],10,t);//将排好序的数组的值回传表格
m_FlexGrid.SetTextMatrix(current_row,m,t);
}
}
/*****求平均值*****/
voidCChild:
:
OnButton8()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
doubleave;
chart[10];
longcurrent_col=m_FlexGrid.GetCol();
longcurrent_row=m_FlexGrid.GetRow();
doublem;
if(current_col==col+4)//用col+4判断是行还是列需要求平均值
{
m=atof(m_FlexGrid.GetTextMatrix(current_row,col+1));
//利用前面求的的和(COL+1)m直接进行求平均
ave=m/col;
gcvt(ave,10,t);
m_FlexGrid.SetTextMatrix(current_row,col+4,t);
}
elseif(r
|