Re[3]: Снова принтер
От: Al2gr  
Дата: 12.05.04 08:56
Оценка: 3 (1)
Здравствуйте, DreamWeaver, Вы писали:
DW>А можешь привести пример использования этой функции. Сколько не пытался, не получается увеличить картинку на бумаге
ну ты даешь :D
вот тебе код примера, и ориентация и увиличение
//----------------------------------------------------
BOOL SetLogicalUnitSize(HDC hPrintDC, RECT &DevRect, double unit)
{
if (!hPrintDC)
return FALSE;
//получить размеры устройства в пикселях
int pp_size_x = GetDeviceCaps(hPrintDC, HORZRES) — 1;
int pp_size_y = GetDeviceCaps(hPrintDC, VERTRES) — 1;
SetRect(&DevRect, 0, 0, pp_size_x, pp_size_y);

//получить размеры устройства в милиметрах
int mm_size_x = GetDeviceCaps(hPrintDC, HORZSIZE);
int mm_size_y = GetDeviceCaps(hPrintDC, VERTSIZE);

double x_fact = (double)pp_size_x * unit * (double)DevRect.right / (double)mm_size_x;
double y_fact = (double)pp_size_y * unit * (double)DevRect.bottom / (double)mm_size_y;
int OldMapMode = SetMapMode(hPrintDC, MM_ISOTROPIC);
while (x_fact > (double)32767 || y_fact > (double)32767)
{
pp_size_x /= 2;
pp_size_y /= 2;
x_fact /= 2;
y_fact /= 2;
}

SIZE PrevWinExt, PrevViewExt;
if (!SetWindowExtEx(hPrintDC, pp_size_x, pp_size_y, &PrevWinExt) ||
!SetViewportExtEx(hPrintDC,(int)(x_fact + 0.5), (int)(y_fact + 0.5), &PrevViewExt) ||
!DPtoLP(hPrintDC, (LPPOINT)&DevRect, 2))
{
DWORD err = ::GetLastError();
TRACE("Set extension error %xl\n", err);
}
return 1;
}

//----------------------------------------------------
BOOL SetDM_Orient(LPPRINTDLG pPrnDlg, int iOrientPage)
{
if (!pPrnDlg->hDC)
return FALSE;

LPDEVNAMES lpDevNames;
LPTSTR DriverName;
LPTSTR DeviceName;
LPTSTR PortName;

if (pPrnDlg->hDevNames && pPrnDlg->hDevMode)
{
DeleteDC(pPrnDlg->hDC);
pPrnDlg->hDC = 0;
BOOL mFlg = TRUE;
lpDevNames = (LPDEVNAMES)GlobalLock(pPrnDlg->hDevNames);
if (lpDevNames)
{
DriverName = (LPTSTR)lpDevNames + lpDevNames->wDriverOffset;
DeviceName = (LPTSTR)lpDevNames + lpDevNames->wDeviceOffset;
PortName = (LPTSTR)lpDevNames + lpDevNames->wOutputOffset;
LPDEVMODE lpDevMode = (LPDEVMODE)GlobalLock(pPrnDlg->hDevMode);
if (lpDevMode)
{
lpDevMode->dmOrientation = iOrientPage;
lpDevMode->dmFields |= DM_ORIENTATION;
pPrnDlg->hDC = CreateDC(DriverName, DeviceName, PortName, lpDevMode);
GlobalUnlock (pPrnDlg->hDevMode);
return TRUE;
}
}
}
return FALSE;

}

//----------------------------------------------------
BOOL OpenPrint(LPPRINTDLG pPrnDlg, int iOrientPage, RECT &DevRect)
{

memset(pPrnDlg, 0, sizeof(PRINTDLG));
pPrnDlg->lStructSize = sizeof(PRINTDLG);
pPrnDlg->Flags = PD_RETURNDC;
pPrnDlg->Flags |= PD_RETURNDEFAULT;

if (!PrintDlg(pPrnDlg))
{
if (pPrnDlg->hDevMode != NULL)
GlobalFree(pPrnDlg->hDevMode);
if (pPrnDlg->hDevNames != NULL)
GlobalFree(pPrnDlg->hDevNames);
pPrnDlg->hDevMode = 0;
pPrnDlg->hDevNames = 0;
return 0;
}
SetDM_Orient(pPrnDlg, iOrientPage);

SetRect(&DevRect, 0, 0, GetDeviceCaps(pPrnDlg->hDC, HORZRES) — 1,
GetDeviceCaps(pPrnDlg->hDC, VERTRES) — 1);
DOCINFOA di;
memset(&di, 0, sizeof(DOCINFOA));
char bf[40];
di.cbSize = sizeof(DOCINFOA);
strcpy(bf, "Proba Pera");
di.lpszDocName = bf;
di.lpszDatatype = 0;
di.fwType = 0;
int doc = StartDocA(pPrnDlg->hDC, &di) > 0;
return doc != 0;
}

