热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请教高手wxWidgets打印表格问题

打印一个表格的时候不知道该如何描述dc,代码如下:test_sheet.h文件:#ifndef_test_sheet_h#define_test_sheet_h#inc
打印一个表格的时候不知道该如何描述dc,代码如下: 
test_sheet.h文件: 
#ifndef _test_sheet_h 
#define _test_sheet_h 

#include "wx_pch.h" 
#include  

class wxSheet; 

class test_sheet : public wxDialog 

public: 
wxSheet *grid; 
wxTextCtrl *logWin; 
wxLogTextCtrl *logger; 

public: 
test_sheet(wxWindow * parent, 
wxWindowID id , 
const wxString& title, 
const wxPoint & pos , 
const wxSize & size , 
long styl, 
const wxChar * name ); 

virtual ~test_sheet(); 

wxLog *m_logOld; 

bool m_addToSel; 

wxSheet *getSheet(){return grid;}; 
DECLARE_EVENT_TABLE() 
}; 
#endif 
#ifndef WX_PCH_H_INCLUDED 
#define WX_PCH_H_INCLUDED 

#if ( defined(USE_PCH) && !defined(WX_PRECOMP) ) 
#define WX_PRECOMP 
#endif // USE_PCH 

// basic wxWidgets headers 
#include  
// for use xrc files 
#include  

#ifdef __BORLANDC__ 
#pragma hdrstop 
#endif 

#ifndef WX_PRECOMP 
#include  
#endif 

#ifdef USE_PCH 
// put here all your rarely-changing header files 

#endif // USE_PCH 

#endif // WX_PCH_H_INCLUDED 
test_sheet.cpp如下: 
#include "test_sheet.h" 
#include "wx/colordlg.h" 
#include "wx/fontdlg.h" 
#include "wx/artprov.h" 
#include "wx/sheet/sheetspt.h" 

BEGIN_EVENT_TABLE(test_sheet, wxDialog) 

END_EVENT_TABLE() 

test_sheet::test_sheet( 
wxWindow *parent , 
wxWindowID id , 
const wxString& title, 
const wxPoint & pos , 
const wxSize & size , 
long styl, 
const wxChar * name ) 
:wxDialog( 
parent, 
wxID_ANY, 
wxString(_T("sheet dialog")), 
wxDefaultPosition, 
wxDefaultSize//wxSize(800,600) 




//m_addToSel = false; 

//wxSplitterWindow *splitter = new wxSplitterWindow(this, -1); 
//splitter->SetMinimumPaneSize(0); 
//splitter->SetSashGravity(0.9); 

//// to use the splitter simply create one, then your sheet as a child 
//// and initialize the splitter with the sheet. 
//wxSheetSplitter* sheetSplitter = new wxSheetSplitter(splitter, -1, 
// wxPoint(0, 0), wxDefaultSize); 

grid = new wxSheet( this, 
-1, 
wxPoint( 0, 0 ), 
wxDefaultSize ); 

grid->CreateGrid( 0, 0 ); 
grid->AppendRows(9); 
grid->AppendCols(4); 
grid->SetRowHeight( 0, 30); 
grid->SetCellSpan( wxSheetCoords(0, 0), wxSheetCoords(1,4 )); 
grid->SetCellValue(wxSheetCoords(0,0),_("钢带编号 宽度 条数 规 格")); 
grid->SetRowHeight( 1, 48.75); 
grid->SetRowHeight( 2, 48.75); 
grid->SetRowHeight( 3, 48.75); 
grid->SetRowHeight( 4, 48.75); 
grid->SetRowHeight( 5, 48.75); 
grid->SetRowHeight( 6, 48.75); 
grid->SetRowHeight( 7, 48.75); 
grid->SetRowHeight( 8, 48.75); 
grid->SetColWidth( 0, 78 ); 
grid->SetColWidth( 1, 58 ); 
grid->SetColWidth( 2, 24 ); 
grid->SetColWidth( 3, 80 ); 
grid->SetCellSpan( wxSheetCoords(1, 0), wxSheetCoords(8, 1)); 
grid->SetCellValue(wxSheetCoords(1,0),_(" 钢带编号\n 890000\n 带 宽\n 0.62*514\n 边 丝\n 12.00\n 带重\n 0\n 总分数\n 4")); 
grid->SetCellValue(wxSheetCoords(1,1),_("158.2")); 
grid->SetCellValue(wxSheetCoords(1,2),_("2")); 
grid->SetCellValue(wxSheetCoords(1,3),_("51×0。62")); 
grid->SetCellValue(wxSheetCoords(2,1),_("67.7")); 
grid->SetCellValue(wxSheetCoords(3,1),_("117.9")); 
grid->SetCellValue(wxSheetCoords(2,2),_("1")); 
grid->SetCellValue(wxSheetCoords(2,3),_("22×0.62")); 
grid->SetCellValue(wxSheetCoords(3,2),_("1")); 
grid->SetCellValue(wxSheetCoords(3,3),_("38×0.62")); 



test_sheet::~test_sheet() 

//delete wxLog::SetActiveTarget(m_logOld); 


4 个解决方案

#1


printing.h如下: 



#ifndef _printing_h 
#define _printing_h 

#pragma warning(disable: 4267) 
#include "test_sheet.h" 
class MyApp: public wxApp 

public: 
MyApp(){}; 
bool OnInit(); 
int OnExit(); 

wxFont m_testFont; 
}; 

