DOCINFO di;
PRINTDLG pd;
int cWidthPels = 300;
int cHeightPels = 200;
HBITMAP hBm = (HBITMAP)LoadImage(NULL, "E:\\image\\1.bmp", IMAGE_BITMAP, cWidthPels, cHeightPels, LR_LOADFROMFILE);
hdc = CreateCompatibleDC(NULL);
SelectObject(hdc, hBm);
ZeroMemory(&pd,sizeof(pd));
ZeroMemory(&di,sizeof(DOCINFO));
pd.lStructSize = sizeof(pd);
pd.Flags = PD_RETURNDC;
PrintDlg(&pd);
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "Bitmap Printing Test";
StartDoc(pd.hDC, &di);
StartPage(pd.hDC);
BitBlt(pd.hDC, 0, 0, cWidthPels , cHeightPels, hdc, 0, 0, SRCCOPY);
EndPage(pd.hDC);
EndDoc(pd.hDC);
DeleteDC(pd.hDC);
DeleteDC(hdc);
DeleteObject(hBm);
DirectX и вывод на печать
можно ли в приложении DirectX (без MFC) вывесть картинку на принтер?
Что значит приложение DirectX?(Direct3D, DirectShow, DirectDraw -Захвати контекст окна и выводи себе спкойно на принтер содержимое этого окна.)
собранное без mfc
[QUOTE=Zushenskiy]Захвати контекст окна и выводи себе спкойно на принтер содержимое этого окна.)[/QUOTE]
хочу не контекст окна выводить, а картинку с винта распечатать (и на листе с позиционировать не абы как...)
вот бы экзампл поглядеть
Непонятно. А при чем здесь DirectX? Картинку с винта распечатать - DirectX не нужен. Совсем.
вопрос в том, что есть проект DirectX собранный без mfc - хочется малой кровью прикрутить печать картинок с винта (не пересобирая)
вообщето какая разница с чем ты работаешь чтобы вывисти на печать ты должен порисовать в контексте и отдать его принтеру и все в чем проблема. а будешь выводить с окна или с винта всеравно это уже твое решение.
как запустить всё (то, что мы прорисовали в контексте принтера) на печать не вызывая диалог печати (без вызова .domodal для диалога печати и отслеживания нажатия ОК на нём)
Код:
DOCINFO di = {0};
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "Bitmap Printing Test";
int cWidthPels = 300;
int cHeightPels = 200;
PRINTER_INFO_8* pp;
DWORD dwNeed = 0;
HANDLE hPrinter = NULL;
HBITMAP hBm = (HBITMAP)LoadImage(NULL, "E:\\image\\1.bmp", IMAGE_BITMAP, cWidthPels, cHeightPels, LR_LOADFROMFILE);
hdc = CreateCompatibleDC(NULL);
SelectObject(hdc, hBm);
OpenPrinter("PDF995", &hPrinter, NULL);
LPBYTE pByte;
BOOL bRes = GetPrinter(hPrinter,8, (LPBYTE)&pp, sizeof(pp), &dwNeed);
pByte = new BYTE[dwNeed];
ZeroMemory(pByte, dwNeed);
bRes = GetPrinter(hPrinter,8, pByte, dwNeed, &dwNeed);
pp = (PRINTER_INFO_8*)pByte;
HDC hDCPrint = CreateDC("WINSPOOL", (char*)pp -> pDevMode -> dmDeviceName, NULL, pp->pDevMode);
StartDoc(hDCPrint, &di);
StartPage(hDCPrint);
TextOut(hDCPrint, 0, 0, "test text", 9);
BitBlt(hDCPrint, 0, 20, cWidthPels , cHeightPels, hdc, 0, 0, SRCCOPY);
EndPage(hDCPrint);
EndDoc(hDCPrint);
delete [] pByte;
DeleteDC(hDCPrint);
DeleteDC(hdc);
DeleteObject(hBm);
ClosePrinter(hPrinter);
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "Bitmap Printing Test";
int cWidthPels = 300;
int cHeightPels = 200;
PRINTER_INFO_8* pp;
DWORD dwNeed = 0;
HANDLE hPrinter = NULL;
HBITMAP hBm = (HBITMAP)LoadImage(NULL, "E:\\image\\1.bmp", IMAGE_BITMAP, cWidthPels, cHeightPels, LR_LOADFROMFILE);
hdc = CreateCompatibleDC(NULL);
SelectObject(hdc, hBm);
OpenPrinter("PDF995", &hPrinter, NULL);
LPBYTE pByte;
BOOL bRes = GetPrinter(hPrinter,8, (LPBYTE)&pp, sizeof(pp), &dwNeed);
pByte = new BYTE[dwNeed];
ZeroMemory(pByte, dwNeed);
bRes = GetPrinter(hPrinter,8, pByte, dwNeed, &dwNeed);
pp = (PRINTER_INFO_8*)pByte;
HDC hDCPrint = CreateDC("WINSPOOL", (char*)pp -> pDevMode -> dmDeviceName, NULL, pp->pDevMode);
StartDoc(hDCPrint, &di);
StartPage(hDCPrint);
TextOut(hDCPrint, 0, 0, "test text", 9);
BitBlt(hDCPrint, 0, 20, cWidthPels , cHeightPels, hdc, 0, 0, SRCCOPY);
EndPage(hDCPrint);
EndDoc(hDCPrint);
delete [] pByte;
DeleteDC(hDCPrint);
DeleteDC(hdc);
DeleteObject(hBm);
ClosePrinter(hPrinter);
PDF995 - это имя драйвера принтера
а что за сложности м.б. со структурами PRINTER_INFO_8 и 9? (вижал говорит, что не знает что это такое, хотя с PRINTER_INFO_1 - PRINTER_INFO_7 всё гут)?
Цитата:
а что за сложности м.б. со структурами PRINTER_INFO_8 и 9? (вижал говорит, что не знает что это такое, хотя с PRINTER_INFO_1 - PRINTER_INFO_7 всё гут)?
перед
#include <windows.h>
вставь
#define _WIN32_WINNT 0x0501
и все будет ок
СПАСИТЕЛЬ!!!
С МЕНЯ СТАКАН :)
что-то ничего в духе loadimage я не нарыл - неужели конвертить jpg в bmp и .... (нежизнерадостно как-то :) )
да ты прав на счет jpg. GDI+(когдато делал анологичную задачу на нем), сторонние библиотеки, либо сам конвертишь, особо сложного ни чего нету в инете валом открытых кодов для конвертации
Код:
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
HDC hdcPrint = CreateDC(NULL, "имя принтера", NULL, NULL);
DOCINFO docInfo;
ZeroMemory(&docInfo, sizeof(docInfo));
docInfo.cbSize = sizeof(docInfo);
docInfo.lpszDocName = "blabla";
StartDoc(hdcPrint, &docInfo);
StartPage(hdcPrint);
Graphics* graph = new Graphics(hdcPrint);
Image img(L"123.jpg");//к примеру
graph.DrawImage(&img, 0.0f, 0.0f);
EndPage(hdcPrint);
EndDoc(hdcPrint);
DeleteDC(hdcPrint);
GdiplusShutdown(gdiplusToken);
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
HDC hdcPrint = CreateDC(NULL, "имя принтера", NULL, NULL);
DOCINFO docInfo;
ZeroMemory(&docInfo, sizeof(docInfo));
docInfo.cbSize = sizeof(docInfo);
docInfo.lpszDocName = "blabla";
StartDoc(hdcPrint, &docInfo);
StartPage(hdcPrint);
Graphics* graph = new Graphics(hdcPrint);
Image img(L"123.jpg");//к примеру
graph.DrawImage(&img, 0.0f, 0.0f);
EndPage(hdcPrint);
EndDoc(hdcPrint);
DeleteDC(hdcPrint);
GdiplusShutdown(gdiplusToken);
незабудь подключить
Код:
#include <gdiplus.h>
#pragma comment (lib, gdiplus.lib")
using namespace Gdiplus;
#pragma comment (lib, gdiplus.lib")
using namespace Gdiplus;
и если есть дефайн #define WIN32_LEAN_AND_MEAN то закоменть его
Слушай, а как ты думаешь, почему boundsChecker ругается на вызов GdiplusShutdown(gdiplusToken) - говорит:
Questionable use of thread Thread created using CreateThread rather than _beginthreadex
(при запуске в релизе никаких вопросов не всплывает)
warning всмысле выдает?
похоже он не любит утечку resource leak:allocated by LoadLibraryA in dllinit.cpp(505)