//----------------------------------------------------
void SendToPrinter ()
{
HGLOBAL hPrnDlg = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(PRINTDLG));
LPPRINTDLG pPrnDlg = (LPPRINTDLG)GlobalLock (hPrnDlg);
RECT DevRect;
POINT pnt;
if (OpenPrint(pPrnDlg, DMORIENT_LANDSCAPE, DevRect))
{
StartPage(pPrnDlg->hDC);
EndPage(pPrnDlg->hDC);
SetLogicalUnitSize(pPrnDlg->hDC, DevRect, 0.25); //4 пиксела = 1 мм
MoveToEx(pPrnDlg->hDC, 80, 80, &pnt); // x = 20 mm, y = 20 mm
LineTo(pPrnDlg->hDC, 240, 240); // x = 60 mm, y = 60 mm

EndDoc(pPrnDlg->hDC);
DeleteDC(pPrnDlg->hDC);
}
GlobalUnlock (hPrnDlg);
GlobalFree (hPrnDlg);
}
Снова принтер
От: DreamWeaver ОАЭ  
Дата: 09.05.04 22:13
Оценка:
Вывожу картинку на принтер, но она получается уж очень маленькой. Как вообще можно задать ширину и высоту пикселя на бумаге?
При помощи функции PrintDlg можно вернуть кучу разных параметров, а как можно, допустим, заставить принтер печатать в чернобелом режиме? Как поменять ориентацию бумаги? Вся эта инфа возвращается в структуре DEVMODE, а как ее задать?
В сложившихся условиях ни то, ни другое не сулило ему никакой выгоды. Чего не скажешь о молчании...
Re: Снова принтер
От: Аноним  
Дата: 10.05.04 06:32
Оценка:
Здравствуйте, DreamWeaver, Вы писали:

DW>Вывожу картинку на принтер, но она получается уж очень маленькой. Как вообще можно задать ширину и высоту пикселя на бумаге?


//--------------------------------------------
// Для работы с принтером
// устанавливает 1 пиксел равным unit милиметрaм
//--------------------------------------------
void MDC::MPrinter::SetLogicalUnitSize(double unit)
{
if (!IsHandle())
return;

Flg_MM_Mode = TRUE;
dUnit = unit;
//получить размеры устройства в пикселях
int pp_size_x = GetDeviceCaps(m_hDC, HORZRES) — 1;
int pp_size_y = GetDeviceCaps(m_hDC, VERTRES) — 1;
SetRect(&DevRect, 0, 0, pp_size_x, pp_size_y);

//получить размеры устройства в милиметрах
int mm_size_x = GetDeviceCaps(m_hDC, HORZSIZE);
int mm_size_y = GetDeviceCaps(m_hDC, VERTSIZE);

double x_fact = (double)pp_size_x * unit * (double)DevRect.right / (double)mm_size_x;
double y_fact = (double)pp_size_y * unit * (double)DevRect.bottom / (double)mm_size_y;
OldMapMode = ::SetMapMode(m_hDC, MM_ISOTROPIC);
while (x_fact > (double)32767 || y_fact > (double)32767)
{
pp_size_x /= 2;
pp_size_y /= 2;
x_fact /= 2;
y_fact /= 2;
}

if (!SetWindowExtEx(m_hDC, pp_size_x, pp_size_y, &PrevWinExt) ||
!SetViewportExtEx(m_hDC,(int)(x_fact + 0.5), (int)(y_fact + 0.5), &PrevViewExt) ||
!DPtoLP(m_hDC, (LPPOINT)&DevRect, 2))
{
#ifdef WIN32
DWORD err = ::GetLastError();
TRACE("Set extension error %xl\n", err);
#endif
}
}

DW> При помощи функции PrintDlg можно вернуть кучу разных параметров, а как можно, допустим, заставить принтер печатать в чернобелом режиме? Как поменять ориентацию бумаги? Вся эта инфа возвращается в структуре DEVMODE, а как ее задать?


смотри DocumentProperties
Re[2]: Снова принтер
От: DreamWeaver ОАЭ  
Дата: 11.05.04 21:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, DreamWeaver, Вы писали:


