Code Search for Developers
 
 
  

tkWinPrintCanvas.c from Gdb at Krugle


Show tkWinPrintCanvas.c syntax highlighted


#ifdef _WIN32

#include <windows.h>

#include "tkWinInt.h"
#include "tkCanvas.h"

#include <tcl.h>
#include <tk.h>



/*
 *--------------------------------------------------------------
 * 
 * PrintCanvasCmd -- 
 *      When invoked with the correct args this will bring up a
 *      standard Windows print dialog box and then print the
 *	contence of the canvas.
 *
 * Results:
 *      Standard Tcl result.
 * 
 *--------------------------------------------------------------
 */


int
PrintCanvasCmd(clientData, interp, argc, argv)
     ClientData clientData;
     Tcl_Interp *interp;
     int argc;
     char **argv;
{
    PRINTDLG pd;
    Tcl_CmdInfo canvCmd;
    TkCanvas *canvasPtr;
    TkWinDrawable *PrinterDrawable;
    Tk_Window tkwin;/* = canvasPtr->tkwin;*/
    Tk_Item *itemPtr;
    Pixmap pixmap;
    HDC hDCpixmap;
    TkWinDCState pixmapState;
    DEVMODE dm;
    float Ptr_pixX,Ptr_pixY,Ptr_mmX,Ptr_mmY;
    float canv_pixX,canv_pixY,canv_mmX,canv_mmY;

    int widget_X_size = 0;
    int widget_Y_size = 0;
    int page_Y_size, page_X_size;
    int tiles_wide,tiles_high;
    int tile_y, tile_x;
    int screenX1, screenX2, screenY1, screenY2, width, height;
    DOCINFO *lpdi = (DOCINFO *) ckalloc(sizeof(DOCINFO));

    if (argc < 2) {
	Tcl_AppendResult(interp, "wrong # args: should be \"",
			 argv[0], " canvas \"",
			 (char *) NULL);
	goto error;
    }

    /* The second arg is the canvas widget */
    if (!Tcl_GetCommandInfo(interp, argv[1], &canvCmd)) {
	Tcl_AppendResult(interp, "couldn't get canvas information for \"",
			 argv[1], "\"", (char *) NULL);
	goto error;
    }
    
    memset(&dm,0,sizeof(DEVMODE));
    dm.dmSize = sizeof(DEVMODE);
    dm.dmScale = 500;

    memset(lpdi,0,sizeof(DOCINFO));
    lpdi->cbSize=sizeof(DOCINFO);
    lpdi->lpszDocName= (LPCSTR) ckalloc(255);
    sprintf((char*)lpdi->lpszDocName,"SN - Printing\0");
    lpdi->lpszOutput=NULL;

    canvasPtr = (TkCanvas *)(canvCmd.clientData);
  tkwin = canvasPtr->tkwin;
    memset(&pd,0,sizeof( PRINTDLG ));
    pd.lStructSize  = sizeof( PRINTDLG );
    pd.hwndOwner    = NULL;
    pd.hDevMode	    = NULL;
    pd.hDevNames    = NULL;
    /* pd.hDC = */
    pd.Flags	    = PD_RETURNDC;

    /* Get printer details. */
    if (!PrintDlg(&pd)) {
	goto done;
    }

    PrinterDrawable = (TkWinDrawable *) ckalloc(sizeof(TkWinDrawable));
    PrinterDrawable->type = TWD_WINDC;
    PrinterDrawable->winDC.hdc = pd.hDC;

    Ptr_pixX=(float)GetDeviceCaps(PrinterDrawable->winDC.hdc,HORZRES);
    Ptr_pixY=(float)GetDeviceCaps(PrinterDrawable->winDC.hdc,VERTRES);
    Ptr_mmX=(float)GetDeviceCaps(PrinterDrawable->winDC.hdc,HORZSIZE);
    Ptr_mmY=(float)GetDeviceCaps(PrinterDrawable->winDC.hdc,VERTSIZE);
  
        screenX1=0; screenY1=0;
    screenX2=canvasPtr->width; screenY2=canvasPtr->height;
	canvasPtr->drawableXOrigin = screenX1 - 30;
	canvasPtr->drawableYOrigin = screenY1 - 30;
	pixmap = Tk_GetPixmap(Tk_Display(tkwin), Tk_WindowId(tkwin),
	    (screenX2 + 30 - canvasPtr->drawableXOrigin),
	    (screenY2 + 30 - canvasPtr->drawableYOrigin),
	    Tk_Depth(tkwin));
 	width = screenX2 - screenX1;
	height = screenY2 - screenY1;

    hDCpixmap = TkWinGetDrawableDC(Tk_Display(tkwin), pixmap, &pixmapState);
    canv_pixX=(float)GetDeviceCaps(hDCpixmap,HORZRES);
    canv_pixY=(float)GetDeviceCaps(hDCpixmap,VERTRES);
    canv_mmX=(float)GetDeviceCaps(hDCpixmap,HORZSIZE);
    canv_mmY=(float)GetDeviceCaps(hDCpixmap,VERTSIZE);

    
    SetMapMode(PrinterDrawable->winDC.hdc,MM_ISOTROPIC);
    SetWindowExtEx(PrinterDrawable->winDC.hdc,(int)((float)canv_pixX),(int)((float)canv_pixY),NULL);
    SetViewportExtEx(PrinterDrawable->winDC.hdc,(int)((float)Ptr_pixX),
			    (int)((float)Ptr_pixY),
			    NULL);

    /* max X and Y for canvas  */
    for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
	    itemPtr = itemPtr->nextPtr) {
	if (itemPtr->x1 > widget_X_size) {
	    widget_X_size = itemPtr->x1;
	}
	if (itemPtr->y1 > widget_Y_size) {
	    widget_Y_size = itemPtr->y1;
	}
    }

    /* Calculate the number of tiles high */
    page_Y_size = GetDeviceCaps(hDCpixmap,LOGPIXELSY)*(Ptr_mmY/22);
    page_X_size = GetDeviceCaps(hDCpixmap,LOGPIXELSX)*(Ptr_mmX/22);

    tiles_high = ( widget_Y_size / page_Y_size ); /* start at zero */
    tiles_wide = ( widget_X_size / page_X_size ); /* start at zero */

    StartDoc(pd.hDC,lpdi);

    for (tile_x = 0; tile_x <= tiles_wide;tile_x++) {
    for (tile_y = 0; tile_y <= tiles_high;tile_y++) {
	SetViewportOrgEx(pd.hDC,-(tile_x*Ptr_pixX),-(tile_y*Ptr_pixY),NULL);
        StartPage(pd.hDC);

 	for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
		itemPtr = itemPtr->nextPtr) {
	    (*itemPtr->typePtr->displayProc)((Tk_Canvas) canvasPtr, itemPtr,
		    canvasPtr->display, (unsigned long) PrinterDrawable/*pixmap*/, screenX1, screenY1, width,
		    height);
	}
    
    EndPage(pd.hDC);
    }
    }
    EndDoc(pd.hDC);

