Консультация № 59837
23.10.2006, 01:46
0.00 руб.
0 1 1
Здравствуйте! Помогите плиз разобраться с координатами GDI.
Нужно распечатать вывод, рисуемый моей программой.
Сейчас оно работает, но вывод печатается совсем маленький, раза в 5 меньше чем надо. Когда-то давно я разбирался со всеми этими клиенстскими логическими, экранными координатами но все благополучно забыл :-)
В принципе смогу разобраться сам, но решил проверить, что быстрее - получить помощь уважаемых экспертов или втыкать самому.
Ниже куски кода приложения, постарался привести только необходимое и достаточное. Нужно, передать такой rcPosition, чтобы AFCYearObj::Draw отрисовало все так, чтобы картинка занимала весь лист бумаги.
Сорри если излагожил непонятно. Заранее спасибо!

Приложение:
class AFCYearSelectWnd : public CWnd{ AFCYearObj *pObj;// ....};AFCYearSelectWnd* m_YearSelectCtrl1;// ....CPrintDialog dlgPrint(FALSE,PD_ALLPAGES,this); if (dlgPrint.DoModal()==IDOK) { CDC dcPrint; dcPrint.Attach(dlgPrint.GetPrinterDC()); DOCINFO myPrintJob; // ... Урезан код инициализации myPrintJob if (dcPrint.StartDoc(&myPrintJob)>=0) { dcPrint.StartPage(); CRect client; client = GetClientRect(); dcPrint.DPtoLP(&client); m_YearSelectCtrl1->pObj->rcPosition = client; m_YearSelectCtrl1->pObj->Draw(&dcPrint); dcPrint.EndPage(); dcPrint.EndDoc(); } dcPrint.DeleteDC(); }void AFCYearObj::Draw(CDC *pDC){ // Рисуем картинку, ограниченную в rcPosition pDC->FillSolidRect(rcPosition,RGB(255,255,255)); // ...}

Обсуждение

Неизвестный
23.10.2006, 10:13
общий
это ответ
Здравствуйте, Eustin!

GetClientRect() возвращает размер окна в точках. Вам же нужно вывести на бумагу изображение соответствующего размера, учитывая разрешение принтера, выбранный формат бумаги и пр.
Для получения размера DC принтера в точках можно воспользоваться
int Width = dcPrint.GetDeviceCaps(HORZ_RES);
int Height = dcPrint.GetDeviceCaps(VERT_RES);
Для более точной подгонки хорошо бы еще учесть физические поля принтера:
GetDeviceCaps(PHYSICAL_OFFSET_X);
GetDeviceCaps(PHYSICAL_OFFSET_Y);
Правда нужно будет перевести в пикселы, например узнав разрешение принтера
GetDeviceCaps(LOGPIXELS_X);
GetDeviceCaps(LOGPIXELS_Y);

Удачи!
Форма ответа