<Create 함수와 OnCreate 함수의 차이점>

 책을 읽다보니 Create 함수와 OnCreate 함수의 차이점이 정확히 이해되지 않습니다. Create 함수는 윈도우를 만드는 것인데, OnCreate 함수의 구체적인 역할이 무엇인지 궁금합니다.

 눈에 보이는 객체(즉, 윈도우를 가지는 객체)는 모두 Create 함수를 가지고 있습니다. 클래스 내에서 정의되어 있는 것도 있고, 상위의 Create를 부르는 객체도 있습니다. C++ 객체와 윈도우 객체를 맵핑하는 과정이 대개 이 함수 안에서 수행됩니다. Create 함수는 이미 말한 것처럼 HWND와 C++ 객체를 맵핑하는 함수이고, 이때 WM_CREATE 라는 메시지가 발생됩니다. 미 메시지를 받는 핸들러가 바로 OnCreate 입니다. 윈도우 메시지는 MS가 윈도우를 만들 때 어떤 메시지를 전달하려는 것이며, 만약 다른 작업이 필요하면 이 메시지를 참조해 어떤 처리를 수행하면 됩니다.

 

<동영상 반복 기능>

액티브X 컨트롤을 이용해 하나의 동영상을 계속적으로 반복, 재생하고자 합니다. 이것과 관련된 함수를 가르쳐 주세요.

Registered ActiveX Controls을 보세요. 만약 윈도우 미디어 플레이어라는 액티브X를 사용한다면 라인 두 개만 추가하면 됩니다.

 먼저 SetAutoRewind(BOOL bNewValue) 메쏘드에 bNewValue 값을 TRUE로 설정합니다. SetPlayCount(long nNewValue) 메쏘드에 nNewValue 값으로 replay시키고 싶은 값을 입력하는데, 10번을 연속 재생하려면 10을 입력합니다. 10000000 값을 넣으면 거의 무한대가 수행됩니다. 따라서 SetPlayCount() 내에 원하는 반복 회수에 해당하는 숫자를 입력합니다.

 

<문자열을 16진수로 변환하는 방법>

문자열을 16진수로 변환하는 방법을 알고 싶습니다. 예를 들어 문자열 "4A6F"를 16진수 4A6F 로 바꾸는 방법입니다.

다음 코드를 사용하면 가장 빠른 결과를 얻을 수 있습니다.

int n=0, len='A'-10;
while(*ch != '\0') {
     n *= 16;

     if(*ch >= '0' && *ch <= '9') n += *ch - '0';
     else if(*ch >= 'A' && *ch <= 'F') n += *ch - len;
     else return -1;   // error

     ch++;
}

앞의 코드는 ch에 문자열이 넘어오고 모두 대문자라고 가정했습니다. 두 번째로 사용할 수 있는 방법은 다음과 같습니다.

int n = 0;
sscanf(ch, "%x", &n);

 앞의 16진수 전용 코드보다는 느리지만 8진수, 10진수, 16진수 모두 다룰 수 있다는 장점을 갖고 있습니다.

 

<한글을 판정하는 방법>

프로그램 중에 이름과 패스워드를 받아오는 부분이 있습니다. 여기서 이름란은 영문과 한글만 받아오고 싶은데 한문, 일본어, 기타 특수 문자와 어떻게 구분해야 하는지 모르겠습니다.

일단 한글인지 아닌지는 다음의 함수를 사용하면 됩니다. 두 바이트 중 첫 번째 바이트를 검사해서 한글인지 판단합니다. 물론 코드페이지는 설정합니다. 일본어는 코드페이지를 바꾸고, 한자일 경우는 별 수 없이 코드 레인지를 검사해야 합니다. 윈도우 98에 있는 문자표를 보면 한자는 완성형이므로 0xcaa1 ~ 0xfdfe 로 이뤄져 있습니다.

BOOL IsDBCSLeadByteEx(
     UINT CodePage,    // identifier of code page
     BYTE TestChar      // character to test
);

일본어와 관련된 함수는 MSDN의 바이트 분류에서 나오는 가다카나를 판단하는 함수 및 기타 일본어 (코드 페이지 932) 관련 함수를 참고하세요.

 

<뷰 클래스에서 프레임 클래스>

뷰 클래스에서 프레임 클래스를 다루고자 하는데 어떻게 해야할 지 갈피를 잡지 못하고 있습니다.

뷰에서 프레임 클래스의 포인터를 얻는 방법은 SDI, MDI 에 따라 조금 다르지만 그 사용법은 거의 비슷합니다. 우선 SDI는 다음처럼 프레임의 포인터를 얻습니다.

CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();

MDI에서는 차일드 프레임이냐 메인 프레임이냐에 따라 다른데, 치일드 프레임은 먼저 메인 프레임을 얻은 후에야 얻을 수 있습니다.

CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
CChildFrame *pChild = (CChildFrame *)pFrame->GetActiveFrame();

이런 식으로 얻습니다.

 

<비주얼 C++에서 엔터키 처리법>

에디트 입력 박스에서 엔터키를 치면 무반응으로 나타납니다. 다음 에디트 박스로 넘어가는 방법을 가르쳐 주세요.

에디트 박스(다른 컨트롤도 마찬가지이다)에 무엇을 입력하다가 엔터키를 누르면 디폴트 버튼을 누른 것으로 됩니다. 보통 다이얼로그를 새로 만들면 OK버튼에 디폴트가 체크됩니다. 그래서 편법을 사용해 버튼을 하나 만들고 프로퍼티에 디폴트 버튼을 체크합니다. 이때 다른 버튼은 설정이 해지됩니다. 이 버튼은 보일 필요가 없으므로 visible 특성을 없애고 이동할 필요가 없는 컨트롤의 tab stop 특성을 해제합니다. 이동 순서는 Layout 메뉴의 tab order로 설정하고, 새로 만든 버튼의 함수에 컨트롤을 이동시키는 코드를 넣습니다.

void CReturnDlg::OnButtonDefault()
{
     // TODO: Add your control notification handler code here
     UpdateData(TRUE);

     // 처리할 내용
     NextDlgCtrl();
}

 

 <다이얼로그 박스 대신 프레임 생성하기>

다이얼로그 박스 대신에 하나의 프레임을 생성할 수는 없을까요. 아니면 다이얼로그 박스 안에서 뷰를 사용하는 방법은 무엇입니까?

다이얼로그에서도 뷰는 얼마든지 생성할 수 있습니다. 먼저 헤더파일에 CFrameWnd 객체와 View 객체를 하나씩 선언합니다.

이렇게 하면 CWnd로부터 상속받은 곳에서는 어디든지 뷰를 만들어 붙일 수 있습니다.

 

- the end of this article -