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