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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2010, 16:30   #1
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
Вопрос Вывод текста на принтер

Доброе время суток, уважаемые форумчане. у меня к вам большая просьба: подскажите, пожалуйста, как узнать драйвер принтера и отправить текст на печать! Текст должен быть аналогичным тому, который функция DrawText выводит на экран! Заранее огромное спасибо!

Код:
#include<windows.h>
LRESULT CALLBACK DepartComTechWndProc(HWND,UINT,UINT,LONG);
int WINAPI WinMain(HINSTANCE hInstance, 
HINSTANCE hPrevInstance,
				LPSTR lpszCmdParam, int nCmdShow)
{
WNDCLASS WndClass; 

HWND hWnd; 

MSG Msg; 


wchar_t szClassName[]=L"DepartComTech";

WndClass.style=CS_VREDRAW|CS_HREDRAW;
WndClass.lpfnWndProc=DepartComTechWndProc;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hInstance=hInstance;
WndClass.hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
WndClass.hCursor=LoadCursor(NULL,IDC_CROSS);
WndClass.hbrBackground=(HBRUSH) GetStockObject(LTGRAY_BRUSH);
WndClass.lpszMenuName=NULL;
WndClass.lpszClassName=szClassName;


if(!RegisterClass(&WndClass))
{
	MessageBox(NULL,L"Cannot register class",L"Error",MB_OK);
	return 0;
}

hWnd=CreateWindow(szClassName,L"Programmirovanie na WIN 32 API",
				WS_OVERLAPPEDWINDOW|WS_CAPTION|WS_HSCROLL|WS_VSCROLL, 
				15,20,
				300,200,
				NULL,NULL,
				hInstance,NULL);


if(!hWnd)

{
	MessageBox(NULL,L"Cannot create window",L"Error",MB_OK);
	return 0;
}

ShowWindow(hWnd,nCmdShow);

UpdateWindow(hWnd);


while(GetMessage(&Msg,NULL,0,0))
{
// преобразование сообщения к одному стилю обработки

	TranslateMessage(&Msg);

// передача сообщения в оконную функцию

	DispatchMessage(&Msg);
}

// возврат дополнительной информации о сообщении

return Msg.wParam;

}

LRESULT CALLBACK DepartComTechWndProc(HWND hWnd,UINT Message, UINT wParam,LONG lParam)

{
HDC hDC,hCompatibleDC;
PAINTSTRUCT PaintStruct;
static HANDLE hBitmap;
HANDLE hOldBitmap;
RECT Rect;
BITMAP Bitmap;
//
static int nHorizDifference=0,nVertDifference=0; 
static int nHorizPosition=0,nVertPosition=0;
// выбор нужной последовательности обработки для
// конкретного сообщения
switch(Message)
{
// загрузка Bitmap из файла 
case WM_CREATE:
hBitmap=LoadImage(NULL,L"setup.bmp", IMAGE_BITMAP,
				  0,0,LR_LOADFROMFILE);
return 0;
case WM_PAINT:
	hDC=BeginPaint(hWnd,&PaintStruct);
GetObject(hBitmap,sizeof(BITMAP),&Bitmap);
hCompatibleDC=CreateCompatibleDC(hDC);
hOldBitmap=SelectObject(hCompatibleDC,hBitmap);
	GetClientRect(hWnd,&Rect);
	BitBlt(hDC,0,0,Rect.right,Rect.bottom,hCompatibleDC,
		   nHorizPosition,nVertPosition,SRCCOPY);

if((nHorizDifference=(Bitmap.bmWidth-Rect.right))>0)
 SetScrollRange(hWnd,SB_HORZ,0,nHorizDifference,TRUE);
else
 SetScrollRange(hWnd,SB_HORZ,0,0,TRUE);                                   
if((nVertDifference=(Bitmap.bmHeight-Rect.bottom))>0)
 SetScrollRange(hWnd,SB_VERT,0,nVertDifference,TRUE);
 else
 SetScrollRange(hWnd,SB_VERT,0,0,TRUE);
// предыдущий  Bitmap становиться текущим
SelectObject(hCompatibleDC,hOldBitmap);
	
DrawText(hDC,L"Programmirovanie na WIN 32 API",-1,&Rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);

DeleteDC(hCompatibleDC);
	EndPaint(hWnd,&PaintStruct);
	return 0;

//
case WM_VSCROLL:
	switch(LOWORD(wParam))
	{
	case SB_LINEDOWN:
		if(nVertPosition<nVertDifference)
			nVertPosition++;
	break;
	case SB_LINEUP:
		if(nVertPosition>0)
			nVertPosition--;
	break;
	case SB_THUMBTRACK:
		nVertPosition=HIWORD(wParam);
	break;
	}
	SetScrollPos(hWnd,SB_VERT,nVertPosition,TRUE);
	InvalidateRect(hWnd,NULL,TRUE);
	return 0;
case WM_HSCROLL:
	switch(LOWORD(wParam))
	{
	case SB_LINERIGHT:
		if(nHorizPosition<nHorizDifference)
			nHorizPosition++;
	break;
	case SB_LINELEFT:
		if(nHorizPosition>0)
			nHorizPosition--;
	break;
	case SB_THUMBTRACK:
		nHorizPosition=HIWORD(wParam);
	break;
	}
	SetScrollPos(hWnd,SB_HORZ,nHorizPosition,TRUE);
	InvalidateRect(hWnd,NULL,TRUE);
	return 0;
case WM_DESTROY:
	DeleteObject(hBitmap);
	PostQuitMessage(0);
	return 0;
}                                                                                                      
return DefWindowProc(hWnd,Message,wParam,lParam);

}
JeyKip вне форума Ответить с цитированием
Старый 06.03.2010, 17:27   #2
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Нужно создать контекст устройства для принтера. Вот почитай.

