`
dqifa
  • 浏览: 116329 次
社区版块
存档分类
最新评论

使用wxWidgets实现所见即所得打印(CodeBlocks)

阅读更多

1、从wxPrintout派生一个类Printout,类源码如下:

 

        =====文件名:printout.h=====
#ifndef PRINTOUT_H
#define PRINTOUT_H

#include <wx/wx.h>
#include <wx/print.h>
#include <wx/printdlg.h>
#include "wxPrintMain.h"
class wxPrintFrame;
class Printout : public wxPrintout
{
    public:
//        Printout();
        Printout(wxPrintFrame* frame, const wxString &title = wxT("My printout")): wxPrintout(title) { m_frame=frame; }
//        virtual ~Printout();
        virtual void GetPageInfo(int *minPage, int *maxPage,int *pageFrom, int *pageTo);
        virtual bool HasPage(int pageNum);
        virtual void DrawPageOne(wxDC*dc);
        virtual void DrawPageTwo(wxDC *dc);
        virtual bool OnBeginDocument(int startPage, int endPage);
        bool OnPrintPage(int page);
    protected:
    private:
        wxPrintFrame *m_frame;
};

#endif // PRINTOUT_H


        =====文件名:printout.cpp=====
#include "printout.h"

//Printout::Printout()
//{
//    //ctor
//}

//Printout::~Printout()
//{
//    //dtor
//}

bool Printout::OnBeginDocument(int startPage, int endPage)
{
    if (!wxPrintout::OnBeginDocument(startPage, endPage))
        return false;

    return true;
}

void Printout::GetPageInfo(int *minPage, int *maxPage,int *pageFrom, int *pageTo)
{
    *minPage = 1;
    *maxPage = 2;
    *pageFrom = 1;
    *pageTo = 2;
}

bool Printout::HasPage(int pageNum)
{
    return (pageNum >= 1 && pageNum <= 2);
}

void Printout::DrawPageOne(wxDC*dc)
{
    // 下面的代码可以这样写只是因为我们知道图片的大小是200 x200
    // 如果我们不知道的话,需要先计算图片的大小
    float maxX = 200;
    float maxY = 200;
    // 让我们先设置至少个设备单位的边框50
    float marginX = 50;
    float marginY = 50;
    // 将边框的大小增加到图片的周围
    maxX += (2*marginX );
    maxY += (2*marginY );
    // 获取象素单位的当前设备上下文的大小
    int w, h;
    dc->GetSize (&w, &h);
    //计算一个合适的缩放值
    float scaleX =( float )(w/ maxX );
    float scaleY =( float )(h/ maxY );
    // 选择或者方向上较小的那个XY
    float actualScale = wxMin ( scaleX , scaleY );
    // 计算图片在设备上的合适位置以便居中
    float posX = ( float )(( w*(200*actualScale ))/2.0);
    float posY = ( float )(( h*(200*actualScale ))/2.0);
    // 设置设备平移和缩放
    dc->SetUserScale ( actualScale , actualScale );
    dc->SetDeviceOrigin ( ( long )posX , ( long ) posY );
    // ok现在开始画画
    dc->SetBackground(*wxWHITE_BRUSH );
    dc->Clear();
//    dc->SetFont ( wxGetApp ().m_testFont );
    dc->SetBackgroundMode ( wxTRANSPARENT );
    dc->SetBrush (*wxCYAN_BRUSH );
    dc->SetPen (*wxRED_PEN );
    dc->DrawRectangle (0, 30, 200 , 100);
    dc->DrawText ( wxT (" Rectangle 200 by 100 "), 40, 40);
    dc->SetPen ( wxPen (*wxBLACK ,0, wxDOT_DASH ) );
    dc->DrawEllipse (50 , 140 , 100 , 50);
    dc->SetPen (*wxRED_PEN );
    dc->DrawText ( wxT (" Test message : this is in 10 point text "),10, 180);
}

void Printout::DrawPageTwo(wxDC *dc)
{
    int ppiScreenX, ppiScreenY;
    GetPPIScreen(&ppiScreenX, &ppiScreenY);
    int ppiPrinterX, ppiPrinterY;
    GetPPIPrinter(&ppiPrinterX, &ppiPrinterY);
    float scale = (float )((float )ppiPrinterX/(float)ppiScreenX);
    int pageWidth, pageHeight;
    int w, h;
    dc->GetSize(&w, &h);
    GetPageSizePixels(&pageWidth, &pageHeight);
    float overallScale = scale*( float )(w/(float)pageWidth);
    dc->SetUserScale(overallScale, overallScale) ;
    float logUnitsFactor = (float )(ppiPrinterX/(scale*25.4));
    float logUnits = (float)(50*logUnitsFactor);
    dc->SetPen(*wxBLACK_PEN);
    dc->DrawLine(50, 250, (long)(50.0 + logUnits), 250);
    dc->DrawLine(50, 250, 50, (long)(250.0 + logUnits));
    dc->SetBackgroundMode(wxTRANSPARENT);
    dc->SetBrush(*wxTRANSPARENT_BRUSH);
//    dc->SetFont(wxGetApp().m_testFont);
    dc->DrawText(wxT("Some test text"), 200, 300 );
}

bool Printout::OnPrintPage(int page)
{
    wxDC *dc = GetDC();
    if (dc)
    {
        if (page == 1)
        {
            DrawPageOne(dc);
        }

        else if (page == 2)
        {
            DrawPageTwo(dc);
        }
        MapScreenSizeToPage();
        dc->DrawText(wxString::Format(wxT("PAGE %d"), page), 0, 0);
        return true;
    }
    else
        return false;
}

 2、定义一个全局变量并初始化,使用后清理内存

wxPrintData *g_printData = NULL;
wxPageSetupDialogData* g_pageSetupData = NULL;


g_printData = new wxPrintData;
g_pageSetupData = new wxPageSetupDialogData;

 

delete g_printData;

delete g_pageSetupData;

 

 

3、实现打印预览

void wxPrintFrame::OnPrintPreviewClicked(wxCommandEvent& event)
{
    wxPrintPreview *preview =new wxPrintPreview(new Printout(this), new Printout(this), g_printData);
    if (!preview->IsOk())
    {
        delete preview;
        wxMessageBox(_T("There was a problem previewing"),_T("打印预览"),wxOK);
        return;
    }
    wxPreviewFrame *frame =new wxPreviewFrame(preview, this, wxT("打印预览实例"), wxPoint(100, 100), wxSize(600, 650));
    frame->Centre(wxBOTH);
    frame->Initialize();
    frame->Show();
}

 

4、实现打印功能

void wxPrintFrame::OnPrintClicked(wxCommandEvent& event)
{
    wxPrintDialogData printDialogData(* g_printData);

    wxPrinter printer(&printDialogData);
    Printout po(this, wxT("My printout"));
    if (!printer.Print(this, &po, true /*prompt*/))
    {
        if (wxPrinter::GetLastError() == wxPRINTER_ERROR)
        {
            wxMessageBox(wxT("There was a problem printing. Perhaps your current printer is not set correctly?"));
        }
        else
        {
            wxMessageBox(wxT("You canceled printing"));
        }
    }
    else
    {
        (*g_printData) = printer.GetPrintDialogData().GetPrintData();
    }
}

 

 

5、实现打印设置

void wxPrintFrame::OnPrintSetupClicked(wxCommandEvent& event)
{
    (*g_pageSetupData) = *g_printData;

    wxPageSetupDialog pageSetupDialog(this, g_pageSetupData);
    pageSetupDialog.ShowModal();

    (*g_printData) = pageSetupDialog.GetPageSetupDialogData().GetPrintData();
    (*g_pageSetupData) = pageSetupDialog.GetPageSetupDialogData();
}

分享到:
评论

相关推荐

    所见即所得打印

    "所见即所得打印"(What You See Is What You Get,简称WYSIWYG)是一种在计算机软件中编辑文档的方式,它使得用户在屏幕上看到的内容与最终打印出来的效果几乎完全一致。这种技术在打印和排版领域尤为重要,因为它...

    配置好的CodeBlocks20.03+wxWidgets3.14

    配置CodeBlocks与wxWidgets的集成,可以让你在CodeBlocks中创建和管理使用wxWidgets库的项目。以下是一个详细步骤的概述: 1. **安装CodeBlocks**:首先,你需要在D盘解压缩`codeblocks-20.03`文件,确保不改变其...

    Codeblocks+wxWidgets安装及编译.doc

    Codeblocks+wxWidgets安装及编译

    wxWidgets-3.0.4 mingw32-gcc codeblocks可用版本 自编译

    这个压缩包文件“wxWidgets-3.0.4 mingw32-gcc codeblocks可用版本 自编译”是为Windows平台设计的,特别是为那些使用MinGW32编译器和Code::Blocks集成开发环境(IDE)的开发者准备的。 wxWidgets库包含了丰富的...

    运用MinGW和CodeBlocks在Windows上编译wxWidgets及使用

    在Windows环境下开发C++图形用户界面应用程序时,wxWidgets是一个强大的跨平台库,它允许开发者使用统一的API来编写代码,同时在多个操作系统上运行。本指南将详细介绍如何利用MinGW(Minimalist GNU for Windows)...

    codeblocks配置wxwidgets3.0.0

    codeblocks的最新版本只配置支持wxwidgets3.0.0,解决在用codeblocks新建工程时,没有wxwidgets版本可选的问题,将wizard.script文件直接覆盖CB安装目录下的CodeBlocks\share\CodeBlocks\templates\wizard\wxwidgets...

    wxWidgets2.8.10和CodeBlocks8.02

    结合这两个组件,开发者可以使用CodeBlocks 8.02作为开发环境,利用wxWidgets 2.8.10库创建功能丰富的、跨平台的C++应用。首先,需要安装`codeblocks-8.02mingw-setup.exe`,然后在CodeBlocks中配置wxWidgets的路径...

    wxWidgets在codeblocks中的配置

    这表明文章的主要目的是指导开发者如何设置他们的开发环境,以便能够使用wxWidgets进行跨平台的GUI应用程序开发。 知识点详解: ### 1. wxWidgets简介 wxWidgets是一个强大的跨平台软件开发库,最初于1992年以...

    Windows上配置CodeBlocks + wxWidgets

    Windows 上配置 Code::Blocks + wxWidgets 在本篇文章中,我们将详细介绍如何在 ...配置 Code::Blocks + wxWidgets 需要仔细地按照步骤进行安装和配置,这样才能确保能够正确地使用 wxWidgets 库和 Code::Blocks IDE。

    编译好的CodeBlocks可以直接使用的wxWidgets库

    这个压缩包文件“wxWidgets”包含了已经使用Mingw编译好的wxWidgets库,特别针对CodeBlocks 8.02版本进行了适配。这意味着你可以直接将这些库文件导入到CodeBlocks中,而无需自行编译wxWidgets,从而节省了大量的...

    使用wxwidgets进行跨平台程序开发(中文版)_wxWidgets学习_wxWidgets_

    **wxWidgets 概述** wxWidgets 是一个开源的 C++ 库,它允许开发者使用标准的 C++ 编程语法创建跨平台的图形...通过不断学习和实践,开发者可以利用 wxWidgets 实现自己的创新想法,同时享受到跨平台开发带来的便利。

    以CodeBlocks为IDE,在wxWidgets中实现窗体透明效果

    通过这个教程,你已经了解了如何在`CodeBlocks`中使用`wxWidgets`库创建一个带有透明效果的窗口。这只是一个基本的示例,实际应用中你还可以根据需求添加更多的功能,如控件、事件处理等。继续深入学习`wxWidgets`和...

    CodeBlocks的安装以及wxWidget的安装及配置

    CodeBlocks和wxWidgets的安装、配置及编译 CodeBlocks是一款功能强大的集成开发环境(IDE...安装和配置CodeBlocks、wxWidgets需要注意许多细节,需要一步步按照正确的步骤进行安装和配置,才能确保正确的编译和使用。

    CodeBlocks的wxWidgets3.1工程脚本

    这个是一个外国人写的在CodeBlocks中建立的wxWidgets3.1工程的向导脚本,一放进去直接覆盖掉。

    基于wxwidgets实现的自定义菜单

    在本文中,我们将深入探讨如何使用wxWidgets库来实现自定义菜单功能。wxWidgets是一个流行的跨平台C++库,它提供了丰富的GUI(图形用户界面)组件,使得开发者能够轻松地创建具有吸引力的桌面应用程序。 首先,我们...

    codeblocks_17.12.tar.xz+wxWidgets-3.0.4.tar.bz2源码.zip

    5. **使用CodeBlocks**:现在,你可以使用新编译的CodeBlocks IDE创建C++项目,并选择wxWidgets作为GUI库。CodeBlocks将自动处理项目设置,使得链接到wxWidgets库变得简单。 通过源码编译CodeBlocks和wxWidgets,...

    使用wxWidgets进行跨平台程序开发 pdf

    wxWidgets是一个成熟的跨平台C++库,它允许开发者使用一套代码来创建图形用户界面(GUI)程序,这些程序能够在Windows、Linux、Mac OS X等多个操作系统上运行。在深入了解如何使用wxWidgets进行程序开发之前,有必要...

    codeblocks下搭载wxwidgets的统计计算器源代码

    总之,通过这个项目,你可以学习到如何在CodeBlocks中集成和使用wxWidgets,理解GUI编程的基本原理,掌握统计计算的实现方法,以及实践面向对象编程和C++的基础知识。这是一个很好的动手实践项目,对于提升编程技能...

Global site tag (gtag.js) - Google Analytics