Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Prosba o pomoc jak wydrukowac na papierze w C++

Ostatnio zmodyfikowano 2020-11-16 19:14
Autor Wiadomość
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

 
 
P-177706
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 » Kurs WinAPI, C++ » PodstawyGrafika lekcja, 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)
P-177707
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


P-177708
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:
C/C++
#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 )
{
   
    // WYPEŁNIANIE STRUKTURY
    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 );
   
    // REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    // TWORZENIE OKNA
    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 ); // Pokaż okienko...
    UpdateWindow( hwnd );
   
    print( hwnd );
   
    // Pętla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}

// OBSŁUGA ZDARZEŃ
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.
P-177709
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 .

C/C++
if( r > 0 )
{
    // parametry ustawiana pozycji prostokata
    int rc1_lewa = 1000; // pozycja pozioma  - bedzie tu zmienna pobierana z pliku
    int rc1_gora = 900; // pozycja pinowa   - bedzie tu zmienna pobierana z pliku
    int rc1_prawa = rc1_lewa - 60; // szerokosc kreski - 60 pixeli
    int rc1_dol = rc1_gora - 30; // wysokosc kreski - 30 pixeli
   
    HBRUSH PedzelCzarny; // prostokat czarny ;
    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-"; // opisanie na druku naglowka
    const char * start_line = "---+---"; // miejsce dopasowania do druczku z innym znakiem aby sie nalozyl.
    TextOut( pPDX->hDC, 250, 200, s, lstrlen( s ) );
    // od lewej strony, od gory
    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 :


C/C++
// ShowWindow( hwnd, nCmdShow ); // Pokaż okienko windows ...
 
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
P-177718
« 1 »
  Strona 1 z 1