C++ & C# Programming page
 

 

# Úvod
# Tvůrci
# C++
# C#
# Linky





Primitivní Tisk

Na přání pár C++ čtenářů přináším návod primitivního tisku textu na primitivní výstup - papír :-)

Už podle nadpisu snad poznáte, že nejde o složité tisknutí grafiky, tabulek a podobně. Cílem je vytisknout stránku textu a to ještě k tomu neformátovaného.
Jak říká jedno přísloví: "Chytrému napověz, hloupého kopni.", pokud se někdo o toto téma bude zajímat, na internetu nebo v nápovědě MSDN nalezne dost informací, aby tiskl i složitou grafiku.
Dnes vám pouze napovím, příště možná i kopnu, když bude čas a nějaké funkce na grafiku napíšu. :-)

Funkce Tisk:

void Tisk(HWND hWnd)
{
     HDC hdc;
     DOCINFO di; 
     hdc = CreateDC("WINSPOOL", "HP DESKJET 510", NULL, NULL); 
     memset( &di, 0, sizeof(DOCINFO)); 
     di.cbSize = sizeof(DOCINFO); 
     di.lpszDocName = "Text Document"; 
     if( StartDoc( hdc, &di) != SP_ERROR ) 
     { 
          StartPage(hdc); 
          TCHAR szText[200]; 
          // nacteni textu z EditBoxu, je nuzne zmenit pokud chcete tuto funkci nekde pouzit
          SendMessage(g_hEdit, WM_GETTEXT,  200, LPARAM(szText));
          DrawText(hdc, szText); // vlastni, pretizena funkce
          EndPage(hdc); 
          EndDoc(hdc); 
     } 
     DeleteDC(hdc);
}

Na začátku se vytvoří handle zařízení, ve kterém musíme zadat textovou konstantu jména zařízení. To přináši plus i mínus. Není třeba speciální příkaz pro tiskárnu, lze tisknout na víc druhů zařízení. Jenže k tomu, aby se dalo tisknout, potřebujeme jméno tiskárny, jaké je v systému. V této ukázce jsem použil jméno HP DESKJET 510, stará, inkoustová tiskárna, na které byl program odzkoušen. Toto jméno musíte proto podle potřeby změnit. V praxi se volá dialog windows, kde získáme informace, jako kolik stránek tisknout, na které tiskárně a podobně. Zjednodušeně by stačilo uživateli zobrazit EditBox, do kterého by jméno zadal a pokud by bylo špatně, prostě by se nic netisklo a on by ho musel zadat znovu. Není to "user-friendly", pro začátek však stačí.
Dále se musí vytvořit dokument, který se bude tisknout, potom stránka, do ní se nasází text, grafika atd, stránka a dokument se uzavře a začne tisk. Na konci se ještě uzavře DC.


Funkce DrawText:

void DrawText(HDC hdc, LPTSTR Text)
{
     int a = 0; // pozice v Text
     int radek = 10; // radek pro tisk
     Text[strlen(Text) + 1] = 0; // uzavreni Textu
     while(Text[a] != 0)
    { 
          TCHAR szBuf[200]; 
          int b = 0; 
          while(Text[a] != 13 && Text[a] != 10 && Text[a] != 0 && Text[a] && -52)
          { 
               szBuf[b] = Text[a]; 
               b++; 
               a++; 
           } 
          szBuf[b] = 0; 
          TextOut(hdc, 10, radek, szBuf, strlen(szBuf)); 
          radek += 25; // posunuti Y pozice tisku
          a++; 
     }
}

Tato funkce je přetížená, to znamená, že ji můžeme nalézt použitou k vykreslení textu do DC. To ale nemá s tímto případem nic společného.
Smyslem celého procesu je rozdělit Text na řádky, protože funkce TextOut vytiskne jen jeden řádek a znaky 10, 13 (další řádek) se netrápí. Ve smyčce se čte Text, znaky mezi 13, 10 se překopírovávají do bufferu, který je pokaždé vytisknut.
Kvůli jednoduchosti jsem neřešil rozdělení na více stránek, to by se musel zjistit počet řádků na stránku a pokaždé ukončit a začít stránku.

Chtěl bych se omluvit, že tentokrát funkci neukáži na aplikaci. Průběžně však vytvářím textový editor, ve kterém se bude například tisk vyskytovat, ale protože není ještě vše hotovo, musí vám stačit jen zjednodušený úryvek funkce na tisk, který by měl teoreticky fungovat skoro ihned po "implantaci" do jiné aplikace.



Správce sekce: Dejvino



14.2 2005

C++: pridano par odkazu na clanky o OpenGL, IRC, POP3 a BMP
14.8 2004

C++: přidán klient pro Internet Relay Chat (IRC)
11.7 2004

C++: opravil jsem zdrojak WebServeru, byla tam navic jedna funkce kterou jsem nepridal a mnoho zacatecniku by si s tim nemuselo vedet rady...
27.6 2004

Vytvořen IRC kanál #c-prog na serveru Quakenet
10.6 2004

C++: přidán program WebServer, stojí za prohlédnutí!
5.6 2004

C++: přidán článek o CheckBoxu
29.5 2004

C++: přidán program WinSock Mail
28.5 2004

C#: přidán program DNStoIP
Vaše IP je 107.20.115.174
Stránka byla načtena za 0.01862 sekund.