Как разместить полосу прокрутки не снизу, а сверху?

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Аватара пользователя
Сионист
Сообщения: 1078
Зарегистрирован: 31 мар 2014, 05:18

Как разместить полосу прокрутки не снизу, а сверху?

Сообщение Сионист » 06 янв 2016, 13:21

Как разместить полосу прокрутки не снизу, а сверху?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Re: Как разместить полосу прокрутки не снизу, а сверху?

Сообщение Romeo » 06 янв 2016, 13:52

Если скролбары были заданы в стиле окна (см. стили WS_HSCROLL, WS_VSCROLL), то повлиять на их положение никак нельзя (ну или я не знаю таких способов). Вариант получить хендл окна скролбара и переместить его тоже не прокатит, так как при таком создании скролбары не являются отдельными окнами и отрисовываются оконной процедурой главного окна.

Остаётся лишь один варинт - не задавать стили при создании окна, а создать скролбары руками. В этом случае можно будет указать их положение (хоть посередине окна расположить), но при этом придётся запрограммировать много вещей, о которых в первом подходе думать не приходится. Например, изменение размеров скролбаров и их шкал при ресайзе окна. Плюс, в некоторых случаях, вероятно, придётся пробрасывать дополнительные сообщения WM_HSCROLL/WM_VSCROLL для того, чтобы переиспользовать уже запрограммированное поведение окна на эти сообщения (например, во время того же самого ресайза). Возможно, понадобится и ещё какой-то тюнинг, но я не могу сейчас сказать какой - нужно пробовать и смотреть, что получится.

Создать скролбар руками можно, например, вот так:

Код: Выделить всё

// inside switch (message) in WndProc
case WM_CREATE:
        scrr1 = CreateWindow(_T("scrollbar"), NULL, WS_CHILD| WS_VISIBLE, 
                10, 10, 200, 20, hWnd,  NULL, hInst, NULL);
Ну и уже не знаю в какой раз, хочу заметить, что гугл, как всегда, помогает нам в этом вопросе. И не говори, что ты ничего не нашёл...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Аватара пользователя
Сионист
Сообщения: 1078
Зарегистрирован: 31 мар 2014, 05:18

Re: Как разместить полосу прокрутки не снизу, а сверху?

Сообщение Сионист » 10 янв 2016, 07:16

А что за функция _T?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Re: Как разместить полосу прокрутки не снизу, а сверху?

Сообщение Romeo » 10 янв 2016, 11:40

Это макрос, который разворачивается в L, если UNICODE выставлен, или в пустое значение, если не выставлен.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Аватара пользователя
Сионист
Сообщения: 1078
Зарегистрирован: 31 мар 2014, 05:18

Сообщение Сионист » 10 янв 2016, 14:53

А нафига он нужен? Забыть, что проект уникодовый, как то посложнее будет, чем накосячить с макросом и скобками.

Теперь бегунок заморозился в крайнем левом положении. Текст прокручивается правильно, диапазон правильный, но на экране бегунок остаётся в крайнем левом положении, несмотря на
SetScrollPos(Scroll, SB_HORZ, Position, TRUE);
. Что я делаю не так?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Re: Как разместить полосу прокрутки не снизу, а сверху?

Сообщение Romeo » 10 янв 2016, 16:34

Сионист писал(а):А нафига он нужен? Забыть, что проект уникодовый, как то посложнее будет, чем накосячить с макросом и скобками.
Для того, чтобы, меняя в настройках проекта всего лишь одно значения макроса, можно было легко собрать как уникодную, так и не уникодную сборку, не трогая код.
Сионист писал(а):Теперь бегунок заморозился в крайнем левом положении. Текст прокручивается правильно, диапазон правильный, но на экране бегунок остаётся в крайнем левом положении, несмотря на . Что я делаю не так?
Если бы я ещё знал после чего наступило это "теперь"... А вообще я с таким не сталкивался, так что подсказать не могу, но выглядит как какая-то грубая ошибка в использовании скролбара.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Аватара пользователя
Сионист
Сообщения: 1078
Зарегистрирован: 31 мар 2014, 05:18

Re: Как разместить полосу прокрутки не снизу, а сверху?

Сообщение Сионист » 10 янв 2016, 17:58

