본문 바로가기
코스웨어/12년 내장형하드웨어

2012. 07.17 일자 API 수업 정리자료 입니다. (과제 포함)

by 알 수 없는 사용자 2012. 7. 18.
728x90
반응형



★ Check



 

Ex) Check 

WndClass.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage, WPARAM wParam,

             LPARAM lParam)

{

    HDC hdc;

    PAINTSTRUCT ps;

    static HWND c1, c2, c3,c4;

    static BOOL bEllipse = FALSE;

    switch(iMessage)

    {

        case WM_CREATE :

            c1 = CreateWindow(TEXT("button"),TEXT("Draw Ellipes?"),

                WS_CHILD|WS_VISIBLE|BS_CHECKBOX,20,20,160,25,hWnd,

                (HMENU)0,g_hInst,NULL);

            

            c2 = CreateWindow(TEXT("button"),TEXT("Good bey Message?"),

            WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,20,50,160,25,hWnd,

                (HMENU)1,g_hInst,NULL);

            

            c3 = CreateWindow(TEXT("button"),TEXT("3State"),

                WS_CHILD|WS_VISIBLE|BS_3STATE,20,80,160,25,hWnd,

                (HMENU)2,g_hInst,NULL);

            

            c4 = CreateWindow(TEXT("button"),TEXT("Draw Ellipes?"),

            WS_CHILD|WS_VISIBLE|BS_AUTO3STATE,20,110,160,25,hWnd,

                (HMENU)3,g_hInst,NULL);

            return 0;

        case WM_COMMAND :

            switch(LOWORD(wParam))

            {

             case 0 :

                if(SendMessage(c1,BM_GETCHECK,0,0)==BST_UNCHECKED)

                {

                    SendMessage(c1,BM_SETCHECK,BST_CHECKED,0);

                    bEllipse = TRUE;

                }

                else

                    SendMessage(c1,BM_SETCHECK,BST_UNCHECKED,0);

                    bEllipse = FALSE;

                }

                InvalidateRect(hWnd,NULL,TRUE);

                break;

             case 2 :

                if(SendMessage(c3,BM_GETCHECK,0,0)==BST_UNCHECKED)

                {

                         SendMessage(c3,BM_SETCHECK,BST_CHECKED,0);

                }

                else

                {

                 if(SendMessage(c3,BM_GETCHECK,0,0)==BST_INDETERMINATE)

                 {

                             SendMessage(c3,BM_SETCHECK,BST_UNCHECKED,0);

                 }

                 else

                 {   

                            SendMessage(c3,BM_SETCHECK,BST_INDETERMINATE,0);

                 }

                 }

                 break;

            }

            return 0;

                    

        case WM_PAINT :

            hdc = BeginPaint(hWnd, &ps);

            if(bEllipse == TRUE)

            {

                Ellipse(hdc,200,100,400,200);

            }

            else

            {

                Rectangle(hdc,200,100,400,200);

            }

            EndPaint(hWnd, &ps);

            return 0;

        case WM_DESTROY :

            if(SendMessage(c2,BM_GETCHECK,0,0)==BST_CHECKED)

            {

                MessageBox(hWnd,TEXT("Good bey"),TEXT("Check"),MB_OK);

            }

            PostQuitMessage(0);

            return 0;

    }

    return (DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

 

 



[ 위 예제에 사용된 Check Box ]


Check Box 

컨트롤 ID

윈도우 핸들

수동 Check Box

0 

c1

자동 Check Box

1 

c2 

3상태수동

2 

c3

3상태자동

3 

c4

 

 

 

 

 


< 실행 결과 >


 





 

 

 



체크 박스가 눌러지는 즉시 이 체크 박스는 부모 윈도우로

   BN_CLICKED 통지 메시지를 보낸다.

 

 



[ Good bey Message? 에 체크후 종료하였을 때 ]


 

 

 

 

 

 



 

 

★ 컨트롤의 메시지

 

 

컨트롤은 자신에게 어떤 변화가 있을 때마다 부모 윈도우로 메시지를

   보내며 이 메시지를 통지 메시지라고 부른다.

 


부모 윈도우가 체크 박스의 현재 상태를 알아보거나 상태를 바꾸고자

  할 때도 차일드 윈도우로 메시지를 보낸다.

 


통지 메시지는 차일드가 부모로 보내는 보고 메시지이고 그냥 메시지는

   부모가 차일드에게 어떤 지시를 내리기 위해 보내는 명령이다.

 

 




[ 부모 윈도우가 체크 박스로 보낼 수 있는 메시지 ]


메시지

설명

BM_GETCHECK

체크 박스가 현재 체크되어 있는 상태인지를 조사하며

wParam, lParam은 사용하지 않는다.

체크 상태는 리턴값으로 돌려진다.

BM_SETCHECK

체크 박스의 체크 상태를 변경하며 wParam에

변경할 체크 상태를 지정한다.

 

 



 

[ BM_SETCHECK 에 의해 설정되는 체크 박스의 상태 ]


상수

의미

BST_UNCHECKED 

현재 체크되어 있지 않다.

BST_CHECKED 

현재 체크되어 있다.

BST_INDETERMINATE 

체크도 아니고 안 체크도 아닌 상태

 

 

 

 





 라디오 버튼

 

라디오 번튼도 일종의 버튼이다. "button"클래스에

   BS_RADIOBUTTON, BS_AUTORADIOBUTTON 중 하나의

  스타일을 지정하면 라디오 버튼이 된다.

 


체크 버튼은 진위적인 옵션을 개별적으로 입력받는데 비해

   라디오 버튼은 여러가지 선택 사항 중 한 가지만 선택할

   필요가 있을 때 사용한다.

 


그룹을 이루는 첫 번째 라디오 버튼에만 WS_GROUP스타일을 주고

   나머지 라디오 버튼은 WS_GROUP스타일을 주지 않으면 된다.

 




Ex) Radio 

