본문 바로가기
코스웨어/15년 스마트컨트롤러

2015.11.18_개인업무일지_[WIN32API #5]_이량경

by 알 수 없는 사용자 2015. 11. 19.
728x90
반응형
<Win32API>✔ 

================================================================


6-5-가. CreateFont

- 폰트를 만들기 위해서는 CreateFont 함수 사용
- 이 함수가 리턴해 주는 핸들을 HFONT형의 변수에 대입.

HFONT CreateFont 

( int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet, DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, LPCTSTR lpszFace ); 


fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, LPCTSTR lpszFace ); 

인수설명
nHeight폰트의 높이를 논리적인 단위로 지정한다. 이 값이 0일 경우는 디폴트 크기가 사용된다.
hWidth폰트의 폭을 지정하되 이 값이 0이면 nHeight에서 지정한 높이에 따라 폭을 자동으로 결정한다. 즉 이 값이 0이면 폰트의 종횡비(장평)가 일정하다.
nEscapement폰트의 각도를 0.1도 단위로 설정한다. 이 각도는 문자가 출력될 X출과 문자열과의 각도이며 일상적인 360분법의 각도 체계를 사용한다. 즉 세시 방향이 0도로 사용되며 반시계 방향으로 각도가 증가한다.
nOrientation글자 한자와 X축과의 각도를 지정한다. nEscapement는 전체 문자열의 기울기를 지정하는데 비해 이 인수는 개별 문자의 기울기를 설정한다.
nWeight폰트의 무게를 0~1000까지의 값으로 설정한다. 쉽게 말해서 폰트의 두께를 설정한다. 0~1000까지의 값을 지정할 수 있으며 보통 굵기인 FW_NORMAL이 400이다.
bItalic, bUnderline, cStrikeOut기울임체, 밑줄, 관통선 속성을 설정한다. 데이터형이 BYTE이지만 불린형처럼 사용한다. 속성을 주고 싶으면 0 이외의 값(TRUE)를 주고 속성을 주지 않으려면 0(FALSE)를 준다.
nCharSet문자 셋을 설정한다. 여러 가지 값이 있지만 실제 사용될 수 있는 옵션은 ANSI_CHARSET과 OEM_CHARSET가 있다. ANSI_CHARSET가 윈도우즈에서 사용하는 문자셋이고 OEM_CHARSET가 도스에서 사용하는 문자셋이라고 생각하면 된다.
nOutPrecision출력 정확도를 설정한다.
nClipPrecision클리핑 정확도를 설정한다.
nQuality논리적 폰트를 물리적 폰트에 얼마나 근접시킬 것인가를 지정한다.
nPitchAndFamily폰트의 피치와 그룹을 설정한다.
lpszFacename글꼴의 이름을 나타내는 문자열을 설정한다.

인수가 많기도 하지만 개별 인수의 의미도 무척 복잡하다. 
* 하지만 이중 실질적으로 변경해 주어야할 필요가 있는 인수는 
- 문자의 크기를 지정하는 nHeight
- 글꼴 모양을 지정하는 lpszFacename 
- 나머지 인수는 디폴트를 사용하면 일단은 큰 무리 없이 사용할 수 있다.


6-5-나. Font.dsw

-------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd , UINT iMessage , WPARAM wParam , LPARAM lParam )
{
        HDC hdc;
        PAINTSTRUCT ps;
        WCHAR str[256];
        static HFONT font;
        static HFONT oldfont;
        WCHAR str2[] = L "폰트 TEST 1234";

        switch ( iMessage)
       {
        case WM_PAINT:
              hdc = BeginPaint( hWnd, &ps);
              font = CreateFont(50, 0, 0, 0, 0, 0, 0, 0, HANGEUL_CHARSET , 255, 0, 0, 0, "궁서" );
              oldfont = ( HFONT)SelectObject(hdc, font);
               LoadString(g_hInst, IDS_STRING1, str, 256);
               TextOut(hdc, 10, 10, str, lstrlen(str));
               TextOut(hdc, 100, 100, str2, lstrlen(str2));
              SelectObject(hdc, oldfont);
              DeleteObject(font);
              EndPaint( hWnd, &ps);
               return 0;

        case WM_DESTROY:
              PostQuitMessage(0);
               return 0;
       }
        return ( DefWindowProc(hWnd , iMessage , wParam , lParam ));

}


