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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.