Есть ли способ условно проверить, использует ли окно полосу прокрутки? - PullRequest
1 голос
/ 17 июня 2019

В приложении, над которым я работаю, 2 кнопки нарисованы на экране относительно CListBox (назовем его myListBox), который расположен непосредственно слева от них.

Кнопки расположены в соответствии ск значениям, полученным из myListBox.GetClientRect().Тем не менее, когда полосы прокрутки присутствуют в myListBox, эти кнопки расположены неправильно, поскольку GetClientRect не учитывает такие вещи, как полосы прокрутки.

Мне любопытно, если вкоторый я могу проверить, если список в настоящее время использует полосу прокрутки, если это имеет смысл.Таким образом, я могу применить разницу к функции, которая перемещает мои кнопки так, чтобы я мог добиться правильного размещения независимо от наличия полосы прокрутки.

Я пробовал GetWindowRect, но я предполагаю, что окно инкапсулирует списокполе намного больше, чем само поле списка (задним числом это очевидно).

if (scrollbarinfo.rgstate[0] == (STATE_SYSTEM_INVISIBLE || 
STATE_SYSTEM_UNAVAILABLE))
{
    visible = false;
}

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Вы можете использовать функцию CWnd::GetScrollBarInfo и проверять rgstate член ее SCROLLBARINFO полученной структуры.

SCROLLBARINFO sbi { };
LONG lScrollBar = OBJID_VSCROLL; //can also be OBJID_HSCROLL or OBJID_CLIENT
GetScrollBarInfo(lScrollBar, &sbi);

if (sbi.rgstate[0] & STATE_SYSTEM_INVISIBLE)
{
    //Scroll bar is not visible at the moment.
}
else if (sbi.rgstate[0] & STATE_SYSTEM_UNAVAILABLE)
{
    //Scrol bar is disabled, but might be visible.
}
0 голосов
/ 18 июня 2019

Для ссылки на всех, кто мог бы увидеть этот пост, это то, что сработало для меня, учитывая мой оригинальный код, принимая во внимание то, что @Jovibor сказал:

int info = scrollbarinfo.rgstate[0];
if ((info & (STATE_SYSTEM_INVISIBLE | STATE_SYSTEM_UNAVAILABLE)) != 0)
{
visible = false;
}
...