DECLARE_APP(MyApp) 

class MyCanvas; 
class MyFrame: public wxFrame 

public: 
MyCanvas *canvas; 
wxBitmap m_bitmap; 
MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size); 

void Draw(wxDC& dc); 
void OnPrint(wxCommandEvent& event); 
void OnPrintPreview(wxCommandEvent& event); 
void OnPageSetup(wxCommandEvent& event); 
void OnPrintout(wxCommandEvent& event); 
protected: 

void Init(); 

DECLARE_EVENT_TABLE() 


public: 
test_sheet *m_Sheet; 
}; 

// Define a new canvas which can receive some events 
class MyCanvas: public wxScrolledWindow 

public: 
MyCanvas(wxFrame *frame, const wxPoint& pos, const wxSize& size, long style = wxRETAINED); 
~MyCanvas(void){}; 

virtual void OnDraw(wxDC& dc); 
void OnEvent(wxMouseEvent& event); 

DECLARE_EVENT_TABLE() 
}; 

class MyPrintout: public wxPrintout 

public: 
MyPrintout(const wxChar *title = _T("My printout")):wxPrintout(title) {} 
bool OnPrintPage(int page); 
bool HasPage(int page); 
bool OnBeginDocument(int startPage, int endPage); 
void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo); 
void DrawPageOne(); 
void DrawPageTwo(); 

}; 

#define WXPRINT_QUIT 100 
#define WXPRINT_PRINT 101 
#define WXPRINT_PAGE_SETUP 103 
#define WXPRINT_PREVIEW 104 
#define WXPRINT_OUT 105 


#endif 

#2


printing.cpp如下: 
#include "wx/wxprec.h" 
#include "wx/wx.h" 
#include  
#include "wx/metafile.h" 
#include "wx/print.h" 
#include "wx/printdlg.h" 
#include "wx/image.h" 
#include "wx/accel.h" 
#include  
#include  
#include "printing.h" 

MyFrame *frame = (MyFrame *) NULL; 
wxPrintData *g_printData = (wxPrintData*) NULL ; 
MyCanvas *canvas; 
wxBufferedPaintDC* dcs; 
test_sheet* sheet; 
wxPageSetupDialogData* g_pageSetupData = (wxPageSetupDialogData*) NULL; 
//bool WritePageHeader(wxPrintout *printout, wxDC *dc, const wxChar *text, float mmToLogical); 
IMPLEMENT_APP(MyApp) 
bool MyApp::OnInit(void) 

wxInitAllImageHandlers(); 
m_testFont.Create(10, wxSWISS, wxNORMAL, wxNORMAL); 
g_printData = new wxPrintData; 

