불필요한 연산을 줄였다.
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;
}
'API' 카테고리의 다른 글
함수,변수 표기법(헝가리안) (2) | 2008.08.15 |
---|---|
레지스트리 쓰기, 삭제 함수 (1) | 2008.08.13 |
#if defined(_UNICODE) || defined(UNICODE) 디파인 or 연결시 (0) | 2008.08.08 |
DialogBoxIndirect 예제 심플 (2) | 2008.08.06 |
대화상자와 등록 정보 시트 소프트웨어 (0) | 2008.08.06 |
DialogBoxIndirect 사용 예제 (3) | 2008.08.06 |
cbWndExtra 이용 윈도우 인스턴스 별로 개별적인 메모리 할당... (1) | 2008.08.06 |