enum {ID_R1=101,ID_R2,ID_R3,ID_R4,ID_R5,ID_R6};

HWND r1,r2,r3,r4,r5,r6;

int Graph = 0;

COLORREF Color=RGB(0,0,0);

 

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage, WPARAM wParam,

             LPARAM lParam)

{

    HDC hdc;

    PAINTSTRUCT ps;

    HBRUSH MyBrush, OldBrush;

    

 

    switch(iMessage)

    {

        case WM_CREATE :

            CreateWindow(TEXT("button"),TEXT("Graph"),WS_CHILD|

                WS_VISIBLE|BS_GROUPBOX,5,5,120,110,hWnd,

                (HMENU)0,g_hInst,NULL);

            CreateWindow(TEXT("button"),TEXT("Color"),WS_CHILD|

                WS_VISIBLE|BS_GROUPBOX,145,5,120,110,hWnd,

                (HMENU)1,g_hInst,NULL);

            r1=CreateWindow(TEXT("button"),TEXT("Rectangle"),WS_CHILD|

                WS_VISIBLE|BS_AUTORADIOBUTTON,10,20,100,30,hWnd,

                (HMENU)ID_R1,g_hInst,NULL);

            r2=CreateWindow(TEXT("button"),TEXT("Ellipse"),WS_CHILD|

                WS_VISIBLE|BS_AUTORADIOBUTTON,10,50,100,30,hWnd,

                (HMENU)ID_R2,g_hInst,NULL);

            r3=CreateWindow(TEXT("button"),TEXT("Line"),WS_CHILD|

                WS_VISIBLE|BS_AUTORADIOBUTTON,10,80,100,30,hWnd,

                (HMENU)ID_R3,g_hInst,NULL);

            r4=CreateWindow(TEXT("button"),TEXT("Black"),WS_CHILD|

            WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,150,20,100,30,

                hWnd,(HMENU)ID_R4,g_hInst,NULL);

            r5=CreateWindow(TEXT("button"),TEXT("Red"),WS_CHILD|

                WS_VISIBLE|BS_AUTORADIOBUTTON,150,50,100,30,hWnd,

                (HMENU)ID_R5,g_hInst,NULL);

            r6=CreateWindow(TEXT("button"),TEXT("Blue"),WS_CHILD|

                WS_VISIBLE|BS_AUTORADIOBUTTON,150,80,100,30,hWnd,

                (HMENU)ID_R6,g_hInst,NULL);

            CheckRadioButton(hWnd,ID_R1,ID_R3,ID_R1);

            CheckRadioButton(hWnd,ID_R4,ID_R6,ID_R4);

            break;

        case WM_COMMAND :

            switch(LOWORD(wParam))

            {

                case ID_R1 :

                    Graph = 0;

                    break;

                case ID_R2 :

                    Graph = 1;

                    break;

                case ID_R3 :

                    Graph = 2;

                    break;

                case ID_R4 :

                    Color = RGB(0,0,0);

                    break;

                case ID_R5 :

                    Color = RGB(255,0,0);

                    break;

                case ID_R6 :

                    Color = RGB(0,0,255);

                    break;

            }

            InvalidateRect(hWnd,NULL,TRUE);

            return 0;

        case WM_PAINT :

            hdc = BeginPaint(hWnd, &ps);

            MyBrush = CreateSolidBrush(Color);

            OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);

            switch(Graph)

            {

                case 0 :

                    Rectangle(hdc,10,200,200,300);

                    break;

                case 1 :

                    Ellipse(hdc,10,200,200,300);

                    break;

                case 2 :

                    MoveToEx(hdc,10,200,NULL);

                    LineTo(hdc,200,300);

                    break;

            }

            SelectObject(hdc,OldBrush);

            DeleteObject(MyBrush);

            EndPaint(hWnd, &ps);

            return 0;

        case WM_DESTROY :

            PostQuitMessage(0);

            return 0;

    }

    return (DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

 




 

< 실행 결과 >


 




 





 

 

 

 



 

    BOOL CheckRadioButton(HWND hDlg, int nlDFirst, int nlDLast, int nlDCheck);


 

첫 번째 인수는 라디오 버튼을 가지는 부모 윈도우 의 핸들이다.


 

두 번째와 세 번째인수는 각각 그룹의 시작 버튼과 끝 버튼이다.


 

네 번째 인수로 선택될 버튼의 ID를 준다.

 

 



 

 

과제) SimplePaint

 

