![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Печать [D7, Win95/98, WinME, NT4, Win2k, WinXP]
Shutov © (2004-03-07 18:45:00)Здравствуйте. Подскажите пожалуйста, как используя только
WinAPI произвести настройку принтера (минимум - ориентацию и
кол-во печатаемых страниц), а затем и печать (с cоответствующими
настройками из 'настройки принтера') обычного Bitmap'а?
Shutov (2004-03-18 15:28:00) [1]Спасибо.
YuRock (2004-03-10 14:15:00) [2]Все это умеет делать ф-ция PrintDlg.
Вот пример (ф-ция возвращает имя принтера и устанавливает настройки):
function SelectPrinter(hWnd : THandle; DevMode : PDevMode) : String;
var
pdlg : TPrintDlg;
dm : PDevMode;
begin
pdlg.lStructSize := SizeOf(TPrintDlg);
pdlg.hwndOwner := hWnd;
pdlg.hDevMode := 0;
pdlg.hDevNames := 0;
pdlg.hDC := 0;
pdlg.Flags := PD_HIDEPRINTTOFILE or PD_NOPAGENUMS or PD_NOSELECTION;
pdlg.hInstance := HInstance;
pdlg.hPrintTemplate := 0;
pdlg.hSetupTemplate := 0;
pdlg.nCopies := 1;
if PrintDlg(pdlg) then
begin
dm := GlobalLock(pdlg.hDevMode);
Result := StrPas(dm.dmDeviceName);
if Assigned(DevMode) then CopyMemory(DevMode, dm, SizeOf(TDevMode));
GlobalUnlock(HGLOBAL(dm));
end
else
Result := '';
end;
В параметр этой ф-ции в итоге (DevMode) в итоге запишутся нужные настройки. Если не хотите выбрасывать окно с выбором принтера - можете проициализировать DevMode вручную. DevMode затем передается как параметр в CreateDC. Пример:
procedure TGStatusGrid.Print;
var
DC : HDC;
di : TDocInfo;
hPrevFont : THandle;
sPrinterName : String;
dm : TDevMode;
begin
sPrinterName := SelectPrinter(Handle, @dm);
if sPrinterName = '' then Exit;
DC := CreateDC(LPSTR('WINSPOOL'), LPSTR(sPrinterName), nil, @dm);
SetBkMode(DC, TRANSPARENT);
hPrevFont := SelectObject(DC, GetStockObject(ANSI_VAR_FONT));
//
di.cbSize := SizeOf(TDocInfo);
di.lpszDocName := LPSTR('Печать документа');
di.lpszOutput := nil;
StartDoc(DC, di);
StartPage(DC);
// На этой странице рисуйте, что хотите...
EndPage(DC);
EndDoc(DC);
SelectObject(DC, hPrevFont);
DeleteDC(DC);
end;
> Никто ничего не подскажет?
Достаточно, надеюсь?
Shutov (2004-03-10 13:48:00) [3]Никто ничего не подскажет?