编程词典
明日图书
明日软件
用户注册
用户登录
站内
  当前位置:编程词典服务网 >> 编程词典社区论坛 >> 打印对话框中的表格
  · 打印对话框中的表格

用户:  大麦
发帖:  430 篇
作品:  0 个
回复:  110 篇
技术分:  1160 分
等级:  
注册:  2010-05-11 09:09:40



发表于:2010-07-13 14:14:29
          楼主

打印对话框中的表格
使用Visual C++编写的很多程序都是基于对话框的应用程序,如果要编写打印功能,也可以通过调用Windows打印对话框来实现。
例如,打印对话框中的表格,程序设计步骤如下:
(1)创建一个基于对话框的应用程序,将对话框的Caption属性修改“打印对话框中的表格”。
(2)向对话框中添加一个列表视图控件和一个按钮控件,为列表视图控件关联变量m_Grid。
(3)在对话框的OnInitDialog函数中设置列表视图的扩展风格,并向列表视图中插入数据,代码如下。
 m_Grid.SetExtendedStyle(LVS_EX_FLATSB        //扁平风格显示滚动条
  |LVS_EX_FULLROWSELECT               //允许整行选中
  |LVS_EX_HEADERDRAGDROP            //允许整列拖动
  |LVS_EX_ONECLICKACTIVATE           //单击选中项
  |LVS_EX_GRIDLINES);                  //画出网格线
 //设置列标题及列宽度
 m_Grid.InsertColumn(0,"商品编号",LVCFMT_LEFT,70,0);
 m_Grid.InsertColumn(1,"商品名称",LVCFMT_LEFT,70,1);
 m_Grid.InsertColumn(2,"商品单价",LVCFMT_LEFT,70,2);
 m_Grid.InsertColumn(3,"商品数量",LVCFMT_LEFT,70,3);
 try
 {
       m_pConnection.CreateInstance("ADODB.Connection");     //创建连接对象实例
    _bstr_t strConnect="DRIVER={Microsoft Access Driver (*.mdb)};
   uid=;pwd=;DBQ=DataBase.mdb;";
    m_pConnection->Open(strConnect,"","",adModeUnknown);   //打开数据库
 }
 catch(_com_error e)           //捕捉可能出现的错误
 {
  AfxMessageBox(e.Description());        //弹出错误处理
 }
 CString sql;
 sql.Format("select * from merchandise order by 商品编号 desc");  //设置查询字符串
 m_pRecordset.CreateInstance(__uuidof(Recordset));     //创建记录集对象实例
 m_pRecordset->Open(_bstr_t(sql), m_pConnection.GetInterfacePtr(),
  adOpenDynamic, adLockOptimistic, adCmdText);     //执行SQL得到记录集
 while(!m_pRecordset->adoEOF)        //记录集不为空时循环
 {
  m_Grid.InsertItem(0,"");         //向列表视图中插入行
  //向列表视图中插入列
  m_Grid.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("商品编号"));
  m_Grid.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("商品名称"));
  m_Grid.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("商品单价"));
  m_Grid.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect("商品数量"));
  m_pRecordset->MoveNext();        //记录集指针移动到下一条记录
 }
 m_pRecordset->Close();          //关闭记录集
 m_pConnection->Close();          //关闭数据库连接
 注意:我们在遍历记录集中的对象时,一定要调用MoveNext方法向下移动记录集,否则就会陷入死循环,程序无法响应。
(4)处理“打印”按钮的单击事件,调用打印对话框打印列表视图中的数据,代码如下。
void CTablePrintDlg::OnPrint()
{
 CBitmap bitmap;              //定义位图对象
 CClientDC dc(&m_Grid);           //获取列表视图设备上下文
 CDC memDC;            //声明设备上下文
 CRect rect;
     //创建一个与列表视图设备上下文兼容的CDC对象
 memDC.CreateCompatibleDC(&dc);
 m_Grid.GetClientRect(rect);         //获得列表视图的客户区域
 bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());  //创建位图
 memDC.SelectObject(&bitmap);         //载入位图
 memDC.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);   //将列表视图绘制在位图中
 CPrintDialog dlg(FALSE);          //创建打印对话框
 if(dlg.DoModal() == IDOK)          //打印
 {
  CDC PrintDc;           //声明设备上下文
  PrintDc.Attach(dlg.GetPrinterDC());       //获得打印机设备上下文
  int screenx,screeny;          //屏幕每英寸像素数
  int printx,printy;           //打印机每英寸像素数
  double ratex,ratey;          //打印机与屏幕的像素比率
  //获取屏幕每英寸像素数
  screenx =  dc.GetDeviceCaps(LOGPIXELSX); 
  screeny =  dc.GetDeviceCaps(LOGPIXELSY);
  //获取打印机每英寸像素数
  printx  =  PrintDc.GetDeviceCaps(LOGPIXELSX);
  printy  =  PrintDc.GetDeviceCaps(LOGPIXELSY);
  //计算打印机与屏幕的像素比率
  ratex   = (double)(printx)/screenx;
  ratey   = (double)(printy)/screeny;
  PrintDc.StartDoc("StartPrint");        //开始打印
  PrintDc.StretchBlt(0,0,(int)(rect.Width()*ratex),(int)(rect.Height()*ratey),
   &memDC,0,0,rect.Width(),rect.Height(),SRCCOPY);   //绘制打印图像
  PrintDc.EndDoc();          //结束打印
 }
 bitmap.Detach();           //释放位图对象
}
程序运行效果如图1所示。
 
图1  打印表格

 

本帖赏分:0 分   回复数:0 篇     
修改   删除   引用   回复
该帖暂无回复!
吉林省明日科技有限公司提供技术支持. 
Copyright © 1999-2008 吉林省明日科技有限公司. 吉ICP备10002740
当前时区 GMT+8, 今天是 
刷新页面 - 关于我们 - 设为首页