-------------------------------------------------------------


* 인수의 개수가 좀 많을뿐 펜이나 브러시와 별반 다를 바가 없다. 
- CreateFont 함수로 폰트의 모든 성질을 다 전달해 주는 방법외에 LOGFONT 구조체를 사용하여 폰트를 정의하고,
- CreateFontIndirect 함수로 폰트를 만드는 방법도 있다.

**************************************

typedef struct tagLOGFONT {   //lf
LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; } LOGFONT;

**************************************

- LOGFONT 구조체는 CreateFont 함수의 인수 전체를 멤버 변수로 가지는 구조체이며 
이 구조체에 원하는 값을 먼저 대입한 후 CreateFontIndirect 함수로 이 구조체의 번지를 넘겨주면 된다.
HFONT CreateFontIndirect( CONST LOGFONT *lplf);
- LOGFONT 구조체에서 폰트의 특성을 다 정의하므로 함수는 이 구조체의 포인터만 인수로 전달받는다. 

- 출력 결과는 물론 CreateFont 함수를 사용한 것과 동일하다. 
- CreateFont 함수의 인수에 폰트의 특징을 모두 열거해 주는 방법에 비해 
  -> LOGFONT 구조체를 사용하는 방법은 몇가지 장점을 가지고 있다. 
  -> 여러벌의 폰트 객체를 만들어야 할 때 LOGFONT의 멤버중 일부만을 변경하여 재사용할 수 있으며 
 -> LOGFONT 구조체 배열을 사용하면 사용할 폰트의 목록을 미리 작성해 놓을 수도 있다.

- Win32 API는 이 예에서와 같이 함수명 뒤에 Indirect가 붙은 함수들이 있는데 
- 이 함수들은 공통적으로 구조체의 포인터를 인수로 취한다는 특징을 가지고 있다. 
- CreatePenIndirect, CreateBrushIndirect 등의 함수들이 있다.
-------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd , UINT iMessage , WPARAM wParam , LPARAM lParam )
{
        HDC hdc;
        PAINTSTRUCT ps;
        static HFONT font;
        static HFONT oldfont;
        WCHAR str2[] = L "폰트 TEST 1234";
        LOGFONT lf;
        switch ( iMessage)
       {
        case WM_PAINT:
              hdc = BeginPaint( hWnd, &ps);
              lf.lfHeight = 50;
              lf.lfWidth = 0;
              lf.lfEscapement = 0;
              lf.lfOrientation = 0;
              lf.lfWeight = 0;
              lf.lfItalic = 0;
              lf.lfUnderline = 0;
              lf.lfStrikeOut = 0;
              lf.lfCharSet = HANGEUL_CHARSET;
              lf.lfOutPrecision = 0;
              lf.lfClipPrecision = 0;
              lf.lfQuality = 0;
              lf.lfPitchAndFamily = 0;
              lstrcpy(lf.lfFaceName, L"궁서" );
              font = CreateFontIndirect(&lf);
              oldfont = ( HFONT)SelectObject(hdc, font);
               TextOut(hdc, 100, 100, str2, lstrlen(str2));
              SelectObject(hdc, oldfont);
              DeleteObject(font);
              EndPaint( hWnd, &ps);
               return 0;
       
        case WM_DESTROY:
              PostQuitMessage(0);
               return 0;
       }
        return ( DefWindowProc(hWnd , iMessage , wParam , lParam ));

}



-------------------------------------------------------------

6-5-다. 문자열의 색상

- Text의 Color를 Set하는 함수이며 SetBkColor은 글자 뒤쪽의 배경색상을 지정하는 함수이다.
둘 다 COLORREF형의 인수를 취하므로 RGB 매크로 함수를 사용하여 원하는 색상을 설정하도록 한다. 

