科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Windows系统打印选项在Linux上的移植 (3)

Windows系统打印选项在Linux上的移植 (3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

移植是实现传统高层应用程序跨平台运行的一项核心技术。打印子系统移植是应用程序移植的重要组成部分。实现打印选项设置模块在不同平台上的用户接口UI(User Interface)转换是实现打印子系统移植过程中的一项核心技术。

作者:龚奕平 来源:IBM DW中国 2007年10月18日

关键字: Linux 打印 Windows

  • 评论
  • 分享微博
  • 分享邮件
 

注意:以上代码是通过函数gnome_print_config_set()来改变GnomePrintConfig设置的。事实上,每个 GNMOE Print系统打印设置对话框(图2)都会和一个GnomePrintConfig结构相关联。用户对该对话框选项的改变都有可能影响到后台 GnomePrintConfig结构的相关数值。更为具体的说,当用户点击图2中"确定"按钮后,与之相连的GnomePrintConfig结构的相关数值就会根据用户的选择被自动更新。

4.3 获取GNOME Print打印参数和参数转换

在用户设置完打印参数之后,移植程序就需要读取这些参数的具体数值,并把这些数值转化成Windows的数据结构。GNOME Print提供了一系列函数,如gnome_print_config_get()和gnome_print_config_get_page_size (),来读取打印设置数值。

4.3.1 读取打印纸张名称

移植程序可以通过函数gnome_print_config_get() 来获取当前打印纸张的名称。

char *pPaperName;
pPaperName = (char*)gnome_print_config_get(
pConfig,
(const guchar*)GNOME_PRINT_KEY_PAPER_SIZE);
if (!pPaperName)
    return 0;

在此,GNMOE Print返回的纸张名称被存储在字符串变量pPaperName中。当然,这里得到的打印纸张名称和Windows定义的打印纸张名称是不一致的: GNOME Print获得的打印纸张名称通常为"A4"或"B5"这样具有明显含义的字符串;而Windows则将纸张的名称定义为一系列宏存储在结构 n_DevMode.dmPaperSize中。因此移植程序还需根据规范进行相应转换。

4.3.2 读取打印纸张尺寸

移植程序可以通过函数gnome_print_config_get_page_size()可以获取当前打印纸张的长度(PaperLength_pt)和宽度(PaperWidth_pt)。

gdouble PaperWidth_pt, PaperLength_pt;
    gnome_print_config_get_page_size( 
pConfig,
&PaperWidth_pt,
&PaperLength_pt);

从GNOME Print中获取的纸张尺寸是以1/72英寸为单位的;而Windows则把纸张尺寸以0.1毫米为单位存储在结构DEVMODE. dmPaperWidth和DEVMODE.dmPaperLength中。因此,移植程序需要进行如下转换:

n_DevMode.dmPaperWidth =(short)(PaperWidth_pt*2.54*100/72+0.5);
n_DevMode.dmPaperLength = (short)(PaperLength_pt*2.54*100/72+0.5);

在此,代码(short)(x+0.5)的含义是返回浮点数x的四舍五入整数值。

4.3.3 读取打印纸张方向

移植程序可以通过函数gnome_print_config_get()来获取当前的打印纸张的方向。在下面的代码中,打印纸张方向称被存储在字符串变量pPaperName中。

char *pPageOrientation = (char*)gnome_print_config_get(
pConfig,
(const guchar*)GNOME_PRINT_KEY_ORIENTATION);
if (!pPageOrientation)
    return 0;

Windows将打印纸张方向存储在结构DEVMODE.dmOrientation中。移植程序需要进行如下转换:

if ((0 == strcmp(pPageOrientation, "R0"))
||(0 == strcmp(pPageOrientation, "R180")))
n_DevMode.dmOrientation = DMORIENT_PORTRAIT;
 else if ((0 == strcmp(pPageOrientation, "R90"))||(0 == strcmp(pPageOrientation, "R270")))
 XML error:  The previous line is longer than the max of 90 characters 
 n_DevMode.dmOrientation = DMORIENT_LANDSCAPE;

4.4 GNOME Print清理工作

在使用完GNOME Print打印设置后,需要手动释放分配的内存。

gnome_print_config_unref(pConfig);
gnome_print_job_close(pJob);

5.GNOME Print打印设置方法与自定义打印设置方法

使用GNOME Print就要遵循GNOME Print的数据接口。当然使用GNOME Print并不是在Linux平台上完成打印选项设置的唯一选择。不少Linux应用程序,无论是移植应用程序还是在Linux平台上直接开发的应用程序,通过自定义打印前台(即打印设置对话框)和打印后台(即打印数据结构)来完成打印设置功能。在此将这种实现方式称为自定义打印设置方法。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章