Проблема печати под Win98
От: Krizai  
Дата: 04.06.03 09:07
Оценка:
Имеется такая проблема:
Печатаю кусочек текста плюс несколько линий на принтер из диалогового пиложения(хоть и не существенног но тестится на HP3820). Так вот писал я всю эту радость под Win2K и она там прекрасно заработало, но принес ее на конечное ее место работы(Win98) и она в упор отказалась работать, как выяснил методжом тыка она отказывается м енять какие либо параметры контекста.
Т.е. тестовая програмка печатает линию созданным пером и пишет чего-то там под W2K нормально, а под W98 линия стандартная, надпись тоже.
Может кто-что подскажет, как с этим бороться?
Тестовый исходник ниже:

CDC PrintDC;
PrintDC.Attach(cp.GetPrinterDC());
DOCINFO infStru;
::ZeroMemory (&infStru, sizeof (DOCINFO));
CString title="Test";
infStru.cbSize = sizeof (DOCINFO);
infStru.lpszDocName=title;
infStru.lpszOutput=NULL;
CPen pen(PS_SOLID,5,RGB(100,0,0));
PrintDC.SelectStockObject(BLACK_PEN);
PrintDC.SelectStockObject(ANSI_VAR_FONT);
PrintDC.SelectObject(pen);
PrintDC.SetTextColor(RGB(100,100,0));
PrintDC.SetTextColor(RGB(100,100,0));
PrintDC.StartDoc(&infStru );
PrintDC.StartPage(); // начало страницы
PrintDC.TextOut(190,170,"TEST BLA_BLA_BLA");
PrintDC.MoveTo(10,10);
PrintDC.LineTo(200,200);
PrintDC.EndPage();
PrintDC.EndDoc();
PrintDC.DeleteDC();
Re: Проблема печати под Win98
От: Patalog Россия  
Дата: 04.06.03 10:08
Оценка:
Здравствуйте, Krizai, Вы писали:

[]

1. Какие ошибки возвращает винда на попытки изменить состояния контекста?
2. Как создается контекст принтера?
3.
PrintDC.SelectObject(&pen);

не помогает?
4. Иногда бываю глюки с дровами принтера. Попробуй поставить стандартные, из дистрибутива windows. А ежели они и стоят, тогда попробуй наоборот, поставь дрова производителя.
Почетный кавалер ордена Совка.
Re[2]: Проблема печати под Win98
От: Serguei666 Беларусь  
Дата: 04.06.03 11:53
Оценка:
Здравствуйте, Patalog, Вы писали:

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


P>[]


P>1. Какие ошибки возвращает винда на попытки изменить состояния контекста?

P>2. Как создается контекст принтера?
P>3.
P>
P>PrintDC.SelectObject(&pen); 
P>

P>не помогает?
Прикольно. Если компилятор не выдал опибку, то &pen и pen в данном случае одно и то же.
Но вообще код действително странный.
Зачем две ручки выбирать подряд: PrintDC.SelectStockObject(BLACK_PEN); и PrintDC.SelectObject(pen);


P>4. Иногда бываю глюки с дровами принтера. Попробуй поставить стандартные, из дистрибутива windows. А ежели они и стоят, тогда попробуй наоборот, поставь дрова производителя.
Хотите сказать 'спасибо'? Тогда поставьте оценку
Re[3]: Проблема печати под Win98
От: Krizai  
Дата: 04.06.03 18:15
Оценка:
Здравствуйте, Serguei666, Вы писали:

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


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


Все уже сам разобрался, вся проблеммиа в том что все изменения контекста оказывается нужно делать после StartDoc,StartPage, во всяком случае при их перестановки туда оно заработало
А насчет куска кода, этот кусок кода не из результирующего продукта, просто он долго и нудно подгонялся, чтоб обнаружить и локализовать глюк.

Всем сэнкс за ответы.
Re[3]: Проблема печати под Win98
От: Patalog Россия  
Дата: 05.06.03 08:13
Оценка:
Здравствуйте, Serguei666, Вы писали:

[]

P>>3.

P>>
P>>PrintDC.SelectObject(&pen); 
P>>

P>>не помогает?

S>Прикольно. Если компилятор не выдал опибку, то &pen и pen в данном случае одно и то же.


Не совсем. В случае с pen будет вызван CPen::operator HGDIOBJ + CDC::SelectObject(HGDIOBJ), причем последний работает только для "простых" контекстов, т.е. m_hDC == m_hAttribDC. В данном случае это конечно роли не играет, тем более, что в этом SelectObject для этого стоит ASSERT. Поэтому я и поставил смайлик, как констатацию данного совета как "танца с бубном".
Кроме этого есть еще один момент. В этом случае следующая операция будет некорректна:
CPen* old_pen = static_cast<CPen*>dc.SelectObject(pen);
...
dc.SelectObject(old_pen); //tyt грохнется

а такую конструкцию делать надобно, ибо "намусорил — убери за собой".
В случае с &pen все будет ок.

S>Но вообще код действително странный.

S>Зачем две ручки выбирать подряд: PrintDC.SelectStockObject(BLACK_PEN); и PrintDC.SelectObject(pen);

Это да.
Почетный кавалер ордена Совка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.