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_3STATE | 3가지 상태를 가지는 체크 박스 |
BS_AUTOCEHCKBOX | 자동 체크 박스 |
BS_AUTO3STATE | 3가지 상태를 가지는 자동 체크 박스 |
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
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151119 윤재희 #6. 게임 작성(맵핑, 박스 밀기) (6) | 2015.11.19 |
---|---|
20151119 22번 업무일지 우대희 API (6) | 2015.11.19 |
20151119-김재홍-win32API_6일차-푸시푸시게임 (4) | 2015.11.19 |
김태현 WinAPI 5일차 (4) | 2015.11.19 |
20151118_안향진_API_5 (5) | 2015.11.19 |
20151118 - 홍준모 게임만들기 ( 5일차) (4) | 2015.11.18 |
20151118 수업 / API_5 남수진 (6) | 2015.11.18 |
20151118_박서연_일일업무보고서_WinAPI(5) (3) | 2015.11.18 |