DW>>Вывожу картинку на принтер, но она получается уж очень маленькой. Как вообще можно задать ширину и высоту пикселя на бумаге?


А>//--------------------------------------------

А>// Для работы с принтером
А>// устанавливает 1 пиксел равным unit милиметрaм
А>//--------------------------------------------
А>void MDC::MPrinter::SetLogicalUnitSize(double unit)
А>{
А> if (!IsHandle())
А> return;

А> Flg_MM_Mode = TRUE;

А> dUnit = unit;
А> //получить размеры устройства в пикселях
А> int pp_size_x = GetDeviceCaps(m_hDC, HORZRES) — 1;
А> int pp_size_y = GetDeviceCaps(m_hDC, VERTRES) — 1;
А> SetRect(&DevRect, 0, 0, pp_size_x, pp_size_y);

А> //получить размеры устройства в милиметрах

А> int mm_size_x = GetDeviceCaps(m_hDC, HORZSIZE);
А> int mm_size_y = GetDeviceCaps(m_hDC, VERTSIZE);

А> double x_fact = (double)pp_size_x * unit * (double)DevRect.right / (double)mm_size_x;

А> double y_fact = (double)pp_size_y * unit * (double)DevRect.bottom / (double)mm_size_y;
А> OldMapMode = ::SetMapMode(m_hDC, MM_ISOTROPIC);
А> while (x_fact > (double)32767 || y_fact > (double)32767)
А> {
А> pp_size_x /= 2;
А> pp_size_y /= 2;
А> x_fact /= 2;
А> y_fact /= 2;
А> }

А> if (!SetWindowExtEx(m_hDC, pp_size_x, pp_size_y, &PrevWinExt) ||

А> !SetViewportExtEx(m_hDC,(int)(x_fact + 0.5), (int)(y_fact + 0.5), &PrevViewExt) ||
А> !DPtoLP(m_hDC, (LPPOINT)&DevRect, 2))
А> {
А> #ifdef WIN32
А> DWORD err = ::GetLastError();
А> TRACE("Set extension error %xl\n", err);
А> #endif
А> }
А>}

А можешь привести пример использования этой функции. Сколько не пытался, не получается увеличить картинку на бумаге
В сложившихся условиях ни то, ни другое не сулило ему никакой выгоды. Чего не скажешь о молчании...
Re[4]: Снова принтер
От: DreamWeaver ОАЭ  
Дата: 12.05.04 22:20
Оценка:
Здравствуйте, Al2gr, Вы писали:

A>Здравствуйте, DreamWeaver, Вы писали:

DW>>А можешь привести пример использования этой функции. Сколько не пытался, не получается увеличить картинку на бумаге
A>ну ты даешь :D
A>вот тебе код примера, и ориентация и увиличение
A>//----------------------------------------------------
A>BOOL SetLogicalUnitSize(HDC hPrintDC, RECT &DevRect, double unit)
A>{
A> if (!hPrintDC)
A> return FALSE;
A> //получить размеры устройства в пикселях
A> int pp_size_x = GetDeviceCaps(hPrintDC, HORZRES) — 1;
A> int pp_size_y = GetDeviceCaps(hPrintDC, VERTRES) — 1;
A> SetRect(&DevRect, 0, 0, pp_size_x, pp_size_y);

A> //получить размеры устройства в милиметрах

A> int mm_size_x = GetDeviceCaps(hPrintDC, HORZSIZE);
A> int mm_size_y = GetDeviceCaps(hPrintDC, VERTSIZE);

A> double x_fact = (double)pp_size_x * unit * (double)DevRect.right / (double)mm_size_x;

A> double y_fact = (double)pp_size_y * unit * (double)DevRect.bottom / (double)mm_size_y;
A> int OldMapMode = SetMapMode(hPrintDC, MM_ISOTROPIC);
A> while (x_fact > (double)32767 || y_fact > (double)32767)
A> {
A> pp_size_x /= 2;
A> pp_size_y /= 2;
A> x_fact /= 2;
A> y_fact /= 2;
A> }

A> SIZE PrevWinExt, PrevViewExt;

A> if (!SetWindowExtEx(hPrintDC, pp_size_x, pp_size_y, &PrevWinExt) ||
A> !SetViewportExtEx(hPrintDC,(int)(x_fact + 0.5), (int)(y_fact + 0.5), &PrevViewExt) ||
A> !DPtoLP(hPrintDC, (LPPOINT)&DevRect, 2))
A> {
A> DWORD err = ::GetLastError();
A> TRACE("Set extension error %xl\n", err);
A> }
A> return 1;
A>}

