유돌이

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2009. 1. 10. 13:38 C/C++/MFC

[항목 체크]

 메뉴핸들->CheckMenuItem(해당아이디, MF_CHECKED);

 

 

[항목 해지]

메뉴핸들->CheckMenuItem(해당아이디, MF_UNCHECKED);

 

 

[예제]

CMenu *hMenu = GetMenu();
   
 if(hMenu->GetMenuState(ID_EXPLAIN, MF_BYCOMMAND) != MF_CHECKED){ 
  hMenu->CheckMenuItem(ID_EXPLAIN, MF_CHECKED);
 }
 else{
  hMenu->CheckMenuItem(ID_EXPLAIN, MF_UNCHECKED);
 }


'C/C++/MFC' 카테고리의 다른 글

" call by value " 와 " call by reference " 의 차이점  (0) 2009.01.10
API 종료 방법  (0) 2009.01.10
API 컨트롤 숨기기, 나타내기  (0) 2009.01.05
CWnd 클래스  (0) 2009.01.05
포인터 사용법  (0) 2009.01.05
posted by 유돌이
2009. 1. 5. 22:31 C/C++/MFC

[숨기기]

GetDlgItem(숨길아아디)->ShowWindow(SW_HIDE);

 

 

[나타내기]

GetDlgItem(나타낼아이디)->ShowWindow(SW_SHOW);


'C/C++/MFC' 카테고리의 다른 글

API 종료 방법  (0) 2009.01.10
메뉴 항목 체크/ 해지 하기  (0) 2009.01.10
CWnd 클래스  (0) 2009.01.05
포인터 사용법  (0) 2009.01.05
MFC를 사용하여 웹 브라우저 만들기  (0) 2009.01.02
posted by 유돌이
2009. 1. 5. 22:29 C/C++/MFC

클래스

생성/소멸

l        CWnd

1.       설명 : CWnd 객체를 생성한다. Windows 윈도는 CreateEx나 Create 멤버 함수가 호출 될 때까지 생성되거나 부가되지 않는다.

l        DestroyWindow

1.       설명 : CWnd 객체에 부가되는 Windows 윈도를 파괴한다. DestroyWindow 멤버 함수는 그것의 활동을 제거하고 입력 초점을 제거하기 위해 윈도에 적절한 메시지를 전달한다. 또한 윈도의 메뉴를 파괴하고, 애플리케이션 큐를 지우며, 사용되는 타이머를 지우고, 클립보드 소유를 제거하며, 클립보드-뷰어의 체인이 CWnd의 뷰어 체인의 맨 위에 있다면 파괴한다. 그것은 CWnd 객체를 파괴하지 않는다. 

윈도가 어떠한 윈도의 부모이면, 이들의 자식 윈도들은 자동적으로 부모 윈도가 파괴될 때 파괴된다. DestroyWindow 멤버 함수는 또한 CDialog::Create 에 의해 생성된 모델이 없는 다이얼로그 박스를 파괴한다.

파괴된 CWnd가 자식 윈도이고 WS_EX_NOPARENTNOTIFY 스타일 세트를 갖지 않는다면,  WM_PARENTNOTIFY 메시지는 부모로 보내진다.

2.       구문 : virtual BOOL DestroyWindow();

3.       파라미터 : 없음.

4.       리턴값 : 윈도가 파괴되면 0 이외의 값이며, 그 외의 경우에는 0을 리턴한다.

초기화

l        Create

1.       설명 : Windows 자식 윈도를 생성하고 CWnd 객체에 그것을 부가한다. 두 단계로 자식 윈도를 생성할 수 있다. 우선 생성자를 호출한다. 그것은 CWnd 객체를 생성한다. 그리고 나서 Windows 자식 윈도를 생성하고 그것을 CWnd에 부가하는 Create를 호출한다. Create는 윈도의 클래스 이름과 윈도 이름을 초기화하며, 그것의 스타일, 부모, ID에 대한 값들을 등록한다.

2.       구문 : virtual BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWND* pParentWnd, UINT nID, CcreateContext* pContext=NULL );

3.       파라미터

lpszClassName Window 클래스에 명명하는 널-종결된 문자 스트링을 가르킨다. ( WNDCLASS 구조체 )  이 클래스 이름은 전역 AfxRegisterWndClass 함수 또는 이미 정의 된 컨트롤 클래스 이름 중 어느 것으로 등록할 수 있다. 만일 NULL이면, 디폴트 CWnd 속성을 이용한다.

lpszWindowName 윈도 이름을 포함하고 있는 널 종결 문자 스트링을 가리킨다. 이 윈도 이름은 캡션으로 표시된다. 

dwStyle 윈도를 생성할 때 사용되는 윈도 스타일. WS_POPUP 스타일을 사용할 수 없다. 팝업 윈도우를 생성하기 위하여 CWnd::CreateEx 함수를 사용한다.

rect pParentWnd의 클라이언트 좌표에서 윈도의 크기와 위치를 나타낸다.

pParentWnd 윈도의 부모 윈도를 나타내는 CWnd에 대한 포인터. 부모가 테스크탑 윈도이면 NULL이다.

nID- 자식 윈도의 ID.

 pContext 생성되는 윈도우의 컨텍스트를 기술하는 데 사용되는 CCreateContext 구조체에 대한 포인터.       

4.       리턴값 : 윈도가 생성되면 비제로, 그렇지 않으면 0.

[ 윈도우 스타일 ]

WS_BORDER

가는 선 테두리로 된 윈도를 하나 만든다.

WS_CAPTION

타이틀 바가 있는 윈도를 하나 만든다. WS_BORDER스타일을 포함한다.

WS_CHILD

자식윈도나 컨트롤을 만든다. 이 스타일을 사용하면 WS_POPUP은 사용할 수 없다.

WS_CHILDWINDOW

WS_CHILD 스타일과 같다.

WS_CLIPCHILDREN

그리기 작업이 일어날 때 컨트롤의 자식 윈도를 클리핑한다. 이 스타일은 부모 윈도를 만들 때 사용된다.

WS_CLIPSIBLINGS

그리기 작업이 일어날 때 자식 윈도와 같은 레벨의 윈도들을 클리핑한다. 스타일이 정해져 있지 않고 자식 윈도가 WM_PAINT 메시지를 받으면 동기가 윈도로 윈도가 겹쳐져 있어도 윈도우의 전체 영역이 갱신 영역에 추가된다.

WS_DISABLED

만들어 질 때부터 사용자 입력이 불가능한 상태의 윈도가 만들어 진다.

WS_DLGFRAME

대화상자에 사용되는 스타일의 테두리가 있는 윈도를 하나 만든다. 이 스타일로 만들어진 윈도는 타이틀 바를 가질 수 없다.

WS_GROUP

한 그룹의 처음 컨트롤임을 표시한다. 다음 WS_GROUP 스타일을 가진 컨트롤을 만나면 현재 그룹은 끝나고 다음 그룹이 사작된다. 보통 라디오 버튼이 그룹화되어 존재하며 한 그룹 내의 개개 항목들간은 화살표 키로 이동할 수 있다.

WS_HSCROLL

수평 스크롤 바가 있는 윈도를 만든다.

WS_ICONIC

WS_MINIMIZE와 같다.

WS_MAXIMIZE

처음부터 전체 화면으로 표시되는 윈도를 하나 만든다.

WS_MAXIMIZEBOX

전체 화면 표시 버튼이 있는 윈도를 만든다.

WS_MINIMIZE

처음부터 아이콘 표시된 윈도를 만든다.

WS_MINIMIZEBOX

아이콘 표시 버튼이 있는 윈도를 만든다.

WS_OVERLAPPED

타이틀 바와 테두리가 있는 윈도를 만든다.

WS_OVERLAPPEDWINDOW

WS_BORDER, WS_POPUP, WS_SYSMENU, WS_THICKFRAME, WS_MAXIMIZEBOX, WS_MINIMIZEBOX의 조합

WS_POPUP

팝업 윈도를 만든다. WS_CHILD는 이 스타일과 함께 쓰일 수 없다.

WS_POPUPWINDOW

WS_BORDER, WS_POPUP, WS_SYSMENU의 조합. 시스템 메뉴가 보이도록 WS_CAPTION이 지정되어야 한다.

WS_SIZEBOX

WS_THICKFRAME과 같다.

WS_SYSMENU

타이틀 바에 시스템 메뉴가 있는 윈도를 만든다.

WS_TABSTOP

탭 키 멈춤 컨트롤을 지정한다.

WS_THICKFRAME

크기 조절 경계선이 있는 윈도를 만든다.

WS_TILED

WS_OVERLAPPED와 같다.

WS_TILED_WINDOW

WS_OVERLAPPEDWINDOW와 같다.

WS_VISIBLE

처음부터 눈에 보이는 윈도를 만든다.

WS_VSCROLL

수직 스크롤 바가 있는 윈도를 만든다.

 

l        CalcWindowRect

1.       설명 : 계획된 클라이언트 사각형 크기에 바탕을 둔 윈도 사각형의 요구된 크기를 계산하기 위해 이 멤버 함수를 호출한다. 결과로 생성되는 윈도 사각형(lpClientRect에 포함된)은 그때 클라이언트 영역이 원하는 크기를 지닌 윈도를 생성하기 위해 Create 멤버 함수를 지나칠 수 있다. 윈도를 생성하기 전에 윈도의 크기를 조절하기 위하여 프레임워크로 호출한다. 클라이언트 사각형은 클라이언트 영역을 완전히 봉하는 가장 작은 크기의 사각형이다. 윈도 사각형은 윈도를 완전히 봉하는 가장 작은 크기의 사각형이다.

2.       구문 : virtual void CalcWindowRect( LPRECT lpClientRect, UINT nAdjustType = adjustBorder );

3.       파라미터

lpClientRect 윈도 사각형의 결과 값을 포함하는 RECT 구조체나 Crect 객체에 대한 포인트들을 나타낸다. 함수의 처리가 완료되면, 이 사각형에는 그 결과 윈도 사각형의 좌표로 채워진다.

nAdjustType 사각형 좌표 계산에 스크롤바를 제외하려면 adjustBorder=0, adjustOutside=1은 사각형의 마지막 측정에 더해짐을 의미한다.

             4.  리턴값 : 아무 것도 리턴하지 않는다. 

l        GetStyle

1.       설명 : 윈도의 스타일 플래그를 리턴한다. GetStyle은 GWL_STYLE 플래그로 SDK함수 ::GetWindowLong를 호출한다.

2.       구문 : DWORD GetStyle() const;

3.       파라미터 : 없음.

l        GetExStyle

1.        설명 : 윈도의 확장 스타일 플래그를 얻는다. 이 함수는 단순히 GWL_EXSTYLE 플래그로 SDK함수 ::GetWindowLong를 호출한다.

2.        구문 : DWORD GetExStyle() const;

3.        파라미터 : 없음.

4.        리턴값 : 아무 것도 리턴하지 않는다.

l        Attach

1.       설명 : CWnd 오브젝트에 윈도(HWND)를 붙인다. 윈도가 CWnd 오브젝트에 붙어 있으면, CWnd 멤버 함수는 그 윈도를 조작하는데 사용된다. MFC 밖에서(CWnd::Create나 CWnd::CreateEx함수가 아닌) 생성된 윈도를 조작하려면 이 함수를 사용하라. 이것은 시스템 자체나 서드 파티 소프트웨어 라이브러리에서 생성된 윈도이다. CWnd 오브젝트에 윈도를 붙이는 것은 윈도에 전달된 메시지를 자동적으로 받을 수 없게 한다. 메시지를 받는 자세한 내용은 CWnd::SubclassWindow 함수를 참고하라.

2.       구문 : public BOOL Attach(HWND hWndNew);

3.       파라미터

hWndNew CWnd 오브젝트에 붙어 있게 될 윈도 핸들.

             4.  리턴값 : 아무 것도 리턴하지 않는다.

l        Detach

1.          설명 : 현재 붙어 있는 윈도우(HWND)에서 CWnd 오브젝트를 떼어낸다. CWnd 오브젝트가 HWND에 붙어 있으면 CWnd는 윈도를 조정하는 데 사용된다. 윈도에서 떨어지면 다시 붙을 때까지 CWnd 오브젝트를 사용할 수 없다.

2.          구문 : public HWND Detach();

3.          파라미터 : 없음.

4.          리턴값 : CWnd 오브젝트에 붙어 있는 HWND.

l        FromHandle

1.       설명 : 주어진 윈도 핸들을 CWnd에 대한 포인터로 리턴한다. MFC가 지정 핸들과 관련되는 영구 CWnd를 가지고 있지 않으면 임시 CWnd를 만들어 핸들에 연결한다. 임시 CWnd는 애플리케이션이 윈도에 제어를 리턴할 때 생기는 아이들 루프에 들어갈 때까지 FromHandle에 의해 리턴된 정당한 CWnd를 사용할 수 있도록 아이들 시간 처리 동안 자동적으로 파괴된다.  

2.       구문 : static CWnd* PASCAL FromHandle( HWND hWnd );

3.       파라미터

hWnd CWnd 오브젝트와 관련되는 윈도 핸들.

             4.  리턴값 : 임시적인 새로운 CWnd에 대한 포인터.

l        GetSafeHwnd

1.       설명 : CWnd 오브젝트와 현재 관련된 윈도 핸들을 리턴한다. NULL CWnd를 호출한다 해도 안전(safe)하기 때문에 GetSafeHwnd라 부른다.

2.       구문 : HWND GetSafeHwnd() const;

3.       파라미터 : 없음.

4.       리턴값 : CWnd 오브젝트와 현재 관련된 현재 관련된 윈도 핸들. CWnd가 NULL이거나 윈도에 관련된 핸들이 없으면 NULL.

l        CreateEx

1.        설명 : 주어진 특징과 스타일로 윈도를 생성하고 그 윈도를 CWnd 오브젝트와 관련시킨다. 확장된 스타일로 된 윈도, 예를 들어 투명 윈도를 생성하려면 CWnd::Create 함수 대신에 이 함수를 사용하라.

2.        구문 : public virtual BOOL CreateEx( DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hwndParent, HMENU nID 또는 HMenu, LPVOID lpParam = NULL );

3.        파라미터

dwExStyle 확장된 윈도 스타일.

lpszClassName 윈도로 사용할 윈도 클래스의 이름을 갖는 널로 끝나는 문자열에 대한 포인터. NULL이면 MFC는 대부분의 경우에 충분히 만족할 수 있는 기본 윈도 클래스를 사용한다. 자기 자신의 윈도 클래스를 등록하기 위하여 AfxRegisterWndClass 함수를 사용할 수 있다.

LpszWindowName 윈도의 이름을 갖는 널로 끝나는 문자열에 대한 포인터. 이 윈도의 이름은 캡션으로 표시된다.

DwStyle 윈도를 생성할 때 사용되는 윈도 스타일. WS_POPUP 스타일이 사용될 수 없다는 것에 유의하라. 팝업 윈도를 생성하기 위하여 CWnd::CreateEx함수를 사용하라.

X 부모윈도의 사용자 좌표로 표시되는 윈도의 왼쪽 상단의 x좌표.

Y 부모윈도의 사용자 좌표로 표시되는 윈도의 왼쪽 상단의 y좌표.

NWidth 윈도의 폭.

NHeight 윈도의 높이.

hwndPrent 윈도의 부모 윈도의 핸들.

NIDorHMenu 윈도 스타일에 따라 할당되는 윈도나 메뉴 ID. 이 ID를 사용하여 부모윈도에 있는 자식 윈도를 참조한다. 예를 들어, CWnd::GetDlgItem 함수는 ID로 주어진 자식 윈도에 대한 포인터를 얻는다.

LpParam 사용자 데이터에 대한 포인터. 이 파라미터에 대해 어떤 포인터도 전달할 수 있다. 이 포인터는 CREATESTRUCT 구조체의 lpCreteParams로 CWnd::OnCreate 핸들러에 전달된다. 

             4.  리턴값 : 윈도가 생성되면 비제로, 그렇지 않으면 0.

WS_EX_ACCEPTFILES

드래그 앤 드롭 파일을 받아들이는 윈도를 생성한다.

WS_EX_APPWINDOW

최상위 레벨 윈도가 이이콘으로 표시되면 그 윈도를 작업표시줄에 넣는다.

WS_EX_CLIENTEDGE

윈도의 테두리에 움푹 들어간 가장자리가 있다.

WS_EX_CONTEXTHELP

윈도의 타이틀 바에 (?)표시를 둔다. 사용자가 이 표시를 클릭하면 커서가 물음표 표시가 있는 포인터로 바뀐다. 그 후 자식 윈도를 클릭하면 그 자식 윈도가 WM_HELP 메시지를 받는다. 

WS_EX_CONTROLPARENT

사용자가 TAB키를 눌러서 자식 윈도 사이를 왔다갔다 할 수 있게 한다.

WS_EX_DLGMODALFRAME

이중 테두리를 가진 윈도를 생성한다. 타이틀을 추가하려면 dwStyle값에 WS_CAPTION을 넣는다.

WS_EX_LEFT

좌측 정렬 속성을 가진 윈도우를 생성한다. 디폴트.

WS_EX_LEFTSCROLLBAR

수직 스크롤바를 만들 경우 클라이언트 영역의 왼쪽에 둔다.

WS_EX_LERREADING

왼쪽에서 오른쪽으로 읽는 텍스트를 가진 윈도를 생성한다. 디폴트.

WS_EX_MDICHILD

MDI 자식 윈도를 생성한다.

WS_EX_NOPARENTNOTIFY

WM_PARENTNOTIFY 메시지를 보내지 않는다.

WS_EX_OVERLAPPEDWINDOW

WS_EX_CLIENTEDGE와 WS_EX_WINDOEDGE 스타일의 조합이다.

WS_EX_PALETTEWINDOW

WS_EX_WINDOWEDGE, WS_EX_SMCAPTION, WS_EX_TOPMOST 스타일의 조합이다.

WS_EX_RIGHT

우측 정렬 속성을 가진 윈도를 생성한다.

WS_EX_RIGHTSCROOLBAR

수직 스크롤바를 만들 경우 클라이언트 영역으 오른쪽에 둔다. 디폴트.

WS_EX_RTLREADING

오른쪽에서 왼쪽으로 읽는 텍스트를 가진 윈도를 생성한다.

WS_EX_STATICEDGE

입체감 있는 테두리 스타일의 윈도를 생성한다. 사용자 입력을 받아들이지 않는 항목에 이 스타일을 사용한다.

WS_EX_TOOLWINDOW

도구(tool) 윈도를 생성한다. 도구 윈도는 위치 이동이 가능한 도구 상자에서 사용된다.

WS_EX_TOPMOST

최상위 레벨이 아닌 모든 윈도위에 두고자 하는 윈도를 생성한다.

WS_EX_TRANSPRENT

투명한 윈도를 생성한다. 이 윈도에 의해서 가려지는 동기간 윈도는 WM_PAINT 메시지를 먼저 받고 그 후 투명한 모양으로 윈도가 생성된다.

WS_EX_WINDOWEDGE

가장자리가 돌출된 테두리가 있는 윈도를 생성한다.

l        CreateControl

1.          설명 : CWnd 객체에 의해 MFC 프로그램에서 나타날 OLE 컨트롤을 생성하는데 사용한다. CreateControl은 CWnd::Create 함수의 직접적인 아날로그로서, CWnd를 위한 윈도를 생성 시킨다. CreateControl은 일상적인 윈도 대신 OLE 컨트롤을 생성시킨다. 단지 윈도 dwStyle 플래그의 서브 세트만이 CreateControl을 지원한다.( WS_VISIBLE, WS_DISABLED, WS_BORDER, WS_GROUP, WS_TABSTOP )

