API

DialogBoxIndirect 샘플 수정 및 코딩 최적화 작업

디버그정 2008. 8. 6. 20:09

불필요한 연산을 줄였다.

LPWORD lpwAlign (LPWORD ptr) // 4의 배수 단위 설정
{
 return (LPWORD)((((unsigned long)ptr+3)>>2)<<2);
}


int DialogBoxTemplate(HWND hParent, DLGPROC DlgProc)
{

 HGLOBAL hGlobal;
 LPDLGTEMPLATE lpdt;
 LPDLGITEMTEMPLATE lpdit;

 LPWORD lpw;
 LPWSTR lpwsz;
 LRESULT ret;

 // 글로벌 메모리 할당 및 포인터를 얻음
 hGlobal = GlobalAlloc(GMEM_ZEROINIT, 1024);
 if (!hGlobal) return 0;
 lpdt = (LPDLGTEMPLATE)GlobalLock(hGlobal);
 
 // 다이얼로그 속성, 모양 설정
 int iParentWidth, iParentHeight;
 if(hParent){
  RECT rc; GetWindowRect(hParent, &rc);
  iParentWidth=rc.right-rc.left;
  iParentHeight=rc.bottom-rc.top;
 }
 else{ // 부모가 정해지지 않은 경우(풀스크린이 대상)
  iParentWidth=GetSystemMetrics(SM_CXSCREEN);
  iParentHeight=GetSystemMetrics(SM_CYSCREEN);
 }
 // 템플릿에서 사용하는 단위는 실제픽셀보다 2배수 더 큰 듯하다.(고려)
 lpdt->cx=600/2;       // 너비
 lpdt->cy=400/2;       // 높이
 lpdt->x=(iParentWidth-(lpdt->cx*2))/4; // 시작 X위치
 lpdt->y=(iParentHeight-(lpdt->cy*2))/4; // 시작 Y위치
 
 lpdt->cdit=4;      // 자식 컨트롤의 수
 lpdt->style = WS_POPUP | WS_BORDER | WS_SYSMENU | DS_MODALFRAME | WS_CAPTION;
// lpdt->dwExtendedStyle=0;


 lpw = (LPWORD) (lpdt + 1); // 기본정보 설정후 다음 부분으로 이동
 *lpw++ = 0;   // no menu : 설정하지 않을시 0
 *lpw++ = 0;   // predefined dialog box class (by default)

 lstrcpyW((LPWSTR)lpw, L"블루윈도우"); // 유니코드 스트링임을 주의
    lpw += (lstrlenW((LPCWSTR)lpw) + 1);

    //-----------------------
    // Define an OK button.
    //-----------------------

 lpw = lpwAlign (lpw); // 4바이트 정렬
 lpdit = (LPDLGITEMTEMPLATE) lpw;
 lpdit->x  = 10; lpdit->y  = 50;
 lpdit->cx = 80; lpdit->cy = 15;
 lpdit->id = IDOK;  // OK button identifier
 lpdit->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;

 lpw = (LPWORD) (lpdit + 1);
 *lpw++ = 0xFFFF;
 *lpw++ = 0x0080;    // button class


 lstrcpyW((LPWSTR)lpw, L"Exit"); // 유니코드 스트링임을 주의
    lpw += (lstrlenW((LPCWSTR)lpw) + 1);
 *lpw++ = 0;              // no creation data


 //-----------------------
 // Define a Help button.
 //-----------------------
 lpw = lpwAlign (lpw);

 lpdit = (LPDLGITEMTEMPLATE) lpw;
 lpdit->x  = 10; lpdit->y  = 30;
 lpdit->cx = 80; lpdit->cy = 15;
 lpdit->id = 10000;    // Help button identifier
 lpdit->style = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON;

 lpw = (LPWORD) (lpdit + 1);
 *lpw++ = 0xFFFF;
 *lpw++ = 0x0080;                 // button class atom

 lstrcpyW((LPWSTR)lpw, L"DisplayInput"); // 유니코드 스트링임을 주의
    lpw += (lstrlenW((LPCWSTR)lpw) + 1);

 *lpw++ = 0;                      // no creation data


 //-----------------------
 // Define a EDIT.
 //-----------------------
 lpw = lpwAlign (lpw);

 lpdit = (LPDLGITEMTEMPLATE) lpw;
 lpdit->x  = 10; lpdit->y  = 10;
 lpdit->cx = 80; lpdit->cy = 12;
 lpdit->id = 10001;    // Help button identifier
 lpdit->style = ES_LEFT | WS_BORDER | WS_TABSTOP | WS_CHILD | WS_VISIBLE;

 lpw = (LPWORD) (lpdit + 1);
 *lpw++ = 0xFFFF;
 *lpw++ = 0x0081;                 // edit class atom

 lstrcpyW((LPWSTR)lpw, L"Edit들어가냐"); // 유니코드 스트링임을 주의
    lpw += (lstrlenW((LPCWSTR)lpw) + 1);
 
 *lpw++ = 0;                      // no creation data


 //-----------------------
 // Define a static text control.
 //-----------------------
 lpw = lpwAlign (lpw);

 lpdit = (LPDLGITEMTEMPLATE) lpw;
 lpdit->x  = 10; lpdit->y  = 80;
 lpdit->cx = 40; lpdit->cy = 20;
 lpdit->id = 200; //ID_TEXT;  // text identifier
 lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;

 lpw = (LPWORD) (lpdit + 1);
 *lpw++ = 0xFFFF;
 *lpw++ = 0x0082;                         // static class

 lstrcpyW((LPWSTR)lpw, L"static입니다."); // 유니코드 스트링임을 주의
    lpw += (lstrlenW((LPCWSTR)lpw) + 1);

 *lpw++ = 0;                              // no creation data

 GlobalUnlock(hGlobal);
 ret = DialogBoxIndirect(NULL,
 (LPDLGTEMPLATE) hGlobal,
 hParent,
 (DLGPROC) DlgProc);

 GlobalFree(hGlobal);

 return ret;



}