2012-02-27 1 views
2

리소스 파일에 정의 된 대화 클라이언트 영역의 크기를 결정해야합니다.대화 상자 가져 오기 리소스 파일에 정의 된 크기

GetClientRect는 디자인 크기를 바탕 화면의 크기로 줄입니다. 화면 단위로 설계된 크기가 필요합니다. 나는 this이 대화 상자 리소스의 크기를 가져 오는 것을 목적으로하지만, 슬프게도 MFC를 사용합니다.

대화 상자가 열리고 HWND와 ID가 있습니다. MFC를 사용하지 않고 화면 단위로 dsign 크기를 얻으려면 어떻게해야합니까?

+0

대화 코드는 대화 상자의 리소스 ID로 CreateDialog를 호출 한 다음 GetClientRect를 호출하는 것과 같습니다. 리소스에서 실제로 템플릿을 구문 분석해야 할 것입니다. – pezcode

+0

@pezcode : 그래서 FindResource, LoadResource 및 LockResource를 사용하여 DLGTEMPLATE로 시작하는 대화 상자 리소스에 대한 포인터를 가져오고 거기에서 cx 및 cy 또는 대화 상자 단위의 크기를 얻습니다. 그런 다음 GetDialogBaseUnits를 사용하여 화면 단위로 변환 하시겠습니까? 프로세스 수명 동안 리소스가 잠긴 상태입니까? 여러 번 잠그지 않아야합니까? –

+0

클래식 XY 질문입니다. 그 정보로 정확히 무엇을 할 것인가를 알아 냈다고 가정 해 봅시다. –

답변

1
SIZE GetDialogSize(INT nResourceId, BOOL bApproximateCalcMethod = FALSE, LPCTSTR strDllName = NULL) 
{ 

    SIZE dlgSize = {0}; 
    HINSTANCE hModule = 0; 

    if(strDllName != NULL) 
     hModule= ::LoadLibrary(strDllName);    
    else 
     hModule = ::GetModuleHandle(NULL); 

    HRSRC hRsrc = ::FindResource(hModule, MAKEINTRESOURCE(nResourceId), RT_DIALOG); 

    HGLOBAL hTemplate = ::LoadResource(hModule, hRsrc); 

    DLGTEMPLATE* pTemplate = (DLGTEMPLATE*)::LockResource(hTemplate); 

    if (bApproximateCalcMethod) // the approximate method of calculating 
    { 
     LONG dlgBaseUnits = GetDialogBaseUnits(); 
     int baseunitX = LOWORD(dlgBaseUnits), baseunitY = HIWORD(dlgBaseUnits); 
     dlgSize.cx = MulDiv(pTemplate->cx, baseunitX, 4); 
     dlgSize.cy = MulDiv(pTemplate->cy, baseunitY, 8); 
    } 
    else // the accurate method of calculation 
    { 
     HWND hDlg = ::CreateDialogIndirect(0, pTemplate, NULL, DialogProc);   
     RECT rc = {0}; 
     ::GetWindowRect(hDlg, &rc); 
     ::DestroyWindow(hDlg); 

     dlgSize.cx = rc.right - rc.left; 
     dlgSize.cy = rc.bottom - rc.top; 
    } 

    UnlockResource(hTemplate); 
    ::FreeResource(hTemplate); 

    if(strDllName != NULL) 
     ::FreeLibrary(hModule); 

    return dlgSize; 
} 
+0

고마워요! 나는 pezcode의 힌트를 사용하여 이것을 더 많이 또는 더 적게 가졌지 만 대화 단위에서 화면 단위로의 변환은 여전히 ​​문제이며 정리 코드는 매우 유용합니다. 대화 상자가 데스크톱보다 큰 경우 정확한 방법으로 잘라낸 크기를 반환하지 않습니까? –

+0

MapDialogRect를 사용하여 대화 상자 단위에서 화면 단위로 변환 할 때 매우 좋은 결과를 얻었습니다. –

+0

MapDialogRect는 대화 단위를 화면 단위로 변환 할 때 완벽하게 작동합니다. 제 경우에는 HWND와 대화를 나눴습니다. "정확한 계산 방법"에서 GetWindowRect를 대체 할 수있는 hellkni9ht의 코드에서. –

관련 문제