done:
    ckfree ((char*) lpdi->lpszDocName);
    ckfree ((char*) lpdi);
    return TCL_OK;
error:
    ckfree ((char*) lpdi->lpszDocName);
    ckfree ((char*) lpdi);
    return TCL_ERROR;
}



static void 
ide_delete_print_canvas_command(ClientData clientData)
{
  /* destructor code here.*/
}

int
ide_create_printcanvas_command (Tcl_Interp *interp)
{

  /* initialization code here */
  
        if (Tcl_CreateCommand(interp, "ide_print_canvas", PrintCanvasCmd, 
			  NULL, ide_delete_print_canvas_command) == NULL)
	return TCL_ERROR;

	    return TCL_OK;
}

#endif /* _WIN32 */




See more files for this project here

Gdb

GDB, the GNU Project debugger, allows you to see what is going on `inside' another program while it executes -- or what another program was doing at the moment it crashed.

Project homepage: http://sources.redhat.com/gdb/
Programming language(s): Assembly,C,C++,Expect
License: other

  Makefile.am
  Makefile.in
  guitcl.h
  paths.c
  subcommand.c
  subcommand.h
  tclcursor.c
  tclgetdir.c
  tclhelp.c
  tclmain.c
  tclmapi.c
  tclmsgbox.c
  tclshellexe.c
  tclsizebox.c
  tclwinfont.c
  tclwingrab.c
  tclwinmode.c
  tclwinpath.c
  tclwinprint.c
  tkCanvEdge.c
  tkCanvLayout.c
  tkCanvLayout.h
  tkGraphCanvas.c
  tkTable.c
  tkTable.h
  tkTable.tcl
  tkTable.tcl.h
  tkTableCell.c
  tkTableCellSort.c
  tkTableCmd.c
  tkTableCmd.h
  tkTableCmds.c
  tkTableEdit.c
  tkTableInitScript.h
  tkTablePs.c
  tkTableTag.c
  tkTableUtil.c
  tkTableWin.c
  tkTable_version.in
  tkTabletcl.h
  tkWarpPointer.c
  tkWinPrintCanvas.c
  tkWinPrintText.c
  xpmlib.c