2.          구문 : BOOL CreateControl( LPCTSTR lpszClass{REFCLSID clsid}, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, Cfile* pPersist = NULL, BOOL bStorage = FALSE, BSTR  bstrLieKey = NULL );

3.          파라미터

lpszClass 생성될 컨트롤의 클래스를 대표하는 스트링에 대한 포인터이다.

lpszWindowName 컨트롤에 표시된 텍스트에 대한 포인터이다. 컨트롤의 Caption표시.

dwStyle Window 스타일.

rect 컨트롤의 크기나 위치를 지정한다.

pParentWnd 컨트롤의 부모 윈도를 지정한다. 이 값이 NULL이면 안된다.

nID 컨트롤 ID를 지정한다.

pPersist 컨트롤을 위한 지속적인 상태를 포함하는 Cfile에 대한 포인터이다. 디폴트 값은 NULL이며, 그것은 이 컨트롤을 위해 어느 지속적인 상태도 부하가 가해지지 않음을 가리킨다.

bStorage 데이터가 IStorage 데이터(TRUE) 또는 IStream 데이터(FALSE)로서 해석이 가능해야 한다. 디폴트 값은 FALSE이다.

bstrLicKey 선택적인 라이센스 키 데이터이다. 이 데이터는 단지 런타임 라이센스 키가 요구되는 생성 컨트롤에서만 필요하다. 디폴트 값은NULL이다.

clsid 컨트롤을 위한 유일한 클래스 ID이다.

             4.  리턴값 : 성공적으로 수행될 경우 0 이외의 값이며, 작동이 실패할 경우 0 이다.

 

윈도 상태 함수

l        IsWindowEnable

1.       설명 : CWnd이 마우스와 키보드 입력에 대해 실행 가능한지를 지정한다.

2.       구문 : BOOL IsWindowEnable() const;

3.       파라미터 : 없음.

4.       리턴값 : 윈도가 사용할 수 있으면 비제로, 그렇지 않으면 0.

l        EnableWindow

1.  설명 : 마우스의 입력과 키보드의 입력을 가능하거나 불가능하게 한다. 입력이 불가능하면, 마우스 클릭이나 키스느로크와 같은 입력은 무시된다. 입력이 가능하면, 윈도는 모든 입력을 처리한다. 마일 실행 가능 상태가 변한다면, WM_ENABLE 메시지가 이 함수가 리턴되기 전에 보내진다. 만일 불가능 상태이면, 비록 WM_ENABLE 메시지가 전달 되었어도 암시적으로 불가능하다. 윈도는 반드시 활동하기 전에 가능하게 되어야 한다. 디폴트로, 윈도는 그것이 생성될 때 사용 가능하다. 초기에 사용 불가능한 윈도를 생성하기 위해 Create 또는 CreateEx 멤버 함수에서 애플리케이션은 WS_DISABLED 스타일을 지정할 수 있다. 윈도가 생성된 후 애플리케이션은 또한 윈도를 사용가능하거나 불가능으로 만들기 위해 EnableWindow 멤버 함수를 이용한다.  

                    애플리케이션은 다이얼로그 박스에서 컨트롤을 사용 가능하거나 불가능하게 만들기 위해 이 함수를 이용할 수 있다. 불가능한 컨트롤은 입력 초점을 받지 못하거나, 액세스할 수도 없다.

2.       구문 : BOOL EnableWindow( BOOL bEnable = TRUE );

3.       파라미터

bEnable 윈도가 사용할 수 있게 하려면 TRUE, 사용할 수 없게 하려면 FALSE.

4.  리턴값 : 윈도가 이전에 사용할 수 없게 되어 있으면 TRUE, 사용할 수 있게 되어 있으면FALSE.

l        GetActiveWindow

1.         설명 : 현재 활성화된 윈도에 대한 포인터를 얻는다. 활성화 윈도는 입력 초점을 갖는 윈도나 CWnd::SetActiveWindow 함수에 대한 호출로 활성화 된 윈도이다.

2.         구문 : static CWnd* PASCAL GetActiveWindow();

3.         파라미터 : 없음.

4.         리턴값 : 활성화된 윈도에 대한 포인터나 어떤 윈도도 현재 활성화되지 않았다면 NULL. 리턴 포인터는 임시적이고 나중 사용을 위하여 보관하지 않아야 한다. 임시 CWnd는 애플리케이션이 윈도에 제어를 리턴할 때 일어나는 아이들 루프에 들어갈 때까지 GetActiveWindow에 의해 리턴되는 정당한 CWnd를 사용할 수 있도록 아이들 시간 처리 동안 자동적으로 파괴된다.

l        SetActiveWindow

1.       설명 : 윈도를 활성화 윈도로 만든다.

2.       구문 : CWnd* SetActiveWindow();

3.       파라미터 : 없음.

4.       리턴값 : 이전에 활성화된 윈도에 대한 포인터. 리턴 포인터는 임시적이고 나중 사용을 위하여 보관되지 않아야 한다. 임시 CWnd는 애플리케이션이 윈도에 제어를 리턴할 때 일어나는 아이들 루프에 들어갈 때까지 SetActiveWindow에 의해 리턴되는 정당한 CWnd를 사용할 수 있도록 아이들 시간 처리 동안 자동적으로 파괴된다.

l        GetCapture

1.       설명 : 마우스 캡처를 갖는 윈도에 대한 포인터를 얻는다. 한 번에 단 하나의 윈도만이 마우스 캡처를 가질 수 있다. 윈도는 CWnd::SetCapture 함수를 호출하여 마우스를 캡처한다. 윈도가 캡처된 마우스를 가질 때, 커서 위치가 윈도 내에 없더라도 마우스 메시지를 받는다.

2.       구문 : static CWnd* PASCAL GetCapture();

3.       파라미터 : 없음.

4.       리턴값 : 마우스 캡처를 갖는 윈도에 대한 포인터나 마우스 캡처를 갖지 않으면 NULL. 리턴 포인터는 임시적이고 나중 사용을 위하여 보관되지 않아야 한다. 임시 CWnd는 애플리케이션이 윈도에 제어를 리턴할 때 일어나는 아이들 루프에 들어갈 때 까지 GetActiveWindow에 의해 리턴되는 정당한 CWnd를 사용할 수 있도록 아이들 시간 처리 동안 자동적으로 파괴된다.

 

l        SetCapture

1.        설명 : 커서가 이 윈도우 위에 있는가에 관계없이 모든 마우스 메시지가 이 윈도에 보내지게 한다. 마우스 메시지는 CWnd::ReleaseCapture 함수가 호출될 때까지 잡힌다(Capture). 종종 사용자가 왼쪽 마우스 버튼을 누를 때 이 함수를 호출하고 버튼이 해제될 때 캡처를 해제한다.

2.        구문 : CWnd* SetCapture();

3.        파라미터 : 없음.

4.        리턴값 : 전에 캡처를 갖는 윈도에 대한 포인터. 아무 것도 없으면 NULL. 리턴 포인터는 임시 적이고 나중 사용을 위하여 보관되지 않아야 한다. 임시 CWnd는 애플리케이션이 윈도우에제어를 리턴할 때 일어나는 아이들 루프에 들어갈 때까지 SetCapture에 의해 리턴되는 정당한 CWnd를 사용할 수 있도록 아이들 시간 처리 동안 자동적으로 파괴된다.

l        GetFocus

1.       설명 : 현재 입력 초점을 갖는 윈도에 대한 포인터를 리턴한다.

2.       구문 : static CWnd* PASCAL GetFocus();

3.       파라미터 : 없음.

4.       리턴값 : 현재 입력 초점을 갖는 CWnd에 대한 포인터. 이 포인터는 임시적이고 나중 사용을 위하여 보관되지 않아야 한다. 임시 CWnd는 애플리케이션이 윈도에 제어를 리턴할 때 일어나는 아이들 루프에 들어갈 때까지 GetFocus에 의해 리턴되는 정당한 CWnd를 사용할 수 있도록 아이들 시간 처리 동안 자동적으로 파괴된다.

l        SetFocus

1.       설명 : 입력을 위해 선택된 것을 알린다. 입력 초점은 모든 키보드 입력을 윈도에 직접 전달한다. 이미 입력 초점을 가졌던 윈도는 입력 초점을 잃지 않는다. SetFocus함수는 WM_KILLFOCUS를 윈도에 보내 입력 초점을 잃게 하고 WM_SETFOCUS를 보내 입력 초점을 받아들이게 한다. 그 윈도나 부모 윈도를 활성화시킨다. 어떤 윈도도 초점을 가지고 있지 않았을 때 키가 눌러지면 WM_SYSCHAR, WM_SYSKEYDOWN, WM_SYSKEYUP 메시지를 발생한다.

2.       구문 : CWnd* SetFocus();

3.       파라미터 : 없음.

4.       리턴값 : 초점을 가진 윈도 객체에 대한 포인터. 이런 객체가 없으면 NULL을 리턴한다. 리턴된 포인터는 일시적이며 저장될 수 없다.

l        GetDesktopWindow

1.       설명 : 데스크탑 윈도에 대한 포인터를 얻는다. 데스크탑 윈도는 전체 윈도를 나타내는 바탕 화면이고, 그위에 모든 윈도가 그려진다. 이 포인터는 임시 적이고 나중 사용을 위하여 보관되지 않아야 한다.

2.       구문 : static CWnd* PASCAL GetDesktopWindow();

3.       파라미터 : 없음.

4.       리턴값 : 데스크탑 윈도에 대한 포인터.

l       ModifyStyle

1.  설명 : 특정 스타일 플래그를 추가하고 다른 특정 스타일 플래그를 제거하여 이 윈도와 관련된 윈도 스타일을 수정한다. 또한 nFlags가 0 이외의 값이면, ModifyStyle은 ::SetWindowPos 함수를 호출하여 다음의 네 가지, 미리 설정된 플래그와 조합하여 윈도를 다시 그린다.

SWP_NOSIZE 현재의 크기를 유지한다.

SWP_NOMOVE 현재의 위치를 유지한다.

SWP_NOZORDER 현재의 Z순서를 유지한다.

SWP_NOACTIVATE 윈도를 활성화 시키지 않게 한다.

2.       구문 : BOOL ModifyStyle( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 );

3.       파라미터

dwRemove 윈도에서 제거되는 윈도 스타일 플래그의 조합.

dwAdd 윈도에서 추가되는 윈도 스타일 플래그의 조합.

NFlags SetWindowPos호출에 전달되는 SetWindowPos 플래그. 플래그 SWP_NOSIZE, SWP_NOMOVE, SWP_NOZORDER, SWP_NOACTIVATE는 ModifyStyle에 필요한 파라미터를 기술하는 어떤 방법도 없기 때문에 자동적으로 사용된다. 이 파라미터가 0이면 SetWindowPos는 호출되지 않는다.

             4.  리턴값 : 성공하면 비제로, 그렇지 않으면 0.

[ SetWindowPos의 nFlags 값 ]

SWP_DRAWFRAME

윈도우 주위에 윈도 클래스의 정의에 따라 프레임을 그린다.

SWP_FRAMECHANGED

윈도의 크기가 바뀌지 않더라도 윈도에 WM_NCCALCSIZE 메시지를 강제로 보내게 한다.

SWP_HIDEWINDOW

윈도를 숨긴다.

SWP_NOACTIVATE

윈도를 활성화 시키지 않는다.

SWP_NOCOPYBITS

클라이언트 영역의 내용을 복구 시키지 않는다.

SWP_NOMOVE

X와 Y값을 무시한다. 윈도의 크기는 변경만 가능하다.

SWP_NOOWNERZORDER

Z-order에서 소유자 윈도의 위치를 변경시키지 않는다.

SWP_NOREDRAW

윈도 이동이 있은 후에도 다시 그리는 일을 하지 않게 한다. 그릴 필요가 있는 부분은 응용프로그램이 분명히 무효화 시키고 다시 그려야 한다.

SWP_NOREPOSITION

SWP_NOOWNERZORDER 플래그와 같다.

SWP_NOSENDCHANGING

윈도가 WM_WINDOWPOSCHANGING 메시지를 받지 못하게 한다.

SWP_NOSIZE

cx와 cy 값을 무시한다. 윈도의 이동만 가능하다.

SWP_NOZORDER

hwndInsertAfter 값을 무시한다. 

SWP_SHOWWINDOW

윈도를 출력한다.

l       ModifyStyleEx

1.       설명 : 특정 스타일 플래그를 추가하고 다른 특정 스타일 플래그를 제거하여 이 윈도에 관련되는 윈도 스타일을 수정한다. 또한, ModifyStyleEx는 임으로 특정 플래그로 ::SetWindowPos 함수를 호출한다.

2.       구문 : BOOL ModifyStyleEx( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 );

3.       파라미터

dwRemove 윈도에서 제거되는 윈도 확장 스타일 플래그의 조합.

dwAdd 윈도에 추가되는 윈도 확장 스타일 플래그의 조합.

nFlags SetWindowPos 호출에 전달되는 SetWindowPos 플래그. 플래그 SWP_NOSIZE, SWP_NOMOVE, SWP_NOZORDER, SWP_NOACTIVATE는 ModifyStyle에 필요한 파라미터를 기술하는 어떤 방법도 없기 때문에 자동적으로 사용된다. 이 파라미터가 0이면 SetWindowPos는 호출되지 않는다.

4.       리턴값 : 성공하면 비제로, 그렇지 않으면 0.

 

윈도의 크기와 위치

l       IsIconic

1.       설명 : CWnd가 최소화(아이콘화)되는지의 여부를 지정한다.

2.       구문 : BOOL IsIconic() const;

3.       파라미터 : 없음.

4.       리턴값 : CWnd가 최소화되었으면 비제로, 그 외의 경우에는 0이다.  

l       IsZoomed

1.       설명 : 윈도가 최대 화면인가 아닌가를 판단한다.

2.       구문 : BOOL IsZoomed() const;

3.       파라미터 : 없음.

4.       리턴값 : 윈도가 최대 화면이면 비제로, 그렇지 않으면 0.

l       MoveWindow

1.        설명 : 윈도가 특정 위치로 이동시키고 특정 크기로 조정한다. 이 함수로 윈도를 이동할 때 , 윈도는 윈도에 WM_GETMINMAXINFO 메시지를 보낸다. 이 메시지는 윈도의 크기와 위치를 제어할 기회를 윈도에 준다.

2.        구문 : void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );

  void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );

             3.  파라미터

                    x 윈도의 왼쪽 상단의 새 x좌표. 이 윈도가 최상위 윈도이면, x는 스크린의 왼쪽 상단을 기준으로 한다. 이 윈도가 자식 윈도이면, x는 부모 윈도의 사용자 영역의 왼쪽 상단을 기준으로 한다.

y 윈도의 왼쪽 상단의 새 y좌표. 이 윈도가 최상위 윈도이면, y는 스크린의 왼쪽 상단을 기준으로 한다. 이 윈도가 자식 윈도이면, y는 부모 윈도의 사용자 영역의 왼쪽 상단을 기준으로 한다.  

nWidth 윈도의 새 폭.

nHeight- 윈도의 새 높이.

bRepaint 윈도가 다시 칠해져야 하면 TRUE, 그렇지 않으면 FALSE. 이 파라미터에 FALSE를 전달하면 어떤 다시 칠하는 것도 발생하지 않는다.

lpRect 윈도의 새 위치와 크기를 포함하는 RECT 구조체와 CRect 오브젝트에 대한 포인터. 

             4.  리턴값 : 아무 것도 리턴하지 않는다.

l       SetWindowPos

1.       설명 : 윈도의 크기, 위치, 자식 윈도의 Z 순서, 팝업, 상위 레벨을 변경하기 위해 함수를 호출한다. 윈도는 화면에 Z 순서에 따라 나열 되어 있다. 즉 Z 순서 맨 위에 있는 윈도는 화면 맨 위에 나타난다. 모든 자식 윈도의 좌표는 부모 윈도의 사용자 영역 좌측 상단과 연관 있는 사용자 좌표이다.

2.       구문 : BOOL SetWndowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags );

3.       파라미터

pWndInsertAfter 이 윈도가 Z 순서에 넣은 다음의 윈도. 또한, wndBottom, wndTop, wndTopMost, wndNoTopMost 상수중의 하나이다.

wndBottom

윈도를 Z 순서 끝에 놓는다. 이 CWnd가 맨 위 윈도이면 상위 상태 속성을 잃게 된다. 시스템이 다른 윈도 밑에 이 윈도를 놓기 때문이다.

wndTop

윈도를 Z 순서 맨 위에 놓는다.

wndTopMost

윈도를 맨 위에 놓는다. 비활성화되더라도 최상위 자리를 유지한다.

wndNoTopMost

윈도를 모든 맨 위 윈도가 아닌 윈도 최상 즉 모든 맨 위 윈도 아래 위치에 재 지정한다 이미 그 위치에 있으면 효과가 없다.

                 x 윈도의 왼쪽 상단의 새 x 좌표.

                 y 윈도의 왼쪽 상단의 새 y 좌표.

                 cx 윈도의 새로운 폭.

                 cy 윈도의 새로운 높이.

                 nFlags - [ SetWindowPos의 nFlags 값 ]의 조합.

             4.  리턴값 : 성공하면 비제로, 그렇지 않으면 0.

l       BringWindowToTop

1.       설명 : 윈도를 오버랩 윈도의 스택의 맨 위에 올려 놓는다. 윈도가 완전하게 보이게 하려면 이 함수를 사용하라. 이 함수는 윈도의 스타일을 항상 최상위로 만들지는 않는다. 윈도를 항상 최상위로 만들려면, CWnd::SetWindowPos 함수를 사용하라. 윈도가 팝업, 상위 수준이거나 MDI 자식 윈도이면 이 함수는 그 윈도를 활성화시킨다.

2.       구문 : public void BringWindowToTop();

3.       파라미터 : 없음.

4.       리턴값 : 아무 것도 리턴하지 않는다.

l       GetWindowRect

1.       설명 : 윈도의 사각형의 좌표를 얻는다. 좌표는 스크린 좌표이다.

2.       구문 : void GetWindowRect( LPRECT lpRect ) const;

3.       파라미터

lpRect 윈도 좌표로 채워지는 RECT 구조체나 CRect 오브젝트에 대한 포인터.

4.       리턴값 : 아무 것도 리턴하지 않는다.

l       GetClientRect

1.       설명 : 윈도의 사용자 영역을 정의하는 사각형을 얻는다. 사각형은 사용자 좌표로 표시되기 때문에 상대적이므로 외쪽 상단은 항상 (0, 0)이다.

2.       구문 : void GetClientRect( LPRECT lpRect ) const;

3.       파라미터

lpRect 윈도의 사용자 영역의 좌표로 채워지는 RECT 구조체나 CRect 오브젝트에 대한 포인터.

             4.  리턴값 : 아무 것도 리턴하지 않는다.

 

윈도 액세스 함수

l       ChildWindowFromPoint

1.         설명 : 주어진 위치를 갖는 자식 윈도를 알아낸다. 주어진 위치가 자식 윈도우 내에 있지않고, CWnd의 사용자 영역의 밖에 있으면, NULL이 리턴된다. 주어진 위치가 CWnd의 하나의 자식윈도 이상에 있을 경우는 발견한 첫번째 윈도가 리턴된다. 이 함수의 두번째 버전은 윈도 95에서 새롭게 제공되고 검색을 위하여 걸러내는 윈도의 타입을 기술할 수 있다. 보이지 않거나 사용할 수 없거나 투명한 윈도는 제거된다.