마우스로 자유 곡선을 그리되 선의 색상은 라디오 버튼으로 선택하고,

굵기는 체크 박스로 선택하도록 하라.

다시 스리기 버튼을 제공하고 이 버튼을 누르면 화면을 모두 지우도록 한다.

아직 화면 복구는 하지 않아도 된다.

색상이 너무 많아 실습하기 번거롭다면 빨간색, 파란색, 노란색

정도의 색상만 사용해도 상관없다.

 



 

Ex) SimplePaint

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage, WPARAM wParam,

             LPARAM lParam)

{

    HDC hdc;

    static enum {ID_R1 =101,ID_R2,ID_R3,ID_R4,ID_R5,ID_R6,ID_R7,ID_R8};

    static HWND c1, c2, c3, c4, r1, r2, r3;

    static COLORREF Color = RGB(0,0,0);

    static int x;

    static int y;

    static    BOOL bNowDraw = FALSE;

    static int Pen_r=1;

    PAINTSTRUCT ps;

    HPEN MyPen, OldPen;

 

 

    switch(iMessage)

    {

        case WM_CREATE :

            CreateWindow(TEXT("button"),

TEXT("Pen Color"),WS_CHILD|WS_VISIBLE|

BS_GROUPBOX,5,5,120,150,hWnd,(HMENU)0,g_hInst,NULL);

            /*        선색상라디오버튼        */

            c1 = CreateWindow(TEXT("button"),

                TEXT("Balck"),WS_CHILD|WS_VISIBLE|

                BS_AUTORADIOBUTTON|WS_GROUP,10,20,100,30,

                hWnd,(HMENU)ID_R1,g_hInst,NULL);

            c2 = CreateWindow(TEXT("button"),TEXT("Red"),

                WS_CHILD|WS_VISIBLE|

                BS_AUTORADIOBUTTON,10,50,100,30,

                hWnd,(HMENU)ID_R2,g_hInst,NULL);

            c3 =CreateWindow(TEXT("button"),

                TEXT("Blue"),WS_CHILD|WS_VISIBLE|

                BS_AUTORADIOBUTTON,10,80,100,30,

                hWnd,(HMENU)ID_R3,g_hInst,NULL);

            c4 =CreateWindow(TEXT("button"),

                TEXT("Yellow"),WS_CHILD|WS_VISIBLE|

                BS_AUTORADIOBUTTON,10,110,100,30,

                hWnd,(HMENU)ID_R4,g_hInst,NULL);

            /*        선굵기체크버튼        */

            r1 = CreateWindow(TEXT("button"),

                TEXT("글자굵기1"),WS_CHILD|WS_VISIBLE|

                BS_AUTOCHECKBOX,150,20,100,30,

                hWnd,(HMENU)ID_R5,g_hInst,NULL);

            r2 = CreateWindow(TEXT("button"),

                TEXT("글자굵기5"),WS_CHILD|WS_VISIBLE|

                BS_AUTOCHECKBOX,150,50,100,30,

                hWnd,(HMENU)ID_R6,g_hInst,NULL);

            r3 = CreateWindow(TEXT("button"),

                TEXT("글자굵기10"),WS_CHILD|WS_VISIBLE|

                BS_AUTOCHECKBOX,150,80,110,30,

                hWnd,(HMENU)ID_R7,g_hInst,NULL);

            CreateWindow(TEXT("button"),

                TEXT("지우기"),WS_CHILD|WS_VISIBLE|

                BS_PUSHBUTTON,300,29,100,30,

                hWnd,(HMENU)ID_R8,g_hInst,NULL);

            CheckRadioButton(hWnd,ID_R1,ID_R4,ID_R1);

            break;

 

 

        case WM_COMMAND :

            switch(LOWORD(wParam))

            {

                case ID_R1 :

                    Color = RGB(0,0,0);

                    break;

                case ID_R2 :

                    Color = RGB(255,0,0);

                    break;

                case ID_R3 :

                    Color = RGB(0,0,255);

                    break;

                case ID_R4 :

                    Color = RGB(255,255,0);

                    break;

                

                case ID_R5 :

                    if(SendMessage(r1, BM_GETCHECK,0,0)==BST_UNCHECKED)

                    {

                        Pen_r = 1;

                    }

                    else

                    {

                        SendMessage(r2,BM_SETCHECK, BST_UNCHECKED,0);

                        SendMessage(r3,BM_SETCHECK, BST_UNCHECKED,0);

                        Pen_r = 1;

                    }

                    break;

 

                case ID_R6 :

                    if(SendMessage(r2, BM_GETCHECK,0,0)==BST_UNCHECKED)

                    {        

                        Pen_r = 1;

                    }

                    else

                    {

                        SendMessage(r1,BM_SETCHECK,BST_UNCHECKED,0);

                        SendMessage(r3,BM_SETCHECK,BST_UNCHECKED,0);

                        Pen_r = 5;

                    }

                    break;

 

                case ID_R7 :

                    if(SendMessage(r3, BM_GETCHECK,0,0)==BST_UNCHECKED)

                    {

                        Pen_r = 1;

                    }

                    else

                    {

                        SendMessage(r1,BM_SETCHECK,BST_UNCHECKED,0);

                        SendMessage(r2,BM_SETCHECK,BST_UNCHECKED,0);

                        Pen_r = 10;

                    }

                    break;

                case ID_R8 :

                    InvalidateRect(hWnd,NULL,TRUE);

            }

            return 0;

 

        case WM_PAINT :

            hdc = BeginPaint(hWnd, &ps);

            EndPaint(hWnd, &ps);

            return 0;

 

        case WM_LBUTTONDOWN :

            x = LOWORD(lParam);

            y = HIWORD(lParam);

            bNowDraw = TRUE;

            return 0;

 

        case WM_MOUSEMOVE :

            if(bNowDraw == TRUE)

            {

                hdc = GetDC(hWnd);

                MyPen = CreatePen(PS_SOLID, Pen_r, Color);

                OldPen = (HPEN)SelectObject(hdc, MyPen);

                MoveToEx(hdc,x,y,NULL);

                x = LOWORD(lParam);

                y = HIWORD(lParam);

                LineTo(hdc,x,y);

                ReleaseDC(hWnd,hdc);

                SelectObject(hdc,OldPen);

                DeleteObject(MyPen);

            }

            return 0;

        case WM_LBUTTONUP :

            bNowDraw = FALSE;

            return 0;

        

        case WM_DESTROY :

            PostQuitMessage(0);

            return 0;

    }

    return (DefWindowProc(hWnd,iMessage,wParam,lParam));

}

 

 

 

< 실행 결과 >

 

 

 




그림 실력이 개판이라 죄송합니다. (  ' ' )(   . . ).. 꾸벅


질문은 댓글로 남기는걸로 ..


오늘도 좋은 하루 되세요 


728x90

'코스웨어 > 12년 내장형하드웨어' 카테고리의 다른 글

보수  (0) 2012.07.18
ARM보드 프로그램 설치/파일넣기  (0) 2012.07.18
포인터의 개념  (0) 2012.07.18
ARM  (0) 2012.07.18
문자열 함수 정리  (0) 2012.07.18
소스 인사이트 단축키 및 한글입력팁  (1) 2012.07.18
LCD와 타이밍도  (0) 2012.07.18
프로그램의 실행과 오류 정리  (0) 2012.07.18