Последний раз редактировалось profi; 06.03.2010 в 17:37.
profi вне форума Ответить с цитированием
Старый 07.03.2010, 19:21   #3
JeyKip
Форумчанин
 
Регистрация: 18.09.2009
Сообщений: 133
По умолчанию

Вот я изменил код...но у меня все равно контекст не строится!!! Подкорректируйте, пожалуйста, или помогите советом, в чем может быть проблема!! И я сомневаюсь, что нужно писать этот код в WM_PAINT...Заранее очень благодарен, за ЛЮБУЮ ПОЛЕЗНУЮ ИНФОРМАЦИЮ!!!...))


Код:
#include<windows.h>

HDC GetPrinterDC()
{
   wchar_t  msgbuf[128];
   LPSTR pch;
   LPSTR pchFile;
   LPSTR pchPort;
   
   // Определяем текущий принтер из файла win.ini
   if(!GetProfileString(L"windows", L"device", L"",
	   LPWSTR(msgbuf), sizeof(msgbuf)))
          return NULL;
   
   // Выполняем разбор строки для выделения имени драйвера,
   // имени устройства и имени порта ввода/вывода
   for(pch=LPSTR(msgbuf); *pch && *pch != ','; pch=AnsiNext(pch));
   
   if(*pch)
     *pch++ = 0;
   
   // Пропускаем управляющие символы и символ табуляции
   while(*pch && *pch <= ' ')
     pch=AnsiNext(pch);
   pchFile = pch;

   while(*pch && *pch != ',' && *pch > ' ')
     pch = AnsiNext(pch);

    if(*pch)
     *pch++ = 0;
   
   while(*pch && (*pch <= ' ' || *pch == ','))
     pch = AnsiNext(pch);
   
   pchPort = pch;

   while(*pch && *pch > ' ')
     pch = AnsiNext(pch);
   
   *pch = 0;
   
   // Возвращаем контекст отображения для принтера
   return CreateDC(LPCWSTR(pchFile), msgbuf, LPCWSTR(pchPort), NULL);
}


