2014-09-16 2 views
0

Итак, для игрового проекта я создаю игровое окно (конечно), но я знаю только размер клиента, а не фактический размер. Я знаю, как рассчитать размер, но я получаю неправильные результаты, когда я тестирую, чтобы увидеть размер клиентской области (должен быть таким же, как и вход).Размер клиента Win32 и неправильный размер

void NewWindow(width, height) 
{ 
    // Code setting things up here. 
     if (!fullscreen) // Convert client size to window size. 
     { 
      style = WS_OVERLAPPEDWINDOW; 

      RECT r = RECT(); 
      r.top = 0; 
      r.bottom = height; 
      r.left = 0; 
      r.right = width; 

      AdjustWindowRect(&r, WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX |  WS_MAXIMIZEBOX, FALSE); 

      w = r.right; 
      h = r.bottom; 
     } 

     hWnd = CreateWindow(CLASS_NAME, title, style, CW_USEDEFAULT, CW_USEDEFAULT, w, h, NULL, NULL, GetModuleHandle(NULL), (LPVOID)NULL); 
} 

И код для получения размера клиента является:

Size Game::GetClientSize() 
{ 
    RECT r = RECT(); 
    GetClientRect(hWnd, &r); 

    return Size(r.right - r.left, r.bottom - r.top); 
} 

Я не уверен, где проблема, потому что AdjustWindowRect, кажется, выводит значение больше, чем то, что я положил в ...

Спасибо, Филипп

+0

В дополнение к уже указанным ответам, имейте в виду, что 'AdjustWindowRect', как и у старых, имеет ряд ошибок, например. неверные результаты для окна с линией меню. И ошибки в Windows имеют тенденцию сохраняться. Они становятся частью обратной совместимости. –

ответ

4

Стиль, который вы переходите на AdjustWindowRect, должен быть тем же самым, если вы переходите на страницу CreateWindow. В противном случае они будут несоответствовать. Вам также необходимо рассчитать ширину как правую - левую, а верхнюю - верхнюю, так как отрегулированный прямоугольник обычно имеет отрицательное начало относительно начала клиентской области.

3

Конечно, это; AdjustWindowRect() раздувает прямоугольник, чтобы добавить место для границы и заголовка, которые вы указали; в вашем случае левые и верхние значения (вероятно) становятся отрицательными, поэтому правые и нижние не представляют ширину и высоту. Вычислите ширину и высоту с помощью r.right - r.left и r.bottom - r.top, как и в вашей второй примерной функции.

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/ms632665(v=vs.85).aspx «Прямоугольник окна - это самый маленький прямоугольник, который полностью закрывает окно, которое включает в себя область клиента и неклиентской области ». –

-1
HWND windowHandle = NULL; 
WNDCLASS wndClass; 
wndclassex.style = CS_HREDRAW | CS_VREDRAW; 
wndclassex.lpfnWndProc = WndProc; 
wndclassex.cbClsExtra = 0; 
wndclassex.cbWndExtra = 0; 
wndclassex.hInstance = hInstance; 
wndclassex.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
wndclassex.hCursor = LoadCursor(NULL, IDC_ARROW); 
wndclassex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 
wndclassex.lpszMenuName = NULL; 
wndclassex.lpszClassName = L"Wnd"; 
RegisterClass(&wndClass); 
RECT rt = {0, 0, 640, 480}; 
AdjustWindowRect(&rt, WS_OVERLAPPEDWINDOW, FALSE); 
windowHandle = CreateWindow(L"Wnd", L"Wnd", WS_OVERLAPPEDWINDOW, 10, 10, rt.right - rt.left, rt.bottom - rt.top, NULL, NULL, hInstance, NULL); 
ShowWindow(windowHandle, SW_SHOW); 
Смежные вопросы