Размер границы фиксированного окна - PullRequest
1 голос
/ 20 августа 2010

Мне нужно как-то получить ширину (фиксированного) размера границы окна (вертикальной).По умолчанию в WinXP он довольно тонкий, но в Win7 с включенным Aero он намного толще.

Я думал, что GetSystemMetrics справится, но, похоже, он возвращает одинаковые значения для систем XP и Win7, я проверил следующеепараметры:

SM_CXBORDER
SM_CXEDGE
SM_CYFIXEDFRAME
SM_CYBORDER
SM_CXFIXEDFRAME

Но, как я уже писал, они возвращают одинаковые значения для обеих ОС независимо от того, насколько толстой является вертикальная граница окна.Окно было создано с флагами WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, если это поможет (* оно не является значительным).

Спасибо за любые мысли.

Кра

Ответы [ 6 ]

5 голосов
/ 20 августа 2010

Что ж, потратив некоторое время на это, вот код, который, кажется, возвращает реальную ширину границы (если кому-то это понадобится):

NONCLIENTMETRICS ncm;
OSVERSIONINFO OS;

OS.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);

GetVersionEx (&OS);

if (OS.dwMajorVersion < 6)
{
    ncm.cbSize = sizeof (ncm) - sizeof(ncm.iPaddedBorderWidth);
    SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);
    BorderWidth = ncm.iBorderWidth;
}
else
{
    ncm.cbSize = sizeof (ncm);
    SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);
    BorderWidth = ncm.iBorderWidth + ncm.iPaddedBorderWidth;
}

Полагаю, в нем все еще есть какой-то глюк, но он приемлем для меня :)) Глюк, о котором я знаю, заключается в том, что он вычисляет ширину границы значительного окна, если у вас есть всплывающее окно, оно немного отличается размер (но, например, в XP кажется, что вы не можете установить размер границы всплывающего окна, вы можете сделать это только для большого окна).

2 голосов
/ 27 марта 2011

Кра, ключевое слово DwmApi (для Vista и новее):

  1. DwmIsCompositionEnabled
  2. DwmGetWindowAttribute (DWMWA_EXTENDED_FRAME_BOUNDS)
2 голосов
/ 23 августа 2010

Если основная проблема заключается в том, что вам нужно вычислить размер «окна» для достижения желаемого клиентского прямоугольника, а затем пропустите математику.

AdjustWindowRectEx - гораздо более надежное решение на будущее.Даже AdjustWindowRect должен сделать некоторые предположения, так как без реального окна он не знает о полосах прокрутки или оборачивании меню: отправьте существующему окну сообщение WM_NCCALCSIZE , и DefWindowProc вычислит и вернет клиентскую область, которая в результате получится.Раздвиньте прямоугольник окна разницей между вычисленной и требуемой клиентской областью.

0 голосов
/ 22 июня 2016

Самое близкое, что я могу получить: -верх: GetSystemMetrics(SM_CXPADDEDBORDER) + GetSystemMetrics(SM_CYDLGFRAME) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION)внизу: GetSystemMetrics(SM_CXPADDEDBORDER) + GetSystemMetrics(SM_CYDLGFRAME)влево или вправо: GetSystemMetrics(SM_CXPADDEDBORDER) + GetSystemMetrics(SM_CXDLGFRAME)

Добавьте эти значения к размеру окна, чтобы получить желаемый размер клиента.

0 голосов
/ 20 августа 2010

GetWindowRect () возвращает координаты из DESKTOP в качестве источника.Вверху слева от экрана.

GetClientRect () возвращает координаты ОКОННОЙ ОБЛАСТИ КЛИЕНТА, с которой вы вызывали.

Вам необходимо преобразовать координаты из одной в другую.

Как указано в adf88, это делается с помощью ScreenToClient и ClientToScreen.«Экран» - это рабочий стол.

Поиск GetWindowRect (), GetClientRect (), ScreenToClient () и ClientToScreen ().

HTH

0 голосов
/ 20 августа 2010

Возможно GetClientRect - это то, что вам нужно вообще.В любом случае вы можете вычислить их по измерениям, возвращаемым GetClientRect и GetWindowRect

псевдокод:

wr = GetWindowRect()
cr = GetClientRect()

left_border_width = cr.left
right_border_width = wr.right - wr.left - cr.right
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...