- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
If I have a window DC (sDC) and a printer DC (pDC), why can't I just draw into pDC the way I would a sDC? Or if I have a DIB, how di I print it? I would really like to know of any experience yoiu've had with this.
Thanks,
Brooks Van Horn
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Here is a routine which prints a bitmap to an already-initialized printer device context (hdc_printer). The bitmap in this case is passed as a resourceId already defined via the resource editer, or as a handle to a bitmap generated or acquired by some other means. This routine is part of a larger module which INCLUDEs IFWIN and IFWINTY.
FUNCTION print_bitmap (hdc_printer, resourceId, hBmap, &
xpos, ypos, mult, origin) RESULT (res)
IMPLICIT NONE
INTEGER(HANDLE), INTENT(IN) :: hdc_printer, hBmap
INTEGER, INTENT(IN) :: resourceId, xpos, ypos, origin
REAL, INTENT(IN) :: mult
INTEGER(HANDLE) :: hdc_screen, hbitmap, hlib
INTEGER :: rval, res
INTEGER :: swide, shigh, pwide, phigh, bwide, bhigh
TYPE(T_RECT) :: rect
TYPE(T_BITMAPINFO) :: bmi
! NOTE - use of these functions requires that DIBSECTN.LIB be included
! in the link build and that DIBSECTN.DLL be present in the runtime path
!INTERFACE
! INTEGER(4) FUNCTION DSLoadDIBSectionFromBMPFile (fname, hbitmap, hpalette)
! !DEC$ ATTRIBUTES DLLIMPORT, STDCALL,ALIAS:'_DSLoadDIBSectionFromBMPFile@12':: DSLoadDIBSectionFromBMPFi
! !DEC$ ATTRIBUTES REFERENCE :: fname
! CHARACTER*(*) fname
! INTEGER hbitmap
! INTEGER hpalette
! END FUNCTION DSLoadDIBSectionFromBMPFile
!END INTERFACE
INTERFACE
INTEGER(4) FUNCTION DSDrawDIBSectionOnDC (hdc, hbitmap, lprect)
!DEC$ ATTRIBUTES DLLIMPORT, STDCALL,ALIAS:'_DSDrawDIBSectionOnDC@12':: DSDrawDIBSectionOnDC
INTEGER hdc, hbitmap, lprect
END FUNCTION DSDrawDIBSectionOnDC
END INTERFACE
! scaling factors, screen to printer
hdc_screen = GetDC (NULL)
swide = GetDeviceCaps (hdc_screen, LOGPIXELSX)
shigh = GetDeviceCaps (hdc_screen, LOGPIXELSY)
pwide = GetDeviceCaps (hdc_printer, LOGPIXELSX)
phigh = GetDeviceCaps (hdc_printer, LOGPIXELSY)
! load bitmap from supplied resource identifier
IF (hBmap == 0) THEN
res = -1 ! cannot load library
hlib = LoadLibrary ('DIBSECTN.DLL'C)
IF (hlib == 0) GO TO 20
res = -2 ! cannot load bitmap
hbitmap = LoadImageID (ghInstance, resourceId, IMAGE_BITMAP, &
0, 0, LR_CREATEDIBSECTION)
IF (hbitmap == 0) THEN
rval = FreeLibrary (hlib)
RETURN
END IF
res = -3 ! bitmap has null extent
CALL GetBitmapSize (hbitmap, hdc_screen, bwide, bhigh)
IF (bwide /= 0 .AND. bhigh /= 0) THEN
bwide = IFIX(mult*FLOAT(bwide)*FLOAT(pwide)/FLOAT(swide))
bhigh = IFIX(mult*FLOAT(bhigh)*FLOAT(phigh)/FLOAT(shigh))
! displace mapping rectangle wrt local origin
SELECT CASE (origin)
CASE (top_left)
rect%left = xpos
rect%right = xpos + bwide
rect%top = ypos
rect%bottom = ypos + bhigh
CASE (mid_left)
rect%left = xpos
rect%right = xpos + bwide
rect%top = ypos - bhigh/2
rect%bottom = rect%top + bhigh
CASE (bot_left)
rect%left = xpos
rect%right = xpos + bwide
rect%top = ypos - bhigh
rect%bottom = ypos
CASE (top_right)
rect%left = xpos - bwide
rect%right = xpos
rect%top = ypos
rect%bottom = ypos + bhigh
CASE (mid_right)
rect%left = xpos - bwide
rect%right = xpos
rect%top = ypos - bhigh/2
rect%bottom = rect%top + bhigh
CASE (bot_right)
rect%left = xpos - bwide
rect%right = xpos
rect%top = ypos - bhigh
rect%bottom = ypos
END SELECT
res = -4 ! cannot transfer DIB section to printer
IF (DSDrawDIBSectionOnDC (hdc_printer, hbitmap, LOC(rect))) &
res = rect%bottom - rect%top + 1
rval = DeleteObject (hbitmap)
rval = FreeLibrary (hlib)
! use supplied handle to existing bitmap
ELSE
hbitmap = hBmap
bmi%bmiHeader%biBitCount = 0
bmi%bmiHeader%biSize = SIZEOF(bmi%bmiHeader)
rval = GetDIBits (hdc_printer, hbitmap, 0, 0, 0, LOC(bmi), DIB_RGB_COLORS)
IF (rval == 0) THEN
banner(1) = 'GetDIBits error'
CALL API_Error (hbitmap)
END IF
bwide = bmi%bmiHeader%biWidth
bhigh = bmi%bmiHeader%biHeight
!bwide = IFIX(mult*FLOAT(bwide)*FLOAT(pwide)/FLOAT(swide))
!bhigh = IFIX(mult*FLOAT(bhigh)*FLOAT(phigh)/FLOAT(shigh))
rval = SetDIBitsToDevice (hdc_printer, & ! device context
0, 0, & ! device x,y ULC
bwide, bhigh, & ! source dimensions
0, 0, & ! source x,y LLC
0, bhigh, & ! scan line start, count
LOC(hbitmap), & ! DIB bits array
bmi, & ! bitmapinfo structure
DIB_RGB_COLORS) ! RGB or palette index flag
END IF
END IF
20 rval = ReleaseDC (NULL, hdc_screen)
END FUNCTION print_bitmap
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Here is a routine which prints a bitmap to an already-initialized printer device context (hdc_printer). The bitmap in this case is passed as a resourceId already defined via the resource editer, or as a handle to a bitmap generated or acquired by some other means. This routine is part of a larger module which INCLUDEs IFWIN and IFWINTY.
FUNCTION print_bitmap (hdc_printer, resourceId, hBmap, &
xpos, ypos, mult, origin) RESULT (res)
IMPLICIT NONE
INTEGER(HANDLE), INTENT(IN) :: hdc_printer, hBmap
INTEGER, INTENT(IN) :: resourceId, xpos, ypos, origin
REAL, INTENT(IN) :: mult
INTEGER(HANDLE) :: hdc_screen, hbitmap, hlib
INTEGER :: rval, res
INTEGER :: swide, shigh, pwide, phigh, bwide, bhigh
TYPE(T_RECT) :: rect
TYPE(T_BITMAPINFO) :: bmi
! NOTE - use of these functions requires that DIBSECTN.LIB be included
! in the link build and that DIBSECTN.DLL be present in the runtime path
!INTERFACE
! INTEGER(4) FUNCTION DSLoadDIBSectionFromBMPFile (fname, hbitmap, hpalette)
! !DEC$ ATTRIBUTES DLLIMPORT, STDCALL,ALIAS:'_DSLoadDIBSectionFromBMPFile@12':: DSLoadDIBSectionFromBMPFi
! !DEC$ ATTRIBUTES REFERENCE :: fname
! CHARACTER*(*) fname
! INTEGER hbitmap
! INTEGER hpalette
! END FUNCTION DSLoadDIBSectionFromBMPFile
!END INTERFACE
INTERFACE
INTEGER(4) FUNCTION DSDrawDIBSectionOnDC (hdc, hbitmap, lprect)
!DEC$ ATTRIBUTES DLLIMPORT, STDCALL,ALIAS:'_DSDrawDIBSectionOnDC@12':: DSDrawDIBSectionOnDC
INTEGER hdc, hbitmap, lprect
END FUNCTION DSDrawDIBSectionOnDC
END INTERFACE
! scaling factors, screen to printer
hdc_screen = GetDC (NULL)
swide = GetDeviceCaps (hdc_screen, LOGPIXELSX)
shigh = GetDeviceCaps (hdc_screen, LOGPIXELSY)
pwide = GetDeviceCaps (hdc_printer, LOGPIXELSX)
phigh = GetDeviceCaps (hdc_printer, LOGPIXELSY)
! load bitmap from supplied resource identifier
IF (hBmap == 0) THEN
res = -1 ! cannot load library
hlib = LoadLibrary ('DIBSECTN.DLL'C)
IF (hlib == 0) GO TO 20
res = -2 ! cannot load bitmap
hbitmap = LoadImageID (ghInstance, resourceId, IMAGE_BITMAP, &
0, 0, LR_CREATEDIBSECTION)
IF (hbitmap == 0) THEN
rval = FreeLibrary (hlib)
RETURN
END IF
res = -3 ! bitmap has null extent
CALL GetBitmapSize (hbitmap, hdc_screen, bwide, bhigh)
IF (bwide /= 0 .AND. bhigh /= 0) THEN
bwide = IFIX(mult*FLOAT(bwide)*FLOAT(pwide)/FLOAT(swide))
bhigh = IFIX(mult*FLOAT(bhigh)*FLOAT(phigh)/FLOAT(shigh))
! displace mapping rectangle wrt local origin
SELECT CASE (origin)
CASE (top_left)
rect%left = xpos
rect%right = xpos + bwide
rect%top = ypos
rect%bottom = ypos + bhigh
CASE (mid_left)
rect%left = xpos
rect%right = xpos + bwide
rect%top = ypos - bhigh/2
rect%bottom = rect%top + bhigh
CASE (bot_left)
rect%left = xpos
rect%right = xpos + bwide
rect%top = ypos - bhigh
rect%bottom = ypos
CASE (top_right)
rect%left = xpos - bwide
rect%right = xpos
rect%top = ypos
rect%bottom = ypos + bhigh
CASE (mid_right)
rect%left = xpos - bwide
rect%right = xpos
rect%top = ypos - bhigh/2
rect%bottom = rect%top + bhigh
CASE (bot_right)
rect%left = xpos - bwide
rect%right = xpos
rect%top = ypos - bhigh
rect%bottom = ypos
END SELECT
res = -4 ! cannot transfer DIB section to printer
IF (DSDrawDIBSectionOnDC (hdc_printer, hbitmap, LOC(rect))) &
res = rect%bottom - rect%top + 1
rval = DeleteObject (hbitmap)
rval = FreeLibrary (hlib)
! use supplied handle to existing bitmap
ELSE
hbitmap = hBmap
bmi%bmiHeader%biBitCount = 0
bmi%bmiHeader%biSize = SIZEOF(bmi%bmiHeader)
rval = GetDIBits (hdc_printer, hbitmap, 0, 0, 0, LOC(bmi), DIB_RGB_COLORS)
IF (rval == 0) THEN
banner(1) = 'GetDIBits error'
CALL API_Error (hbitmap)
END IF
bwide = bmi%bmiHeader%biWidth
bhigh = bmi%bmiHeader%biHeight
!bwide = IFIX(mult*FLOAT(bwide)*FLOAT(pwide)/FLOAT(swide))
!bhigh = IFIX(mult*FLOAT(bhigh)*FLOAT(phigh)/FLOAT(shigh))
rval = SetDIBitsToDevice (hdc_printer, & ! device context
0, 0, & ! device x,y ULC
bwide, bhigh, & ! source dimensions
0, 0, & ! source x,y LLC
0, bhigh, & ! scan line start, count
LOC(hbitmap), & ! DIB bits array
bmi, & ! bitmapinfo structure
DIB_RGB_COLORS) ! RGB or palette index flag
END IF
END IF
20 rval = ReleaseDC (NULL, hdc_screen)
END FUNCTION print_bitmap
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks Paul, but where do I acquire this DIBSECTN.LIB and DIBSECTN.DLL. They are not on my Win 10 x64 system.
Thanks, Brooka
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Also, what happens if there is no resource id. My problem is that I want to capture a part of my screen and print it.I can create a dib with the bm inside itt but then what. I have the code as follows:
iret = StartDoc(hdcPrn, INFO)
iret = StartPage(hdcPrn)
...... what do i do here????
iret = EndPage(hDCPrn)
iret = EndDoc(hDCprn)
bret = DeleteDC(hDCprn)
bret = ReleaseDC(ghWndMain, phDC)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
reading Paul's code, if you have the bitmap structures populated and a dc for the print device then it seems to me that you just need to call "SetDIBitsToDevice"
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
If you were using Quickwin this would all be very easily accomplished in just a few (less than 10?) lines of code. That is, if you can settle for capturing the screen to a bmp file (which I usually convert to a tif or gif file) for later printing. But I don't think you are, so I will reserve the specifics for those who are interested.
Also: are you looking for publication quality in your graphics, or is it OK if the "printed" image as only the very crude resolution of a monitor's screen?
An interesting and undocumented note: The "screen" in a Quickwin window is actually a virtual screen, as it can be made any size at all and needn't fit within a window or even the entire monitor. In this way the resolution of the captured graphics can be made extremely high. I usually make my captured graphics 600 dpi, but there is no problem making them 1200 or 2400 dpi or really anything you want. And I don't understand why, but the publishers I work with prefer high-resolution bitmap graphics files instead of scalable vector files.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page