본문 바로가기

Windows/Windows API

텍스트 인쇄 (print)

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND g_hMainWnd;
LPSTR lpszClass="Print";

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
         ,LPSTR lpszCmdParam,int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst=hInstance;
    
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hInstance=hInstance;
    WndClass.lpfnWndProc=(WNDPROC)WndProc;
    WndClass.lpszClassName=lpszClass;
    WndClass.lpszMenuName=NULL;
    WndClass.style=CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);
    
    hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
         NULL,(HMENU)NULL,hInstance,NULL);
    ShowWindow(hWnd,nCmdShow);
    g_hMainWnd=hWnd;
    
    while(GetMessage(&Message,0,0,0)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return Message.wParam;
}

void Print()
{
    HDC hPrtdc;
    int xpage, ypage;
    DOCINFO doc;
    int Result;
    PRINTDLG pd;

/*
    // WIN.INI 파일에서 DC를 직접 만들어 사용하는 방법
    char szPrinter[80];
    char *szDevice, *szDriver, *szOutput;
    GetProfileString("windows","device",",,,",szPrinter,80);
    szDevice = strtok(szPrinter,",");
    szDriver = strtok(NULL, ", ");
    szOutput = strtok(NULL, ", ");
    hPrtdc=CreateDC(szDriver,szDevice,szOutput,NULL);
    if (hPrtdc==NULL) return;
//*/

/*
    // CreateDC로 프린터 DC 생성. 2000에서만 사용할 수 있다.
    char szDevice[256];
    DWORD dwSize=256;
    GetDefaultPrinter(szDevice, &dwSize);
    hPrtdc=CreateDC(NULL,szDevice,NULL,NULL);
    if (hPrtdc==NULL) return;
//*/

//*
    // 프린터에 관한 정보를 구하고 DC를 만든다.
    memset(&pd,0,sizeof(PRINTDLG));
    pd.lStructSize=sizeof(PRINTDLG);
    pd.Flags=PD_RETURNDC;
    pd.hwndOwner=g_hMainWnd;
    pd.nFromPage=1;
    pd.nToPage=1;
    pd.nMinPage=1;
    pd.nMaxPage=1;
    pd.nCopies=1;
    PrintDlg(&pd);
    hPrtdc=pd.hDC;
    if (hPrtdc == NULL) return;
//*/

    // 인쇄 작업을 시작한다.
    doc.cbSize=sizeof(DOCINFO);
    doc.lpszDocName="Test Document";
    doc.lpszOutput=NULL;
    doc.lpszDatatype=NULL;
    doc.fwType=0;
    Result=StartDoc(hPrtdc, &doc);
    if (Result <= 0) goto end;
    Result=StartPage(hPrtdc);
    if (Result <= 0) goto end;

    // 출력을 보낸다.
    xpage = GetDeviceCaps(hPrtdc, HORZRES);
    ypage = GetDeviceCaps(hPrtdc, VERTRES);
    Rectangle(hPrtdc,0,0,xpage,ypage);
    SetTextAlign(hPrtdc,TA_CENTER);
    TextOut(hPrtdc,xpage/2,ypage/2,"Test String 대한민국",20);

    // 출력을 종료한다.
    Result=EndPage(hPrtdc);
    if (Result <= 0) goto end;

    // 인쇄 작업을 끝낸다.
    Result=EndDoc(hPrtdc);
    if (Result <= 0) goto end;

end:
    if (pd.hDevMode)
        GlobalFree(pd.hDevMode);
    if (pd.hDevNames)
        GlobalFree(pd.hDevNames);
    DeleteDC(hPrtdc);
    return;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    char Mes[]="마우스 왼쪽 버튼을 누르면 인쇄를 시작합니다";
    switch(iMessage) {
    case WM_LBUTTONDOWN:
        Print();
        return 0;
    case WM_PAINT:
        hdc=BeginPaint(hWnd,&ps);
        TextOut(hdc,100,100,Mes,strlen(Mes));
        EndPaint(hWnd,&ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

'Windows > Windows API' 카테고리의 다른 글

프로그램 실행 (CreateProcess)  (0) 2013.10.01
그림 인쇄(print)  (0) 2013.10.01
MDI  (0) 2013.10.01
클립보드 텍스트 복사 (Clipboard)  (0) 2013.10.01
클립보드 에디트 복사 (Clipboard)  (0) 2013.10.01