COLORREF SetTextColor( HDC hdc, COLORREF crColor );

COLORREF SetBkColor( HDC hdc, COLORREF crColor );
int SetBkMode( HDC hdc, int iBkMode ); 

- 두 함수의 반대 함수는 GetTextColor, GetBkColor이며 이 함수들은 현재 설정된 문자색과 배경색을 구해 준다. 
- 문자색으로 빨간색을 주고 배경색으로 초록색을 주면 초록색 바탕에 빨간색의 글자가 출력될 것이다. 
- 세번째 함수는 배경색상을 사용할 방법을 설정한다. 

- OPAQUE와 TRANSPARENT 두가지 옵션중 한가지를 선택할 수 있으며 디폴트는 OPAQUE이다.
인수설명
OPAQUE불투명한 배경을 사용한다. 그래서 배경 색상에 의해 뒷쪽의 그림이 지워진다. 이 모드가 디폴트이다.
TRANSPARENT투명한 배경색상을 사용한다. 그래서 문자를 출력한 후에도 배경이 바뀌지 않는다. 즉 문자 사이 사이의 여백에 있는 원래 배경이 지워지지 않는다.
-------------------------------------------------------------

LRESULT CALLBACK WndProc(HWND hWnd , UINT iMessage , WPARAM wParam , LPARAM lParam )
{
        HDC hdc;
        PAINTSTRUCT ps;
        static HFONT font;
        static HFONT oldfont;
        WCHAR str[] = L "폰트 TEST 1234";
        HBRUSH myBrush;
        HBRUSH oldBrush;
        switch ( iMessage)
       {
        case WM_PAINT:
              hdc = BeginPaint( hWnd, &ps);
              myBrush = CreateHatchBrush( HS_CROSS, RGB(0, 0, 255));
              oldBrush = ( HBRUSH)SelectObject(hdc, myBrush);
              Rectangle(hdc,50, 50, 400, 200);
              SelectObject(hdc, oldBrush);
              
              font = CreateFont(30, 0, 0, 0, 0, 0, 0, 0, HANGEUL_CHARSET , 255, 0, 0, 0, L"궁서" );
              oldfont = ( HFONT)SelectObject(hdc, font);
              SetTextColor(hdc, RGB(255, 0, 0));
              SetBkColor(hdc, RGB(255, 255, 0));
               TextOut(hdc, 100, 100, str, lstrlen(str));
              SetBkMode(hdc, TRANSPARENT);
               TextOut(hdc, 100, 150, str, lstrlen(str));

              SelectObject(hdc, oldfont);
              DeleteObject(myBrush);
              DeleteObject(font);
              EndPaint( hWnd, &ps);
               return 0;

        case WM_DESTROY:
              PostQuitMessage(0);
               return 0;
       }
        return ( DefWindowProc(hWnd , iMessage , wParam , lParam ));
}

- 불투명한 배경 모드를 사용한 경우는 배경의 바둑판 모양이 지워지지만 
- 투명한 배경 모드를 사용하면 글자 사이 사이로 바둑판 모양이 그대로 남아 있는다. 

- 비트맵이나 그림 위에 문자열을 출력한다면 투명 모드를 사용해야 할 것이다.


-------------------------------------------------------------

6-5-라. 글자 회전시키기