2.         구문 : public CWnd* ChildWindowFromPoint( POINT pt ) const;

public CWnd* ChildWindowFromPoint( POINT pt, UINT nFlags ) const;

             3.  파라미터

                 pt 판단할 자식 윈도에 대한 부모 윈도의 사용자 영역의 위치.

                 nFlags 건너뛸 자식 윈도를 지정한다. 다음의 값들의 조합으로 이루어질 수 있다.

CWP_ALL

어떠한 자식 윈도도 건너 뛰지 말라.

CWP_SKIPINVISIBLE

보이지 않는 자식 윈도를 건너 뛰어라.

CWP_SKIPDISABLED

기능이 억제된 자식 윈도를 건너 뛰어라.

CWP_SKIPTRANSPARENT

투명한 자식 윈도를 건너 뛰어라.

4.       리턴값 : 지정한 위치를 포함하는 자식 윈도를 나타내는 CWnd에 대한 포인터. 지정한 위치가CWnd의 사용자 영역 내에 있지 않으면, NULL이 리턴된다. 지정한 위치가 사용자 영역 내에 있지만 CWnd의 자식 윈도 내에 있지 않으면 CWnd 자체에 대한 포인터가 리턴된다.

l       FindWindow

1.        설명 : 지정한 클래스 이름과 윈도 이름을 갖는 톱 레벨 윈도를 찾는다. FindWindow는 자식 윈도를 찾지 못한다.

2.        구문 : static CWnd* PASCAL FindWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName )

3.        파라미터

lpszClassName 원하는 윈도의 클래스 이름을 갖는 NULL로 끝나는 문자열 버퍼에 대한 포인터. 어느 클래스 이름이나 허용되면 NULL일 수 있다.

lpszWindowName 원하는 윈도의 윈도 이름을 갖는 NULL로 끝나는 문자열 버퍼에 대한 포인터. 어느 윈도우 이름이나 허용되면 NULL일 수 있다.

4.        리턴값 : 일치하는 CWnd 오브젝트에 대한 포인터, 또는 어느 것도 발견되지 않으면 NULL. 이 포인터는 나중에 사용하기 위하여 보관되지 않도록 임시적이어야 한다.

l       GetNextWindow

1.       설명 : 윈도 매니저 리스트에 있는 다음이나 이전 윈도에 대한 포인터를 얻는다. 윈도 메니저 리트스는 최상위 윈도들과 그들과 연관된 자식 윈도, 그리고 어떠한 자식 윈도의 자식윈도에 대한 앤트리들을 포함한다. 이 윈도가 최상위 윈도이면, 이 함수는 다음이나 이전 최상위 윈도를 찾는다. 이 윈도가 자식 윈도이면, 이 함수는 다음이나 이전 자식 윈도를 찾는다. 

2.       구문 : CWnd* GetNextWindow( UINT nFlag = GW_HWNDNEXT ) const;

3.       파라미터

nFlag 다음 윈도를 얻기 위해서는 GW_HWNDNEXT나 이전 윈도를 얻기 위해서는 GW_HWNDPREV.

4.       리턴값 : 멤버 함수가 동작에 성공하면 윈도 메니저의 리스트에 있는 다음의(또는 이전의) 윈도를

확인한다. 리턴된 포인터는 일시적일 수 있으며, 나중에 사용하려고 저장할 수 없다.

l       GetOwner

1.        설명 : 윈도의 소유자에 대한 포인터를 얻는다. 윈도가 소유자가 없다면, 부모 윈도 객체에 대한 포인터가 디폴트로 리턴된다. 소유자와 소유된 윈도 사이의 관계가 여러 가지 중요한 면에서 부모-자식 윈도의 관계와는 다르다는 것에 주의한다. 예를 들어, 부모를 지닌 윈도는 그것의 부모 윈도의 클라이언트 영역에 국한된다. 소유된 윈도는 데스크탑의 어떠한 위치에서도 이끌어 낼 수 있다.

2.        구문 : CWnd* GetOwner() const;

3.        파라미터 : 없음.

4.        리턴값 : 이 윈도의 오너 윈도에 대한 포인터. 이 포인터는 나중 사용을 위하여 보관되지 않아야 한다. 

l       SetOwner

1.       설명 : 이 윈도의 오너를 특정 윈도로 변경한다. 기본적으로, 윈도의 오너는 자신의 부모이다. 오너를 다른 윈도로 설정하는 것은 윈도에서 자신의 부모보다는 다른 윈도에 알림 코드가 전달되게 한다. 이 특징은 자식 윈도의 부모가 컨테이너 애플리케이션에 있지만 오너는 서브 애플리케이션에 뒤에 있는 MFC OLE 구현에서 많이 사용된다.

2.       구문 : void SetOnwer( CWnd* pOnwerWnd );

3.       파라미터

pOnwerWnd 윈도의 새로운 오너. 윈도가 어떤 오너도 갖지 않으면 NULL이다.

             4.  리턴값 : 아무 것도 리턴하지 않는다. 

l       GetParent

1.       설명 : 이 윈도의 부모 윈도를 얻는다.

2.       구문 : CWnd* GetParent() const;

3.       파라미터 : 없음.

4.       리턴값 : 이 윈도의 부모 윈도에 대한 포인터. 이 포인터는 나중 사용을 위하여 보관되지 않아야 한다. 이 함수는 CWnd 오브젝트가 윈도에 붙어 있지 않거나 윈도가 부모 윈도를 갖지 않으면 NULL를 리턴한다.

l       SetParent           

1.        설명 : 이 윈도의 부모를 특정 윈도로 변경한다. 이 자식 윈도가 보이면, 필요한 다시 그리기가 자동적으로 행해진다.

2.        구문 : CWnd* SetParent( CWnd* pWndNewParent );

3.        파라미터

pWndNewParent 새로운 부모 윈도에 대한 포인터.

4.        리턴값 : 이전 부모 윈도에 대한 포인터. 리턴 포인터는 임시적이고 나중 사용을 위하여 보관되지 않아야 한다.

l       GetTopWindow

1.       설명 : 이 윈도의 최상위 자식 윈도를 얻는다. 이 윈도가 어떤 자식 윈도도 갖지 않으면 NULL을 리턴한다.

2.       구문 : CWnd* GetTopWindow() const;

3.       파라미터 : 없음.

4.       리턴값 : 이 윈도의 최상위 자식 윈도에 대한 포인터. 이 포인터는 나중 사용을 위하여 보관되지 않도록 임시적이어야 한다.

 

l       GetWindow

1.       설명 : 이 윈도와 특정 관계를 갖는 윈도에 대한 포인터를 얻는다.

2.       구문 : CWnd* GetWindow( UINT nCmd ) const;

3.       파라미터

nCmd 이 윈도와 원하는 윈도 사이의 관계를 나타내는 상수. 다음 값 중의 하나이다.

GW_CHILD

윈도의 첫번째 자식 윈도를 얻는다.

GW_HWNDFIRST

이 윈도가 자식 윈도이면, 부모가 같은 첫번째 윈도를 얻고 그렇지 않으면 첫번째 최상위 윈도를 얻는다.

GW_HWNDLAST

이 윈도가 자식 윈도이면, 부모가 같은 마지막 윈도를 얻고 그렇지 않으면 마지막 최상위 윈도를 얻는다.

GW_HWNDNEXT

윈도 관리자 리스트에 있는 다음 윈도를 얻는다.

GW_HWNDPREV

윈도 관리자 리스트에 있는 이전 윈도를 얻는다.

GW_OWNER

윈도의 오너를 얻는다.

             4.  리턴값 : 요청한 윈도에 대한 포인터.

l       GetLastActivePopup

1.       설명 : CWnd에 의해 소유된 팝업 윈도 중 가장 최근 활성화된 팝업 윈도를 결정한다. 

2.       구문 : CWnd* GetLastActivePopup() const;

3.       파라미터 : 없음.

4.       리턴값 : 가장 최근에 활성화된 팝업 윈도에 대한 포인터. 리턴값은 다음의 내용 중 일치하는 것이 있으면 윈도 그 자체가 된다.

¨ 윈도 자체가 가장 최근에 활성화 되었다. 

¨ 윈도는 어떠한 팝업 윈도들을 가지고 있지 않다.

¨ 윈도는 최상위 윈도가 아니거나 다른 윈도에 의해 소유된다.

                 이 포인터는 나중 사용을 위하여 보관되지 않아야 한다. 

l       IsChild

1.       설명 : 특정 윈도가 자식 윈도인지 이 윈도의 후손 윈도인가를 판단한다.

2.       구문 : BOOL IsChild( const CWnd* pWnd ) const;

3.       파라미터

pWnd 검사할 윈도에 대할 포인터.

             4.  리턴값 : 윈도가 이 윈도의 자식 윈도이거나 후손이면 비제로, 그렇지 않으면 0.

l       GetDlgItem

1.        설명 : 다이얼로그 박스 또는 다른 윈도에 있는 특정한 컨트롤이나 자식 윈도에 대한 포인터를 검색한다. 리턴된 포인터는 일상적으로 nID에 의해 식별된 컨트롤의 타입에 속하게 된다.

2.        구문 : CWnd* GetDlgItem( int nID ) const;

  void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;

             3.  파라미터

                 nID 얻을 자식 윈도 ID.

                 phWnd 지정 자식 윈도 핸들로 채워지는 HWND에 대한 포인터.

4.        리턴값 : 첫번째 형식의 함수는 지정 자식 윈도에 대한 포인터를 리턴하거나  자식윈도가 존재하지 않으면 NULL.

l       GetDlgCtrlID

1.        설명 : 윈도나 어떠한 자식 윈도의 컨트롤 ID값 또는, 다이얼로그 박스에서 컨트롤의 ID 값들을 리턴한다. 최상위 윈도들이 ID 값을 갖지 않으므로, 이 함수의 리턴 값은 CWnd가 최상위 윈도라면 유효하지 않다.

2.        구문 : int GetDlgCtrlID() const;

3.        파라미터 : 없음.

4.        리턴값 : 자식 윈도 ID.

l       SetDlgCtrlID

1.       설명 : 윈도 ID나 컨트롤 ID에 새로운 값을 설정한다. 이 윈도는 다이얼로그 박스에 있는 컨트롤이나 자식 윈도는 가능하지만 상위 레벨 윈도는 가능하지 않다.

2.       구문 : int SetDlgCtrlID( int nID );

3.       파라미터

nID 컨트롤, 자식윈도 새로운 ID.

4.       리턴값 : 컨트롤, 자식윈도 이전 ID.

l       GetParentFrame

1.       설명 : 이 윈도의 부모 프레임에 대한 포인터를 얻는다. 이 윈도에 대한 어떤 부모 프레임 윈도가 아니면, GetParentFrame은 NULL을 리턴한다.

2.       구문 : CWnd* GetParentFrame() const;

3.       파라미터 : 없음.

4.       리턴값 : 부모 프레임 윈도에 대한 포인터. 이 포인터는 나중에 사용을 위하여 보관되지 않아야 한다.

l       UpdateData

1.       설명 : 다이얼로그 데이터 교환과 확인을 한다. 이 함수는 몇 가지 초기화 작업을 수행하고 실제 데이터 교환과 확인을 수행하기 위하여 CWnd의 CWnd::DoDataExchange 멤버를 호출한다. 보통 MFC는 CDialog::OnInitDialog함수에서 다이얼로그 컨트롤을 초기화하고 CDialog::OnOK의 기본 구현에서 다이얼로그로부터 데이터를 얻기 위하여 이 함수를 자동으로 호출한다.

2.       구문 : BOOL UpdateData( BOOL bSaveAndValidate = TRUE );

3.       파라미터

bSaveAndValidate TRUE는 데이터가 윈도에서 얻어지고 임의로 확인되어야 한다는 것을 나타내고, FALSE는 데이터가 윈도에 보내야 한다는 것을 나타낸다.

             4.  리턴값 : 성공하면 비제로, 그렇지 않으면 0.

l       BeginPaint

1.         설명 : 칠하기 위하여 윈도를 준비하고 칠하기 위한 디바이스 컨텍스트를 생성하고 리턴한다. PAINTSTRUCT 구조체에 칠하는 정보를 체운다. 전형적으로 WM_PAINT 메시지에 응답하기 위해서만 이 함수를 호출한다. 이 함수를 호출하면 칠하기를 끝냈을 때에 반드시 CWnd::EndPaint를 호출하여야 한다. 보통 MFC CPaintDC 클래스는 윈도 칠하기를 캡슐화했기 때문에 이 함수를 호출할 필요는 없다. 윈도 갱신 영역이 지워지기 위하여 마크되면 BeginPaint는 윈도에 WM_ERASEBKGND 메시지를 보낸다. 칠해지는 영역에 카렛을 포함하고 있으면 BeginPaint는 자동적으로 칠하여 카렛이 지위지지 않도록 숨긴다.

2.         구문 : public CDC* BeginPaint( LPPAINTSTRUCT lpPaint );

3.         파라미터

lpPaint PAINTSTRUCT에 대한 구조체.

             4.  리턴값 : 칠하는 데 사용되는 CDC 오브젝트에 대한 포인터.

l       EndPaint

1.        설명 : WM_PAINT 메시지에 응답하여( CWnd::OnPaint 메시지 핸들러 ) 칠하려고 하는 윈도를 칠하였을 때 이 함수를 호출한다. 이 함수는 CWnd::BeginPaint 함수의 호출로 할당된 디바이스 컨텍스트를 해제한다. 종종 자신의 생성자와 소멸자 내에서 BeginPaint와 EndPaint를 호출을 캡슐화하는 CPaintDC를 사용하는 것이 더 쉽다.

2.        구문 : void EndPaint( LPPAINTSTRUCT lpPaint );

3.        파라미터

lpPaint CWnd::BeginPaint 호출에 응답으로 제공되는 PAINTSTRUCT 구조체에 대한 포인터.

4.        리턴값 : 아무 것도 리터하지 않는다.

l       GetDC

1.       설명 : 윈도의 사용자 영역에 대한 디바이스 컨텍스트를 얻는다. 보통 리턴된 디바이스 컨텍스트는 일반 디바이스 컨텍스트이다. 그러나 윈도우 클래스에 사용되는 스타일 플래그에 따라 개인 또는 클래스 디바이스 컨텍스트가 리턴된다. CS_OWNDC, CS_PARENTDC와 CS_CLASSDC 플래그는 기능을 제어한다. 디바이스가 컨텍스트가 윈도 클래스에 속하지 않으면, ReleaseDC 멤버 함수는 반드시 색칠이 끝난 후에 상황을 풀기 위해 호출되어야 한다. 시스템은 전체 5개의 일반 디바이스 컨텍스트로 제한하기 때문에 16비트 윈도(그리고 Win32s)에서 ReleaseDC를 사용하는 것은 아주 중요하다.

2.       구문 : CDC* GetDC();

3.       파라미터 : 없음.

4.       리턴값 : 디바이스 컨텍스트에 대한 포인터. 이 포인터는 임시적이고 나중 사용을 위하여 보관 되지 않아야 한다. 

l       GetWindowDC

1.       설명 : 캡션 바, 메뉴들, 그리고 스크롤 바들을 포함하는 전체 윈도에 대한 디스플레이 내용을 얻는다. 클라이언트 영역을 대신하여 내용의 원점이 CWnd의 왼쪽상단 구석이므로, 윈도 디스플레이 내용은 CWnd의 어느 곳에서나 색칠하기를 허용한다. 디포트 속성은 그것이 내용을 얻을 때마다. 디스플레이 내용에 할당된다. 이전의 속성은 잃어버린다. GetWindowDC는 CWnd 비클라이언트 영역 안의 특별한 색칠 효과에 사용되는 의도가 있다. 어떤 윈도의 비클라이언트 영역의 색칠은 추천되지 않는다. GetSystemMetrics Windows 함수는 캡션 바나, 메뉴, 그리고 스크롤 바와 같은 비클라이언트 영역의 다양한 부분들의 치수들을 얻기 위해 사용될 수 있다. 색칠이 완료된 후, ReleaseDC 멤버 함수는 반드시 디스플레이 내용을 해제하기 위해 호출되어야 한다. 디스플레이 내용의 해제에 실패하면 동시에 오픈될 수 있는 디바이스 내용의 수에 제한이 있어서 애플리케이션에 의해 요청된 색칠에 심각한 영향을 미친다.

2.       구문 : CDC* GetWindowDC();

3.       파라미터 : 없음.

4.       리턴값 : 전체 윈도 영역에 대한 디바이스 컨텍스트에 대한 포인터. 이 포인터는 임시적이고 나중 사용을 위하여 보관 되지 않아야 한다. 

 

l       ReleaseDC

1.       설명 : CWnd::GetDC나 CWnd::GetDCEx 함수를 사용하여 얻어지는 디바이스 컨텍스트를 해제한다.

2.       구문 : int ReleaseDC( CDC* pDC );

3.       파라미터

pDC 해제되는 디바이스 컨텍스트에 대한 포인터.

             4.  리턴값 : 성공하면 비제로, 그렇지 않으면 0.

l       Invalidate

1.       설명 : 윈도의 전 클라이언트 영역을 무효화한다. 이 함수를 호출하는 것은 MULL 사각형 포인터로 CWnd::InvalidateRect를 호출하는 것과 동일하다. 윈도의 무효화 영역은 현재 갱신 영역에 모인다. 갱신 영역은 윈도가 WM_PAINT 메시지를 보내는 다음 번에 칠하는 윈도의 영역이다. 윈도는 갱신 영역이 비어있지 않고 애플리케이션에 대해 대기한 그 이상의 메시지가 없을 때에만 윈도에 칠하기 명령을 보낸다.

2.       구문 : void Invalidate( BOOL bErase = TRUE );

3.       파라미터

bErase 칠하기 전에 갱신 영역은 지워야 한다면 TRUE. 갱신 영역의 어떤 부분을 지우기 마크되면 전체 갱신 영역이 지워진다. 영역은 윈도에 WM_ERASEBKGND 메시지를 보내 지워진다.

4.       리턴값 : 아무 것도 리턴하지 않는다.

l       InvalidateRect

1.       설명 : 특정 사각형을 무효화로 만든다. 윈도의 무효화 영역은 현재 갱신 영역에 쌓인다. 갱신 영역은 윈도가 윈도에 WM_PAINT 메시지를 보내는 다음 번에 칠하는 윈도의 영역이다. 윈도는 갱신 영역이 비어 있지 않고, 애플리케이션에 대해 대기한 그 이상의 메시지가 없을 때에만 윈도에 칠하는 명령을 보낸다. CWnd::ValidateRgn이나 CWnd::ValidateRect 함수를 호출하여 갱신 영역의 일 부분을 제거할 수 있다.

2.       구문 : void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );

3.       파라미터

lpRect 사용자 좌표로 무효화되는 사각형을 갖는 RECT 구조체나 CRect 오브젝트에 대한 포인터. NULL이면, 윈도는 윈도의 전체 사용자 영역을 무효화한다.

BErase 칠하기 전에 갱신 영역을 지워야 한다면 TRUE. 갱신 영역의 어떤 부분을 지우기 위해 마크되면 전체 갱신 영역이 지워진다. 영역은 윈도에 WM_ERASEBKGND 메시지를 보내 지운다.

             4.  리턴값 : 아무 것도 리턴하지 않는다.

l       ShowWindow

1.       설명 : 윈도의 보이기,숨기와 상태를 제어한다.

