打印对话框中的表格
使用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所示。
.jpg)
图1 打印表格