- CreateFont의 세번째 인수인 nEscapement를 변경시키면 문자열의 각도를 바꾸어 가며 회전시킬 수 있다.
-------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd , UINT iMessage , WPARAM wParam , LPARAM lParam )
{
        HDC hdc;
        PAINTSTRUCT ps;
        int i;
        static HFONT font;
        static HFONT oldfont;
        WCHAR str[] = L "               Beautiful Korea" ;
        HFONT myFont;
        HFONT oldFont;

        switch ( iMessage)
       {
        case WM_PAINT:
              hdc = BeginPaint( hWnd, &ps);
               for (i = 0; i < 900; i = i + 100)
              {
                     myFont = CreateFont(50, 0, i, 0, FW_NORMAL , FALSE , FALSE , FALSE,
                            ANSI_CHARSET, OUT_DEFAULT_PRECIS , CLIP_DEFAULT_PRECIS ,
                            DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS ,
                           L "Times New Poman");
                     oldFont = ( HFONT)SelectObject(hdc, myFont);
                      TextOut(hdc, 0, 450, str, lstrlen(str));
                     SelectObject(hdc, oldFont);
                     DeleteObject(myFont);
              }
              EndPaint( hWnd, &ps);
               return 0;

        case WM_DESTROY:
              PostQuitMessage(0);
               return 0;
       }
       return ( DefWindowProc(hWnd , iMessage , wParam , lParam ));
}



-------------------------------------------------------------

7-1-가. 컨트롤의 정의

* 컨트롤(Control)이란 
- 사용자와의 인터페이스를 이루는 도구이다. 
- 인터페이스를 이룬다는 말은 사용자로부터 명령을 받아들이고 출력 결과를 보여준다는 뜻이다. 
- 프로그램은 실행중에 끊임없이 사용자와 통신을 하는데 컨트롤을 통해 명령과 정보를 받아들이고 또한 컨트롤을 통해 실행 결과를 사용자에게 보고한다. 
- 컨트롤의 가장 대표적인 예로 푸시 버튼과 에디트 컨트롤을 들 수 있다. 
- 다음은 워드 6.0의 파일 열기 대화상자인데 얼마나 많은 종류의 컨트롤이 사용되는가 보아라.

- 사용자는 이 대화상자의 컨트롤들을 통해 프로그램과 정보를 주고 받고 명령을 내린다. 
-에디트에 파일 이름을 입력하며 리스트 박스에서 디렉토리를 선택하고 푸시 버튼을 눌러 명령을 내린다.
- 만약 컨트롤이 없다면 사용자에게 현재 설정된 옵션을 보여줄 방법도, 옵션을 바꾸도록 하지도 못할 것이다. 
- 컨트롤의 의미를 한마디로 설명하기는 힘들지만 "버튼, 에디트, 리스트, 스크롤 바 등을 뭉떵거려 컨트롤이라고 한다"라고 이해하는 것이 더 빠를 것이다.

- 컨트롤도 하나의 윈도우이다. 화면상의 일정한 영역을 차지하며 자신의 고유 메시지를 처리할 수 있는 능력을 가지고 있다. 
- 그렇다고 해서 진짜 윈도우처럼 타이틀 바나 경계선을 가지고 독립적으로 사용되는 것은 아니며 보통 대화상자의 차일드 윈도우로 존재한다.

* 윈도우 클래스를 따로 만들 필요없이 CreateWindow 함수의 첫번째 인수로 미리 정의된 윈도우 클래스를 주면 해당 컨트롤을 만들 수 있다. 

윈도우 클래스컨트롤
button버튼, 체크, 라디오
static텍스트
scrollbar스크롤 바
edit에디트
listbox리스트 박스
combobox콤보 박스

7-1-나. Button

LPSTR lpszClass="MyButton";

*** 이 책에서는 lpszClass 문자열을 프로젝트명으로 정의하여 사용하고 있지만 
이 프로젝트의 경우 Button이라는 클래스명은 윈도우즈가 미리 사용하고 있기 때문에 사용할 수 없다. 
그래서 윈도우 클래스를 MyButton이라는 이름으로 만들었다.

-------------------------------------------------------------