2.       구문 : BOOL ShowWindow( int nCmdShow );

3.       파라미터

nCmdShow 다음 플래그의 하나이다.

SW_HIDE

이 윈도를 숨기도 다른 윈도로 활성화를 전달한다.

SW_MINMIZE

윈도를 최소화하고 관리자 리스트에 있는 최상위 윈도를 활성화한다.

SW_RESTORE

윈도를 활성화 하고 표시한다. 윈도가 최대,최소화되어 있으면 원래 크기와 위치로 복원한다.

SW_SHOW

윈도를 현재 크기, 위치로 활성화 하고 디스플레이한다.

SW_SHOWMAXIMIZED

윈도를 활성화하고 최대 크기로 디스플레이한다.

SW_SHOWMINIMIZED

윈도를 활성화하고 아이콘으로 디스플레이한다.

SW_SHOWMINNOACTIVE

윈도를 아이콘으로 디스플레이하고 현재 활성화된 윈도는 활성화 상태로 있다. 즉 다른 윈도를 활성화하지 않는다.

SW_SHOWNA

윈도를 현 상태로 디스플레이하고 현재 활성화된 윈도는 활성화 상태로 있다.

SW_SHOWNOACTIVATE

윈도를 가장 최근의 크기와 위치로 디스플레이한다. 현재 활성화된 윈도가 활성화 상태로 있다.

SW_SHOWNOMAL

윈도를 활성화하고 디스플레이한다. 윈도가 최대, 최소화된 상태이면 원래 크기, 위치로 복원된다.

             4.  리턴값 : 윈도가 이미 나타나 있으면 비제로, 그렇지 않으면 0.

l       IsWindowVisible

1.       설명 : 윈도가 보이는지 보이지 않는지를 판단한다. 이 함수는 WS_VISIBLE 스타일이 윈도에 설정되어 있고 부모 윈도도 보이면 TRUE. IsWindowVisible은 실제로 윈도가 표시 화면에 보이는지를 판단하지는 않는다. ( 다른 윈도에 의해 숨겨질 수도 있다. )

2.       구문 : BOOL IsWindowVisible() const;

3.       파라미터 : 없음.

4.       리턴값 : 윈도가 보이면 비제로, 그렇지 않으면 0.

 

좌표 맵핑 함수

l       ClientToScreen

1.        설명 : 주어진 포인트나 스크린 좌표에 표시되는 사각형의 클라이언트 좌표를 스크린 좌표로 전환한다. 클라이언트 좌표는 CWnd의 클라이언트 영역의 왼쪽 상단을 기준으로 한다. 스크린 좌표는 화면 스크린의 왼쪽 상단을 기준으로 한다.

2.        구문 : public void ClientToScreen( LPPOINT lpPoint ) const; 

public void ClientToScreen( LPRECT lpRect ) const;

             3.  파라미터

                    lpPoint 클라이언트 좌표로 된 위치를 갖는 POINT 구조체나 CPoint 오브젝트에 대한 포인터. 이 위치 좌표의 내용은 계산된 스크린 좌표로 교체된다.

lpRect 클라이언트 좌표로 된 위치를 갖는 RECT 구조체나 CRect 오브젝트에 대한 포인터. 이 사각 좌표의 내용은 계산된 스크린 좌표로 교체된다.

             4.  리턴값 : 아무 것도 리턴하지 않는다.

l       ScreenToClient

1.       설명 : 윈도에 대한 스크린 좌표를 클라이언트 자표로 변환한다. 스크린 좌표는 스크린의 왼쪽 상단을 기준으로 한다. 클라이언트 좌표는 클라이언트 영역의 왼쪽 상단을 기준으로 한다.

2.       구문 : void ScreenToClient( LPPOINT lpPoint ) const;

void ScreenToClient( LPRECT lpRect ) const;

            

3.  파라미터

                 lpPoint 변환할 위치를 포함하는 POINT 구조체나 CPoint 오브젝트에 대한 포인터.

                 lpRect 변환할 위치를 포함하는 RECT 구조체나 CRect 오브젝트에 대한 포인터.

             4.  리턴값 : 아무 것도 리턴하지 않는다.

 

윈도 텍스트 함수

l       SetWindowText

1.       설명 : 지정된 텍스트로 윈도 타이틀을 정한다. 윈도가 컨트롤이면 컨트롤 안의 텍스트가 설정된다. 이 함수는 WM_SETTEXT 메시지를 그 윈도에 전한다.

2.       구문 : void SetWindowText( LPCTSTR lpszString );

3.       파라미터

lpszString 새로운 윈도 텍스트로 사용되는 널로 끝나는 문자열에 대한 포인터.

             4.  리턴값 : 아무 것도 리턴하지 않는다.

l       GetWindowText

1.       설명 : 현재 윈도 캡션의 텍스트를 얻는다. 편집박스에서 캡션 텍스트는 편집 컨트롤 자체에 있는 텍스트이다.

2.       구문 : int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;

void GetWindowText( CString& rString ) const;

             3.  파라미터

                 lpszStringBuf 널로 끝나는 윈도에 있는 문자 버퍼에 대한 포인터.

                 nMaxCount lpszStringBuf에 의해 가리키는 버퍼의 크기.

                 rString 윈도 텍스트로 체워지는 CString에 대한 참조.

4.  리턴값 : 첫번째 형식의 함수는 제공되는 버퍼에 실제 복사되는 문자들의 수이다. 두번째 형식의 함수는 아무 것도 리턴하지 않는다.  

l       GetWindowTextLength

1.       설명 : 현재 윈도 캡션의 길이를 얻는다. 윈도 캡션 텍스트를 담는 데 필요한 버퍼의 크기를 판단하기 위하여 문자 버퍼 포인터의 파라미터를 받는 GetWindowText 함수의 형식을 호출하기 전에 이 함수를 호출하라.

2.       구문 : int GetWindowTextLength() const;

3.       파라미터 : 없음.

4.       리턴값 : 현재 윈도 캡션에 있는 문자의 수.

l       SetFont

1.       설명 : 윈도의 현재 글꼴을 다른 글꼴로 변경한다.

2.       구문 : void SetFont( CFont* pFont, BOOL bRedraw = TRUE );

3.       파라미터

pFont 새로운 폰트를 지정한다.

bRedraw -  TRUE이면 윈도를 다시 그린다.

l       GetFont

1.       설명 : 윈도의 현재 글꼴에 대한 포인터를 리턴한다.

2.       구문 : CFont* GetFont() const;

3.       파라미터 : 없음.

4.       리턴값 : 윈도에 의해 사용되는 글꼴에 대한 포인터. 이것은 임시적이고 나중 사용을 위하여 보관되지 않아야 한다.

드래그-드롭 함수

l       DragAcceptFiles

1.       설명 : 윈도가 파일관리자에서 드래그되는 파일을 받는가를 나타내기 위하여 이 함수를 호출한다. 받는 것이 가능하면, 윈도는 WM_DROPFILE 메시지를 받는다. 보통 자신의 애플리케이션의 맨 처음 애플리케이션의 메인 윈도에서 이 함수를 호출한다.

2.       구문 : void DragAcceptFiles( BOOL bAccept = TRUE );

3.       파라미터

bAccept 윈도가 드래그 파일을 받으면 TRUE, 그렇지 않으면 FALSE.

4.       리턴값 : 아무 것도 리턴하지 않는다.

 

다이얼로그 박스 아이템 함수

l       DlgDirList

1.       설명 : 파일이나 디렉토리 리스팅을 지닌 리스트 박스를 채운다. DlgDirList는           LB_RESETCONTENT와 LB_DIR 메시지를 리스트 박스에 전한다. 주어진 경로와 일치하는 모든 파일들의 이름을 갖고 nIDListBox에 의해 지정된 리스트 박스를 채운다. 

2.       구문 : public int DlgDirList( LPTSTR lpPathSpec, int nIDListBox, int nIDStaticPath, UINT nFileType );

3.  파라미터

lpPathSpec 경로나 파일 이름을 함유하고 있는 널 종결 스트링을 가리킨다. DlgDirList는 수정을 충분히 함유할 정도로 긴 이 스트링을 수정한다. 더 많은 정보는 다음의 설명 부분을 참조한다.

nIDListBox 리스트 박스의 식별자를 지정한다. 만일 nIDListBox가 0이면, DlgDirList는 리스트 박스가 존재하지 않으며 하나의 박스도 채우려하지 않음을 나타낸다.

nIDStaticPath 현재의 드라이브와 디렉토리를 나타내는데에 사용되는 정적 텍스트 컨트롤의 식별자를 지정한다. 만일 nIDStaticPath가 0이면, DlgDirList는 그와 같은 텍스트 컨트롤이 존재하지 않음을 나타낸다.

nFileType 나타날 파일들의 속성들을 지정한다. 다음의 값들의 조합으로 나타날 수 있다.

DDL_READWRITE

부가적인 속성없이 데이터 파일을 읽고 쓴다.

DDL_READONLY

읽기 전용 파일들.

DDL_HIDDEN

히든 파일들.

DDL_SYSTEM

시스템 파일들.

DDL_DIRECTORY

디렉토리들.

DDL_ARCHIVE

아카이브

DDL_POSTMSGS

LB_DIR 플래그. 만일 LB_DIR 플래그가 설정되면, Windows는 애플리케이션 큐에 있는 DlgDirList에 발생된 메시지를 넣는다. 그렇지 않으면 다이얼로그박스 프로시저에 직접 전달한다.

DDL_DRIVES

드라이브. DDL_DRIVES 플래그가 설정되면 DDL_EXCLUSIVE 플래그가 자동으로 설정되기 때문에 드라이브와 파일을 갖는 디렉토리 리스트를 생성하기 위하여 DlgDirList를 두 번 호출해야 한다. 한 번은 DDL_DRIVES 플래그를 설정하여 호출한다.

DDL_EXCLUSIVE

Exclusive 비트. Exclusive 비트가 설정되면, 지정 타입의 파일만이 리스트되고, 그렇지 않으면 일반 파일과 지정 타입의 파일들만이 리스트된다.

             4.  리턴값 : 성공하면 비제로, 그렇지 않으면 0.

l       DlgDirListComboBox

1.       설명 : 주어진 경로와 파일 스펙과 주어진 위치와 주어진 타입과 일치하는 파일의 리스트를 지정 콤보박스에 채운다.

2.       구문 : public int DlgDirListComboBox( LPTSTR lpPathSpec, int nIDComboBox, int nIDStaticPath, UINT nFileType );

3.       파라미터

lpPathSpec 리스트되는 파일에 대한 디렉토리와 파일 스펙을 갖는 널로 끝나는 문자열 버퍼를 가리킨다. 이 파라미터가 가리키는 문자열이 파일 스펙을 갖지 않으면, *.*이 된다. 이 함수가 실행되면, 지정 문자열의 드라이브와 경로는 제거된다.

nIDComboBox 파일이 리스트되는 콤보박스의 리소스 ID. 이 파라미터가 0이면, DlgDirListComboBox는 어떤 콤보박스도 파일 문자열로 채워지지 않는다.

nIDStaticPath 현재 드라이브와 디렉토리로 설정되는 스태틱 컨트롤의 리소스 ID. 이 파라미터가 0이면, DlgDirListComboBox는 어떤 컨트롤도 이 정보를 갖지 않는다.

nFileType 리스트 되는 파일의 타입을 나타내는 플래그. DlgDirList와 동일.

4.       리턴값 : 성공하면 비제로, 그렇지 않으면 0.

l       GetDlgItemText

1.       설명 : 다이얼로그 박스에 있는 컨트롤에 연관된 타이틀이나 텍스트를 얻기 위해 이 멤버 함수를 호출한다. GetDlgItemText 멤버 함수는 lpStr에 의해 지정된 위치에 텍스트를 복사하며 복사한 텍스트의 바이트 수의 크기를 리턴한다.

2.       구문 : int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;

int GetDlgItemText( int nID, CString& rString ) const;

3.       파라미터

nID 타이틀이 검색될 컨트롤에 대한 정수 식별자를 지정한다.

lpStr 컨트롤의 타이틀과 텍스트를 받는 버퍼를 가리킨다.

nMaxCount lpStr에 복사될 스트링의 최대 길이(바이트)를 지정한다. 스트링이 nMaxCount보다 길다면, 짤리게 된다.

rString CString에 대한 참조이다.

4.  리턴값 : 널 문자의 종결을 포함하지 않은채, 버퍼에 복사된 바이트의 실제 수를 확인한다. 텍스트가 복사되지 않는다면, 0이다.

l       SendDlgItemMessage

1.       설명 : 컨트롤에 메시지를 보낸다. SendDlgItemMessage는 멤버 함수는 메시지가 처리될 때까지 리턴되지 않는다. SendDlgItemMessage를 이용하는 것은 주어진 컨트롤에 대해 CWnd*를 얻고 SendMessage 멤버 함수를 호출하는 것과 동일하다.

2.       구문 : LRESULT SendDlgItemMessage( int nID, UINT message, WPARAM wParam=0, LPARAM lParam=0 );

3.       파라미터

nID 메시지를 받을 다이얼로그 박스 컨트롤의 식별자를 지정한다.

Message 보내진 메시지를 지정한다.

WParam 부가적인 메시지 종속 정보를 지정한다.

LParam 부가적인 메시지 종속 정보를 지정한다.

4.  리턴값 : 컨트롤의 윈도 프로시저에 의해 리턴된 값을 지정한다. 또는 만일 컨트롤이 찾지 못하면 0이다.

 

메뉴 함수

l       GetMenu

1.       설명 : 이 윈도와 관련된 메뉴에 대한 포인터를 얻는다. 자식 윈도는 메뉴를 갖고 있지 않기 때문에, 자식 윈도에 대해 이 함수를 호출하지 않아야 한다.

2.       구문 : CMenu* GetMenu() const;

3.       파라미터 : 없음.

4.       리턴값 : 메뉴를 확인한다. CWnd가 메뉴를 갖지 않는다면 NULL이다. CWnd가 자식 윈도이면 리턴 값은 정의되지 않는다.

l       SetMenu

1.        설명 : 현재 매뉴를 다른 매뉴로 변경한다. 변경된 메뉴를 반영하기 위해 윈도가 다시 그려져야 한다. SetMenu는 이전 메뉴를 없애지 않는다. CMenu::DestroyMenu 함수를 호출하여 이전 메뉴를 없애야 한다.

2.        구문 : BOOL SetMenu( CMenu* pMenu );

3.        파라미터

pMenu 새로운 메뉴를 나타낸다. NULL이면 현재 메뉴가 없어진다.

             4.  리턴값 : 성공하면 비제로, 그렇지 않으면 0.

 

타이머 함수

l       SetTimer

1.        설명 : 시스템 타이머를 설치한다. 설정된 시간 간격마다 시스템은 WM_TIMER를 애플리케이션 메시지 큐나 TimerProc 콜백 함수에 보낸다. 타이머는 한정된 전역 자윈이다. 그러므로 프로그램은 타이머가 실제로 사용할 수 있는 것인지 확인하기 위해 SetTimer의 리턴 값을 검사하는 것이 중요하다.

2.        구문 : UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD );

 

3.  파라미터

                 nIDEvent 0이 아닌 타이머 ID를 지정한다.

                 nElapse 시간 간격(millisecond 단위)을 지정한다.

       lpfnTimer WM_TIMER를 처리하는 TimerProc 콜백(callback) 함수의 주소. NULL이면 WM_TIMER는 에플리케이션의 메시지 큐에 들어가도 CWnd에 의해 처리된다. lpfnTimer 콜백 함수는 TimerProc로 명명할 필요는 없으나 다음과 같이 정의되고 0을 리턴해야 한다.

       Void CALLBACK EXPORT TimerProc(

             HWND hWnd,                                 //handle of CWnd that called SetTimer

             UINT nMsg,                                   //WM_TIMER

             UINT nIDEvent,                              //timer identification

             DWORD dwTime               //system time

       );

4.  리턴값 : 새로운 타이머의 ID를 리턴한다. 타이머를 없애기 위해 KillTimer 함수에 이 값을 넘긴다. 성공이면 비제로, 그렇지 않으면 0.

 

경고 함수

l       FlashWindow

1.       설명 : 주어진 윈도를 한번 플래쉬하게 한다. 연속적인 플래쉬를 위해서는 시스템 타이머를 생성하고 반복적으로 FlashWindow를 호출한다. CWnd를 호출하는 것은 마치 CWnd가 비활성에서 활성으로의 변환을 의미하거나, 또는 그 역을 행하는 것처럼 윈도의 타이틀 바의 외형을 변화시키는 것을 의미한다.(비활성 타이틀 바는 활성화된 타이틀 바로 변화된다. 활성화된 타이틀 바는 비활성화된 바로 변환된다.) 전형적으로 윈도는 주의를 요구하거나 현재 입력 초점을 지니고 있지 않는 사용자에게 정보를 알려주기 위해 플래쉬하게 된다. 파라미터 bInvert는 윈도가 입력 초점을 취하거나 더 이상 플래쉬하지 않을 때에만 FALSE가 되어야 한다. 입력 초점을 취하기 위해 기다리는 동안 연속적인 호출하는 것에는 TRUE이어야 한다. 이 함수는 항상 최소화된 윈도들에 대해 0 이외의 값을 리턴한다. 윈도가 최소화되면, FlashWindow는 간단히 윈도의 아이콘을 플래쉬시킨다. bInvert는 최소화된 윈도들에 대해 무시한다.

2.       구문 : BOOL FlashWindow( BOOL bInvert );

3.       파라미터

bInvert CWnd가 플래쉬되었거나 윈래의 상태로 리턴했는지를 지정한다. CWnd는 bInvert가 TRUE이면 한 상태에서 다른 상태로 플래쉬한다. 만일 bInvert가 FALSE이면 윈도는 원래의 상태를(활성화에 관계없이) 리턴한다.

4.  리턴값 : FlashWindow 멤버 함수를 호출하기 전에 윈도가 활성화되었다면 비제로, 그 외의 경우에는 0이다.

l       MessageBox

1.       설명 : 애플리케이션 제공된 메시지와 캡션을 포함하는 윈도를 생성하고 디스플레이하며, 이미 정의된 아이콘들과 Message-Box Style 리스트에서 기술한 푸시 버튼의 조합을 추가할 수 있다. 메시지 박스 스타일의 리스트를 위해, Style 절에 있는 Message-Box Style을 참조한다. 애플리케이션에 메시지를 처리하기 위해 이 멤버 함수를 대신하여 전역 함수인 AfxMessageBox를 이용한다.

2.       구문 : int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );

3.       파라미터

lpszText 디스플레이될 메시지를 포함하는 CString 객체나 널 종결 스트링을 가리킨다.

lpszCaption 메시지 박스 캡션에 이용될 메시지를 포함하는 CString 객체나 널 종결 스트링을 가리킨다. 만일 lpszCaption이 NULL이면, 디폴트 캡션 Error가 이용된다.

nType 메시지 박스의 내용과 거동을 지정한다.

             4.  리턴값 : 함수의 결과를 지정한다. 메시지 박스를 생성할 만큼 충분한 메모리가 없다면 0이다.

 

윈도 메시지 함수

l       GetCurrentMessage

1.       설명 : 현재 처리되는 메시지에 대한 포인터를 얻는다. 보내는 정확한 메시지를 판단하기 위해서 메시지에 응답할 때 이 함수를 호출할 수 있다.

2.       구문 : static const MSG* PASCAL GetCurrentMessage();

3.       파라미터 : 없음.