LRESULT CALLBACK DepartComTechWndProc(HWND,UINT,UINT,LONG);
// описание функции WinMain - точки входа в программу
int WINAPI WinMain(HINSTANCE hInstance, 
HINSTANCE hPrevInstance,
				LPSTR lpszCmdParam, int nCmdShow)
{

WNDCLASS WndClass; 

HWND hWnd; 

MSG Msg;
wchar_t szClassName[]=L"DepartComTech";



WndClass.style=CS_VREDRAW|CS_HREDRAW;
WndClass.lpfnWndProc=DepartComTechWndProc;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hInstance=hInstance;
WndClass.hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
WndClass.hCursor=LoadCursor(NULL,IDC_CROSS);
WndClass.hbrBackground=(HBRUSH) GetStockObject(LTGRAY_BRUSH);
WndClass.lpszMenuName=NULL;
WndClass.lpszClassName=szClassName;



if(!RegisterClass(&WndClass))
{
	MessageBox(NULL,L"Cannot register class",L"Error",MB_OK);
	return 0;
}


hWnd=CreateWindow(szClassName,L"NAZVANIE",
				WS_OVERLAPPEDWINDOW|WS_CAPTION, 
				15,20,
				400,200,
				NULL,NULL,
				hInstance,NULL);


if(!hWnd)

{
	MessageBox(NULL,L"Cannot create window",L"Error",MB_OK);
	return 0;
}

// отображение окна на экране

ShowWindow(hWnd,nCmdShow);

// посылка оконной функции сообщения WM_PAINT с требованием
// перерисовать рабочую область окна

UpdateWindow(hWnd);

// цикл обработки сообщений
// выбор сообщений из очереди функцией GetMessage

while(GetMessage(&Msg,NULL,0,0))
{
// преобразование сообщения к одному стилю обработки

	TranslateMessage(&Msg);

// передача сообщения в оконную функцию

	DispatchMessage(&Msg);
}

// возврат дополнительной информации о сообщении

return Msg.wParam;

}

LRESULT CALLBACK DepartComTechWndProc(HWND hWnd,UINT Message, UINT wParam,LONG lParam)

{
// дескриптор контекста устройства
HDC hDC, hPrinterDC,hCompDC;
HANDLE hText, hOldText; 
// характеристики области рисования
PAINTSTRUCT PaintStruct;
// определение области рисования
RECT Rect;
int driver;
wchar_t bufer;
wchar_t nos[]=L"Nosolenko";
 
  
// выбор нужной последовательности обработки для
// конкретного сообщения
switch(Message)
{
case WM_PAINT:
	
// обработка сообщения о перерисовке рабочей зоны окна
// получение дескриптора устройства
	hDC=BeginPaint(hWnd,&PaintStruct);
// определение клиентской области для рисования,
// в структуре Rect первые две координаты равны 0, а -
// третья и четвертая - значения ширины и высоты окна

GetClientRect(hWnd,&Rect);

if ((hPrinterDC=GetPrinterDC())==0){
DrawText(hPrinterDC,L"NELZYA",-1,&Rect,
		DT_SINGLELINE|DT_CENTER|DT_VCENTER);
} else {

	hText=nos;
    GetObject (hText,sizeof(wchar_t),&bufer);
	hCompDC=CreateCompatibleDC(hPrinterDC);
    hOldText=SelectObject(hCompDC,hText);
   
	BitBlt(hPrinterDC,100,100,300,400,hCompDC,0,0,SRCCOPY);
	// вывод строки в зону, определенную флажками
		DrawText(hPrinterDC,L"LUBOY TEXT",-1,&Rect,
		DT_SINGLELINE|DT_CENTER|DT_VCENTER);
	

	SelectObject(hCompDC,hOldText);
	DeleteObject(hText);
	DeleteDC(hCompDC);
	DeleteDC(hPrinterDC);



// завершение перерисовки
	EndPaint(hWnd,&PaintStruct);
}
	return 0;
// начало операции уничтожения окна
// сообщение WM_DESTROY появляется в очереди сообщений при
// закрытии окна
case WM_DESTROY:
// функция PostQuitMessage посылает окну (данным об окне в 
// системе) сообщение WM_QUIT, которое вызывает прекращение
// цикла обработки
	PostQuitMessage(0);
	return 0;
}

// обработка всех остальных сообщений (по умолчанию)
return DefWindowProc(hWnd,Message,wParam,lParam);

}
JeyKip вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод на принтер AlexandЯ Помощь студентам 2 30.01.2010 11:34
Вывод текста SeeWhoIam Помощь студентам 2 24.12.2009 22:36
C|Вывод текста Troi666 Помощь студентам 4 09.05.2009 01:31
вывод текста Shkentik Общие вопросы Delphi 5 21.04.2009 23:29
Вывод на принтер содержимого формы Ermiss Общие вопросы Delphi 2 20.12.2007 15:40