c++ - 设置用于打印 C++ 的 GDI 页面设置

标签 c++ printing gdi

我在为文档设置“默认”页面大小时遇到​​问题。我在 Windows 上使用 Visual C++,使用 GDI 调用(需要向后兼容)。

到目前为止,我的基本方法是获取默认的 DEVMODE,在其上设置我想要的属性,然后提示用户是否要更改它。但它似乎对页面大小没有影响。它适用于方向。

我做错了什么?

HDC GetPrinterDC () {
    // Initialize device
    PRINTDLG pd = {0};
    pd.lStructSize = sizeof( pd );
    pd.Flags = PD_RETURNDEFAULT;
    PrintDlg(&pd);

    // If device initialization failed, abort
    if (pd.hDevMode == NULL) return NULL;

    // Get the actual memory pointer
    PDEVMODE dm = (PDEVMODE)GlobalLock(pd.hDevMode);
    if (dm) {
        // Set any properties that are specific for our document
        if (dm->dmFields & DM_ORIENTATION)
            dm->dmOrientation = DMORIENT_LANDSCAPE;

        if (dm->dmFields & DM_PAPERSIZE)
            dm->dmPaperSize = 0;

        if (dm->dmFields & DM_PAPERLENGTH)
            dm->dmPaperLength = 3302; // 13in

        if (dm->dmFields & DM_PAPERWIDTH)
            dm->dmPaperWidth = 4572; // 18in

        GlobalUnlock(pd.hDevMode);
    }

    // Initialize a PRINTDLG structure.
    pd.hwndOwner = GetForegroundWindow();
    pd.Flags = PD_RETURNDC | PD_HIDEPRINTTOFILE | PD_DISABLEPRINTTOFILE | PD_NOPAGENUMS | PD_NOSELECTION | PD_USEDEVMODECOPIESANDCOLLATE ;

    // Retrieve the printer DC
    HDC hdc = NULL;
    if (PrintDlg(&pd)) hdc = pd.hDC;

    // Free the resources allocated
    if (pd.hDevMode != NULL) GlobalFree(pd.hDevMode);
    if (pd.hDevNames != NULL) GlobalFree(pd.hDevNames);

    return hdc;
}

最佳答案

显然,您可以将 DEVMODE 结构中的 dmFields 指定为您想要的任何内容。

代码应该是这样的:

    PDEVMODE dm = (PDEVMODE)GlobalLock(pd.hDevMode);
    if (dm) {
        // Set any properties that are specific for our document
        dm->dmFields = dm->dmFields | DM_ORIENTATION | DM_PAPERSIZE
            | DM_PAPERLENGTH | DM_PAPERWIDTH;
        dm->dmOrientation = DMORIENT_LANDSCAPE;
        dm->dmPaperSize = 0;
        dm->dmPaperLength = 3302; // 13in
        dm->dmPaperWidth = 4572; // 18in

        GlobalUnlock(pd.hDevMode);
    }

关于c++ - 设置用于打印 C++ 的 GDI 页面设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18993542/

相关文章:

c++ - 在 C++ 中使用 getopt() 处理参数

c++ - 从另一个线程和类 C++ 更新 Winform 控件

python - 如何在Python中连接单词和整数?

c++ - 修改位图大小

printing - 如何指定不同方向的字体高度?

c++ - 如何将 GDI 8-bpp 索引位图转换为 RGB 位图?

c++ - 如何创建 std::string 包装器,将 ptr 保留到 std::string 并将 ptr 保留到创建该包装器实例的类中的特殊类函数?

c++ - C++模板特化/部分和全部

c++ - printf ("something\n") 输出 "something "(附加空间) (g++/linux/用gedit读取输出文件)

javascript - JavaFX : Set default printer for WebEngine/Webview