LRESULT CALLBACK WndProc(HWND hWnd , UINT iMessage , WPARAM wParam , LPARAM lParam )
{
        switch ( iMessage)
       {
        case WM_CREATE:
               CreateWindow(TEXT ("button" ), TEXT ("Click Me" ), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                     20, 20, 100, 25, hWnd, ( HMENU)0, g_hInst, NULL);
               CreateWindow(TEXT ("button" ), TEXT ("Me Two" ), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
                     20, 50, 100, 25, hWnd, ( HMENU)1, g_hInst, NULL);
               return 0;
        case WM_COMMAND:
               switch ( LOWORD( wParam))
              {
               case 0:
                      MessageBox(hWnd , TEXT ("First Button Clicked" ), TEXT("Button" ), MB_OK );
                      break;
               case 1:
                      MessageBox(hWnd , TEXT ("Second Button Clicked" ), TEXT("Button" ), MB_OK );
                      break;
              }
               return 0;
       
        case WM_DESTROY:
              PostQuitMessage(0);
               return 0;
       }
        return ( DefWindowProc(hWnd , iMessage , wParam , lParam ));

}


-------------------------------------------------------------

7-3-다. 버튼 만들기

- 컨트롤은 윈도우이기는 하지만 홀로 사용될 수 없으며 반드시 부모 윈도우의 차일드로 존재해야 한다. 
- 컨트를은 보통 메인 윈도우가 만들어질 때 즉, WM_CREATE 메시지가 발생했을 때 만들어 준다.
- 컨트롤도 하나의 윈도우이므로 CreateWindow 함수를 호출하여 만들었다.

CreateWindow("button","Click Me",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20,20,100,25,hWnd,(HMENU)0,g_hInst,NULL); 

✔ "button"

- CreateWindow 함수의 
- 첫번째 인수는 만들고자 하는 윈도우의 윈도우 클래스이다. 
- 컨트롤은 윈도우즈에 의해 미리 윈도우 클래스가 정의되어 있으므로 별도의 윈도우 클래스를 정의할 필요없이 인수에 만들고자 하는 컨트롤의 윈도우 클래스명을 적어주면 된다. "button" 윈도우 클래스를 지정했으므로 버튼이 만들어질 것이다.

✔ "Click Me"

- 두번째 인수는 윈도우의 타이틀 바에 나타날 윈도우의 제목이되 컨트롤에 따라 캡션이 나타날 위치가 달라진다.
- 보통 윈도우라면 타이틀 바에 캡션이 나타나지만 버튼은 버튼위에 캡션이 나타나며 체크, 라디오 버튼은 그 왼쪽에 캡션이 나타난다. 
- 리스트 박스나 스크롤 바처럼 캡션이 필요없는 컨트롤은 NULL을 지정하면 된다.

✔ 스타일

- 세번째 인수윈도우의 속성값이다. 
- 컨트롤의 경우 예외없이 차일드 윈도우이므로 WS_CHILD 스타일은 반드시 주어야 한다. 
- 또한 WS_VISIBLE 스타일을 주어야 ShowWindow 함수를 호출하지 않아도 컨트롤이 화면에 나타나게 되므로 컨트롤의 경우 이 두 스타일값은 거의 예외없이 지정해 주어야 한다. 
- 그 외 컨트롤에 따른 스타일값을 추가로 지정해 주는데 버튼의 경우는 다음과 같은 스타일값을 사용하여 버튼의 종류를 지정한다. 
- 버튼의 스타일 값은 BS_ 접두어로 시작된다.

스타일속성
BS_PUSHBUTTON푸시 버튼
BS_DEFPUSHBUTTON디폴트 푸시 버튼
BS_CHECKBOX체크 박스
BS_3STATE3가지 상태를 가지는 체크 박스
BS_AUTOCEHCKBOX자동 체크 박스
BS_AUTO3STATE3가지 상태를 가지는 자동 체크 박스
BS_RADIOBUTTON라디오 버튼
BS_GROUPBOX그룹 박스

✔ 위치

- 4번째부터 7번째 인수까지는 윈도우의 위치와 크기를 지정한다. 
- 컨트롤의 경우는 부모 윈도우의 작업 영역을 기준으로 한 좌표가 사용된다. 

- 이 예제의 경우 부모 윈도우의 작업 영역 좌상단에서 (20,20)에 버튼이 위치하며 폭은 100, 높이는 25픽셀이다.


✔ 부모 윈도우

