ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어 공부 되새김 Win32Api구현해보기 7편 반복문 for - DrawText
    C언어 공부 되새김 Win32api로 구현해보기 2019. 10. 21. 21:48

    컴퓨터 프로그래밍 C언어 공부를 콘솔로 공부하고 윈도우 프로그래밍으로 구현하는데 

    콘솔로 공부하던 소스를 윈도우 프로그래밍 기본코드를 제외하고 함수형식으로 콘솔 소스와

    비슷하게 구현해보려고 합니다.

    콘솔은 쉽고 윈도우는 어렵다가 아니고 윈도우 프로그래밍을 시작부터 접하면서 친숙해졌으면 합니다.

    구현은 무료 통합개발 환경인 Dev-C++ 4.9.9.2로 구현합니다.

    지난편에는 console 프로그래밍의 기초 반복문인 for문을 TextOut 출력을 통해구현하였습니다.

    이번편에는 DrawText를 통해서 구현하겠습니다.

    Win32Api 프로그래밍 DrawText

    #include 

    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

    /*  Make the class name into a global variable  */
    char szClassName[ ] = "myadmonWindowsApp";

    void Study_Main(HDC hdc);

    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)

    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */

        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);

        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;

        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "myadmon Windows App",       /* Title Text */
    //           WS_OVERLAPPEDWINDOW, /* default window */
               WS_CAPTION | WS_SYSMENU,
    //           WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               640,                 /* The programs width */
               480,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );

        /* Make the window visible on the screen */
        ShowWindow (hwnd, nFunsterStil);

        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }

        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }


    /*  This function is called by the Windows function DispatchMessage()  */

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HDC hdc;
        PAINTSTRUCT ps;
        
        switch (message)                  /* handle the messages */
        {

            case WM_PAINT:
                hdc=BeginPaint(hwnd,&ps);

                Study_Main(hdc); //함수 호출 

                EndPaint(hwnd,&ps);
        break;

            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }

        return 0;
    }

    void Study_Main(HDC hdc){

        char str[80*23];  //출력 전체 영역을 만든다.
        char strline[80];  //한줄 출력 영역을 만든다.
        int i;
        int Dan=7; 

        for(i=1;i<10;i++){
            wsprintf(strline,TEXT("%d * %d = %d\n"), Dan, i, Dan*i);
            strcat(str,strline); //전체 출력 영역에 한줄씩 더해준다. 
        }
        
        // 화면의 (0, 0) 위치부터 (640, 480) 위치까지 사각형 영역을 만든다.
        RECT rt = {0, 0, 640, 480}; 
        DrawText(hdc, str, -1, &rt, DT_LEFT | DT_WORDBREAK);  //왼쪽 정렬하여 출력한다.

    }

    DrawText명령어에서 DT_LEFT 대신 DT_CENTER, DT_RIGHT를 입력하면 다양한 출력이 됩니다.

    DT_CENTER
    DT_RIGHT (앗 출력 이탈되었네요)

    끝부분 딱맞추기는 숙제입니다.
    출력영역을 조정하면 됩니다.~~~


    오늘은 여기까지입니다.

    그럼 이만...

Designed by Tistory.