futek2 Temat założony przez niniejszego użytkownika |
Prosba o pomoc jak wydrukowac na papierze w C++ » 2020-11-14 11:35:38 Witam. Od paru dni borykam sie z wyslaniem na domyslna drukarke pod WINDOS7 prostokata o wymiarze 30 x 60 pixeli ( nie wiem czy nie bedzie zamaly ale ewetulanie sobie ustwie) wypelnionego na czarno a jego lokalizacje uzaleznic na papierze od wartosci liczby ktora jest zapisana w pliku TXT. Odczyt pliku txt tym nie mam problemu i wyswietlanie na ekranie jest. Posilkuje sie opisem
http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Zaawansowane/Drukowanie/372
Ale nie umiem sobe poradzic aby ten prostokat stworzyc w kodzie a potem wyslac na domyslna drukarke aby jego pozycje na papierze byl zalezna wartosci liczbyodczytanej z pliku txt. Te pzycje sa 1 - 20. Rozne proby robilem operajac sie na tym linku powyzej ale nic mi nie wychodzi. Chcial bym tez aby byla mozliwosc ustawienia w kodzie marginesu bocznego od lewej i gorneg. Nie chce zadnych okienek po WINDOS program ma odczytwac kolejne regordy z pliku co juz mam zrobione a potem wyrdukowac na papierze ( na gotowym druku na ktorym musze zaznaczyc miejsca tym prostokatem) Drukowanie ma trwac az do odczytania wszystkich liczb z pliku - jeden wiersz to jedem wiersz na drukarce naniesony na gotowy druk i drukarka pobiera kolejna kartke z drukiem. Prosze o pomoc. Futek2
|
|
pekfos |
» 2020-11-14 12:27:17 Raczej nikt charytatywnie nie napisze za Ciebie kodu, więc dla najlepszych rezultatów określ problem dokładniej niż "nie umiem sobie poradzić". Na podstawie kursu powinieneś mieć już działające drukowanie elipsy (albo chociaż jakiś kod), przerobienie na prostokąt nie jest skomplikowane. Masz w tej lekcji link do Grafika, gdzie jest opisane renderowanie prostej geometrii. Do pobierania domyślnej drukarki służy PD_RETURNDEFAULT ( https://docs.microsoft.com/en-us/windows/win32/api/commdlg/ns-commdlg-printdlgexa) |
|
futek2 Temat założony przez niniejszego użytkownika |
Prosba o pomoc jak wydrukowac na papierze w C++ » 2020-11-15 10:18:36 Witam czytajacych i kol. pekfos. Rozumiem Cie ze duzo ludzi pisze o podobnych problemach i faktycznie jest sie czasami czlowiek jest juz zmeczony ciaglym odpowiadaniem. Ale ja nie jestem zawodowcem i na dadatek mam juz ponad 65 lat i moja edukacja programowania zaczela sie na kiedy mialem ZX SPECTRUM. Duzo rzeczy musialem sie sam nauczyc bo juz okres edukacji szkolnej sie zakonczyl i trzeba bylo pracowac. Ale to juz histora.
A teraz z powodu COVID19 siedzi sie wiecej w domu to dobrze miec zainteresowanie bo mozna sie wsciec jak by tylko sie ogladalo TV.
Ale nawiazujac do tematu ktory mnie interesuje to jezeli w opisie z linku ktorym sie posiakowalem z naszego forum byl by prosty przejzysty przyklad co dalo by sie wyprobowac bez skladania jak na pierwszy raz to zapewne bym sie nie zwracal o pomoc. Ale zanim Ty mi napisales swoja odpowiedz to ja juz znalazlem w sieci taki prosty dzialajacy przyklad jak z tego linku ponizej. Moze nie jest doskonaly ale dziala bo juz przetestwalem a teraz juz rozumiem jak to trzeba zrobic.
http://webdevtipstricksandinfo.blogspot.com/2012/07/how-to-print-in-c-using-win32-api.html
I moze teraz Twoje stanowisko ulegnie zmianie po przeczytaniu a Twoje uwagi beda pomocne jak sie posilkowac tym opisem z naszego forum bo moze to innym sie przyda jak trafia na ten temat. http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Zaawansowane/Drukowanie/372 A moze dlatego jest taki bo go napisal "Złośliwiec" i nie byl aktualizowany bo moze malo kto sie tym interesowal.
Przyklad z naszego forum zapewne dla zaawansowanyh jest zrozumialy ale dla kogos co nigdy nie robil wydruku to jest zawilyi brak konkretnego przykladu jak jest to w innych lekcjach, ze sa nawet obrazki co otrzymamy jak uruchomimy przykladowy kod. Jak np ten opis ktory Ty podeslales a byl mi juz wczesniej znany. http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Podstawy/Grafika/181
Znalazlem tez inny opis zwiazanym z moim problemem i ten tez jest juz przestowany i dziala ale jest obszerniejszy ale ladnie opisany. Tu link https://www.dreamincode.net/forums/topic/194320-win32-api-printer-tutorial-using-gdi-functions/
Mysle ze powoli przebrne przez drobne jeszcze trudnosci z kodem na drukowanie.
Ale zawsze pomoc jest mile widziana.
Pozdrawiam. Futek2
|
|
pekfos |
» 2020-11-15 12:57:22 I moze teraz Twoje stanowisko ulegnie zmianie po przeczytaniu a Twoje uwagi beda pomocne jak sie posilkowac tym opisem z naszego forum bo moze to innym sie przyda jak trafia na ten temat. |
Moje stanowisko wciąż jest takie, że jak się ma problem, to należy go odpowiednio opisać. Nie powinno być potrzeby ciągania za język i nie powinno być potrzeby nauczania indywidualnego. Problem zawsze jest konkretny, a bez stosownego opisu można najwyżej zgadywać i przerzucać się materiałami. Przyklad z naszego forum zapewne dla zaawansowanyh jest zrozumialy ale dla kogos co nigdy nie robil wydruku to jest zawilyi brak konkretnego przykladu jak jest to w innych lekcjach, ze sa nawet obrazki co otrzymamy jak uruchomimy przykladowy kod. |
Lekcja o drukowaniu opisuje po kolei wszystkie kroki, jakie trzeba wykonać. Jedyne czego brakuje do pełnego przykładu to posklejanie kodu w kolejności w jakiej występuje w lekcji i dodanie jakiejś okienkowej aplikacji jako podstawkę - tą można skopiować z pierwszej lekcji kursu: #include <Windows.h>
LPSTR NazwaKlasy = "Klasa Okienka"; MSG Komunikat;
int print( HWND hwnd ) { int r = 0; HRESULT hResult; LPPRINTDLGEX pPDX = NULL; LPPRINTPAGERANGE pPageRanges = NULL; pPDX =( LPPRINTDLGEX ) GlobalAlloc( GPTR, sizeof( PRINTDLGEX ) ); if( !pPDX ) return E_OUTOFMEMORY; pPageRanges =( LPPRINTPAGERANGE ) GlobalAlloc( GPTR, 10 * sizeof( PRINTPAGERANGE ) ); if( !pPageRanges ) return E_OUTOFMEMORY; pPDX->lStructSize = sizeof( PRINTDLGEX ); pPDX->hwndOwner = hwnd; pPDX->hDevMode = NULL; pPDX->hDevNames = NULL; pPDX->hDC = NULL; pPDX->Flags = PD_RETURNDC | PD_COLLATE; pPDX->Flags2 = 0; pPDX->ExclusionFlags = 0; pPDX->nPageRanges = 0; pPDX->nMaxPageRanges = 10; pPDX->lpPageRanges = pPageRanges; pPDX->nMinPage = 1; pPDX->nMaxPage = 1000; pPDX->nCopies = 1; pPDX->hInstance = 0; pPDX->lpPrintTemplateName = NULL; pPDX->lpCallback = NULL; pPDX->nPropertyPages = 0; pPDX->lphPropertyPages = NULL; pPDX->nStartPage = START_PAGE_GENERAL; pPDX->dwResultAction = 0; hResult = PrintDlgEx( pPDX ); if( hResult == S_OK && pPDX->dwResultAction == PD_RESULT_PRINT ) { DOCINFO docInfo; ZeroMemory( & docInfo, sizeof( docInfo ) ); docInfo.cbSize = sizeof( docInfo ); docInfo.lpszDocName = "Test"; r = StartDoc( pPDX->hDC, & docInfo ); if( r != SP_ERROR ) { r = StartPage( pPDX->hDC ); if( r > 0 ) { HBRUSH hbrNull =( HBRUSH ) GetStockObject( NULL_BRUSH ); HBRUSH hbrOld =( HBRUSH ) SelectObject( pPDX->hDC, hbrNull ); Ellipse( pPDX->hDC, 500, 500, 1000, 1000 ); Ellipse( pPDX->hDC, 1000, 800, 1500, 1300 ); Ellipse( pPDX->hDC, 800, 1000, 1800, 2000 ); SelectObject( pPDX->hDC, hbrOld ); const char * s = "To jest test drukarki."; TextOut( pPDX->hDC, 50, 80, s, lstrlen( s ) ); r = EndPage( pPDX->hDC ); if( r > 0 ) r = EndDoc( pPDX->hDC ); } } } if( pPDX->hDC ) DeleteDC( pPDX->hDC ); if( pPDX->hDevMode ) GlobalFree( pPDX->hDevMode ); if( pPDX->hDevNames ) GlobalFree( pPDX->hDevNames ); GlobalFree( pPDX ); GlobalFree( pPageRanges ); return 0; }
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX wc; wc.cbSize = sizeof( WNDCLASSEX ); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 ); wc.lpszMenuName = NULL; wc.lpszClassName = NazwaKlasy; wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); if( !RegisterClassEx( & wc ) ) { MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...", MB_ICONEXCLAMATION | MB_OK ); return 1; } HWND hwnd; hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Oto okienko", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL ); if( hwnd == NULL ) { MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION ); return 1; } ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); print( hwnd ); while( GetMessage( & Komunikat, NULL, 0, 0 ) ) { TranslateMessage( & Komunikat ); DispatchMessage( & Komunikat ); } return Komunikat.wParam; }
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_CLOSE: DestroyWindow( hwnd ); break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hwnd, msg, wParam, lParam ); } return 0; } Nie jest to dosłownie ten sam kod co z kursu, bo jak się okazuje, nie ma czegoś takiego jak GetStockBrush() i SelectBrush() i zamiast nich trzeba użyć GetStockObject() i SelectObject() wraz z odpowiednim rzutowaniem, tak jak w lekcji o grafice. To będzie wkrótce poprawione. |
|
futek2 Temat założony przez niniejszego użytkownika |
Prosba o pomoc jak wydrukowac na papierze w C++ » 2020-11-16 19:14:37 Witam czytajacych temat oraz kol.pekfos. Dzieki kol. pekfos za podeslanie poprawionego przykladu z lekcji o drukowaniu. Kod juz mialam zrobiony ale nawiazujac do tego co kolega umiscil to ja fragment kodu tez uzupelnilem na moje potrzeby, drukujacy na papierze maly prostokat, tak zrobilem: Byc moze ktos z tego skrzysta z tego fragmentu kodu bazujac na calym kodzie z poprzedniego kodu ktory umiescil kol. pekfos . if( r > 0 ) { int rc1_lewa = 1000; int rc1_gora = 900; int rc1_prawa = rc1_lewa - 60; int rc1_dol = rc1_gora - 30; HBRUSH PedzelCzarny; PedzelCzarny = CreateSolidBrush( 0x000000 ); HBRUSH hbrOld =( HBRUSH ) SelectObject( pPDX->hDC, PedzelCzarny ); Rectangle( pPDX->hDC, rc1_lewa, rc1_gora, rc1_prawa, rc1_dol ); SelectObject( pPDX->hDC, hbrOld ); const char * s = "LP-"; const char * start_line = "---+---"; TextOut( pPDX->hDC, 250, 200, s, lstrlen( s ) ); TextOut( pPDX->hDC, 200, 500, start_line, lstrlen( start_line ) ); r = EndPage( pPDX->hDC ); if( r > 0 ) r = EndDoc( pPDX->hDC ); } } }
Ten fragment kodu dziala po wymianie w kodzie ktory zamiescil kol pekfos. Dodatkowo zaremowam w dalszej czesci aby przyspieszyc drukowanie a jest linia w kodzie z : Teraz tylko rozbuduje ten fragmentu kodu aby to wiecej rysowalo sie tych malych prostokacikow na druczku z godnie z pozycjami odczytanymi z pliku. Pragne tez dodac informacje ze kod nie kompiluje sie na DEV C++ wersja 5.6 nalezy zmienic linie
//LPSTR NazwaKlasy = "Klasa Okienka"; const char * NazwaKlasy = "Klasa Okienka"; MSG Komunikat;
Pozdrawiam. Futek2 |
|
« 1 » |