A>//----------------------------------------------------

A>BOOL SetDM_Orient(LPPRINTDLG pPrnDlg, int iOrientPage)
A>{
A> if (!pPrnDlg->hDC)
A> return FALSE;

A> LPDEVNAMES lpDevNames;

A> LPTSTR DriverName;
A> LPTSTR DeviceName;
A> LPTSTR PortName;

A> if (pPrnDlg->hDevNames && pPrnDlg->hDevMode)

A> {
A> DeleteDC(pPrnDlg->hDC);
A> pPrnDlg->hDC = 0;
A> BOOL mFlg = TRUE;
A> lpDevNames = (LPDEVNAMES)GlobalLock(pPrnDlg->hDevNames);
A> if (lpDevNames)
A> {
A> DriverName = (LPTSTR)lpDevNames + lpDevNames->wDriverOffset;
A> DeviceName = (LPTSTR)lpDevNames + lpDevNames->wDeviceOffset;
A> PortName = (LPTSTR)lpDevNames + lpDevNames->wOutputOffset;
A> LPDEVMODE lpDevMode = (LPDEVMODE)GlobalLock(pPrnDlg->hDevMode);
A> if (lpDevMode)
A> {
A> lpDevMode->dmOrientation = iOrientPage;
A> lpDevMode->dmFields |= DM_ORIENTATION;
A> pPrnDlg->hDC = CreateDC(DriverName, DeviceName, PortName, lpDevMode);
A> GlobalUnlock (pPrnDlg->hDevMode);
A> return TRUE;
A> }
A> }
A> }
A> return FALSE;

A>}


A>//----------------------------------------------------

A>BOOL OpenPrint(LPPRINTDLG pPrnDlg, int iOrientPage, RECT &DevRect)
A>{

A> memset(pPrnDlg, 0, sizeof(PRINTDLG));

A> pPrnDlg->lStructSize = sizeof(PRINTDLG);
A> pPrnDlg->Flags = PD_RETURNDC;
A> pPrnDlg->Flags |= PD_RETURNDEFAULT;

A> if (!PrintDlg(pPrnDlg))

A> {
A> if (pPrnDlg->hDevMode != NULL)
A> GlobalFree(pPrnDlg->hDevMode);
A> if (pPrnDlg->hDevNames != NULL)
A> GlobalFree(pPrnDlg->hDevNames);
A> pPrnDlg->hDevMode = 0;
A> pPrnDlg->hDevNames = 0;
A> return 0;
A> }
A> SetDM_Orient(pPrnDlg, iOrientPage);

A> SetRect(&DevRect, 0, 0, GetDeviceCaps(pPrnDlg->hDC, HORZRES) — 1,

A> GetDeviceCaps(pPrnDlg->hDC, VERTRES) — 1);
A> DOCINFOA di;
A> memset(&di, 0, sizeof(DOCINFOA));
A> char bf[40];
A> di.cbSize = sizeof(DOCINFOA);
A> strcpy(bf, "Proba Pera");
A> di.lpszDocName = bf;
A> di.lpszDatatype = 0;
A> di.fwType = 0;
A> int doc = StartDocA(pPrnDlg->hDC, &di) > 0;
A> return doc != 0;
A>}

A>//----------------------------------------------------

A>void SendToPrinter ()
A>{
A> HGLOBAL hPrnDlg = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(PRINTDLG));
A> LPPRINTDLG pPrnDlg = (LPPRINTDLG)GlobalLock (hPrnDlg);
A> RECT DevRect;
A> POINT pnt;
A> if (OpenPrint(pPrnDlg, DMORIENT_LANDSCAPE, DevRect))
A> {
A> StartPage(pPrnDlg->hDC);
A> EndPage(pPrnDlg->hDC);
A> SetLogicalUnitSize(pPrnDlg->hDC, DevRect, 0.25); //4 пиксела = 1 мм
A> MoveToEx(pPrnDlg->hDC, 80, 80, &pnt); // x = 20 mm, y = 20 mm
A> LineTo(pPrnDlg->hDC, 240, 240); // x = 60 mm, y = 60 mm

A> EndDoc(pPrnDlg->hDC);

A> DeleteDC(pPrnDlg->hDC);
A> }
A> GlobalUnlock (hPrnDlg);
A> GlobalFree (hPrnDlg);
A>}

Пасибки огромное, теперя вкурил.
В сложившихся условиях ни то, ни другое не сулило ему никакой выгоды. Чего не скажешь о молчании...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.