一个初学者写的很适合初学者参考多文档程序示例终于写完了。写得很辛苦呀!所以想把成果和初学者分享一下。请按下面地址下载源代码: 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出来的话,我也不用在这里混了!笑!!