Для того, чтобы, меняя в настройках проекта всего лишь одно значения макроса, можно было легко собрать как уникодную, так и не уникодную сборку, не трогая код.
Зачем? Очевидно же, что проект или уникодовый, или нет.
Если бы я ещё знал после чего наступило это "теперь"...
После Ваших же советов, точнее попытки их применения. Как было раньше, написано в соседней теме, заменил на

Код: Выделить всё

Scroll=CreateWindow(L"scrollbar"                                       ,
                     nullptr                                            ,
                     WS_CHILD                                           |
                     WS_VISIBLE                                         ,
                     2                                                  ,
                     2                                                  ,
                     2                                                  ,
                     16                                                 ,
                     Window                                             ,
                     NULL                                               ,
                     (HINSTANCE)GetWindowLongPtr(Window, GWLP_HINSTANCE),
                     nullptr                                            );
, где Window - hwnd главного окна, в его оконную процедуру добавил

Код: Выделить всё

  case WM_HSCROLL     : PostMessage(ChartWindow, Message, First, Second);
  break;
, (

Код: Выделить всё

LRESULT CALLBACK                 MainWindowWindowProcedure                    (      HWND                    Window               ,
                                                                                     UINT                    Message              ,
                                                                                     WPARAM                  First                ,
                                                                                     LPARAM                  Second               )
). WM_HSCROLL с LOWORD(First), равными SB_LINELEFT, SB_LINERIGHT и SB_PAGERIGHT проходят, Position инкремируется и декремируется, но SetScrollPos не даёт ни каких видимых эффектов, ползунок сколбара остаётся на месте, а раньше ползал. И SetScrollRange похоже, что не работает: при отключении ограничений в принимающей оконной процедуре скролинг пошёл за установленную границу.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Re: Как разместить полосу прокрутки не снизу, а сверху?

Сообщение Romeo » 10 янв 2016, 18:25

Сионист писал(а):Зачем? Очевидно же, что проект или уникодовый, или нет.
Совсем не очевидно. Кому-то могут понадобиться оба варианта сборки. Ничего удивительного в таком требовании не вижу. Если этот механизм был придуман, то в любом случае он кому-то был нужен, разве не так? Если конкретно тебе он не нужен, просто его не используй.
Сионист писал(а):После Ваших же советов, точнее попытки его применения...
Сионист писал(а):SetScrollPos(Scroll, SB_HORZ, Position, TRUE);
Я такого точно не советовал. Если скролбар создан, как отдельное окно, то второй параметр неверен. Там должен стоять SB_CTL. Ещё раз внимательно прочти документацию. Скорее всего поэтому бегунок и не двигается.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Аватара пользователя
Сионист
Сообщения: 1078
Зарегистрирован: 31 мар 2014, 05:18

Сообщение Сионист » 10 янв 2016, 18:48

В описании SetScrollRange написано:
Handle to a scroll bar control or a window with a standard scroll bar, depending on the value of the nBar parameter.
. Но если передать hwnd форточки со скролом, то создаётся скролл внизу форточки, чей hwnd передан в функцию, даже если в ней уже создан скролл с помощью CreateWindow. А когда передаю hwnd самого созданного с помощью CreateWindow скролла, то походу ничего не срабатывает. И в описании SetScrollPos та же строчка, но если передать hwnd окна со скролом, то перемещается ползунок скрола внизу окна, созданного с помощью SetScrollRange, а если передать hwnd самого скролла, то функция не срабатывает. А как задать рендж и пос, передав hwnd самого скрола? По msdn получается, что обе функции работают и с форточкой, содержащей скролл, и с самим скролом, но тест подтверждает: даже после SetScrollPos старшее слово First при LOWORD(First), равном SB_THUMBPOSITION, остаётся равно нолю.
Я такого точно не советовал. Если скролбар создан, как отдельное окно, то второй параметр неверен. Там должен стоять SB_CTL. Ещё раз внимательно прочти документацию. Скорее всего поэтому бегунок и не двигается.
Теперь ол комплит, только длина бегунка на скролле так и не меняется.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Re: Как разместить полосу прокрутки не снизу, а сверху?

Сообщение Romeo » 10 янв 2016, 19:08

А в SetScrollRange точно SB_CTL передаётся вторым параметром? ;)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Ответить