设置打印方向
“打印设置”对话框也是使用CPrintDialog类创建的,将bPrintSetupOnly参数设置为TRUE,就可以构造“打印设置”对话框。然后在GetDevMode方法可以获得包含打印机的初始化信息和环境信息的DEVMODE结构指针,DEVMODE结构中成员dmOrientation保存打印方向,可选值有两个,为DMORIENT_LANDSCAPE值时是横向打印,为DMORIENT_PORTRAIT值时是纵向打印。
例如,使用“打印设置”对话框设置打印方向,程序设计步骤如下:
(1)创建一个基于对话框的应用程序,将对话框的Caption属性修改“使用打印设置对话框设置打印方向”。
(2)选择工作区窗口的RecourceView选项卡,导入3个图标资源。
(3)在对话框头文件中声明变量,代码如下。
CToolBar m_ToolBar; //工具栏对象
CImageList m_ImageList; //列表视图对象
CString str[7]; //保存打印字符串的字符串数组
CFont font; //字体对象
int screenx,screeny; //窗口每英寸像素数
int printx,printy; //打印机每英寸像素数
double ratex,ratey; //打印机与屏幕的像素比率
BOOL m_IsWay; //打印方向
(4)在对话框的OnInitDialog函数中创建工具栏并设置打印文本,代码如下。
m_ImageList.Create(32,32,ILC_COLOR24|ILC_MASK,1,1); //创建图像列表
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); //向图像列表中添加图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); //向图像列表中添加图标
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3)); //向图像列表中添加图标
UINT array[3]={10000,10001,10002}; //声明数组
m_ToolBar.Create(this); //创建工具栏窗口
m_ToolBar.SetButtons(array,3); //设置工具栏按钮索引
m_ToolBar.SetButtonText(0,"打印设置"); //设置工具栏按钮文本
m_ToolBar.SetButtonText(1,"打印"); //设置工具栏按钮文本
m_ToolBar.SetButtonText(2,"退出"); //设置工具栏按钮文本
m_ToolBar.GetToolBarCtrl().SetImageList(&m_ImageList); //关联图像列表
m_ToolBar.SetSizes(CSize(60,50),CSize(32,32)); //设置按钮和图标的大小
m_ToolBar.EnableToolTips(TRUE); //激活工具栏的提示功能
//显示工具栏
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
//设置打印文本
str[0] = "花间一壶酒,独酌无相亲。rn";
str[1] = "举杯邀明月,对影成三人。rn";
str[2] = "月既不解饮,影徒随我身。rn";
str[3] = "暂伴月将影,行乐须及春。rn";
str[4] = "我歌月徘徊,我舞影凌乱。rn";
str[5] = "醒时同交欢,醉后各分散。rn";
str[6] = "永结无情游,相期渺云汉。rn";
m_IsWay = TRUE; //设置默认打印方向
提示:我们在创建工具栏、状态栏等控件时,创建后需要调用RepositionBars方法来调整工具栏或状态栏的位置和大小,并且显示工具栏或状态啦。
(5)处理WM_CTLCOLOR消息,在该消息中将对话框的背景颜色改为白色。
(6)定义一个自定义函数DrawText,用于绘制打印好预览的文本,代码如下。
void CSetPrintDlg::DrawText(CDC *pDC, BOOL isprinted)
{
if(!isprinted) //预览
{
ratex = 1; //当预览时设置比率为1
ratey = 1; //当预览时设置比率为1
}
else //判断是打印
{
pDC->StartDoc("printstart"); //开始打印
}
font.CreatePointFont(120,"宋体",pDC); //创建字体
for(int i=0;i<7;i++) //设置循环
{
pDC->SelectObject(&font); //将字体选入设备上下文
pDC->TextOut(int(50*ratex),int((80+i*30)*ratey),str[i]); //打印文本
}
if(isprinted) //判断是打印
{
pDC->EndDoc(); //结束打印
}
font.DeleteObject(); //释放字体
}
(7)处理工具栏中“打印设置”按钮的单击事件,判断获得打印方向,代码如下。
void CSetPrintDlg::OnSet() // "打印设置"按钮的单击事件处理函数
{
DWORD dwflags = PD_ALLPAGES | PD_NOPAGENUMS | PD_USEDEVMODECOPIES
| PD_SELECTION | PD_HIDEPRINTTOFILE; //设置"打印设置"对话框属性
CPrintDialog dlg(TRUE,dwflags,NULL); //构造"打印设置"对话框
if(dlg.DoModal()==IDOK) //显示“打印设置”对话框
{
LPDEVMODE dev = dlg.GetDevMode(); //获得打印机信息
if(dev->dmOrientation == DMORIENT_PORTRAIT) //判断是否为纵向打印
m_IsWay = TRUE; //纵向打印
else
m_IsWay = FALSE; //横向打印
}
}
(8)处理工具栏中“打印”按钮的单击事件,调用“打印”对话框进行打印,代码如下。
void CSetPrintDlg::OnPrint() //"打印"按钮的单击事件处理函数
{
DWORD dwflags = PD_ALLPAGES | PD_NOPAGENUMS | PD_USEDEVMODECOPIES
| PD_SELECTION | PD_HIDEPRINTTOFILE; //设置"打印"对话框属性
CPrintDialog dlg(FALSE,dwflags,NULL); //构造"打印"对话框
if(dlg.DoModal()==IDOK) //显示"打印"对话框
{
LPDEVMODE dev = dlg.GetDevMode(); //获得打印机信息
if(m_IsWay)
dev->dmOrientation = DMORIENT_PORTRAIT; //设置纵向打印
else
dev->dmOrientation = DMORIENT_LANDSCAPE; //设置横向打印
CDC dc; //声明设备上下文
dc.Attach(dlg.CreatePrinterDC()); //创建打印机设备上下文
printx = dc.GetDeviceCaps(LOGPIXELSX); //获得打印机像素
printy = dc.GetDeviceCaps(LOGPIXELSY); //获得打印机像素
ratex = (double)(printx)/screenx; //计算屏幕好打印机像素比率
ratey = (double)(printy)/screeny; //计算屏幕好打印机像素比率
DrawText(&dc,TRUE); //绘制打印文本
}
}
程序运行效果如图1所示。
.jpg)
图1 使用打印设置对话框设置打印方向