4.       리턴값 : 현재 메지시를 정의하는 MSG 구조체에 대한 포인터. 

l       PreTranslateMessage

1.  설명 : TranslateMessage(virtual-key messages를 character messages로 변환하는 함수)와 DispatchMessage(The DispatchMessage function dispatches a message to a window procedure. It is typically used to dispatch a message retrieved by the GetMessage function.)

    Windows 함수로 그들이 디스패치하기 전에 윈도 메시지를 번역하기 위해 클래스 CWinApp에 의해 이용된다. 툴팁 메시지를 거르고 전달하기 위해 MFC에 의해 호출된다.

2.  구문 : virtual BOOL PreTranslateMessage( MSG* pMsg );

3.        파라미터

pMsg 처리할 메시지를 포함하는 MSG 구조체를 가리킨다.

             4.  리턴값 : 만일 메시지가 번역되고 디스패치가 안된다면 TRUE, 그렇지 않으면 FALSE.

l       SendMessage

1.       설명 : 윈도에 메시지를 보낸다. 보내지는 메시지는 즉시 전달되기 때문에 포스트되는 메시지와는 다르다. SendMessage는 그 메시지가 처리될 때까지 리턴하지 않는다. 메시지를 윈도의 메시지 큐에 보낸 후 이 값을 즉시 리턴한다.

2.       구문 : LRESULT SendMessage( UINT message, WPARAM wParam=0, LPARAM lParam=0 );

3.       파라미터

message 전송할 메시지를 나타낸다.

wParam 부가적인 메시지에 의존하는 정보를 나타낸다.

lParam 부가적인 메시지에 의존하는 정보를 나타낸다.

4.  리턴값 : 처리되는 메시지의 결과이다. 그것의 값은 보내진 메시지에 의존하므로 메시지에 따라 리턴값이 다르다.

l       PostMessage

1.       설명 : 애플리케이션의 메시지 큐에 메시지를 포스트한다. 메시지를 포스트하는 것은 메시지를 보내는 것과는 다르다. 메시지를 보내면 즉시 받게 된다. 메시지가 포스트될 때, 큐에 이미 있는 다른 메시지들의 뒤에 넣어지고 나중 어느 시점에서 애플리케이션에서 받게 된다. PostMessage는 메시지가 처리되는 것을 기다리지 않는다. 메시지 큐의 메시지는 GetMessage나 PeekMessage Windows 함수에 대해 호출함으로써 검색된다. Windows PostMessage 함수는 다른 애플리케이션에 액세스하는데 이용될 수 있다.

2.       구문 : BOOL PostMessage( UINT message, WPARAM wParam=0, LPARAM lParam=0 );

3.       파라미터

message 포스트되는 메시지.

wParam 부가적인 메시지 종속 정보를 지정한다. 이 파라미터의 내용은 전송된 메시지에 의존한다.

lParam 부가적인 메시지 종속 정보를 지정한다. 이 파라미터의 내용은 전송된 메시지에 의존한다.

             4.  리턴값 : 메시지가 전송되면 비제로, 그렇지 않으면 0.

 

오버라이드 가능한 함수

l       DefWindowProc

1.        설명 : 애플리케이션이 처리되지 않은 어떠한 윈도 메시지에 대한 디폴트 프로세싱을 제공하는 디폴트 윈도 프로시저를 호출한다. 이 멤버 함수는 모든 메시지가 처리됨을 확실히 한다. 윈도 프로시져에 의해 받은 것과 동일한 파리미터들을 지닌채 호출되어야 한다.

2.        구문 : virtual LRESULT DefWindowProc( UINT message, WPARAM wParam, LPARAM lParam );

3.        파라미터

message 처리될 윈도 메시지를 지정한다.

WParam 부가적인 메시지 의존 정보를 지정한다.

LParam 부가적인 메시지 의존 정보를 지정한다.

             4.  리턴값 : 보내진 메시지에 따라 다르다.

l       DoDataExchange                                                                                                                                                                                                                                                                                                                     

1.       설명 : 다이얼로그 데이터를 교환하고 유효화 하기 위해 프레임워크로 호출한다. 이 함수는 절대로 직접 호출하지 말아야 한다. 이 함수는 UpdateData 멤버 함수로 호출한다. 대화 박스의 컨트롤을 초기화하거나 다이얼로그 박스로부터의 데이터를 얻는데 UpdateData를 호출한다. Cdialog에서 애플리케이션 특정 다이얼로그 박스 클래스를 이끌어 내려면, 또는 프레임워크의 자동 데이터 교환과 유효화를 이용하기를 원한다면 이 멤버 함수를 오버라이드할 필요가 있다. ClassWizard는 다이얼로그 데이터교환(DDX)과 유효화(DDV) 전역 함수 호출의 의도된 데이터 맵을 포함하는 멤버 함수의 오버라이드 버전을 작성할 것이다. UpdateData(TRUE)가 호출되면 DoDataExchange 함수가 호출되면서 DDV_로 시작되는 함수들이 호출되고, 이 함수들은 컨트롤에 입력된 값이 이 컨트롤과 Value형 멤버 변수로 전송되기에 적합한 데이터 형으로 되어 있는지, 또 유효한 입력 범위 안에 있는지를 확인하는 일을 한다. 컨트롤에 입력된 값이 Value형 멤버 변수로 전송되기에 적합한 데이터 형이고 유효한 입력 범위 안에 있으면 DDX_로 시작하는 함수들이 호출되어 실제로 데이터가 전송되고, 그렇지 않으면 에러 메시지가 출력되고, 데이터 전송은 취소된다. 여기서 DDV와 DDX는 각각 Dialog Data Validation(다이얼로그 데이터 유효성 확인)과 Dialog Data exchange(다이얼로그 데이터 교환)의 약자이다. UpdateData(FALSE)가 호출되면 DoDataExchange함수가 호출되면서 DDX_로 시작하는 함수들이 호출되어 Value형 멤버 변수에 설정된 데이터가 컨트롤로 전송되어 화면에 출력된다. DoDataExchange 오버라이드 멤버 함수는 반드시 소스 파일에 있는 메크로 문장을 실행해야 한다.

2.       구문 : virtual void DoDataExchange( CDataExchange* pDX );

3.       파라미터

pDX CDataExchange 객체에 대한 포인터.

             4.  리턴값 : 아무 것도 리턴하지 않는다.

 

시스템 메시지 핸들러

l       OnSysCommand

1.        설명 : 사용자가 제어 메뉴에서 명령을 선택할 때나 또는 사용자가 최대화 또는 최소화 버튼을 선택할 때 이 함수가 호출된다. 기본적으로 설정된 값에 의해, OnSysCommand는 이전의 테이블에서 지정된 미리 정해진 동작에 대한 제어 메뉴의 요구를 수행한다. WM_SYSCOMMAND 메시지 내에서, 윈도는 내부적으로 nID의 네 개의 low-order 비트들을 사용한다. 애플리케이션이 nID의 값을 조사할 때, 애플리케이션은 올바른 결과를 얻기 위해 AND 연산자를 사용함으로써 0xFFF0 값과 nID값을 결합시켜야 한다. 제어 시스템 내의 메뉴 아이템은 GetSystmeMenu, AppendMenu, InsertMenu, 그리고 ModifyMenu 함수에 의해 변경될 수 있다. 제어 메뉴를 변경시키는 애플리케이션들은 WM_SYSCOMMAND 메시지와 OnSysCommand에 전달되어야 하는 애플리케이션이 다루지 않는 모든 WM_SYSCOMMAND 메시지를 처리해야만 한다. 애플리케이션이 추가하는 모든 명령어 값들은 애플리케이션이 처리해야만 하고, OnSysCommand에 전달될 수는 없다. 애플리케이션은 WM_SYSCOMMAND 메시지를 OnSysCommand에 전달함으로써 언제든지 모든 시스템 명령을 수행할 수 있다. 제어 메뉴에서 아이템을 선택하기 이해 정의된 단축키들을 눌렀는지를 해석하여 OnSysCommand를 호출하게 된다. 모든 단축키들이 WM_SYSCOMMAND 메시지로 해석된다.

2.        구문 : afx_msg void OnSysCommand( UINT nID, LPARAM lParam );

3.        파라미터

nID 요청되는 시스템 명령 타입을 지정한다. 이 파라미터는 다음 중 어느 값을 가질 수 있다.

SC_CLOSE

CWnd 객체를 종료한다.

SC_HOTKEY

애플리케이션에서 지정한 단축키와 관련된 CWnd 객체를 활성화한다. Lparam의 low-order 단어는 활성화되는 윈도의 HWND를 판별한다.

SC_HSCROLL

수평으로 스크롤한다.

SC_KEYMENU

키가 눌렸는지의 여부로 메뉴를 검색한다.

SC_MAXIMIZE

(or SC_ZOOMM)

CWnd를 최대화.

SC_MINIMIZE

(or SC_ICON)

CWnd를 최소화(아이콘화).

SC_MOUSEMENU

마우스 버튼이 눌렸는지의 여부로 메뉴를 검색한다.

SC_MOVE

CWnd 객체를 이동한다.

SC_NEXTWINDOW

다음 윈도로 이동한다.

SC_PREVWINDOW

이전의 윈도로 이동한다.

SC_RESTORE

정상적인 윈도의 크기와 위치로 윈도를 복원한다.

SC_SCREENSAVE

[부트] 섹션의 SYSTEM.INI 파일에서 지정한 화면 보호기를 실행한다.

SC_SIZE

CWnd 객체의 크기를 정한다.

SC_TASKLIST

윈도의 태스크 매니저 애플리케이션을 실행 또는 활성화한다.

SC_VSCROLL

수직으로 스크롤한다.

                    LParam 마우스로 제어 메뉴 명령을 선택하면 lParam은 커서의 좌표를 포함하게 된다. low-order 단어에는 x 좌표, 그리고 high-order 단어에는 y 좌표를 포함한다. 다른 경우에는 이 파라미터는 사용되지 않는다.

                    Low-order 단어에는 x 좌표, 그리고 high-order 단어에는 y 좌표를 포함한다. 다른 경우에는 이 파라미터는 사용되지 않는다. SC_HOTKEY, SC_SCREENSAVE.

             4.  리턴값 : 아무 것도 리턴하지 않는다.

 

일반 메시지 핸들러

l       OnCommand

1.        설명 : 프레임워크는 사용자가 메뉴의 아이템을 선택할 때나 자식 컨트롤이 주의 메시지를 전달할 때, 또는 accelerator 키스트로크가 전환될 때 이 멤버 함수를 호출한다. OnCommand는 컨트롤 주의와 ON_COMMAND 엔트리들에 대한 메시지 맵을 처리하며, 적절한 멤버 함수를 호출한다. WM_COMMAND 메시지를 다루기 위해 파생된 클래스에서 이 함수를 오버라이드 한다. 오버라이드는 베이스 클래스 OnCommand가 호출되지 않으면 메시지 맵을 처리하지 못한다. 프레임워크에서 이 함수를 호출함으로써 사용자의 애플리케이션이 윈도의 메시지를 다룰 수 있게 된다. 사용자의 함수에 전달된 파라미터들은 메시지가 수신되었을 때 프레임워크가 수신한 파라미터들을 반영하게 된다. 사용자가 이 함수의 기본 수행을 호출하면 이것은 사용자가 함수에 제공한 파라미터들을 사용하는 것이 아니라 메시지를 갖고 전달된 파라미터들을 원래대로 사용할 것이다.

2.        구문 : virtual BOOL OnCommand( WPARAM wParam, LPARAM lParam );

3.        파라미터

wParam wParam의 low-order 단어는 메뉴 아이템이나 컨트롤의 명령 ID를 확인한다. WParam이 high-order 단어는 만일 메시지가 컨트롤에서 나온 것이면 주의 메시지를 지정한다. 만일 메시지가 accelertor에서 나온 것이면 high-order 단어가 1이다. 만일 메시지가 메뉴에서 나온 것이면, high-order 단어가 0이다.

LParam 만일 메시지가 컨트롤에서 나온 것이면 메시지를 전송하는 컨트롤을 확인한다. 그 외

의 경우에는, lParam은 0이다.

4.        리턴값 : 만일 애플리케이션이 이 메시지를 처리한다면 0이외의 값, 그 외의 경우에는 0이다.

               // example for ON_COMMAND
               BEGIN_MESSAGE_MAP( CMyDoc, CDocument )
               //{{AFX_MSG_MAP( CMyDoc )
            ON_COMMAND( ID_MYCMD, OnMyCommand )
            // ... More entries to handle additional commands
            //}}AFX_MSG_MAP
               END_MESSAGE_MAP( )

l       OnActivate

1.       설명 : 프레임워크는 CWnd 객체가 활성화나 비활성화될 때에 이 멤버함수를 호출한다. 처음에는, 비활성화된 주 윈도는 OnActivate를 호출시키며, 그리고 나서 활성화된 주 윈도가 OnActivate를 호출한다. CWnd 객체가 마우스 클릭으로 활성화되면, OnMouseActivate 멤버 함수의 호출을 받는다.

2.       구문 : afx_msg void OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized );

3.       파라미터

nState CWnd가 활성화되거나 비활성화되고 있는지의 여부를 지정한다. 다음 값들 중 하나일 수 있다.

WM_INACTIVE

윈도가 비활성화 된다.

WM_ACTIVE

윈도가 마우스 클릭외의 다른 방법들을 통하여 활성화된다. (예를 들어, 윈도를 선택하기 위한 키보드 인터페이스의 사용을 통한다.)

WM_CLICKACTIVE

윈도가 마우스 클릭으로 활성화된다.

PWndOther 활성화되거나 비활성화된 CWnd에 대한포인터이다. 그 포인터는 NULL이 될 수 있으며, 일시적이다.

BMinimized 활성화되거나 비활성화된 CWnd의 최소화된 상태를 지정한다. TRUE 값은 윈도가 최소화됨을 가리킨다.

l       OnClose

1.       설명 : 프레임워크는 CWnd 또는 애플리케이션이 종결하는 신호로서 이 멤버함수를 호출한다. 디폴트 수행은 DestroyWindow를 호출한다.

2.       구문 : afx_msg void OnClose();

3.       파라미터 : 없음.

l       OnCreate

1.        설명 : Create나 CreateEx 멤버 함수 호출에 의해 생성되는 Windows 윈도를 애플리케이션이 요청할 때에 이 멤버 함수를 호출한다. CWnd 객체는 윈도가 생성된 후 그러나 가시화되기 전에 이 호출을 받는다. OnCreate는 Create나 CreateEx 멤버 함수가 리턴하기 전에 호출된다. 파생된 필수의 초기화를 수행하기 위해 이 멤버 함수는 오버라이드된다.

2.        구문 : afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct);

3.        파라미터

lpCreateStruct 생성될 CWnd 객체에 대한 정보를 함유하고 있는 CREATESTRUCT 구조체를 가리킨다.

4.        리턴값 : OnCreate는 CWnd 객체의 생성을 계속하기 위해 0을 리턴해야한다. 만일 애플리케이션이 1을 리턴하면, 그 윈도는 파괴된다.

l       OnDestroy

1.           설명 : 프레임워크는 파괴될 CWnd 객체에 정보를 주기 위해 이 멤버 함수를 호출한다. OnDestroy는 CWnd 객체가 스크린에서 제거된 후에 호출된다. OnDestroy는 처음에 파괸된 CWnd를 위해 호출되며, 그리고 나서 파괴되었기 때문에 CWnd의 자식 윈도를 위해 호출된다. 모든 자식 윈도들은 여전히 OnDestroy가 가동 중인 동안에 존재한다고 가정할 수 있다.

2.           구문 : afx_msg void OnDestroy()

l       OnEraseBkgnd

1.        설명 : 프레임워크는 CWnd 객체 배경을 지우려고 할 때 이 멤버 함수를 호출한다. 색칠을 위한 무효화된 영역을 준비하기 위해 호출한다. 디폴트 수행은 윈도 클래스 구조체의 hbrBackground 멤버에 의해 지정된 윈도 클래스 배경을 이용하여 배경을 지운다. 만일 hbrBackground 멤버가 NULL이면, OnEraseBkgnd의 오버라이드 버전은 배경색을 지워야 한다. 또한 브러시를 위한 UnrealizeObject를 처음에 호출함으로써 CWnd 좌표들을 갖고 의도된 브러시의 원점을 정렬해야 한다. 만일 오버라이드된 OnEraseBkgnd가 메시지를 처리하고 배경을 지운다면 OnEraseBkgnd는 WM_ERASEBKGND에 대한 응답으로써 0 이외의 값을 리턴한다. 이것은 더 이상 지우기가 필요하지 않다는 것을 가리킨다. 만일 그것이 0을 리턴한다면, 윈도는 지워야할 필요의 의미로 표시된 채 남아 있다.

2.        구문 : afx_msg BOOL OnEraseBkgnd( CDC* pDC );

3.        파라미터

pDC 디바이스 칸텍스트 객체를 지정한다.

4.        리턴값 : 만일 배경이 지워진다면 0 이외의 값, 그 외의 경우에는 0이다.

l       OnMove

1.       설명 : CWnd의 위치가 변경된 후에 호출된다.

2.       구문 : afx_msg void OnMove( int x, int y );

3.       파라미터

x 클라이언트 영역의 좌측 상단의 새로운 x좌표를 지정한다. 이 새로운 위치는 윈도를 겹쳐지게 하거나 생성하기 위해, 그리고 자식 윈도에 대한 부모 클라이언트 좌표를 위해 스크린 좌표로 주어진다.

Y 클라이언트 영역의 좌측 상단의 새로운 y좌표를 지정한다. 이 새로운 위치는 윈도를 겹쳐지게 하거나 생성하기 위해, 그리고 자식 윈도에 대한 부모 클라이언트 좌표를 위해 스크린 좌표로 주어진다.

l       OnPaint

1.       설명 : 윈도 또는 애플리케이션이 한 애플리케이션 윈도의 일부분을 다시 칠하도록 요구할 때 호출된다. UpdateWindow 또는 RedrawWindow 함수가 호출되면 WM_PAINT 메시지가 보내진다. 윈도는 결과적으로 RDW_INTERNALPAINT 플래그 세트를 가진 RedrawWindow 함수를 호출 함으로써 내부적인 색칠 메시지를 받을 수 있다. 이 경우, 윈도는 새로 갱신된 영역을 갖지 않을 수 있다. 애플리케이션은 윈도가 새로 갱신된 영역을 갖고 있는지 결정하기 위해 GetUpdateRect 함수를 호출해야 한다. 만약 GetUpdateRect 함수가 0인 값을 리턴하면 애플리케이션은 BeginPaint와 EndPaint 함수를 호출해서는 안된다. WM_PAINT 메시지는 무효영역과 RDW_INTERNALPAINT 플래그 세트를 가진 RedrawWindow 함수에 대한 호출 모두에 대해 발생할 수 있으므로 애플리케이션은 내부적으로 다시 칠하는 것 또는 각각의 WM_PAINT 메시지에 대한 내부 데이터 구조체들을 살펴봄으로써 새로 갱신해야 하는 것들을 체크 할 책임이 있다. 내부의 WM_PAINT 메시지는 단지 한 번만 윈도로 전송된다. UpdateWindow 함수는 WM_PAINT 메시지를 윈도로 보낸 후에, 윈도가 무용 지물이 되거나 RDW_INTERNALPAINT 플래그 세트를 가진 RedrawWindow 함수가 다시 호출될 때까지 WM_PAINT 메시지는 전송되거나 배치되지 않는다. 뷰 애플리케이션 내에 이미지를 렌더링하는데에 대한 정보는 CView::OnDraw를 참조한다.