- 8번째 인수컨트롤의 부모 윈도우를 지정하는데 컨트롤은 차일드이므로 반드시 부모 윈도우가 있어야 한다. 
- 예제에서는 메인 윈도우의 핸들인 hWnd를 적어줌으로써 부모 윈도우를 지정해 주었다. 
- 그래서 여기서 만들어진 버튼 컨트롤은 hWnd 윈도우의 작업 영역을 기준으로 한 좌표에 생성되며 
- 무슨 일이 생기면 hWnd에게 통지 메시지를 보내고 
- 또한 hWnd가 파괴될 때 같이 파괴된다.

✔ ID
CreateWindow의 9번째 인수윈도우에서 사용할 메뉴의 핸들이다.
- 단 차일드 컨트롤의 경우는 메뉴를 가지지 않으므로 이 인수를 컨트롤의 ID를 지정하는 용도로 사용한다. 
- 한 인수가 경우에 따라 다른 의미를 가지는 것이 다소 이상하게 보이겠으나 윈도우즈 API 함수에서는 이런 일들이 종종 있다.
- 컨트롤의 ID는 컨트롤간의 구분을 위해 사용하는 것이므로 한 부모 아래의 컨트롤끼리 중복되지 않는 ID를 가지기만 하면 된다. 
- 이 예제에서는 두 버튼에 각각 ID 0, ID 1을 주어 구분하고 있는데 (HMENU)형으로 캐스팅해 주어야 한다. 
- 간단한 예제라 0,1의 상수를 직접 사용했지만 사용되는 컨트롤이 많다면 #define으로 매크로 상수를 정의해 쓰는 것이 좋다.

- 9번째 인수는 이 윈도우를 만드는 인스턴스의 핸들이며 
- 10번째 인수MDI에서 사용하는 구조체인데 일단 무시하도록 하자. 

- CreateWindow 함수를 두번 호출하여 두 개의 버튼 컨트롤을 만들었다. 
- 컨트롤을 생성한 후에 CreateWindow 함수는 생성된 차일드 컨트롤의 윈도우 핸들을 리턴해 주는데 핸들이 필요할 경우 별도의 변수에 핸들값을 저장해 주면 된다.
- 이 예제는 버튼의 윈도우 핸들을 쓰지 않으므로 리턴값을 무시하였다.

7-1-라. 부모와의 통신

- 다음은 버튼이 눌러질 경우의 처리를 해 주어야 한다. 
- 컨트롤들은 자신에게 무슨 일이 일어났을 때
- 예를 들어 버튼을 클릭했다거나 에디트에 문자열을 입력했다거나 할 경우 부모 윈도우로 통지 메시지(Notification Message)를 보내준다. 
- 부모 윈도우는 차일드 컨트롤이 보내주는 통지 메시지를 받아 적절한 처리를 해 준다. 
- 버튼을 클릭할 경우 WM_COMMAND 메시지를 부모 윈도우에게 보내며 이때 전달되는 정보는 다음과 같다.

인수설명
HIWORD(wParam)통지코드
LOWORD(wParam)컨트롤의 ID
lParam메시지를 보낸 차일드 윈도우의 윈도우 핸들

- 컨트롤의 ID는 CreateWindow의 아홉번째 인수에서 지정한 정수값이며 어떤 컨트롤이 통지 메시지를 보냈는지를 알려준다. 
- 통지코드는 차일드 컨트롤이 왜 메시지를 보냈는가를 나타내는 값이다. 
- 버튼의 경우 통지코드는 항상 사용자가 자신을 클릭했다는 의미의 BN_CLICKED이므로 이 값은 특별히 검사해볼 필요가 없지만 
- 통지 코드가 여러 개인 컨트롤은 이 값을 검사해 보아야 한다. 
- 부모 윈도우는 WM_COMMAND에서 LOWORD(wParam)값을 조사하여 어떤 컨트롤이 눌러졌는지에 따라 적절한 처리를 한다.