g_pageSetupData = new wxPageSetupDialogData; 
// copy over initial paper size from print record 
(*g_pageSetupData) = *g_printData; 
// Set some initial page margins in mm. 
g_pageSetupData->SetMarginTopLeft(wxPoint(15, 15)); 
g_pageSetupData->SetMarginBottomRight(wxPoint(15, 15)); 
// Create the main frame window 
frame = new MyFrame((wxFrame *) NULL, _T("testview"), 
wxPoint(0, 0), wxSize(800, 600)); 
frame->CreateStatusBar(1); 
wxMenu *file_menu = new wxMenu; 
file_menu->Append(WXPRINT_PRINT, _T("&Print..."), _T("Print")); 
file_menu->Append(WXPRINT_PAGE_SETUP, _T("Page Set&up..."), _T("Page setup")); 
file_menu->Append(WXPRINT_PREVIEW, _T("Print Pre&view"), _T("Preview")); 
file_menu->Append(WXPRINT_OUT, _T("&out..."), _T("out")); 
wxMenuBar *menu_bar = new wxMenuBar; 
menu_bar->Append(file_menu, _T("&File")); 
frame->SetMenuBar(menu_bar); 
MyCanvas *canvas = new MyCanvas(frame, wxPoint(0, 0), wxSize(100, 100), wxRETAINED|wxHSCROLL|wxVSCROLL); 
canvas->SetScrollbars(10, 10,50, 50); 
frame->canvas = canvas; 

// dcs = new wxWindowDC(sheet); 
frame->Centre(wxBOTH); 
frame->Show(); 
SetTopWindow(frame); 
return true; 


int MyApp::OnExit() 

delete g_printData; 
delete g_pageSetupData; 
return 1; 


BEGIN_EVENT_TABLE(MyFrame, wxFrame) 
EVT_MENU(WXPRINT_PRINT, MyFrame::OnPrint) 
EVT_MENU(WXPRINT_PREVIEW, MyFrame::OnPrintPreview) 
EVT_MENU(WXPRINT_PAGE_SETUP, MyFrame::OnPageSetup) 
EVT_MENU(WXPRINT_OUT, MyFrame::OnPrintout) 
END_EVENT_TABLE() 
MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size): 
wxFrame(frame, wxID_ANY, title, pos, size), 
m_Sheet(NULL), 
canvas(NULL) 

canvas = NULL; 


void MyFrame::Init() 

wxFrame::Init(); 






void MyFrame::OnPrint(wxCommandEvent& WXUNUSED(event)) 


wxPrintDialogData printDialogData(* g_printData); 
wxPrinter printer(& printDialogData); 
MyPrintout printout(_T("My printout")); 
if (!printer.Print(this, &printout, true /*prompt*/)) 

if (wxPrinter::GetLastError() == wxPRINTER_ERROR) 
wxMessageBox(_T("There was a problem printing.\nPerhaps your current printer is not set correctly?"), _T("Printing"), wxOK); 
else 
wxMessageBox(_T("You canceled printing"), _T("Printing"), wxOK); 

else 

(*g_printData) = printer.GetPrintDialogData().GetPrintData(); 



void MyFrame::OnPrintPreview(wxCommandEvent& WXUNUSED(event)) 

wxPrintDialogData printDialogData(* g_printData); 
wxPrintPreview *preview = new wxPrintPreview(new MyPrintout, new MyPrintout, & printDialogData); 
if (!preview->Ok()) 

delete preview; 
wxMessageBox(_T("There was a problem previewing.\nPerhaps your current printer is not set correctly?"), _T("Previewing"), wxOK); 
return; 


wxPreviewFrame *frame = new wxPreviewFrame(preview, this, _T("Demo Print Preview"), wxPoint(0, 0), wxSize(800, 600)); 
frame->Centre(wxBOTH); 
frame->Initialize(); 
frame->Show(); 


void MyFrame::OnPageSetup(wxCommandEvent& WXUNUSED(event)) 

(*g_pageSetupData) = *g_printData; 

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

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

void MyFrame::OnPrintout(wxCommandEvent& WXUNUSED(event)) 


static int it = 0; 

if (it == 0) 

if (m_Sheet == NULL) 
m_Sheet = new test_sheet( 
frame, 
wxID_ANY, 
wxString(_T("sheet dialog")), 
wxDefaultPosition, 
wxSize(600,400), 
0 , 
_("nihao") 
); 
if (m_Sheet != NULL) 

m_Sheet->SetSize(800,600); 
m_Sheet->Show(); 

it = 1; 
return; 

it = 0; 

wxPrintDialogData printDialogData(* g_printData); 
wxPrintPreview *preview = new wxPrintPreview(new MyPrintout, new MyPrintout, & printDialogData); 
if (!preview->Ok()) 