2.       구문 : afx_msg void OnPoint();

l       OnSetFocus

1.       설명 : 입력 포커스를 얻은 후에 이 함수가 호출된다. 삽입 기호를 디스플레이하기 위해 이 시점에서 CWnd는 적절한 삽입 기호 함수를 호출해야 한다.

2.       구문 : afx_msg void OnSetFocus( CWnd* pOldWnd );

3.       파라미터 

pOldWnd 입력 포커스를 유실하는 CWnd 객체를 포함한다. 이 포인터는 임시적일 수 있으며, 나중에 사용하기 위해 저장할 수 없다.

l       OnShowWindow

1.       설명 : CWnd 객체가 감춰지거나 표시될 때 이 함수가 호출된다. 윈도는 ShowWindow 함수가 호출될 때, 겹쳐진 윈도가 최대화 또는 저장될 때, 또는 겹쳐졌거나 생성되는 윈도가 닫히거나(아이콘화되거나) 열릴 때(화면 상에 디스플레이될 때) 감춰지거나 표시 된다. 겹쳐진 윈도가 닫힐 때, 모든 그 윈도와 연관된 모든 생성되는 윈도는 감춰지게 된다.

2.       구문 : afx_msg void OnShowWindow( BOOL bShow, UINT nStatus );

3.       파라미터

bShow 윈도가 표시되는지를 지정한다. 윈도가 표시된다면 TRUE, 윈도가 감춰지니다면 FALSE이다.

NStatus 표시되는 윈도의 상태를 지정한다. ShowWindow 함수의 호출 때문에 메시지가 보내진다면 0, 그렇지 않으면 다음 값들 중 하나가 된다.

SW_PATENCLOSING

부모 윈도가 닫히거나(아이콘화되거나) 생성되는 윈도가 숨겨진다.

SW_PARENTOPENING

부모 윈도가 열리거나(디스플레이되거나)생성되는 윈도가 표시된다.

l       OnSize

1.       설명 : 윈도의 크기가 변화된 후 이 함수가 호출된다. OnSize에서 자식 윈도에 대해 SetScrollPos 또는 MoveWindow 함수가 호출된다면 CWnd가 다시 칠해지도록 하기 위해 SetScrollPos 또는 MoveWindow 함수의 bRedraw 파라미터는 0이 아닌 값이 되어야 한다.

2.       구문 : afx_msg void OnSize( UINT nType, int cx, int cy );

3.       파라미터

nType 크기를 재조절하도록 요청하는 형태를 지정한다. 이 파라미터는 다음 값들 중 하나가 될 수 있다.

SIZE_MAXIMIZED

윈도가 최대화되었다.

SIZE_MINIMIZED

윈도가 최소화되었다.

SIZE_RESTORED

윈도의 크기가 재조절되었다. 그러나 SIZE_MINIMIZED 또는 SIZE_MAXIMIZED가 적용된 것은 아니다.

SIZE_MAXHIDE

다른 윈도가 최대화될 때 생성되는 모든 윈도에 메시지가 전달된다.

SIZE_MAXSHOW

다른 윈도가 이전의 크길 환원되었을 때 생성되는 모든 윈도에 메시지가 전달된다.

                  Cx 클라이언트 영역의 새로운 폭을 지정한다.

                  Cy 클라이언트 영역의 새로운 높이를 지정한다.

 

컨트롤 메시지 핸들러

l       OnWndMsg

1.       설명 : WindowProc로 호출하거나, 메시지를 반영하는 동안 호출된다.

2.       구문 : virtual BOOL OnWndMsg( UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult );

3.       파라미터

message 보내진 메시지를 지정한다.

wParam 부가적인 메시지 종속 정보를 지정한다.

LParam 부가적인 메시지 종속 정보를 지정한다.

PResult WindowProc의 리턴 값이다. 메시지에 종속된다. NULL이 될 수 있다.      

4.       리턴값 : 만일 메시지가 다루어졌다면 0 이외의 값, 그 외의 경우에는 0이다.

 

입력 메시지 핸들러

l       OnChar

1.       설명 : 프레임워크는 넌시스템 문자로 키스트로크가 전환할 때 이 멤버 함수를 호출한다. 이 함수는 OnKeyUp 멤버 함수가 호출되기 이전에 OnKeyDown 멤버 함수가 호출된 이후에 호출된다. OnChar는 누르거나 풀었을 때의 키보드 키의 값을 포함한다. 눌러진 키들 간의 1대1 대응이 필요없고 OnChar의 호출이 발생되기 때문에, nFlags 상의 정보는 일반적으로 애플리케이션에는 유용하지 못하다. NFlags 에 있는 정보는 단짖 최근의 OnKeyUp 멤버 함수나 또는 OnChar의 호출을 처리하는 OnKeyDown 멤버 함수에 적용된다. ALT 키와 CTRL 키, 숫자 키패드 왼쪽에 회색의 INS, DEL, HOME, END, PAGE UP, PAGE DOWN, 그리고 화살키들, 그리고 숫자 패드에 있는 슬래쉬(/)와 엔터키이다. 다른 키보드들도 nFlags에서 이러한 확장된 키 비트를 지원할 수 있어야 한다.

2.       구문 : afx_msg void OnChar( UINT nChar, UINT nRepCnt, UINT nFlags );

3.       파라미터

nChar 키의 문자 코드를 포함한다.

NRepCnt 반복되는 카운트, 사용자가 키를 아래로 고정할 때 반복되는 키스트로크의 횟수를 포함한다.

NFlags 다음의 표에 나오는 스캔 코드, 키-변환 코드, 이전의 키 상태, 그리고 칸텍스트 코드들을 포함한다.

플래그들의 설명

0-7

스캔 코드(OEM 의존 값)

8

확장키, 기능키 또는 숫자 패드 상의 키(확장키라면 1, 이외의 키라면 0)

9-10

사용되지 않음.

11-12

윈도가 내부적으로 사용.

13

칸텍스트 코드( ALT 키가 눌려 있는 동안 키를 눌렀을 때 1, 이외의 경우 0)

14

이전 키의 상태(메시지가 보내지기 전에 키를 누를 때 1, 키를 놓았을 때 0)

15

전환 상태(키를 놓았을 대 1, 키를 눌렀을 때 0)

l       OnKeyDown

1.       설명 : 프레임워크는 넌시스템 키가 눌러졌을 때 이 멤버 함수를 호출한다. 넌시스템 키는 ALT 키가 눌러지지 않은 키보드의 키이거나 CWnd가 입력 초점일 때 눌러진 키보드의 키이다. 자동 반복 때문에, 이 함수는 OnKeyUp 멤버 함수가 호출되기 이전에 OnKeyDown 멤버 함수가 호출된 호출된 이후에 호출된다. 이전 키의 상태가 OnKeyDown의 호출이 첫 번째 다운 전환이거나 만복된 다운 전환인지의 여부를 결정하는데에 이용될 수 있다. Enhanced 키들은 주요 부분들 상의 오른쪽 ALT 키와 오른쪽 CTRL 키이다. INS, DEL, HOME, END, PAGE UP, PAGE DOWN, 그리고 화살키들, 그리고 숫자 패드에 있는 슬래쉬(/)와 엔터키이다. 다른 키보드들도 nFlags에서 이러한 확장된 키 비트를 제공 한다.

2.       구문 : afx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );

3.       파라미터 

nChar 주어진 키의 가상 키 코드를 지정한다.

NRepCnt 카운트를 반복한다. (키스트로크 횟수는 사용자가 키를 누르고 있는 결과이다.)

NFlags 다음 리스트에 나온것과 같은, 스캔 코드, 키 전환 코드, 이전 키의 상태, 그리고 칸텍스트 코드들이다. => OnChar 참조

l       OnKeyUp

1.       설명 : 프레임워크는 넌시스템 키가 눌러졌을 때 이 멤버 함수를 호출한다. . 넌시스템 키는 ALT 키가 눌러지지 않은 키보드의 키이거나 CWnd가 입력 초점일 때 눌러진 키보드의 키이다. 자동 반복 때문에, 이 함수는 OnKeyUp 멤버 함수가 호출되기 이전에 OnKeyDown 멤버 함수가 호출된 호출된 이후에 호출된다. 이전 키의 상태가 OnKeyDown의 호출이 첫 번째 다운 전환이거나 만복된 다운 전환인지의 여부를 결정하는데에 이용될 수 있다. Enhanced 키들은 주요 부분들 상의 오른쪽 ALT 키와 오른쪽 CTRL 키이다. INS, DEL, HOME, END, PAGE UP, PAGE DOWN, 그리고 화살키들, 그리고 숫자 패드에 있는 슬래쉬(/)와 엔터키이다. 다른 키보드들도 nFlags에서 이러한 확장된 키 비트를 제공 한다.

2.       구문 : afx_msg void OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags );

3.       파라미터 : OnKeyDown과 동일.

l       OnTimer

1.       설명 : 타이머를 설치하는데 사용된 SetTimer 함수 내에 지정된 각각의 시간 간격 후에 이 함수가 호출된다. 애플리케이션의 메시지 큐 내에 다른 어떤 메시지도 없을 때 DispatchMessage 윈도 함수는 WM_TIMER 메시지를 보낸다.

2.       구문 : afx_msg void OnTimer( UINT nIDEvent );

3.       파라미터

nIDEvent 타이머의 식별자를 지정한다.

 

MDI 메시지 핸들러

l       OnMDIActivate

1.        설명 : 프레임워크는 자식 윈도를 활성화 또는 비활성화시키기 위해 이 멤버 함수를 호출한다. MDI 자식 윈도는 MDI 프레임 윈도에 따라 활성화된다. 프레임이 활성화되면 OnMDIActivate 호출을 받고 마지막으로 활성화된 자식 윈도는 WM_NCACTIVATE 메시지를 받아 활성화된 윈도 프레임과 캡션 바를 그리게 된다. 그러나 또다른 OnMDIActivate 호출을 받지 않는다.

2.        구문 : afx_msg void OnMDIActivate( BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd );

3.        파라미터

bActivate 자식이 활성화되면 TRUE, 비활성화되면 FALSE이다.

PActivateWnd- MDI 자식 윈도가 활성화되도록 하는 포인터를 갖는다. MDI 자식 윈도가 전해주면 pActvateWnd는 활성화되는 자식 윈도에 대한 포인터를 갖는다. 이 포인터는 일시적인 것일 수 있으며, 이후에 사용하기 위해 저장해서는 안된다.

PDeactivateWnd MDI 자식 윈도가 비활성화되도록 하는 포인터를 갖는다. 이 포인터는 일시적인 것일 수 있으며 이후에 사용하기 위해 저장해서는 안된다. 

 


'C/C++/MFC' 카테고리의 다른 글

메뉴 항목 체크/ 해지 하기  (0) 2009.01.10
API 컨트롤 숨기기, 나타내기  (0) 2009.01.05
포인터 사용법  (0) 2009.01.05
MFC를 사용하여 웹 브라우저 만들기  (0) 2009.01.02
[API]버튼만들기  (0) 2009.01.02
posted by 유돌이
2009. 1. 5. 20:42 C/C++/MFC
1. 포인터(포인터 변수)의 개념

(1) 일반 변수와 포인터 변수의 차이점

   일반 변수는 정수/실수/문자 중 1개의 값을 저장한다.
   포인터 변수는 값이 아니라 "주소"(변수, 배열 등 저장공간이 할당된 것)를 저장한다.

	int i=100, data[100]={ 1, 3, 5, 7, 9 };
	int *p, *q;

	p = &i;		// 변수 i의 주소
	q = data;	// 배열 data의 주소

	*p = 200;	// i = 200; 과 동일
	*(q+1) = 30;	// data[1] = 30; 과 동일

(2) 포인터 변수를 이용하여 값을 사용/변경

    포인터를 이용하여 값을 사용하거나, 변경할 수 있는 범위는
    포인터가 가리키는 주소에 따라 결정된다.

    즉, 위 예에서 포인터 p는 i를 가리키므로 1개의 값만 사용/변경할 수 있다.
    그러나 q는 배열 data를 가리키므로 100개의 값을 사용/변경할 수 있다.

(3) 포인터 변수가 배열을 가리킬 때 --- 포인터 변수의 증감 연산

    - 포인터 연산자 '*' 대신에 배열의 인덱스 사용
	즉, *(q+3) 은 q[3] 과 동일하며, 배열과 동일한 형태로 사용할 수 있다.

    - 포인터 변수가 가리키는 배열의 위치 이동
	아래와 같이 포인터 변수가 가리키는 위치를 변경할 수 있다.
	단, 포인터가 가리키는 배열 data[100]의 인덱스 범위를 벗어날 수 없다.

		q = q + 2;
		q++;
		q--;


2. 포인터 배열

   여러 개의 변수(예: 100개의 변수)를 선언하는 대신에 배열을 선언하는 것과 같다.
   즉, 포인터 배열은 포인터 변수를 여러 개 선언하는 대신에 포인터 배열을 사용한다.

	int *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9, *p10;

   와 같이 10개의 포인터 변수를 선언하기 보다는

	int *p[10];

   로 선언하여 p1, p2, ..., p10 대신에 p[0], p[1], ..., p[9] 를 사용한다.


3. 다중 포인터

    1차원 포인터는 값(정수/실수/문자)이 저장된 변수(또는 배열)의 주소.
    2차원 포인터는 1차원 포인터 변수의 주소.
    3차원 포인터는 2차원 포인터 변수의 주소.
    n차원 포인터는 n-1차원 포인터 변수의 주소.

	int i=100, data[100]={ 1, 3, 5, 7, 9 };
	int *p, *q[10];		// 1차원 포인터
	int **dp1, **dp2;	// 2차원 포인터
	int ***tp1, ***tp2;	// 3차원 포인터

	p = &i;
	dp1 = &p;		// p는 포인터 변수
	tp1 = &dp1;

	q[2] = data;
	dp2 = q;		// q는 포인터 배열
	tp2 = &dp2;

   위 예에서

	i, *p, **dp1, ***tp1

   은 모두 동일하다. 마찬가지로 data[0], *q[2], **dp2, ***tp2 도 동일하다.


4. 포인터와 문자 배열, 스트링 상수의 관계

주의 1. 모든 배열의 이름은 배열에 할당된 공간의 첫번째 "주소"이다.

주의 2. 스트링 상수 "ABC"는 그 자체가 "주소"이며, 값을 변경할 수 없다.
	('A', 'B', 'C', '\0' 순서의 4문자가 저장된 "주소"를 지칭한다.
	 이 문자들은 static area에 자동으로 저장된다.)

	단, 문자배열의 초기화(예: char a[] = "ABC";)에 사용된 "ABC"는
	문자배열의 초기화를 편리하게 하기 위한 것일 뿐이며, 스트링 상수가 아니다.

<예1>
	char *p;
	char a[] = { 'A', 'B', 'C', '\0' };	// char a[] = "ABC"; 와 동일함!

	p = a;
	*p = 'X';
	*(p+1) = 'Y';
	*(p+2) = 'Z';

<예2>
	char *p = "ABC";	// p는 스트링 상수 "ABC"를 가리킴
	char b[100];

	strcpy(b, p);
	b[3] = *(p+1);
	b[4] = 'B';
	b[5] = '\0';

   포인터 p는 "스트링 상수"를 가리키고 있으므로 각 문자를 사용할 수 있으나,

	*p = 'X';
	strcpy(p, "XYZ");

   와 같이 값을 변경하는 것은 허용되지 않는다. 그러나 모든 포인터는 다른 주소를
   가리키게 할 수 있으므로

	p = "XYZ";
	p = b;

   와 같은 문장은 당연히 허용된다.(포인터의 정확한 이름은 "포인터 변수"이며,
   포인터 변수가 다른 주소를 가리키게 할 수 있다.)


<예3> char *p = "ABC"; 는

	char *p;
	p = "ABC"

   와 같다. 그러나 char a[] = "ABC"; 를

	char a[4];
	a = "ABC"

   와 같이 쓸 수는 없다.(배열이름은 고정된 주소값이며, 포인터 변수가 아니다.)


5. "구조체 변수"와 "구조체 포인터"에서 항목 선택 방법

(1) 연산자 '.' --- "구조체 변수"의 각 항목을 선택할 때(field selection)

	struct ABC {
	   int a;
	   int b;
	} x, *p;

    의 경우에 "구조체 변수" x의 항목 a 혹은 b를 선택할 때는

	x.a = 100;
	x.b = 200;

    과 같이 사용한다.

(2) 연산자 '->' --- "구조체 포인터"의 각 항목을 선택할 때(field selection)
   
    "구조체 포인터" p를 이용하여 a, b를 가리킬 때는 아래와 같이 사용한다.

	p = &x;		// 포인터 p는 변수 x를 가리키게 했음.
	p->a = 100;
	p->b = 200;

위 예에서 p는 포인터이므로 *p는 x와 동일하다. 따라서 일반적인 포인터 사용법에 따라
위 예는 아래와 같이 써도 무방하다.

	p = &x;
	(*p).a = 100;
	(*p).b = 200;

다만, p->a 가 (*p).a 보다 이해하기가 더 편하고 readability가 좋으므로
일반적으로 이렇게 쓰는 경우는 거의 없다.

<참고> (*p).a를 *p.a 라고 쓰면 안된다. 왜냐하면 '.'이 '*'보다 우선순위가 높아서
       *p.a 는 *(p.a) 와 같아지게 되기 때문이다.


6. 포인터 관련 선언문 예

	int *p;		--- 포인터 변수 p, 정수형 주소 저장
	char *p;	--- 포인터 변수 p, 문자형 주소 저장
	int *p[n];	--- 크기 n인 포인터 배열 p, (p[0], …, p[n-1]에 정수형 주소 저장)

	int *p();	--- 함수 p의 선언, "return값이 int pointer"인 함수 p
	int *p()[];	--- 함수 p의 선언, "return값이 int pointer 배열"인 함수 p

	int (*p)[n];	--- 포인터 변수 p, "크기 n인 정수형 배열 구조를 갖는 주소"를 저장
	int (*p)();	--- 포인터 변수 p, "return값이 int인 함수"의 주소 저장
	int (*p[])();	--- 포인터 배열 p, "return값이 int인 함수"의 주소 저장

'C/C++/MFC' 카테고리의 다른 글

API 컨트롤 숨기기, 나타내기  (0) 2009.01.05
CWnd 클래스  (0) 2009.01.05
MFC를 사용하여 웹 브라우저 만들기  (0) 2009.01.02
[API]버튼만들기  (0) 2009.01.02
Invalidate() , OnDraw(CDC* pDC)  (0) 2009.01.02
posted by 유돌이
2009. 1. 2. 17:57 C/C++/MFC

MFC를 사용하여 웹 브라우저 만들기


1. Project 생성

  • Application Type : SDI
  • Application Name : myWebBr

2. 메뉴 추가

아래의 그림을 참조하면서 메뉴를 만들자.

1) 메인 메뉴

Caption

이동(&M)

2) 이동(&M)의 서브 메뉴

각 ID에 해당하는 함수는 View 클래스에서 만들자.

ID

Caption

Function

Prompt

ID_MOVE_NEXT

앞으로(&N)

OnMoveNext()

앞으로 이동한다.

ID_MOVE_BACK

뒤로(&B)

OnMoveBack()

뒤로 이동한다.

Separator

 

 

 

ID_MOVE_STOP

멈춤(&S)

OnMoveStop()

페이지 다운로드를 멈춘다.

ID_MOVE_RELOAD

