一个初学者写的很适合初学者参考多文档程序示例终于写完了。写得很辛苦呀!所以想把成果和初学者分享一下。请按下面地址下载源代码: http://lgxyslldw.512j.com/cpjs/lgxgrids/LgxgridForMoreDocok.rar。
要运行此例,你还要下载最新版本的lgxgrid控件,下载地址:http://lgxyslldw.512j.com/cpjs/lgxgrids/lgxgridsV31.rar。
(重要的声明,本示例只给初学者参考,对于不是初学者的高手来说,就不要看了,因为你们会对此不屑一顾的。所以,如果你是高手,请你离开,免得又有人认为我是在卖广告!)本示例涉及到一些初学者可能都会遇到的问题:
1、较为完整的多文档/视图例程;
2、动态创建控件对象,并控制它们的事件;
3、如何移动一个控件对象;
4、对话框回车键的问题,这个示例给出了一个较好的解决方案;
5、如何用对话框与文档/视图交换数据;
6、怎样将数据序列化保存到文件,又如何读出来。例如下面是解决回车键问题的代码,这个代码使回车键既有效,又不会关闭对话框:
BOOL CGridInto::PreTranslateMessage(MSG* pMsg)//处理对话框的回车消息
{
if(pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_ESCAPE) //Esc键不退出程序
{
return TRUE;
}
else if(pMsg->wParam == VK_RETURN)
{
if(pMsg->hwnd==GetDlgItem(IDC_EDIT1)->m_hWnd)
{
GetDlgItem(IDC_EDIT2)->SetFocus();
} if(pMsg->hwnd==GetDlgItem(IDC_EDIT2)->m_hWnd)
{
GetDlgItem(IDC_EDIT3)->SetFocus();
}
if(pMsg->hwnd==GetDlgItem(IDC_EDIT3)->m_hWnd)
{
GetDlgItem(IDC_EDIT4)->SetFocus();
} if(pMsg->hwnd==GetDlgItem(IDC_EDIT4)->m_hWnd)
{
GetDlgItem(IDOK)->SetFocus();
} if(pMsg->hwnd==GetDlgItem(IDOK)->m_hWnd)
{
CGridInto::OnOK();
}
return FALSE;
}
} return CDialog::PreTranslateMessage(pMsg);
}下面是动态创建控件的代码:
void CLgxgridForMoreDocView::OnIntoGrid()
{
Lists=Rows=Left=Top=0;
CGridInto Mgridinto;
Mgridinto.DoModal();//显示对话框
if(Mgridinto.Onyes==1)
{
Rows=Mgridinto.Rows;
Lists=Mgridinto.Lists;
Left=Mgridinto.Left;
Top=Mgridinto.Top;
if(Rows>0 && Lists>0)
{
if (id+1<=1013)
{
xi=xi+1;//ID递增
id=1008+xi;
CLgxgridForMoreDocDoc* Mdoc=this->GetDocument();
Mdoc->Grids=xi;
Mdoc->GData[xi].Lists=Lists;
Mdoc->GData[xi].Rows=Rows;
Mdoc->GData[xi].Left=Left;
Mdoc->GData[xi].Top=Top;
Mdoc->GData[xi].Height=288;
Mdoc->GData[xi].Width=294;
NowId=xi;
CLgxgridForMoreDocView::GridAdd(xi,Lists,Rows,Left,Top,288,294);//添加一个表格
}
else
{
MessageBox("在一个文档内,你不能创建多于5个表格!");
}
}
}
}void CLgxgridForMoreDocView::GridAdd(int xi,int Lists,int Rows,int Left,int Top,int Height,int Width)
{
CString Name;
Lgxs[xi].Create(NULL, WS_VISIBLE, CRect(Left,Top,Width+Left,Height+Top), this,xi+1008);//创建控件对象
Lgxs[xi].ShowWindow(SW_HIDE);//初始化是隐藏表格,使用不能看到表格创建的过程
Lgxs[xi].BringWindowToTop();//表格置顶
for(int i=1;i<=Lists;i++)
{
Name.Format("%d",i);
Lgxs[xi].hadd(Name,1,500,true,NULL);
}
Lgxs[xi].SetdRows(Rows);//设置行数
Lgxs[xi].SetSlwok(true);//设置列宽可移动
Lgxs[xi].ShowWindow(SW_SHOW);//显示表格
}
void CLgxgridForMoreDocView::OnLwChangLgxs(UINT nID,long Lid, long Lw)
{
// 把列宽的改变保存到文档
CLgxgridForMoreDocDoc* Mdoc=this->GetDocument();
bool Fok=false;
for(int i=1;i<=Mdoc->Lws;i++)//查找该列变动是否已登记
{
Fok=false;
if(Mdoc->Ldata[i].Gid==(int)nID-1008 && Mdoc->Ldata[i].Ls==Lid)
{
Fok=true;
Mdoc->Ldata[i].Lw=Lw;
break;
}
}
if(Fok==false)
{
Mdoc->Lws=Mdoc->Lws+1;
Mdoc->Ldata[Mdoc->Lws].Gid=(int)nID-1008;
Mdoc->Ldata[Mdoc->Lws].Ls=Lid;
Mdoc->Ldata[Mdoc->Lws].Lw=Lw;
}
}
整个示例所实现的功能:(1)插入n行m列的表格,一个视图可以插入多个表格(2)用鼠标按住表格的表头后,可以移动表格(3)自由合并单元格(4)自由地插入和删除行,自由地拖动列宽,把鼠标指向表头的列表格线处,当鼠标变成双向箭头时,就可以拖动列宽了(5)双击单元格进入编辑状态,你就可以编辑数据了,数据的改变将会保存到文档中,并可从文档中读出。(6)完整的文档/视图功能,你可以把你对表格的编辑保存到文件。重新打开文件,你会看到你对表格的编辑被一模一样地还源了。包括数据与格式。当然,要实现更复杂的文档,你还要写更多的代码。本示例只是一个示例,而且是一个初学者写的,不可能十分完善,要是我能写一个EXCEL出来的话,我也不用在这里混了!笑!!
要运行此例,你还要下载最新版本的lgxgrid控件,下载地址:http://lgxyslldw.512j.com/cpjs/lgxgrids/lgxgridsV31.rar。
(重要的声明,本示例只给初学者参考,对于不是初学者的高手来说,就不要看了,因为你们会对此不屑一顾的。所以,如果你是高手,请你离开,免得又有人认为我是在卖广告!)本示例涉及到一些初学者可能都会遇到的问题:
1、较为完整的多文档/视图例程;
2、动态创建控件对象,并控制它们的事件;
3、如何移动一个控件对象;
4、对话框回车键的问题,这个示例给出了一个较好的解决方案;
5、如何用对话框与文档/视图交换数据;
6、怎样将数据序列化保存到文件,又如何读出来。例如下面是解决回车键问题的代码,这个代码使回车键既有效,又不会关闭对话框:
BOOL CGridInto::PreTranslateMessage(MSG* pMsg)//处理对话框的回车消息
{
if(pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_ESCAPE) //Esc键不退出程序
{
return TRUE;
}
else if(pMsg->wParam == VK_RETURN)
{
if(pMsg->hwnd==GetDlgItem(IDC_EDIT1)->m_hWnd)
{
GetDlgItem(IDC_EDIT2)->SetFocus();
} if(pMsg->hwnd==GetDlgItem(IDC_EDIT2)->m_hWnd)
{
GetDlgItem(IDC_EDIT3)->SetFocus();
}
if(pMsg->hwnd==GetDlgItem(IDC_EDIT3)->m_hWnd)
{
GetDlgItem(IDC_EDIT4)->SetFocus();
} if(pMsg->hwnd==GetDlgItem(IDC_EDIT4)->m_hWnd)
{
GetDlgItem(IDOK)->SetFocus();
} if(pMsg->hwnd==GetDlgItem(IDOK)->m_hWnd)
{
CGridInto::OnOK();
}
return FALSE;
}
} return CDialog::PreTranslateMessage(pMsg);
}下面是动态创建控件的代码:
void CLgxgridForMoreDocView::OnIntoGrid()
{
Lists=Rows=Left=Top=0;
CGridInto Mgridinto;
Mgridinto.DoModal();//显示对话框
if(Mgridinto.Onyes==1)
{
Rows=Mgridinto.Rows;
Lists=Mgridinto.Lists;
Left=Mgridinto.Left;
Top=Mgridinto.Top;
if(Rows>0 && Lists>0)
{
if (id+1<=1013)
{
xi=xi+1;//ID递增
id=1008+xi;
CLgxgridForMoreDocDoc* Mdoc=this->GetDocument();
Mdoc->Grids=xi;
Mdoc->GData[xi].Lists=Lists;
Mdoc->GData[xi].Rows=Rows;
Mdoc->GData[xi].Left=Left;
Mdoc->GData[xi].Top=Top;
Mdoc->GData[xi].Height=288;
Mdoc->GData[xi].Width=294;
NowId=xi;
CLgxgridForMoreDocView::GridAdd(xi,Lists,Rows,Left,Top,288,294);//添加一个表格
}
else
{
MessageBox("在一个文档内,你不能创建多于5个表格!");
}
}
}
}void CLgxgridForMoreDocView::GridAdd(int xi,int Lists,int Rows,int Left,int Top,int Height,int Width)
{
CString Name;
Lgxs[xi].Create(NULL, WS_VISIBLE, CRect(Left,Top,Width+Left,Height+Top), this,xi+1008);//创建控件对象
Lgxs[xi].ShowWindow(SW_HIDE);//初始化是隐藏表格,使用不能看到表格创建的过程
Lgxs[xi].BringWindowToTop();//表格置顶
for(int i=1;i<=Lists;i++)
{
Name.Format("%d",i);
Lgxs[xi].hadd(Name,1,500,true,NULL);
}
Lgxs[xi].SetdRows(Rows);//设置行数
Lgxs[xi].SetSlwok(true);//设置列宽可移动
Lgxs[xi].ShowWindow(SW_SHOW);//显示表格
}
void CLgxgridForMoreDocView::OnLwChangLgxs(UINT nID,long Lid, long Lw)
{
// 把列宽的改变保存到文档
CLgxgridForMoreDocDoc* Mdoc=this->GetDocument();
bool Fok=false;
for(int i=1;i<=Mdoc->Lws;i++)//查找该列变动是否已登记
{
Fok=false;
if(Mdoc->Ldata[i].Gid==(int)nID-1008 && Mdoc->Ldata[i].Ls==Lid)
{
Fok=true;
Mdoc->Ldata[i].Lw=Lw;
break;
}
}
if(Fok==false)
{
Mdoc->Lws=Mdoc->Lws+1;
Mdoc->Ldata[Mdoc->Lws].Gid=(int)nID-1008;
Mdoc->Ldata[Mdoc->Lws].Ls=Lid;
Mdoc->Ldata[Mdoc->Lws].Lw=Lw;
}
}
整个示例所实现的功能:(1)插入n行m列的表格,一个视图可以插入多个表格(2)用鼠标按住表格的表头后,可以移动表格(3)自由合并单元格(4)自由地插入和删除行,自由地拖动列宽,把鼠标指向表头的列表格线处,当鼠标变成双向箭头时,就可以拖动列宽了(5)双击单元格进入编辑状态,你就可以编辑数据了,数据的改变将会保存到文档中,并可从文档中读出。(6)完整的文档/视图功能,你可以把你对表格的编辑保存到文件。重新打开文件,你会看到你对表格的编辑被一模一样地还源了。包括数据与格式。当然,要实现更复杂的文档,你还要写更多的代码。本示例只是一个示例,而且是一个初学者写的,不可能十分完善,要是我能写一个EXCEL出来的话,我也不用在这里混了!笑!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货