Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2017, 11:39   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Программная печать текстового файла из MFC-приложения

Как программно выдать на печать текстовой файл из MFC-приложения?
erslgoeirjh вне форума Ответить с цитированием
Старый 28.08.2017, 13:06   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

https://docs.microsoft.com/en-us/cpp...-print-preview
p51x вне форума Ответить с цитированием
Старый 28.08.2017, 17:37   #3
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

И ещё у меня вопрос: как осуществить программную печать равноширинным текстом?
erslgoeirjh вне форума Ответить с цитированием
Старый 28.08.2017, 17:57   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Загрузить и выбрать равноширинный шрифт.
p51x вне форума Ответить с цитированием
Старый 29.08.2017, 10:51   #5
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Загрузить и выбрать равноширинный шрифт.
А какие из равноширинных шрифтов Вы бы посоветовали? Courier New подойдёт, или же лучше выбрать какой-то другой шрифт?
erslgoeirjh вне форума Ответить с цитированием
Старый 29.08.2017, 15:20   #6
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

И ещё вопрос. У меня строки считываются из текстового файла и выводятся на печать (фрагмент кода):

Код:
if (StartDoc(hDC,&docinfo)>0)
{
    if (StartPage(hDC)>0)
    {
        f = fopen("results.txt","rt");
        while (!feof(f))
        {
            fgets(s,256,f);
            len = strlen(s);
            pzText = (LPCSTR)s;
            TextOut(hDC,0,yPos,pzText,len);
            yPos += cyChar;
        }
        fclose(f);
        EndPage(hDC);
    }
    EndDoc(hDC);
}
Как мне задать шрифт для принтера (например, Courier New) и размер (высоту) шрифта--например, 10 ?
erslgoeirjh вне форума Ответить с цитированием
Старый 29.08.2017, 15:30   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
А какие из равноширинных шрифтов Вы бы посоветовали? Courier New подойдёт, или же лучше выбрать какой-то другой шрифт?
А каких девушек вы б посоветовали? Вот эта блондиночка подойдет или какую-то другую?

Цитата:
Как мне задать шрифт для принтера (например, Courier New) и размер (высоту) шрифта--например, 10 ?
Стандартно. CFont создаете, а потом куда надо SelectObject
p51x вне форума Ответить с цитированием
Старый 29.08.2017, 15:30   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

LOGFONT
CreateFontIndirect()
SelectObject()
waleri вне форума Ответить с цитированием
Старый 29.08.2017, 17:00   #9
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Вот мой код:

Код:
void CPrintSolvedNUDialog::OnBnClickedOk()
// если была нажата кнопка "Печать"
{
	// TODO: добавьте свой код обработчика уведомлений
	int  i, n, len, cyChar, cyPage, yPos;
	char  s[256];
	CString  myString;
	LPCSTR  pzText;
	LPTSTR  lpszText;
	DWORD  size = MAX_PATH;
	TCHAR  temp[MAX_PATH];
	TEXTMETRIC  txtm;
	FILE *f;

	GetDefaultPrinter(temp,&size);	
	HDC  hDC = CreateDC(NULL,temp,NULL,NULL);
	if (hDC)
	{
		cyPage = GetDeviceCaps(hDC,VERTRES);
		GetTextMetrics(hDC,&txtm);
		cyChar = txtm.tmHeight + txtm.tmExternalLeading;
		yPos = 0;
		DOCINFO  docinfo;
		docinfo.cbSize = sizeof(docinfo);
		docinfo.lpszDocName = "Simple";
		docinfo.lpszOutput = NULL;
		docinfo.lpszDatatype = "EMF";
		docinfo.fwType = 0;
		if (StartDoc(hDC,&docinfo)>0)
		{
			if (StartPage(hDC)>0)
			{
				CFont *savedFont = GetFont();
				LOGFONT  lf;
				strcpy(lf.lfFaceName,"Courier New");
				lf.lfHeight = 10;
				lf.lfWidth = 8;
				CFont  myFont;
				myFont.CreateFontIndirectA(&lf);
				((CDC*)hDC)->SelectObject(&myFont);
				f = fopen("results.txt","rt");
				while (!feof(f))
				{
					fgets(s,256,f);
					len = strlen(s);
					pzText = (LPCSTR)s;
					TextOut(hDC,0,yPos,pzText,len);
					yPos += cyChar;
				}
				fclose(f);
				((CDC*)hDC)->SelectObject(savedFont);
				EndPage(hDC);
			}
			EndDoc(hDC);
		}
		DeleteDC(hDC);
	}
	CDialogEx::OnOK();
}
На строке
Код:
((CDC*)hDC)->SelectObject(&myFont);
моя программа бьётся, выдаёт сообщение:

Цитата:
Необработанное исключение по адресу 0x00486A21 в MyProgram.exe: 0xC0000005 нарушение прав доступа при чтении по адресу 0xE4210E25
и дальше не идёт.

Как мне исправить мою ошибку?
erslgoeirjh вне форума Ответить с цитированием
Старый 29.08.2017, 17:29   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

HDC и CDC это разные вещи.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программная компиляция из приложения. Rockot Общие вопросы Delphi 3 04.09.2016 12:15
MFC. Печать Samir_ Visual C++ 1 11.05.2012 22:39
Печать текстового файла PONKA Общие вопросы Delphi 7 11.08.2011 15:37
Вывод текстового файла на печать. XerSon Общие вопросы Delphi 2 04.05.2010 11:21
Печать текстового файла на сетевой принтер VAbramyak Общие вопросы Delphi 3 06.04.2007 20:16