C언어 공부 되새김 Win32api로 구현해보기

Win32Api구현해보기 19편 움직이는 커서

한걸음 한걸음... 지금 한걸음 2019. 11. 28. 22:14

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

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

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

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

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

지난 편에는 rand함수로 2자리 수를 컴퓨터가 임의로 발생시키고 발생시킨 숫자를 맞추는 프로그램을 구현하였습니다.

이번 편에는 sdfe키를 눌렀을경우 도형이 움직이는 프로그램을 구현하겠습니다.

▷ Console 프로그래밍

void main(int argc, char *argv[])
{
    int i,j;
    int Running = 1;
    char ch;
    int Location_X=1;
    int Location_Y=1;

    while(Running){

        ch=getch();
        
        system("CLS");

        switch(ch){
            case 'e':
                if(Location_Y>1){
                    Location_Y--;
                }
            break;
            case 'd':
                if(Location_Y<20){
                    Location_Y++;
                }
            break;
            case 's':
                if(Location_X>1){
                    Location_X--;
                }
            break;
            case 'f':
                if(Location_X<40){
                    Location_X++;
                }
            break;
            case 27: //ESC 키를 누르면 반복문 탈출 
                 Running=0;
            break;
            
            default:
            break;
        }
        
        for(i=0;i<Location_Y;i++){
            printf("\n");
        }
        for(i=0;i<Location_X;i++){
            printf(" ");
        }
        printf("■");
    }

   system("PAUSE");  

}


▷ windows 프로그래밍

#include <windows.h>

 

#include <time.h>

 

/*  Declare Windows procedure  */

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

 

/*  Make the class name into a global variable  */

char szClassName[ ] = "myadmonWindowsApp";

 

void Display_Main(HDC hdc);

 

int Location_X=1;

int Location_Y=1;

 

 

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_CREATE:

            break;

 

        case WM_PAINT:

            hdc=BeginPaint(hwnd,&ps);

            Display_Main(hdc); //화면 그리기

            EndPaint(hwnd,&ps);

                         break;

 

        case WM_CHAR:

            switch((TCHAR)wParam){

                case 27:

                    PostQuitMessage (0);

                break;

                case 'e':

                    if(Location_Y>1){

                        Location_Y--;

                    }

                break;

                case 'd':

                    if(Location_Y<20){

                        Location_Y++;

                    }

                break;

                case 's':

                    if(Location_X>1){

                        Location_X--;

                    }

                break;

                case 'f':

                    if(Location_X<40){

                        Location_X++;

                    }

                break;

            }

 

            InvalidateRect(hwnd,NULL,FALSE); //WM_PAINT 메시지 호출

           

            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 Display_Main(HDC hdc){

 

    char strline[80];

 

    wsprintf(strline,TEXT("■"));

    TextOut(hdc, Location_X*15,Location_Y*15,strline,lstrlen(strline));

   

}

edaf키를 입력시

e : 위 , d : 아래 , a : 왼쪽 , f : 오른쪽 으로 움직이는 도형 구현입니다.

오늘은 여기까지입니다.

그럼 이만...