Как разместить полосу прокрутки не снизу, а сверху?
Модераторы: Duncon, Hawk, Romeo, Eugie
Как разместить полосу прокрутки не снизу, а сверху?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Если скролбары были заданы в стиле окна (см. стили WS_HSCROLL, WS_VSCROLL), то повлиять на их положение никак нельзя (ну или я не знаю таких способов). Вариант получить хендл окна скролбара и переместить его тоже не прокатит, так как при таком создании скролбары не являются отдельными окнами и отрисовываются оконной процедурой главного окна.
Остаётся лишь один варинт - не задавать стили при создании окна, а создать скролбары руками. В этом случае можно будет указать их положение (хоть посередине окна расположить), но при этом придётся запрограммировать много вещей, о которых в первом подходе думать не приходится. Например, изменение размеров скролбаров и их шкал при ресайзе окна. Плюс, в некоторых случаях, вероятно, придётся пробрасывать дополнительные сообщения WM_HSCROLL/WM_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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
А что за функция _T?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Это макрос, который разворачивается в L, если UNICODE выставлен, или в пустое значение, если не выставлен.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
А нафига он нужен? Забыть, что проект уникодовый, как то посложнее будет, чем накосячить с макросом и скобками.
Теперь бегунок заморозился в крайнем левом положении. Текст прокручивается правильно, диапазон правильный, но на экране бегунок остаётся в крайнем левом положении, несмотря на
Теперь бегунок заморозился в крайнем левом положении. Текст прокручивается правильно, диапазон правильный, но на экране бегунок остаётся в крайнем левом положении, несмотря на
. Что я делаю не так?SetScrollPos(Scroll, SB_HORZ, Position, TRUE);
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Для того, чтобы, меняя в настройках проекта всего лишь одно значения макроса, можно было легко собрать как уникодную, так и не уникодную сборку, не трогая код.Сионист писал(а):А нафига он нужен? Забыть, что проект уникодовый, как то посложнее будет, чем накосячить с макросом и скобками.
Если бы я ещё знал после чего наступило это "теперь"... А вообще я с таким не сталкивался, так что подсказать не могу, но выглядит как какая-то грубая ошибка в использовании скролбара.Сионист писал(а):Теперь бегунок заморозился в крайнем левом положении. Текст прокручивается правильно, диапазон правильный, но на экране бегунок остаётся в крайнем левом положении, несмотря на . Что я делаю не так?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Зачем? Очевидно же, что проект или уникодовый, или нет.Для того, чтобы, меняя в настройках проекта всего лишь одно значения макроса, можно было легко собрать как уникодную, так и не уникодную сборку, не трогая код.
После Ваших же советов, точнее попытки их применения. Как было раньше, написано в соседней теме, заменил наЕсли бы я ещё знал после чего наступило это "теперь"...
Код: Выделить всё
Scroll=CreateWindow(L"scrollbar" ,
nullptr ,
WS_CHILD |
WS_VISIBLE ,
2 ,
2 ,
2 ,
16 ,
Window ,
NULL ,
(HINSTANCE)GetWindowLongPtr(Window, GWLP_HINSTANCE),
nullptr );
Код: Выделить всё
case WM_HSCROLL : PostMessage(ChartWindow, Message, First, Second);
break;
Код: Выделить всё
LRESULT CALLBACK MainWindowWindowProcedure ( HWND Window ,
UINT Message ,
WPARAM First ,
LPARAM Second )
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Совсем не очевидно. Кому-то могут понадобиться оба варианта сборки. Ничего удивительного в таком требовании не вижу. Если этот механизм был придуман, то в любом случае он кому-то был нужен, разве не так? Если конкретно тебе он не нужен, просто его не используй.Сионист писал(а):Зачем? Очевидно же, что проект или уникодовый, или нет.
Сионист писал(а):После Ваших же советов, точнее попытки его применения...
Я такого точно не советовал. Если скролбар создан, как отдельное окно, то второй параметр неверен. Там должен стоять SB_CTL. Ещё раз внимательно прочти документацию. Скорее всего поэтому бегунок и не двигается.Сионист писал(а):SetScrollPos(Scroll, SB_HORZ, Position, TRUE);
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
В описании SetScrollRange написано:
. Но если передать hwnd форточки со скролом, то создаётся скролл внизу форточки, чей hwnd передан в функцию, даже если в ней уже создан скролл с помощью CreateWindow. А когда передаю hwnd самого созданного с помощью CreateWindow скролла, то походу ничего не срабатывает. И в описании SetScrollPos та же строчка, но если передать hwnd окна со скролом, то перемещается ползунок скрола внизу окна, созданного с помощью SetScrollRange, а если передать hwnd самого скролла, то функция не срабатывает. А как задать рендж и пос, передав hwnd самого скрола? По msdn получается, что обе функции работают и с форточкой, содержащей скролл, и с самим скролом, но тест подтверждает: даже после SetScrollPos старшее слово First при LOWORD(First), равном SB_THUMBPOSITION, остаётся равно нолю.Handle to a scroll bar control or a window with a standard scroll bar, depending on the value of the nBar parameter.
Теперь ол комплит, только длина бегунка на скролле так и не меняется.Я такого точно не советовал. Если скролбар создан, как отдельное окно, то второй параметр неверен. Там должен стоять SB_CTL. Ещё раз внимательно прочти документацию. Скорее всего поэтому бегунок и не двигается.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
А в SetScrollRange точно SB_CTL передаётся вторым параметром? 

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