druckeransteuerung usb - help!
-
ich versuche gerade aus einem c++ programm einen usb-drucker anzusteuern und direkt aus dem programm einen string (oder ein .txt file) - nur text, keine grafik!!- auszudrucken. das ganze soll ohne druckerdialog vor sich gehen. nach einiger recherche hab ich herausgefunden, dass das wohl nur über winapi geht.
hat das schon jemand gemacht und kann mir hier einen lauffähigen code posten oder tipps geben? ich hab nämlich nicht besonders viel ahnung von winapi....
daaaanke!
-
Bin mir gerade nicht ganz im Klaren, ob du den Drucker direkt ansprechen willst, oder eben "normal".
Falls letzteres - was ich eher vermute - MSDN: Printing and Print Spooler
-
ich weiß nicht genau was du mit "direkt" oder "normal" meinst... www.msdn.com forste ich jedoch seit einigen stunden erfolglos durch...
mir ist das völlig egal wie ich den usb drucker ansteure, hauptsache ich hab nachher einen ausdruck!! bisher hab ichs noch nicht hinbekommendas hier ist mein neuster versuch den ich mir mit hilfe des buchs "windows-programmierung" von charles petzold zusammengereimt hab. ich bekomme keine fehler, es passiert aber auch nix... ist wohl einfach nicht auf usb ausgelegt das ganze, und ausdrücklich steht über usb überhaupt nichts in dem buch... vielleicht hat ja jemand einen tipp...
#include <windows.h> //Gerätekontext ermitteln HDC GetPrinterDC(void) { DWORD dwNeeded, dwReturned; HDC hdc; PRINTER_INFO_4 * pinfo4; EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 4, NULL, 0, &dwNeeded, &dwReturned); pinfo4=(PRINTER_INFO_4*)malloc(dwNeeded); EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 4, (PBYTE) pinfo4, dwNeeded, &dwNeeded, &dwReturned); hdc=CreateDC(NULL, pinfo4->pPrinterName, NULL, NULL); free(pinfo4); return hdc; } //Druckerkontext + Höhe und breite der Seite void PageGDICalls(HDC hdcPrn, int cxPage, int cyPage) { static TCHAR szTextStr[]=TEXT("Hallo, Drucker!"); Rectangle (hdcPrn, 0, 0, cxPage, cyPage); MoveToEx (hdcPrn, 0, 0, NULL); LineTo (hdcPrn, cxPage, cyPage); MoveToEx (hdcPrn, cxPage, 0, NULL); LineTo (hdcPrn, 0, cyPage); SaveDC(hdcPrn); SetMapMode (hdcPrn, MM_ISOTROPIC); SetWindowExtEx (hdcPrn, 1000, 1000, NULL); SetViewportExtEx (hdcPrn, cxPage/2, -cyPage/2, NULL); SetViewportOrgEx (hdcPrn, cxPage/2, cyPage/2, NULL); Ellipse(hdcPrn, -500, 500, 500, -500); SetTextAlign(hdcPrn, TA_BASELINE | TA_CENTER); TextOut(hdcPrn, 0, 0, szTextStr, lstrlen(szTextStr)); RestoreDC(hdcPrn, -1); } BOOL PrintMyPage(HWND hwnd) { static DOCINFO di={sizeof(DOCINFO), TEXT("Print1: Druck")}; BOOL bSuccess=TRUE; HDC hdcPrn; int xPage, yPage; if(NULL==(hdcPrn=GetPrinterDC())) return FALSE; xPage=GetDeviceCaps(hdcPrn, HORZRES); yPage=GetDeviceCaps(hdcPrn, VERTRES); if(StartDoc(hdcPrn, &di)>0) { if(StartPage(hdcPrn)>0) { PageGDICalls(hdcPrn, xPage, yPage); if(EndPage(hdcPrn)>0) EndDoc(hdcPrn); else bSuccess=FALSE; } } else bSuccess=FALSE; DeleteDC(hdcPrn); return bSuccess; } void main() { HDC GetPrinterDC(void); void PageGDICalls(HDC, int, int); BOOL PrintMyPage(HWND); HINSTANCE hInst; TCHAR szAppName[]=TEXT("Print1"); TCHAR szCaption[]=TEXT("Druckprogramm1"); }
-
1.) In PrintMyPage ist hdcPrn gar nicht mehr bekannt
2.) In main solltest du PageGDICalls nicht direkt aufrufenFalls dir das ganze mit Gültigkeitsbereichen noch nicht so ganz klar ist (eigentlich hätte dein Compiler meckern müssen, dass er die Variable nicht kennt) würde ich dir empfehlen erstmal den ganzen Code direkt in main zu schreiben - ist zwar bissl unsaube und unübersichtlich, aber so hast du ja offenbar etwas Probleme damit
-
hi flenders, danke für die tipps, es funktioniert jetzt *juhuuuuu*