delete preview; 
wxMessageBox(_T("There was a problem previewing.\nPerhaps your current printer is not set correctly?"), _T("Previewing"), wxOK); 
return; 


wxPreviewFrame *frame = new wxPreviewFrame(preview, this, _T("Demo Print Preview"), wxPoint(0, 0), wxSize(800, 600)); 
frame->Centre(wxBOTH); 
frame->Initialize(); 
frame->Show(); 

void MyFrame::Draw(wxDC& dc) 


if (m_Sheet != NULL) 

wxPaintDC dcs(this->m_Sheet); 
dc.Blit(0,0,800,600,&dcs,0,0,wxCOPY,false,-1,-1); 


//dc.Blit(0,0,800,600,dcs,0,0,wxCOPY,false,-1,-1); 


BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) 
EVT_MOUSE_EVENTS(MyCanvas::OnEvent) 
END_EVENT_TABLE() 

MyCanvas::MyCanvas(wxFrame *frame, const wxPoint& pos, const wxSize& size, long style): 
wxScrolledWindow(frame, wxID_ANY, pos, size, style) 


SetBackgroundColour(* wxWHITE); 



void MyCanvas::OnDraw(wxDC& dc) 

//dc.Blit(100,100,400,420,dcs,100,100,wxCOPY,false,-1,-1); 

//dc.DrawText(_("包头市华盛不锈钢型材有限公司"),91,21); 

frame->Draw(dc); 


void MyCanvas::OnEvent(wxMouseEvent& WXUNUSED(event)) 



bool MyPrintout::OnPrintPage(int page) 

wxDC *dc = GetDC(); 
if (dc) 

if (page == 1) 
DrawPageOne(); 
else if (page == 2) 
DrawPageTwo(); 
MapScreenSizeToPage(); 
wxChar buf[200]; 
wxSprintf(buf, wxT("PAGE %d"), page); 
//dc->DrawText(buf, 0, 0); 

return true; 

else 
return false; 


bool MyPrintout::OnBeginDocument(int startPage, int endPage) 

if (!wxPrintout::OnBeginDocument(startPage, endPage)) 
return false; 

return true; 


void MyPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo) 

*minPage = 1; 
*maxPage = 2; 
*selPageFrom = 1; 
*selPageTo = 2; 


bool MyPrintout::HasPage(int pageNum) 

return (pageNum == 1 || pageNum == 2); 


void MyPrintout::DrawPageOne() 

wxCoord maxX = 800; 
wxCoord maxY = 600; 
FitThisSizeToPageMargins(wxSize(maxX, maxY), *g_pageSetupData); 
wxRect fitRect = GetLogicalPageMarginsRect(*g_pageSetupData); 
wxCoord xoff = (fitRect.width - maxX) / 2; 
wxCoord yoff = (fitRect.height - maxY) / 2; 
OffsetLogicalOrigin(xoff, yoff); 
/*wxPrinterDC * dct = new wxPrinterDC(frame->m_Sheet); 
this->SetDC(dct);*/ 

frame->Draw(*GetDC()); 


void MyPrintout::DrawPageTwo() 




这样打印的结果是黑屏, 
到底如何才能捕捉到m_Sheet并且将其输出啊,有高手指点下么,谢谢

#3


建议看看wx自己带的打印例子。

#4


另外,关于wxWidgets的问题,还是在forums.wxwidgets.org里问比较好,到英文论坛问:那里回答很活跃,高手特别多!
wxWidgets开发者们经常也在里面回答问题。

推荐阅读
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 本次发布的Qt音乐播放器2.0版本在用户界面方面进行了细致优化,提升了整体的视觉效果和用户体验。尽管核心功能与1.0版本保持一致,但界面的改进使得操作更加直观便捷,为用户带来了更为流畅的使用体验。此外,我们还对部分细节进行了微调,以确保软件的稳定性和性能得到进一步提升。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 2.2 组件间父子通信机制详解
    2.2 组件间父子通信机制详解 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 深入解析 Android TextView 中 getImeActionLabel() 方法的使用与代码示例 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 开发笔记:深入解析Android自定义控件——Button的72种变形技巧
    开发笔记:深入解析Android自定义控件——Button的72种变形技巧 ... [详细]
author-avatar
多米音乐_34024963
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有