+ Ответить в теме
Страница 1 из 2
1 2 ПоследняяПоследняя
Показано с 1 по 10 из 15

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

  1. #1
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

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

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

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    37
    Сообщений
    3,091
    Вес репутации
    21

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

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

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

    Создать скролбар руками можно, например, вот так:
    Код cpp:
    1. // inside switch (message) in WndProc
    2. case WM_CREATE:
    3.         scrr1 = CreateWindow(_T("scrollbar"), NULL, WS_CHILD| WS_VISIBLE,
    4.                 10, 10, 200, 20, hWnd,  NULL, hInst, NULL);

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

  4. #3
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

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

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

  5. #4
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    37
    Сообщений
    3,091
    Вес репутации
    21

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

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

  6. #5
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

    По умолчанию

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

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

  7. #6
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    37
    Сообщений
    3,091
    Вес репутации
    21

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

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

  8. #7
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

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

    Для того, чтобы, меняя в настройках проекта всего лишь одно значения макроса, можно было легко собрать как уникодную, так и не уникодную сборку, не трогая код.
    Зачем? Очевидно же, что проект или уникодовый, или нет.
    Если бы я ещё знал после чего наступило это "теперь"...
    После Ваших же советов, точнее попытки их применения. Как было раньше, написано в соседней теме, заменил на
    Код :
    1. Scroll=CreateWindow(L"scrollbar"                                       ,
    2.                      nullptr                                            ,
    3.                      WS_CHILD                                           |
    4.                      WS_VISIBLE                                         ,
    5.                      2                                                  ,
    6.                      2                                                  ,
    7.                      2                                                  ,
    8.                      16                                                 ,
    9.                      Window                                             ,
    10.                      NULL                                               ,
    11.                      (HINSTANCE)GetWindowLongPtr(Window, GWLP_HINSTANCE),
    12.                      nullptr                                            );
    , где Window - hwnd главного окна, в его оконную процедуру добавил
    Код :
    1.   case WM_HSCROLL     : PostMessage(ChartWindow, Message, First, Second);
    2.   break;
    , (
    Код :
    1. LRESULT CALLBACK                 MainWindowWindowProcedure                    (      HWND                    Window               ,
    2.                                                                                      UINT                    Message              ,
    3.                                                                                      WPARAM                  First                ,
    4.                                                                                      LPARAM                  Second               )
    ). WM_HSCROLL с LOWORD(First), равными SB_LINELEFT, SB_LINERIGHT и SB_PAGERIGHT проходят, Position инкремируется и декремируется, но SetScrollPos не даёт ни каких видимых эффектов, ползунок сколбара остаётся на месте, а раньше ползал. И SetScrollRange похоже, что не работает: при отключении ограничений в принимающей оконной процедуре скролинг пошёл за установленную границу.
    Последний раз редактировалось Сионист; 10.01.2016 в 18:38.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

  9. #8
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    37
    Сообщений
    3,091
    Вес репутации
    21

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

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

  10. #9
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

    По умолчанию

    В описании 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. Ещё раз внимательно прочти документацию. Скорее всего поэтому бегунок и не двигается.
    Теперь ол комплит, только длина бегунка на скролле так и не меняется.
    Последний раз редактировалось Romeo; 10.01.2016 в 19:07. Причина: Слияние
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

  11. #10
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    37
    Сообщений
    3,091
    Вес репутации
    21

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

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

+ Ответить в теме
Страница 1 из 2
1 2 ПоследняяПоследняя

Похожие темы

  1. Хотелось бы разместить рекламу здесь
    Хочу разместить рекламу у Вас на ****была ссылка с текстом developing.ru, вела не на нас.****, в разделе "Флейм." т.е. его надо закрепить. Скажить,...
    от renaisz в разделе Флейм.
  2. чтение из файла снизу вверх
    ВОт этот отрывок кода - чтение файла с верху вниз: assign(f,'a.txt'); reset(f); while not eof(f) do begin readln(f,tmp); ...
    от itwork в разделе Delphi и Pascal
  3. Как разместить TLabel по центру формы?
    Как (и возможно ли) разместить TLabel по центру формы, в зависимости от ее длины?
    от CrCoder в разделе Delphi и Pascal
  4. Переворачивание xls-таблицы снизу-вверх
    Проблема в следующем: есть Excel-таблица с несколькими столбцами, несколькими строками, etc... Надо "перевернуть" этот файл: чтобы первые строки...
    от Anonymous в разделе MS Office и VB(A).

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения