본문 바로가기
kxLibrary

OnInitDialog() 시 컨트롤 SetFocus 포커스가 안될때 예제

by 두루물 2010. 11. 19.

OnInitDialog() 시 컨트롤 SetFocus 포커스가 안될때 예제

"KFC1.0 으로 윈도우즈 SDK 플랫폼
API 프로그램을 MFC 보다 쉽게 하자"



SetFocus 는 OnInitDialog 시점에서는 말을 듣지 않는다.
윈도우가 생성되면서 WM_CREATE 처럼 윈도우 생성이 완전히 처리되기 이전인
그 중간 과정에서 시스템으로 부터 호출되는 프로시듀어 이기 때문이다.
따라서 OnCreate()는 물론,이 대목에서는 화면에 보여지기 이전이고 이는 당연한 현상이다.

즉,다른말로 표현하자면,윈도우를 생성하는 CreateWindow 함수가 아직 끝나기 이전이기 때문이다.

이때,특정 상황에 맞게 해당 컨트롤에 포커스를 주고 싶을때 KFC(kxLibrary 1.0) 에서는 단지 사용하기 쉽게 이미 준비된 함수인 SetTabOrder()를 호출해 주기만 하면 된다.

아래 예제는,이를 표현한 것으로, 다이얼로그 박스에 사용자ID,계정명,비밀번호를 입력 받는다.
단,사용자ID 로 로그인을 시도한 후 비밀번호가 틀렸다면 아래 창을 보여주면서 비밀번호 필드에(에디트컨트롤) 포커스를 주면 응용 프로그램 사용자는 더할 나위 없이 편할 것이며 이런 경우 SetTabOrder()는 윈도우가 보여지기 이전에 필요하다.
혹자는 일명 API를 C++ 클래스화 한 MFC나 WTL 의 아류작이라 할지 모르지만,이처럼 KFC 라이브러리는 제작자가 실사용 하면서 필요한 함수가 추가되면서 이루어진 라이브러리로 다양한 함수가 준비되어 있다.
*제작자는 Turbo-C,BorlandC++,MS-C7.0 부터 VC++1.0 초기부터 MFC10 이 나오는 지금까지도 윈도우즈 API와 MFC를 실무에서 섭렵하여 왔으며 그 MS-Windows 플랫폼에 관한 노하우의 일부가 공개되어 KFC라이브러리에 집대성되고 있는 것이다.
 
이처럼 KFC는,사용하기 쉬운 개발자 플랫폼이며 윈도우즈 메카니즘을 이해하는데 도움이 되는 풀소스코드 라이브러리 이다.

BOOL DlgLogin::OnInitDialog(HWND hWndFocus,LPARAM dwInitParam)
{ //dwInitParam is user param when create.
 KFCDlg::OnInitDialog(hWndFocus,dwInitParam);
 //SetIcon(KFCGetApp()->LoadIcon(IDI_MAINICON),FALSE);
 if(GetStyle() & WS_POPUP)
  CenterWindow(::GetParent(m_hWnd));
 
 SetDlgItemText(IDC_MSG,m_msg.str());
 
 SetDlgItemText(IDC_USER,m_user);
 SendDlgItemMessage(IDC_USER,EM_LIMITTEXT,60,0);
 SetDlgItemText(IDC_ACCT,m_acct);
 SendDlgItemMessage(IDC_ACCT,EM_LIMITTEXT,60,0);
 SetDlgItemText(IDC_PASS,m_pass);
 SendDlgItemMessage(IDC_PASS,EM_LIMITTEXT,60,0);

 EnableWindow(GetDlgItem(IDC_USER),m_focus == 0);
 EnableWindow(GetDlgItem(IDC_USER_NAME),m_focus == 0);
 EnableWindow(GetDlgItem(IDC_ACCT),m_focus == 1);
 EnableWindow(GetDlgItem(IDC_ACCT_NAME),m_focus == 1);
 EnableWindow(GetDlgItem(IDC_PASS),m_focus != 1);
 EnableWindow(GetDlgItem(IDC_PASS_NAME),m_focus != 1);
 if(m_focus == 0){
  //::SetFocus(::GetDlgItem(m_hWnd,IDC_USER));
  KFCWnd tempwnd(::GetDlgItem(m_hWnd,IDC_USER));
  tempwnd.SetTabOrder();
 }
 else if(m_focus == 1){
  //::SetFocus(::GetDlgItem(m_hWnd,IDC_ACCT));
  KFCWnd tempwnd(::GetDlgItem(m_hWnd,IDC_ACCT));
  tempwnd.SetTabOrder();
 }
 else{
  KFCWnd tempwnd(::GetDlgItem(m_hWnd,IDC_PASS));
  tempwnd.SetTabOrder();
  //::SetFocus(::GetDlgItem(m_hWnd,IDC_PASS));
 }
 return TRUE;//If no focus,return FALSE;
}