다시읽기(&R)

OnMoveReload()

현재 페이지를 다시 읽는다.

Separator

 

 

 

ID_MOVE_HOME

홈페이지(&H)

OnMoveHome()

기본으로 설정된 홈페이지로 이동한다.

3. 툴바 추가

1) 이동 메뉴에서 [뒤로], [앞으로], [멈춤]에 해당 하는 툴바를 만들자.

2) 만들어진 툴바와 메뉴 아이템과 ID를 연결하자.

Menu ID

ToolBar

ID_MOVE_BACK

[뒤로]

ID_MOVE_NEXT

[앞으로]

ID_MOVE_STOP

[멈춤]

 

4. 다이알로그바 만들기

 

1) ToolBar는 일반적으로 단순한 아이콘형 버튼들로 이루어진 도구 모음이지만, 다이얼로그바는 보다 다양한 윈도우 컨트롤을 포함할 수 있는 도구모음이라 하겠다. 다이얼로그바는 AppWizard가 자동으로 생성해 주지는 않지만 VC++가 제공하는 Components를 사용하여 간단하게 만들 수 있다.

Project -> Add To Project -> Components and Controls

로 이동하면 VC++이 제공하는 Gallery폴더로 이동하는데 그중에서

Visual C++ Components -> Dialog Bar

를 선택하여 아래와 같이 설정한후 "OK"버튼을 만든다.

Dialog bar Name : My Dialog Bar
Member variable Name : m_wndAddressBar

2) 다이얼로그바를 아래와 같이 편집하자

만들어진 Dialog Bar의 ID는 자동으로 "CG_ID_VIEW_DLGBAR"로 만들어 진다.

Control

Caption

ID

Function

Static Text

주 소

IDC_STATIC

 

Combo Box

 

 

 

Button

이 동

IDC_GO_SITE

OnGoSize()

OnGoSize()함수는  MainFrame클래스에서 만든다. 그러나 다이얼로그바에서 추가한 컨트롤의 ID는 WizardBar에 나타나지 않는다. 따라서 다이얼로그바의 컨트롤에서 전달되는 WM_COMMAND를 처리하기 위해 ON_COMMAND()매크로를 직접 작성한다.

(1) 먼저 MainFrame.h에 매크로 함수임을 선언하고

  1. // CMainFrame.h
  2. class CMainFrame : public CFrameWnd
  3. {
  4. ...        
  5. protected:
  6.         CDialogBar m_wndAddressBar;
  7.         //{{AFX_MSG(CMainFrame)
  8.         afx_msg void OnGoSite();
  9.         afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  10.                 // NOTE - the ClassWizard will add and remove member functions here.
  11.                 //    DO NOT EDIT what you see in these blocks of generated code!
  12.         //}}AFX_MSG
  13.         DECLARE_MESSAGE_MAP()
  14. };

(2) 메시지맵에 컨트롤의 ID와 연결되는 함수명을 정의하고

  1. // CMainFrame.cpp
  2. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  3.         ON_COMMAND(IDC_GO_SITE, OnGoSite)
  4.         ON_COMMAND_EX(CG_ID_VIEW_DLGBAR, OnBarCheck)
  5.         ON_UPDATE_COMMAND_UI(CG_ID_VIEW_DLGBAR, OnUpdateControlBarMenu)
  6.         //{{AFX_MSG_MAP(CMainFrame)
  7.                 // NOTE - the ClassWizard will add and remove mapping macros here.
  8.                 //    DO NOT EDIT what you see in these blocks of generated code !
  9.         ON_WM_CREATE()
  10.         //}}AFX_MSG_MAP
  11. END_MESSAGE_MAP()

(3) 실제 함수의 내용을 기술한다.

  1. #include "MyWebBrDoc.h"
  2. #include "MyWebBrView.h"
  3. void CMainFrame::OnGoSite()
  4. {
  5.         CComboBox *pCombo = (CComboBox*)(m_wndAddressBar.GetDlgItem(IDC_COMBO1));
  6.         if(pCombo)
  7.         {
  8.                 CString urlStr;
  9.                 pCombo->GetWindowText(urlStr);
  10.                 if(urlStr != "")
  11.                 {
  12.                         ((CMyWebBrView*)GetActiveView())->m_WebBr.Navigate(urlStr,NULL,NULL,NULL,NULL);
  13.                 }
  14.                 else
  15.                 {
  16.                         AfxMessageBox("input url\n");
  17.                 }
  18.         }
  19. }

5. 다이얼로그바의 토클 추가하기

메뉴를 추가하는 방법과 동일하게 ResourceView에서 작업하면된다.

  • 위치 : [보기]메뉴의 서브 메뉴로 추가 등록
  • ID : CG_ID_VIEW_DLGBAR
  • Caption : 주소 이동줄

DialogBar를 만들 때 사용된 ID를 그대로 사용하는 이유는 일반적으로 메뉴의 ID를 Toolbar가 그대로 사용하는 것과 동일하다. DialogBar에 주워진 자동처리 부분을 그대로 받아 사용하기 위해 메뉴의 ID를 DialogBar의 ID를 그대로 사용한다.

 

6. ActiveX 컨트롤 추가

웹문서를 보여주도록 프로그램은 매우 복잡한 프로그램으로, 컨트롤을 사용하지 않고는 거의 불가능하다고 볼 수 있다. 따라서 우리는 HTML문서를 보여주는 기능은 MS 익스플로에서 제공하는  ActiveX 컨트롤중 "웹브라우저 컨트롤"을 사용하겠다.

1) Microsoft웹브라우저 컨트롤 추가하기

Project -> Add To Project -> Components and Controls

로 이동하면 VC++이 제공하는 Gallery폴더로 이동하는데 그중에서

Resigtered ActiveX Controls -> Microsoft웹 브라우저

를 선택하여 아래와 같이 설정한후 "OK"버튼을 만든다.

그러면 ClassViewer에 "CWebBrowser2"  클래스가 추가된다.

7. Microsoft Control 제어하기

추가가된 컨트롤을 제어하기 위해 크게 두가지 작업을 해야 한다.

  • 웹 브라우저 컨트롤 생성하기
  • 웹 브라우저 컨트롤의 크기를 현재 View의 크기에 맞게 조정하기

1) 웹 브라우저 컨트롤 생성하기

웹 브라우저 컨트롤를 View클래스에서 사용하기 위해 헤더파일을 삽입하고 멤버 변수를 설정한다.

  1. #include "webbrowser2.h" //추가
  2. class CMyWebBrView : public CView
  3. {
  4. protected: // create from serialization only
  5.         CMyWebBrView();
  6.         DECLARE_DYNCREATE(CMyWebBrView)
  7. // Attributes
  8. public:
  9.         CMyWebBrDoc* GetDocument();
  10.         CWebBrowser2 m_WebBr; // 추가

2) ClassWizard 나 WizardBar에서 WM_CREATE와 WM_SIZE의 메시지 헨들러 함수를 만든다.

  1. int CMyWebBrView::OnCreate(LPCREATESTRUCT lpCreateStruct)
  2. {
  3.         if (CView::OnCreate(lpCreateStruct) == -1)
  4.                 return -1;
  5.         
  6.         // Source Append----------------------------------
  7.         CRect rc;
  8.         GetClientRect(rc);
  9.         if(m_WebBr.Create("Web Control", WS_CHILD|WS_VISIBLE,rc, this, 1010) == FALSE)
  10.         {
  11.                 AfxMessageBox("Fail \n");
  12.                 return -1;
  13.         }
  14.         m_WebBr.GoHome(); // 프로그램이 시작되면 자동으로 기본 페이지로 이동
  15.         // end Append--------------------------------------
  16.         return 0;
  17. }
  18. void CMyWebBrView::OnSize(UINT nType, int cx, int cy)
  19. {
  20.         CView::OnSize(nType, cx, cy);
  21.         
  22.         m_WebBr.MoveWindow(0,0,cx,cy); //추가(현재 View의 크기에 맞게 크기를 조정한다.
  23.         
  24. }

8. 메뉴 아이템 헨들러 추가하기

1) 메인메뉴-[이동]

이미 만들어진 각 메뉴에 해당하는 함수에 아래와 같은 내용으로 수정한다.

  1. void CMyWebBrView::OnMoveNext()
  2. {
  3.         m_WebBr.GoForward(); // 추가
  4.         
  5. }
  6. void CMyWebBrView::OnMoveBack()
  7. {
  8.         m_WebBr.GoBack(); // 추가
  9.         
  10. }
  11. void CMyWebBrView::OnMoveHome()
  12. {
  13.         m_WebBr.GoHome(); // 추가
  14.         
  15. }
  16. void CMyWebBrView::OnMoveStop()
  17. {
  18.         m_WebBr.Stop(); // 추가
  19.         
  20. }
  21. void CMyWebBrView::OnMoveRelaod()
  22. {
  23.         m_WebBr.Refresh(); // 추가
  24.         
  25. }

2) 업데이트 UI 핸들러 추가

다이얼로그바 중에 [앞으로][뒤로]에 해당 하는 화살표 도구의 활성화와 비활성화를 제어하도록 핸들러를 추가한다. 메뉴나 툴바의 버튼의 상태를 정하기 위해 아이템 ID에 연결된 업데이트 핸들러가 호출되는데 이를 "UPDATE_COMMAND_UI"라 한다.

(1) 먼저 ClassWizard에 ID_MOVE_BACK, ID_MOVE_NEXT에 해당하는 UPDATE_COMMAND_UI 메크로 함수를 작성한다.

(2) [뒤로][앞으로] 메뉴의 현재 상태를 저장하기 위한 변수를 선언하고, 위에서 만들어진 OnUpdateMoveBack(), OnUpdateMoveNext()함수의 내용을 수정한다.

  1. // CMyWebBrView.h
  2. class CMyWebBrView : public CView
  3. {
  4.  ...
  5. public:
  6.         BOOL m_bForward; // 추가
  7.         BOOL m_bBack; //---추가
  8.  ...
  9. };
  1. // CMyWebBrView.cpp
  2. CMyWebBrView::CMyWebBrView()
  3. {
  4.         m_bBack = FALSE;
  5.         m_bForward = FALSE;
  6. }
  1. void CMyWebBrView::OnUpdateMoveBack(CCmdUI* pCmdUI)
  2. {
  3.         pCmdUI->Enable(m_bBack);
  4.         
  5. }
  6. void CMyWebBrView::OnUpdateMoveNext(CCmdUI* pCmdUI)
  7. {
  8.         pCmdUI->Enable(m_bForward);
  9.         
  10. }

(3) ActiveX 컨트롤 이벤트

ActiveX 컨트롤은 컨트롤을 포함하고 있는 부모 윈도우에 자신의 정보를 넘겨주기 위해 이벤트를 발생시킨다. 부모 윈도우는 이 이벤트를 받기 위해 다음과 같은 매크로를 사용한다.

  1. // CMyWebBrView.h
  2. class CMyWebBrView : public CView
  3. {
  4. ...
  5.         DECLARE_MESSAGE_MAP()
  6.         DECLARE_EVENTSINK_MAP() // 추가
  7. };
  1. CMyWebBrView.cpp
  2. ...
  3. BEGIN_EVENTSINK_MAP(CMyWebBrView, CView)
  4.         ON_EVENT(CMyWebBrView, 1010,105, OnCommandStateChange, VTS_I4 VTS_BOOL)
  5. END_EVENTSINK_MAP()
  6. ...

(참고) ON_EVENT() 매크로

ON_EVENT(theClass, id, dispid, pfnHandler, vtsParams)

theClass

이벤트 맵이 정의된 클래스

id

이벤트를 보내는 ActiveX 컨트롤의 ID, 즉 웹 브라우저 컨트롤의 ID

dispid

받고자 하는 이벤트 ID로 컨트롤마다 정해져 있다.

ptnHandler

이벤트를 받을 때 호출되는 함수

vtsParams

이벤트 파라미터 타입

(4) 이벤트 핸들러 함수(OnCommandStateChange())

  1. // CMyWebBrView.h
  2. class CMyWebBrView : public CView
  3. {
  4. protected:
  5.         //{{AFX_MSG(CMyWebBrView)
  6.         afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  7.         afx_msg void OnSize(UINT nType, int cx, int cy);
  8.         afx_msg void OnMoveNext();
  9.         afx_msg void OnMoveBack();
  10.         afx_msg void OnMoveHome();
  11.         afx_msg void OnMoveStop();
  12.         afx_msg void OnMoveRelaod();
  13.         afx_msg void OnUpdateMoveBack(CCmdUI* pCmdUI);
  14.         afx_msg void OnUpdateMoveNext(CCmdUI* pCmdUI);
  15.         afx_msg void OnCommandStateChange(long Command, BOOL Enable); // 추가할 핸들러 함수
  16.         //}}AFX_MSG
  17.         DECLARE_MESSAGE_MAP()
  18.         DECLARE_EVENTSINK_MAP()
  1. // CMyWebBrView.cpp
  2. void CMyWebBrView::OnCommandStateChange(long Command, BOOL Enable)
  3. {
  4.         switch(Command)
  5.         {
  6.         case CSC_NAVIGATEFORWARD:
  7.                 m_bForward = Enable;
  8.                 break;
  9.         case CSC_NAVIGATEBACK:
  10.                 m_bBack = Enable;
  11.                 break;
  12.         }
  13. }

9. URL 입력창의 Enter 키 처리

주소 입력창에 주소를 입력한후 엔터키를 쳤을 경우 이동 버튼을 클릭한 것과 같은 효과를 내면된다. 즉, 엔터키를 쳤을 경우 OnGoSite()함수를 Call 하면 될 것이다.

CMainFrame에서 엔터키를 쳤다는 얘기는 윈도우 메시지가 "IDOK" 발생했다는 말과 동일하다. 그럼, "IDOK"가 발생하면 OnGoSite()함수를 Call 할 수 있도록 메크로만 작성해 주면된다.

  1. // CMainFrm.cpp
  2. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  3.         ON_COMMAND(IDC_GO_SITE, OnGoSite)
  4.         ON_COMMAND(IDOK, OnGoSite)
  5.         ON_COMMAND_EX(CG_ID_VIEW_MYDIALOGBAR, OnBarCheck)
  6.         ON_UPDATE_COMMAND_UI(CG_ID_VIEW_MYDIALOGBAR, OnUpdateControlBarMenu)
  7.         //{{AFX_MSG_MAP(CMainFrame)
  8.         ON_WM_CREATE()
  9.         //}}AFX_MSG_MAP
  10. END_MESSAGE_MAP()

10. 파일 열기 메뉴 사용하기

VC++이 기본적으로 제공하는 OnFileOpen()함수를 Overriding(재정의)해서 사용하면된다. View Class에서 "ID_FILE_OPEN"을 사용하여 매크로 함수를 만들고 아래와 같이 소스를 입력하면 된다.

1) View Class에서 마우스 오른쪽 버튼을 클릭한후 "Add Windows Message hadler"를 선택한다.

2) Class or object to handle에서 "ID_FILE_OPEN"을 선택한후 Add Handler를 선택하여 함수를 생성한다.

3) 만들어진 함수에 아래의 코드를 추가한다.

  1. void CWebBrView::OnFileOpen()
  2. {
  3.         CString str="*.htm;*.html";
  4.         CFileDialog fileDlg(TRUE, NULL, str, OFN_HIDEREADONLY,str);
  5.         if(fileDlg.DoModal() == IDOK)
  6.         {
  7.                 m_WebBr.Navigate(fileDlg.GetPathName(),NULL,NULL,NULL,NULL);
  8.         }
  9.      

'C/C++/MFC' 카테고리의 다른 글

CWnd 클래스  (0) 2009.01.05
포인터 사용법  (0) 2009.01.05
[API]버튼만들기  (0) 2009.01.02
Invalidate() , OnDraw(CDC* pDC)  (0) 2009.01.02
MFC (디바이스 컨텍스트와 관련 클래스)  (0) 2008.12.30
posted by 유돌이
2009. 1. 2. 17:55 C/C++/MFC
출처 왜목마을(臥木) | 체키럽
원문 http://blog.naver.com/pbk7318/9119084
#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass="Class";

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;

WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=(WNDPROC)WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);

hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);

while(GetMessage(&Message,0,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch(iMessage) {
case WM_CREATE:
CreateWindow("button","버튼1",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
20,20,100,23,hWnd,(HMENU)0,g_hInst,NULL);
CreateWindow("button","버튼2",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
20,50,70,23,hWnd,(HMENU)1,g_hInst,NULL);
CreateWindow("button","버튼3",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
20,80,150,33,hWnd,(HMENU)2,g_hInst,NULL);
return 0;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case 0:
MessageBox(hWnd,"첫번째 버튼을 누질렀습니다","Button",MB_OK);
break;
case 1:
MessageBox(hWnd,"두번째 버튼을 누질렀습니다","Button",MB_OK);
break;
case 2:
MessageBox(hWnd,"세번째 버튼을 누질렀습니다","Button",MB_OK);
break;
}

case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));

'C/C++/MFC' 카테고리의 다른 글

포인터 사용법  (0) 2009.01.05
MFC를 사용하여 웹 브라우저 만들기  (0) 2009.01.02
Invalidate() , OnDraw(CDC* pDC)  (0) 2009.01.02
MFC (디바이스 컨텍스트와 관련 클래스)  (0) 2008.12.30
윈도우즈와 메시지  (0) 2008.12.30
posted by 유돌이
2009. 1. 2. 17:53 C/C++/MFC

CView::OnDraw(CDC* pDC)

화면이나 프린트 DEVICE에 출력할 때 사용하는 함수입니다. pDC라는 CDC 즉 Device Context 클래스를 받아서 그 안에 화면 출력을 설정하면 바로 화면에 뿌려집니다. 다른 프로그램을 수행하다가 현 프로그램으로 돌아오거나 윈도 사이즈 크기를 변화시키면 화면에 현재 상태를 다시 보여 주어야 하는데 이 때 윈도에서는 OnDraw 함수를 호출합니다. 또한 프로그래머가 화면을 변화시키고 싶을 때 InValidateRect라는 함수를 실행시키면 OnDraw 함수가 실행됩니다.

.......................

......................

Invalidate()

전에 InvalidateRect라는 함수를 배웠을 것입니다. InvalidateRect란 화면의 특정 부분만 재표시하라는 함수이고 Invalidate 함수는 전체를 재표시하라는 함수입니다.안에 인자를 FALSE를 사용하면 화면의 배경색은 나두고 나머지 부분을 재출력하는 것이고 TRUE나 또는 Invalidate()함수를 사용하며 화면의 배경색부터 다시 출력하게 됩니다.

Invalidate(FALSE);//화면을 배경색은 그대로 나두고 재출력

Invalidate() 또는 Invalidate(TRUE);//화면을 배경색부터 재출력 

'C/C++/MFC' 카테고리의 다른 글

MFC를 사용하여 웹 브라우저 만들기  (0) 2009.01.02
[API]버튼만들기  (0) 2009.01.02
MFC (디바이스 컨텍스트와 관련 클래스)  (0) 2008.12.30
윈도우즈와 메시지  (0) 2008.12.30
API 기초??  (0) 2008.12.30
posted by 유돌이
2008. 12. 30. 23:16 C/C++/MFC

디바이스 컨텍스트(Device Context)

우리가 화면에 무언가를 출력하기 위해서는 반드시 윈도우즈 os로 부터 화면을 사용할수 있는 권한(디바이스 컨텍스트)를 얻어야함.(문자하나를 화면에 표시하려고 해도 얻어야만 화면출력이 가능)

