Artifact d21281e45b72204f0eac3809d55554b5f99f5bb09b37547a4cfc51816ec79764:
- Executable file
r38/lisp/csl/cslbase/FXPrintSample.cpp
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 13800) [annotate] [blame] [check-ins using] [more...]
// Sample code to demonstrate use of the Native Printer Code // // This pops up an MDI window, but the important part is not at all // anything displayed - it is that there is a FILE/PRINT menu item // and when activated it prints a sample page with lines and text. // // This code came with FXDCNativePrinter.cpp. There have been // slight adjustments to allow it to run with either FOX 1.0 or FOX 1.1 // As originally supplied this files did not contain any copyright or // author information. Its author (Manuel <address@te...> expained // in an e-mail: // //"c) Including it in FOX: I havent put any copyright notice on the code so it // could be used for any purpose. If Jeroen wants to incorporate it or a // derivative work, it is fine with me." // // and on that basis it seems reasonable to re-circulate this slightly // updated version as usable subject to anything Manuel wants to say but // at least in line with the license terms of the main FOX toolkit. /* Signature: 3cb080b2 05-Jan-2006 */ #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <signal.h> #include <fx.h> #include "FXDCNativePrinter.h" FXPrinter printer; #define CLOCKTIMER 500 const unsigned char penguin[]={ 0x47,0x49,0x46,0x38,0x37,0x61,0x10,0x00,0x12,0x00,0xf2,0x00,0x00,0xb2,0xc0,0xdc, 0x80,0x80,0x80,0x00,0x00,0x00,0xc0,0xc0,0xc0,0x10,0x10,0x10,0xff,0xff,0xff,0xe0, 0xa0,0x08,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x00,0x10,0x00,0x12,0x00,0x00,0x03, 0x53,0x08,0xba,0x21,0x12,0x2b,0xc6,0xe6,0x9e,0x94,0x62,0x64,0x77,0xa3,0x20,0x4e, 0x21,0x74,0x8b,0x60,0x9c,0x1a,0xa9,0x98,0xa8,0x45,0xb2,0x85,0x38,0x76,0x4f,0x6c, 0xbb,0x93,0x60,0xdb,0x0d,0xe4,0xd9,0x83,0x1d,0xe7,0x57,0x18,0x04,0x6f,0xb8,0x4c, 0xec,0x88,0x9c,0x01,0x0c,0x47,0x66,0xac,0xa2,0x38,0x19,0x76,0x36,0x83,0xc3,0xf0, 0xb4,0x5e,0x77,0x03,0xaf,0xf8,0x7b,0x13,0x77,0xad,0xd3,0xad,0x75,0x61,0xa5,0x54, 0x02,0x27,0x45,0x02,0x00,0x3b }; ////////////////////////////////////////////////////////////////////////////////////////////// // Mini application object class FXAPI MainWindow : public FXMainWindow { FXDECLARE(MainWindow) protected: FXMenuBar *menubar; FXMDIClient *mdiclient; // MDI Client area FXMDIMenu *mdimenu; // MDI Window Menu FXGIFIcon *mdiicon; // MDI Icon FXMenuPane *filemenu; FXMenuPane *windowmenu; FXMenuPane *editmenu; FXMenuPane *popupmenu; // Context menu FXToolBarShell *dragshell1,*dragshell2; FXToolBar *toolbar; FXStatusBar *statusbar; FXMenuPane *helpmenu; FXFont *font; protected: MainWindow(){} public: // We define ID's, starting from the last one used by the base class+1. // This way, we know the ID's are all unique for this particular target. enum { ID_ABOUT=FXMainWindow::ID_LAST, ID_NEW, ID_SAVE, ID_OPEN, ID_CLOSE, ID_QUIT, ID_PRINTSETUP, ID_PRINT, ID_LAST }; // message handlers long onCmdAbout(FXObject*,FXSelector,void*); long onCmdNew(FXObject*,FXSelector,void*); long onCmdSave(FXObject*,FXSelector,void*); long onCmdOpen(FXObject*,FXSelector,void*); long onCmdClose(FXObject*,FXSelector,void*); long onCmdQuit(FXObject*,FXSelector,void*); long onCmdPrintSetup(FXObject*,FXSelector,void*); long onCmdPrint(FXObject*,FXSelector,void*); public: MainWindow(FXApp* a); virtual void create(); virtual ~MainWindow(); }; // Map FXDEFMAP(MainWindow) MainWindowMap[]={ //________Message_Type____________ID___________________Message_Handler________ FXMAPFUNC(SEL_COMMAND, MainWindow::ID_ABOUT, MainWindow::onCmdAbout), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_NEW, MainWindow::onCmdNew), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_SAVE, MainWindow::onCmdSave), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_OPEN, MainWindow::onCmdOpen), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_PRINTSETUP,MainWindow::onCmdPrintSetup), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_PRINT, MainWindow::onCmdPrint), FXMAPFUNC(SEL_SIGNAL, MainWindow::ID_QUIT, MainWindow::onCmdQuit), FXMAPFUNC(SEL_CLOSE, 0, MainWindow::onCmdQuit), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_QUIT, MainWindow::onCmdQuit), }; // Object implementation FXIMPLEMENT(MainWindow,FXMainWindow,MainWindowMap,ARRAYNUMBER(MainWindowMap)) /*******************************************************************************/ // Start the whole thing int main(int argc,char *argv[]){ // Make application FXApp application("MDI skeleton","MDI skeleton"); // Open display application.init(argc,argv); // Make window MainWindow *w=new MainWindow(&application); // Create app application.create(); w->setFocus(); // Run return application.run(); } // Make some windows MainWindow::MainWindow(FXApp* a): FXMainWindow(a,"MDI Widget Test",NULL,NULL,DECOR_ALL,0,0,800,600){ FXMDIChild *mdichild; FXScrollWindow *scrollwindow; FXButton *btn; // Initialize printer selection with default values { FXPrintDialog dlg(this,""); // Do NOT show dialog. Just get its default printer dlg.getPrinter( printer ); } // Make menu bar FXToolBarShell* dragshell1=new FXToolBarShell(this,FRAME_RAISED|FRAME_THICK); menubar=new FXMenuBar(this,dragshell1,LAYOUT_SIDE_TOP|LAYOUT_FILL_X); new FXToolBarGrip(menubar,menubar,FXMenuBar::ID_TOOLBARGRIP, TOOLBARGRIP_DOUBLE); // Tool bar FXToolBarShell* dragshell2=new FXToolBarShell(this,FRAME_RAISED|FRAME_THICK); toolbar=new FXToolBar(this,dragshell2, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT); new FXToolBarGrip(toolbar,toolbar, FXToolBar::ID_TOOLBARGRIP,TOOLBARGRIP_DOUBLE); // Status bar statusbar=new FXStatusBar(this, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER); // MDI Client mdiclient=new FXMDIClient(this,LAYOUT_FILL_X|LAYOUT_FILL_Y); // Icon for MDI Child mdiicon=new FXGIFIcon(getApp(),penguin); // Make MDI Menu mdimenu=new FXMDIMenu(this,mdiclient); // MDI buttons in menu:- note the message ID's!!!!! // Normally, MDI commands are simply sensitized or desensitized; // Under the menubar, however, they're hidden if the MDI Client is // not maximized. To do this, they must have different ID's. new FXMDIWindowButton(menubar,NULL,mdiclient, FXMDIClient::ID_MDI_MENUWINDOW,LAYOUT_LEFT); new FXMDIDeleteButton(menubar,mdiclient, FXMDIClient::ID_MDI_MENUCLOSE,FRAME_RAISED|LAYOUT_RIGHT); new FXMDIRestoreButton(menubar,mdiclient, FXMDIClient::ID_MDI_MENURESTORE,FRAME_RAISED|LAYOUT_RIGHT); new FXMDIMinimizeButton(menubar,mdiclient, FXMDIClient::ID_MDI_MENUMINIMIZE,FRAME_RAISED|LAYOUT_RIGHT); // File menu filemenu=new FXMenuPane(this); new FXMenuCommand(filemenu,"&New\tCtl-N\tNew document",NULL,this,ID_NEW); new FXMenuCommand(filemenu,"&Open\tCtl-O\tOpen document",NULL,this,ID_OPEN); new FXMenuCommand(filemenu,"&Close\t\tClose document",NULL, mdiclient,FXMDIClient::ID_MDI_CLOSE); new FXMenuSeparator(filemenu); new FXMenuCommand(filemenu,"&Print setup\t\tSelect printer and paper",NULL, this,ID_PRINTSETUP); new FXMenuCommand(filemenu,"&Print\t\tPrint document",NULL,this,ID_PRINT); new FXMenuSeparator(filemenu); new FXMenuCommand(filemenu,"&Exit\tAlt-F4\tGo pickup some girls",NULL, this,ID_QUIT,0); new FXMenuTitle(menubar,"&Files",NULL,filemenu); // Window menu windowmenu=new FXMenuPane(this); new FXMenuCommand(windowmenu,"Tile &Horizontally",NULL, mdiclient,FXMDIClient::ID_MDI_TILEHORIZONTAL); new FXMenuCommand(windowmenu,"Tile &Vertically",NULL, mdiclient,FXMDIClient::ID_MDI_TILEVERTICAL); new FXMenuCommand(windowmenu,"C&ascade",NULL, mdiclient,FXMDIClient::ID_MDI_CASCADE); new FXMenuCommand(windowmenu,"&Close",NULL, mdiclient,FXMDIClient::ID_MDI_CLOSE); // // The next lines were in the sample app but I can not find // ID_CLOSE_ALL_DOCUMENTS anywhere in the FOX header files... // //new FXMenuCommand(windowmenu,"Clo&se All",NULL, // mdiclient,FXMDIClient::ID_CLOSE_ALL_DOCUMENTS); FXMenuSeparator* sep1=new FXMenuSeparator(windowmenu); sep1->setTarget(mdiclient); sep1->setSelector(FXMDIClient::ID_MDI_ANY); new FXMenuCommand(windowmenu,NULL,NULL,mdiclient,FXMDIClient::ID_MDI_1); new FXMenuCommand(windowmenu,NULL,NULL,mdiclient,FXMDIClient::ID_MDI_2); new FXMenuCommand(windowmenu,NULL,NULL,mdiclient,FXMDIClient::ID_MDI_3); new FXMenuCommand(windowmenu,NULL,NULL,mdiclient,FXMDIClient::ID_MDI_4); new FXMenuTitle(menubar,"&Windows",NULL,windowmenu); // Help menu helpmenu=new FXMenuPane(this); new FXMenuCommand(helpmenu,"&About...",NULL,this,ID_ABOUT,0); new FXMenuTitle(menubar,"&Help",NULL,helpmenu,LAYOUT_RIGHT); getApp()->addSignal(SIGINT,mdiclient,MainWindow::ID_QUIT); // Font #if (FOX_MINOR<=4) font = new FXFont(getApp(), "", 10, FONTWEIGHT_NORMAL, FONTSLANT_REGULAR, FONTENCODING_DEFAULT, FONTSETWIDTH_DONTCARE, FONTPITCH_FIXED); #else font = new FXFont(getApp(), "", 10, FXFont::Normal, FXFont::Straight, FONTENCODING_DEFAULT, 0, FXFont::Fixed); #endif // Right-click popup menu popupmenu=new FXMenuPane(this); new FXMenuCommand(popupmenu,"Test",NULL,this,ID_QUIT); //Fill toolbar new FXButton(toolbar,"Open\t\tOpen new document",mdiicon, this,ID_NEW, ICON_ABOVE_TEXT|BUTTON_TOOLBAR|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT); } // Clean up MainWindow::~MainWindow(){ delete helpmenu; delete windowmenu; delete filemenu; delete font; delete popupmenu; } // Start void MainWindow::create(){ FXMainWindow::create(); show(PLACEMENT_SCREEN); } // About long MainWindow::onCmdAbout(FXObject*,FXSelector,void*){ FXMessageBox::information(this,MBOX_OK,"About", "Sample App"); return 1; } long MainWindow::onCmdNew(FXObject*,FXSelector,void*) { return 1; } long MainWindow::onCmdSave(FXObject*,FXSelector,void*) { return 1; } long MainWindow::onCmdOpen(FXObject*,FXSelector,void*) { return 1; } long MainWindow::onCmdClose(FXObject*,FXSelector,void*) { return 1; } long MainWindow::onCmdQuit(FXObject*o,FXSelector sel,void*ptr) { mdiclient->forallWindows(this,MKUINT(0,SEL_CLOSE),0); if ( ((sel>>16)&0xFFFF)==SEL_CLOSE ) { FXTopWindow::handle(o,sel,ptr); } getApp()->handle(this, MKUINT(FXApp::ID_QUIT,SEL_COMMAND),ptr); return 1; } long MainWindow::onCmdPrintSetup(FXObject*,FXSelector,void*) { FXPrintDialog dlg(this,""); dlg.setPrinter( printer ); // Use last printer selection dlg.execute(); dlg.getPrinter( printer ); return 1; } long MainWindow::onCmdPrint(FXObject*,FXSelector,void*) { FXDCNativePrinter prt(getApp()); FXFont *font10, *font16; FXint w,h; char string[]="Hello world!"; prt.beginPrint(printer); font10 = prt.fntGenerateFont("helvetica", 10); font10->create(); font16 = prt.fntGenerateFont("helvetica", 16); font16->create(); prt.beginPage(1); /* I want to use tenths of millimeter (2.54 cm per inch) */ prt.setHorzUnitsInch( 254 ); prt.setVertUnitsInch( 254 ); prt.setForeground( FXRGB(0,0,0) ); /* WARNING: The concept of border is subject to change. Right now, it is ** not clear if the border is the physical paper border, or the printable ** area. ** The later is printer-dependant . ** Paper size (width x height) is the physical paper size */ /* Draw a frame around the page, 2 cm from each border of the paper. ** This only takes into account your selected paper size, regardles of ** the actual physical size of the paper you feed to the printer. */ prt.drawRectangle(200,200,prt.getPageWidth()-400,prt.getPageHeight()-400); /* Draw a frame exactly at page boundaries */ prt.drawRectangle( 0,0, prt.getPageWidth()-1, prt.getPageHeight()-1 ); /* draw a 10cm horizontal line 3cm from the top-left border */ prt.drawLine(300,300, 1300,300 ); /* Put some text over the line */ prt.setTextFont( font10 ); prt.drawText(300,300, string, strlen(string) ); /* draw another line 2cm below the other */ prt.drawLine(300,500, 1300,500 ); /* Put some text over the line */ prt.setTextFont( font16 ); prt.drawText(300,500, string, strlen(string) ); /* Draw some aligned text */ prt.drawLine(1000, 150, 1000, 1700 ); w=prt.fntGetTextWidth( string, strlen(string) ); prt.drawText( 1000, 1200, string, strlen(string) ); /* Right */ prt.drawText( 1000-w, 1300, string, strlen(string) ); /* Left */ prt.drawText( 1000-(w/2), 1400, string, strlen(string) ); /* Centre */ /* Now, I want to draw using 100th of inch as drawing unit */ prt.setHorzUnitsInch( 100 ); prt.setVertUnitsInch( 100 ); /* Draw a box with sides 1 inch long */ prt.setForeground( FXRGB(255,0,0) ); /* Red box */ prt.drawRectangle( 300, 300, 100, 100 ); /* 3 inches from the margin */ prt.endPage(); prt.endPrint(); return 1; } // end of printing sample code.