- 이 예제의 경우는 두 버튼에 대해 각각 다른 메시지 박스만을 보여주었다.
- 이 코드의 의미를 말로 풀어보면 
  -> "첫번재 버튼이 클릭되었으면 First Button Clicked 메시지를 보여주고 
  -> 두번째 버튼이 클릭되었으면 Second Button Clicked 메시지를 보여준다"이다. 
- 다른 컨트롤의 경우도 통지 메시지를 처리하는 방법은 버튼의 경우와 동일하되 
- 컨트롤에 따라 전달될 수 있는 통지 메시지의 종류가 다르므로 각 통지 메시지에 대해서는 컨트롤별로 따로 공부를 해야 한다.

- WM_COMMAND 메시지는 컨트롤의 통지 메시지뿐만 아니라 메뉴 항목, 액셀러레이터 등의 명령을 처리하는 중요한 일을 한다. 
- 이름 그대로 버튼을 누르거나, 메뉴를 선택하거나 액셀러레이터를 누르는 등 사용자로부터의 명령이 될만한 것들을 모두 처리한다. 
- 이때 컨트롤의 ID, 메뉴 ID, 액셀러레이터 ID 등은 모두 LOWORD(wParam)으로 전달되므로
- 이 세가지 명령들끼리는 0~65535까지의 범위에서 상호 중복되지 않는 ID를 가져야 한다. 
- 또한 그중에서도 컨트롤의 통지 메시지는 통지 코드에 따라 처리를 달리해야 한다. 
- 그래서 WM_COMMAND 메시지의 일반적인 모양은 다음과 같다.

case WM_COMMAND:
        switch(LOWORD(wParam) {         // ID에 따른 분기
        case 메뉴1:처리1;break;
        case 메뉴2:처리2;break;
        case 액셀러레이터1:처리3;break;
        case 컨트롤1:
                switch(HIWORD(wParam)) {        // 통지 코드에 따른 분기
                case 통지코드1:처리1;break;
                case 통지코드2:처리2;break;
                ...........
                }
                break;
        }
return 0;


가. 체크 박스의 종류

- 푸쉬 버튼은 주로 사용자로부터 명령을 받아들이기 위해 사용하는데 비해 체크 박스는 참, 거짓의 진위적인 선택을 입력받을 때 주로 사용

- 우선 두가지 상태를 가지는 체크 박스(BS_CHECKBOX)두가지 상태를 가지는 체크 박스는 선택/비선택 둘 중 하나의 상태를 가지
- 세가지 상태를 가지는 체크 박스(BS_3STATE) 세가지 상태를 가지는 체크 박스는 선택/비선택 외에도 Grayed라는 제 3의 상태를 가짐.

7-2-나. Check


-------------------------------------------------------------
<게임만들기>✔ 

- MFC에서는 OnDestroy로 되어있다. OnCreate...등 On함수로 되어있다.

- MFC로 용량이  안커진다.
- On만 파일 다른데 만듦. 분할 컴파일
- C++할때도 메인 함수가 제일먼저 실행된다.
- MFC도 Winmain이 제일 먼저 실행되지만 중요도는 낮다. 틀만 공급해주고 메시지 맵이랑 On함수들만 계속 돌아간다.
- MFC구조원리 를 알면 이해가 된다.

예를 들면-> 계산기 짜보면 문제 해결능력이 된다.
- 설계 기법을 알아두면 문제해결능력에 도움이 된다,.

✔ 매핑기법

* 일일이 맵을 넣을수 없으므로 매핑기법을 쓴다.
# -> 한장의 그림으로 만드는기법 

#을 만나면 벽돌을 넣으면 된다.


UCHAR ucMap[YFRAME ][XFRAME +1] =
{
        "###############" ,
        "#     #########" ,
        "# ### #########" ,
        "# ###        ##" ,
        "#     ###### ##" ,
        "# ### ###### ##" ,
        "# ### ###### ##" ,
        "#     ###### ##" ,
        "#####        ##" ,
        "###############" ,

};

/****코드소스****/



728x90