디바이스 컨텍스트는 화면이나 프린터,플로터등 출력장치에 문자나 그림을 표시하기 위한 정보를 지닌 구조체이다. 윈도우즈에서 프로그램의 모든 출력요구는 디바이스 컨텍스트(DC)를 통해 이뤄진다.

 

GDI(Graphics Device Interface)

윈도우즈가 제공하는 GDI는 서로 다른 구조를 지닌 출력 장치에 대한 정보를 스스로 판단하고 분석하여 실제로 사용해야 할 드라이버를 로드한다. 응용프로그램과 여러 출력 장치간에 의사소통이 원활히 이루어지도록 통역관 역할을 하기때문에 출력장치마다 프로그램을 달리해야하는 프로그래머의 번거로운 작업을 대신해준다.

 

EX) 도화지 : DC   , 그림그리는 도구 : GDI

 

MFC의 디바이스 컨텍스트 관련 클래스

*DC는 무한정제공되는 것이 아니기 때문에 사용후에는 윈도우즈 os에 반납해야함

  DC클래스를 사용하면 DC를 사용후 윈도우즈에 반환해야하는 번거로운 절차가 없다.

 

1.CDC클래스

디바이스 컨텍스트에 대한 기초 클래스로 화면이나 프린터 출력에 관계된 대부분의 멤버함수를  포함한다.

2.CWindowDC

캡션바,메뉴바, 상태바 등 넌클라이언트 영역을 포함한 전체 윈도우를 표시하는 DC를 관리

3.CClientDC

캡션바,메뉴바,상태바 등을 제외한 클라이언트 영역만을 표시하는 DC를 관리

CClientDC의 생성자는 내부적으로 GetDC()함수를 호출하고 소멸자로 ReleaseDC()함수를 호출한다.

4.CPaintDC

WM_PAINT메시지가 발생했을 때 다시 그려져야 할 영역에 대한 DC를 관리하며 WM_PAINT의 메시지 핸들러인 OnPaint()함수에서 사용한다. 윈도우즈에서의 화면복원 기능을 수행하는

부분

내부적으로 BeginPaint()함수를 호출하고 소멸자는 EndPaint()함수를 호출한다.

5.CMetaFileDC

윈도우즈 메타파일(.WMF나 .EMF)에 대한 DC를 관리

메타파일:그래픽 이미지를 생성해낼수 있는 GDI명령들로 구성된 파일 ex)클립아트


'C/C++/MFC' 카테고리의 다른 글

[API]버튼만들기  (0) 2009.01.02
Invalidate() , OnDraw(CDC* pDC)  (0) 2009.01.02
윈도우즈와 메시지  (0) 2008.12.30
API 기초??  (0) 2008.12.30
const 사용법  (0) 2008.12.30
posted by 유돌이
2008. 12. 30. 23:14 C/C++/MFC

<윈도우 프로시저>

1. 윈도우 프로시저는 윈도우 클래스당 하나씩 배정된다
2. 같은 윈도우 클래스로 부터 만들어진 윈도우는 같은 윈도우 프로시저를 공유하며 동일한 동작을 한다

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam);
- 운영체제에 의해 호출되는 콜백함수이므로 사용자가 호출할 수 없다. SendMessage함수 등으로 간접 호출 가능
- 관심없는 메시지는 DefWindowProc으로 보내 디폴트 처리한다

3. 윈도우 프로시저는 재진입(ReEntrant)이 가능하다. 즉 WndProc 실행 중에 또 WndProc이 호출될 수 있다
- 재진입이 가능하므로 가급적이면 지역변수를 적게 사용하는 것이 좋다


<메시지 큐>

1. 큐 메시지 : 메시지 큐로 들어가는 메시지
- 주로 사용자 입력으로 생성되는 메시지
- WM_KEYDOWN, WM_LBUTTONDOWN, WM_PAINT, WM_TIMER, WM_QUIT 등
- 발생 직후 시스템 메시지 큐에 저장되어 스레드 메시지 큐로 보내지며 최종적으로 윈도우 프로시저에 의해 입력된 순서로 처리된다

2. 비큐 메시지 : 큐로 들어가지 않고 곧바고 윈도우 프로시저로 보내지는 메시지
- 윈도우에게 특정 사실을 알리거나 명령을 보내기 위해서 보내지는 메시지
- 신속하게 처리된다
- API함수 실행 중이나 또느 큐 메시지를 처리하는 중에 추가로 발생한다
- WM_CREATE, WM_SIZE, WM_MOVE, WM_DESTROY, WM_ACTIVATE

3. 운영체제는 하나의 시스템 메시지 큐를 관리하며 각 스레드 별로 하나씩 메시지 큐를 생성한다

4. 시스템 아이들(System Idle)
- 시스템 큐의 메시지를 하나씩 꺼내 어떤 스레드로 보낼 것인지 판단하여 스레드 메시지 큐로 보내고 시스템 큐에서 메시지를 지운다

5. 스레드 메시지 큐에 들어온 메시지는 메시지 루프에 의해 꺼내지고 해당 윈도우의 윈도우 프로시저로 보내져 처리되고 스레드 메시지 큐에서 삭제된다

6. 스레드가 생성될 때 시스템은 디폴트로 메시지 큐를 생성하지 않으며 스레드가 최초 GDI함수나 User함수를 호출할 때 메시지 큐를 만들어 준다


<메시지 루프>

typedef struct tagMSG{
 HWND hwnd;
 UINT message;
 WPARAM wParam;
 LPARAM lParam;
 DWORD time;  // 발생한 시간
 POINT pt;  // 발생시의 마우스 좌표
} MSG;  // 메시지 구조체

DWORD GetMessagePos(VOID);
LONG GetMessageTime(VOID);
- 마우스 트리플 클릭 등을 검출할 때 시간과 위치 정보가 중요하게 사용된다

BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
- 스레드 큐에 대기중인 메시지를 꺼내 첫번째 인수로 전달된 MSG구조체에 복사하고 메시지를 큐에서 제거하고 TRUE를 리턴한다
- 가져온 메시지가 WM_QUIT이면 FALSE를 리턴한다
- hWnd에 윈도우 핸들을 주면 이 윈도우와 그 차일드로 보내지는 메시지만 가져오고 NULL이면 현재 스레드에 속한 모든 메시지를 가져온다
- 메시지 필터링을 하지 않을 경우 세네번째 인자는 0으로 한다
- 메시지 필터링은 프로그램 무한 대기 상태에 빠지거나 오작동 위험이 있으므로 사용하지 않는게 좋다

TranslateMessage함수
- 가상키 입력을 문자 입력(WM_CHAR)로 바꾸는 역할을 한다
- 가상키 입력이 아니면 아무 처리도 하지 않는다

DispatchMessage함수
- 메시지를 윈도우 프로시저로 보내 처리하도록 한다
- MSG 구조체의 hwnd를 보고 정확하게 목적 윈도우의 메시지 처리 함수로 메시지를 전달한다


<PeekMessage>

1. GetMessage함수가 스레드에서 메시지를 가져올 때 메시지가 없다면 메시지가 들어올 때까지 무한 대기한다
- 이 시간에 다른 프로세스가 CPU를 쓸 수 있도록 양보한다
- 멀티 태스킹의 핵심 함수이다
- GetMessage에서 놀고 있는 시간을 데드 타임이라고 한다
- GEtMessage함수는 메시지를 받기 전에는 리턴하지 않으므로 데드 타임을 사용할 수 없다

BOOL PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg);
- 메시지 큐에서 메시지를 꺼내거나 검사하되 메시지가 없더라도 즉각 리턴한다
- 리턴값이 TRUE이면 메시지가 있다는 뜻이고 FALSE이면 메시지가 없다는 뜻이다
- wRemoveMsg 메시지가 있을 경우 큐에서 제거할 것이지 말것인지 지정(PM_REMOVE, PM_NOREMOVE)
- PM_NOREMOVE를 이용하여 살짝 엿보기만 할 수 있다

2. 메시지 펌프
- 다른 메시지를 처리하는 중에 큐에서 메시지를 꺼내는 코드
- PeekMessage를 이용한 메시지 펌프는 메시지 시스템을 이해하는데도 비중이 높은 주체이다


<아이들 타임>

1. 아이들 타임(Idle Time), 데드 타임(Dead Time)
- 응용 프로그램이 아무 것도 하지 않고 노는 시간
- 대부분 GetMessage함수에서 대기중이다

2. 아이들 타임 작업
- 아이들 타임에 할만한 작업은 툴바, 상태란 등의 상태 갱신, 사용하지 않는 자원 회수, 단순 장식을 위한 애니메이션
- 수시로 해야 하되 긴급하지 않고 속도를 희생하면서까지 정확할 필요 없는 작업을 한다

3. 아이들 타임을 찾는 방법
- 멀티 스레드나 타이머는 본질적이 아이들 타임이 아니다
- GetMessage함수를 경우 찾을 수 없고 PeekMessage함수를 써야 한다
- 아이들 타임 작업은 틈틈이 하되 꼭 필요할 때만 하도록 해야 한다

WaitMessage();
- 큐에 메시지가 들어올 때까지 대기하되 메시지가 없으면 다른 프로세스에게 실행 시간을 양보한다


<키 상태 조사하기>

WM_KEYDOWN
- 키가 눌러질 때 발생한다
- wParam을 읽어 어떤 키가 입력 되었는지 알 수 있다

SHORT GetKeyState(int nVirKey);
SHORT GetAsyncKeyState(int nKey);
- 키가 눌러져 있는지 떨어져 있는지 조사하는 함수
- 일반 키가 눌러졌을 경우 최상위 비트가 1, 그렇지 않으면 0. Caps Lock같은 토글키가 켜져 있으면 최하위 비트가 1, 아니면 0
- GetKeyState함수는 메시지가 발생했을 때 상황을 조사하고 GetAsyncKeyState함수는 메시지가 처리될 때 상황을 조사

BOOL GetKeyboardState(PBYTE lpKeyState);
- 모든 가상키의 상태를 한꺼번에 조사
- 256바이트의 배열을 넘겨주어야 한다

폴링(Polling)
- 입력 메시지를 받지 않고 자신이 원할 때 정보를 조사하는 방식
- 신호를 기다리는 것이 아니라 직접 조사한다


<트리플 클릭>
- 일정한 범위 내의 화면 좌표를 짧은 시간안에 연속으로 세번 누르는 동작


'C/C++/MFC' 카테고리의 다른 글

Invalidate() , OnDraw(CDC* pDC)  (0) 2009.01.02
MFC (디바이스 컨텍스트와 관련 클래스)  (0) 2008.12.30
API 기초??  (0) 2008.12.30
const 사용법  (0) 2008.12.30
C프로그래밍 별모양~  (0) 2008.12.30
posted by 유돌이
2008. 12. 30. 23:13 C/C++/MFC

기본형식

 

#include <windows.h>

/*
 - Winmain()의 첫번째 매개변수는 인스턴스 핸들(instance handle)이라 한다.
 
 - 핸들은 애플리케이션이 무언가를 식별하기 위해 사용하는 단순한 숫자다.
 
 - Winmain()에 사용되는 handle은 프로그램을 유일하게 식별한다.
 
 - 때로는 instance handle은 다른 windows함수를 호출할때 인자로 사용되기도 한다.

 

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

===============================
 
 - 초창기 윈도우즈에서는 사용자가 같은 프로그램을 두 번 이상 실행하면 해당 프로그램의
   인스턴스가 여러 개 생성되었다. 한 프로그램의 모든 인스턴스는 프로그램 코드와 더불어, 메

뉴나 대화상자
   템플릿 리소스와 같은 read-only데이터를 공유하였다.
   프로그램 실행시 WinMain()의 두번째 매개변수인 hPrevInstance를 이용하면 이미 다른 인스턴

스가 실행중인지를
   판단할 수 있었다.만약 다른 인스턴스가 실행중이라면 이전 인스턴스의 일부 데이터를 자신의

데이터 영역(data area)으로
   가져옴으로써 일부 작업을 생략할 수 있었다.
   하지만 32비트 윈도우즈에서는 이러한 개념이 더이상 사용되지 않음으로써 WinMain()의 두 번

째 매개변수는
   항상NULL이다.

 

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

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

   - WinMain()의 세 번째 매개변수는 프로그램을 실행할 때 사용하는 명령행(command line)이다

.
     일부 윈도우즈 프로그램은 시작할 때이를 이용하여 특정 파일을 메모리에 로드하기도 한다.
  
 

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

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

   - WinMain()의 네 번째 매개변수는 프로그램이 처음에 어떤 형태로 표시(display)될지를 나타

낸다.
   이 값에 따라 윈도우는 정상(normal)적인 현태, 화면 전체를 가득 채우는 최대화(maximized)

된형태, 그리고 작업 표시줄에 최소화(minimized)된형태 중 하나로 시작한다.
*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPerInstance,
       PSTR szCmdLine, int iCmdShow)
{
 /*
  첫번째 인자 - 윈도우 핸들
  두번째 인자 - 메시지 상자에 표시되는 문자열
  세번째 인자 - 메시지 상자의 캡션 바에 나타나는 문자열
  네번째 인자 - WINUSER.H에 정의된 MB_로 시작하는 상수값의 조합을 사용한다. 버튼의 종류결


                OR연산으로 상수값을 조합할수 있다.

  각문자열은 TEXT매크로가 감싸고 있다.
  보통 문자열은 TEXT매크로로 감쌀 필요는 없지만,
  나중에 유니코드 문자셋을 사용하도록 프로그램을 변환하려면 이렇게 하는 것이 좋다.
 */
 MessageBox (NULL, TEXT("Hello Windows!"), TEXT("HelloMsg"), 0);
 
 // 이 프로그램에서 MessageBox는 1을 리턴하지만 좀더 정확하게는 IDOK(WINUSER.H 에서 1로정

의)를 리턴한다.
 // MessageBox는 다른 값을 리턴할 수 있다.
 // ex) IDYES, IDNO, IDCANCLE, IDABORT, IDRETRY, IDIGNORE 등이 있다.

 return 0;
}

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

WPARAM과 LPARAM

 

WPARAM은 unsigned int 형이고, LPARAM은 unsigned long 형이다.

특징은, WPARAM는 주로 값들을 넘기는데 사용하고, LPARAM는 값들 뿐만 아니라 포인터를 넘겨줄 때 사용된다.

 

보통 window procedure 또는 callback function의 인자로, 먼저 나오는 wParam에 자주 쓰이는 정보를 기술하고, lParam에 추가 정보를 기술한다. 지금은 모두 32bit이므로 사용자가 정의하기 나름이다.

 

윈도우는 메시지 방식으로 프로그램이 진행된다. WPARAM나 LPARAM는 모두 MS에서 지정해 놓은 형식이다. 메시지를 보낼 때 추가로 부가적인 정보를 넣는 것이다. 구체적으로 어떤 정보인지는 아무도 모른다. 이것은 각 메시지마다 다르게 구성되어 있다는 것을 뜻한다.


WM_KEYDOWN을 사용한다면, MS에서 키다운 메시지에 대한 제어를 하고 싶을 땐 이것을 써라. 그리고 부가적인 정보에는 WPARAM와 LPARAM를 사용해라. WPARAM에는 Virtual Key정보를 주고 LPARAM에는 KeyData 정보를 넣을 것이니 구현은 사용자가 알아서 제어를 해라. 하는 것과 같다.

 

W : word

L : long

 

typedef UINT WPARAM;
typedef LONG LPARAM;

현재는 둘다 32bit 값을 갖는 데이터 타입이다. 그냥 unsigned int, long 이라 해도 상관은 없겠지만, 굳이 이름을 WPARAM, LPARAM이라 한 것은 예전 16bit OS 시절에 이름 붙인 것이 이어져 온 것이다. 당시는 WPARAM은 word 형 파라미터, LPARAM은 long 형 파라미터라는 뜻이어서, (여기서 word형은 2바이트, 참고로 dword(double word)형은 4바이트, byte형은 말그대로 1바이트) 그 때도 위처럼 typedef되었었다. 그런데 32bit OS로 오면서 int형이 4바이트가 되었다. 그런데 typedef은 그대로 두다보니 현재 WPARAM는 이름과는 다르게 4바이트를 갖는 형이되었다. 그러니까 지금은 WPARAM이나 LPARAM이나 4바이트를 갖는 데이터 타입이다. 참고로 windef.h를 보면 여러가지 데이터 타입이 typedef되어 있는 걸 볼 수 있다.

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


WNDCLASS 구조체

 

typedef struct tagWNDCLASS

{

        UINT style;

        WNDPROC lpfnWndProc;

        int cbClsExtra;

        int cbWndExtra

        HINSTANCE hInstace;

        HICON hIcon;

        HCURSOR hCursor;

        HBRUSH hbrBackground;

        LPCSTR lpszMenuNmae;

        LPCSTR lpsClassNmae;

}WNDCLASS;

 

style

   윈도우 클레스의 스타일 지정

   CreateWindow 함수에서 지정하는 개별 윈도우의 스타일과는 다름

 

lpfnWndProc

    메시지 처리 함수 지정

 

cbClsExtra

    윈도우 클레스에서 사용하고자 하는 여분의 메모리양을 바이트 수로 지정

    윈도우 클레스를 운영체제에 등록할때 메모리를 추가로 할당 받을 양 지정

 

cbWndExtra

     cbClsExtra 와 유사하되 개별 윈도우에서 사용하고자 하는 여분 메모리양 지정

     개별 윈도우가 만들어 질때 마다 메모리를 추가적으로 할당 받음

 

hInstance

    윈도우 클레스를 등록한 응용 프로그램의 인스턴스 핸들

    지정한 응용 프로그램이 윈도우 클레스의 소우주가 되며 소유주가 파괴 되면 윈도우도 같이

파괴 됨

 

hIcon

    윈도우가 최소화 되었을 때 보여줄 아이콘 지정

    NULL인 경우 아이콘이 그려야 할 때 WM_ICONERASEBKGND 메시지 발생

 

hCursor   

    클레스 커서 지정

    윈도우의 작업 영역에 마우스가 위치해 있을 때 사용될 커서 지정

    리소스에 커서를 추가한 후 LoadCursor 함수로 읽은 후 핸들러에 대입해주거나 시스템에 등

록되 어 있는 디폴트 커서중에서 하나를 대입해줌

    NULL로 지정될 경우 커서 정의가 되지 않으며 마우스 이동시마다 SetCursor함수를 호출하여

윈하는 커서로 변경해주어야 함

 

hbrBackground

    윈도우의 작업 영역에 칠할 배경 브러시 지정

    GetStockObject 나 그외 브러시를 만드는 함수를 사용하여 브러시 핸들을 얻은 후 대입

 

lpszMenuNmae

    윈도우가 사용할 메뉴를 지정

    CreateWindw 함수에서도 개별 윈도우를 만들때 메뉴를 지정하며 CreateWindw에서 별도의 메

뉴를 지정한 경우 이곳에서 지정한 메뉴는 무시됨

 

lpzsClass Name

    등록하고 자는 윈도우 클레스 이름을 나타내는 문자열

    윈도우 클레스 구분에 사용

    대 소문자 구분은 하지 안음


'C/C++/MFC' 카테고리의 다른 글

MFC (디바이스 컨텍스트와 관련 클래스)  (0) 2008.12.30
윈도우즈와 메시지  (0) 2008.12.30
const 사용법  (0) 2008.12.30
C프로그래밍 별모양~  (0) 2008.12.30
BHO 란?  (0) 2008.12.30
posted by 유돌이
prev 1 2 3 4 next