Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Вниз

Толщина СкролБар-ов   Найти похожие ветки 

 
DevilDevil ©   (2006-09-15 15:58) [0]

Для реализации скроллинга в собственном компоненте использую:

procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL
procedure WMHScroll(var Message: TWMVScroll); message WM_VSCROLL
GetScrollInfo
SetScrollInfo


Каким образом задать произвольную (не стандартную) толщину полос прокрутки?


 
Ketmar ©   (2006-09-15 16:06) [1]

для начала неплохо пояснить, что такое "толщина полосы прокрутки", и как оно связано с вышеприведёнными сообщениями.


 
DevilDevil ©   (2006-09-15 16:34) [2]

> Ketmar ©   (15.09.06 16:06) [1]
> для начала неплохо пояснить, что такое "толщина полосы прокрутки"


см. GetSystemMetrics с константой SM_CXVSCROLL

> как оно связано с вышеприведёнными сообщениями
Это способ реализации скроллинга и не более того


 
Ketmar ©   (2006-09-15 18:31) [3]

а что, изменить размеры окна ScrollBar"а -- не помогает?


 
DevilDevil ©   (2006-09-15 18:53) [4]

не очень


 
Ketmar ©   (2006-09-15 19:07) [5]

код давай.


 
DevilDevil ©   (2006-09-15 19:33) [6]

void __fastcall TInfoTable::WMVScroll(TWMVScroll& Msg)
{
 SCROLLINFO Info;
 Info.cbSize=sizeof(Info);
 Info.fMask=SIF_ALL;
 GetScrollInfo(Handle,SB_VERT,&Info);

 int Pos=Info.nPos;

 Info.nMax  = FNeedRowsHeight;
 Info.nPage = ClHeight+1;

 TRect R;
 GetWindowRect(Msg.ScrollBar, &R);
 MoveWindow(Msg.ScrollBar, R.left, R.top, R.Width()+20, R.Height(), true);

 bool CanLookSelect = true;

 switch(Msg.ScrollCode)
 {
   case SB_TOP     : Pos = 0;                               SetFocus();
                     break;
   case SB_BOTTOM  : Pos = MaxPos;                          SetFocus();
                     break;
   case SB_LINEDOWN: Pos = Min(MaxPos, Pos+FDefRowHeight);  SetFocus();
                     break;
   case SB_LINEUP  : Pos = Max(0, Pos-FDefRowHeight);       SetFocus();
                     break;

   case SB_PAGEUP  : Pos = Max(0, Pos-Info.nPage);          SetFocus();
                     break;
   case SB_PAGEDOWN: Pos = Min(MaxPos, Pos+Info.nPage);     SetFocus();
                     break;

   case SB_WHEELPOS:
        if (Msg.Result <= 0) Pos = 0; else
        Pos = Min(Msg.Result, MaxPos);
                     break;

   case SB_USERPOS :
        if (Msg.Result <= 0) Pos = 0; else
        Pos = Min(Msg.Result, MaxPos);

        CanLookSelect = false;
                     break;

   case SB_THUMBPOSITION:
   case SB_THUMBTRACK   :
     Pos=Info.nTrackPos;
     SetFocus();
   break;
   }

 VScrollPos = Info.nPos = Min(Pos, MaxPos);
 NormalizePos(VScrollPos);
 SetScrollInfo(Handle,SB_VERT,&Info,1);

 if (CanLookSelect && startSelect > endSelect)
     StartSelectedRow=startSelect=endSelect= -1;

 RePaint();

 if (!VScrollWidth) VScrollEnd = false;
 else
 VScrollEnd = (EndRow == FRowsCount-1);
}


 
Ketmar ©   (2006-09-15 19:37) [7]

и какого ангела код изменения размеров делает в обработчике WM_VSCROLL? или опиши задачу нормально, или выключи бредогенератор.
я, кстати, ещё в [1] поинтересовался взаимосвязью. и до сих пор интересуюсь.


 
DevilDevil ©   (2006-09-18 13:33) [8]

> Ketmar ©   (15.09.06 19:37) [7]

Перехватить Handle СкролБара на данный момент могу только  в "обработчике" WMVScroll ( TWMVScroll.ScrollBar :  HWND ).

Соответственно, зная его Handle, по идее, могу изменять его размеры... Не работает...


 
Пофигист   (2006-09-20 23:20) [9]

Конечно, не работает.
Потому что, скорее всего, никакого хэндла скролбара там нет.

Ты забыл в самом начале сказать, у тебя внедрён отдельный scroll bar control, или это просто окно со стилем WS_VSCROLL.

Во втором случае никаких хэндлов скролбаров не бывает, это элемент неклиентской области окна.


 
Германн ©   (2006-09-21 01:52) [10]


> Ketmar ©   (15.09.06 19:37) [7]
>
> и какого ангела код изменения размеров делает в обработчике
> WM_VSCROLL?


Даже в WinAPI Ketmar себе (или точнее, ему) не изменяет! :-) Или делает вид, что не изменяет. Хотя сейчас уже это не так интересно как раньше.


 
DevilDevil ©   (2006-09-21 15:45) [11]

> Пофигист   (20.09.06 23:20) [9]
> Конечно, не работает.
> Потому что, скорее всего, никакого хэндла скролбара там
> нет.
> Ты забыл в самом начале сказать, у тебя внедрён отдельный
> scroll bar control, или это просто окно со стилем WS_VSCROLL.
> Во втором случае никаких хэндлов скролбаров не бывает, это
> элемент неклиентской области окна.


Я для того и указал в [0] GetScrollInfo, SetScrollInfo, чтобы Мастера WinAPI сразу поняли, каким образом у меня внедрены скроллбары. Естественно я не делал ни каких окон со стилем WS_VSCROLL. Хотя... делаю впервые, могу и ошибаться...


 
DiamondShark ©   (2006-09-21 21:27) [12]


> Я для того и указал в [0] GetScrollInfo, SetScrollInfo,
> чтобы Мастера WinAPI сразу поняли, каким образом у меня
> внедрены скроллбары.

Экий ты хитровыкрученный.
Вместо того, чтобы показать код, создающий твоё окно со скролбарами, ребусы тут загадываешь.
Ну давай, поотгадываем твои ребусы.


> DevilDevil ©   (15.09.06 19:33) [6]
> void __fastcall TInfoTable::WMVScroll(TWMVScroll& Msg)
> {
>  SCROLLINFO Info;
>  Info.cbSize=sizeof(Info);
>  Info.fMask=SIF_ALL;
>  GetScrollInfo(Handle,SB_VERT,&Info);

Судя по аргументам вызова GetScrollInfo получаешь ты параметры стандартного скролбара окна. Естественно, никакого хэндла скролбара у тебя нет.

А стандартные скролбары не изменишь. Разве что глобально для всей системы.


> Естественно я не делал ни каких окон со стилем WS_VSCROLL

Просто ты об этом не знаешь ;)


 
DevilDevil ©   (2006-09-22 15:05) [13]

> DiamondShark ©   (21.09.06 21:27) [12]
> Вместо того, чтобы показать код, создающий твоё окно со  скролбарами, ребусы тут загадываешь.


Окно - мой TCustomControl компонент. Код, создающий скролбары:
void __fastcall TInfoTable::SetUpScrollV()
{
 SCROLLINFO Info = {0};
 Info.cbSize=sizeof(Info);
 Info.fMask=SIF_ALL;

if (!VScrollWidth || !FRowsCount || !FColsCount)
  {VScrollPos=0; goto l_end;}

 GetScrollInfo(Handle,SB_VERT,&Info);

 Info.nMax = FNeedRowsHeight;
 Info.nPage = ClHeight+1;
 VScrollPos = Info.nPos = Min(Info.nPos, Info.nMax-Info.nPage+1);
 NormalizePos(VScrollPos);

l_end:
 SetScrollInfo(Handle,SB_VERT,&Info, 1);
}


Ну так может кто нибудь даст дельный совет?


 
clickmaker ©   (2006-09-22 15:08) [14]


> Код, создающий скролбары:

Ткни пальцем, где тут создаются скролбары?


 
Игорь Шевченко ©   (2006-09-22 15:28) [15]


> Ну так может кто нибудь даст дельный совет?


Он дан в [12]


 
DevilDevil ©   (2006-09-22 16:18) [16]

> clickmaker ©   (22.09.06 15:08) [14]

SetScrollInfo(Handle,SB_VERT,&Info, 1);

<- код, создающий стандартный вертикальный скроллбар

> Игорь Шевченко ©   (22.09.06 15:28) [15]

Изменение глобальных настроект системы Вы считаете дельным советом?


 
Eraser ©   (2006-09-22 16:29) [17]

> [16] DevilDevil ©   (22.09.06 16:18)

The SetScrollInfo function sets the parameters of a scroll bar, including the minimum and maximum scrolling positions, the page size, and the position of the scroll box (thumb). The function also redraws the scroll bar, if requested.

(c) MSND.


 
clickmaker ©   (2006-09-22 16:48) [18]


> код, создающий стандартный вертикальный скроллбар

что ты говоришь?!
А я-то наивный думал, что скролбар создается как-то так - CreateWindow("SCROLLBAR", .... );


 
DevilDevil ©   (2006-09-22 16:58) [19]

Лично Я никаких CreateWindow не вызывал. Конкретно в моём случае хватило SetScrollInfo.

Ну так по делу может у кого есть что сказать?


 
Игорь Шевченко ©   (2006-09-22 17:03) [20]

DevilDevil ©   (22.09.06 16:18) [16]


> Изменение глобальных настроект системы Вы считаете дельным
> советом?


Так иначе никак :)

Если только свои рисовать, но это дело объемное и многотрудное.


 
clickmaker ©   (2006-09-22 17:06) [21]


> Лично Я никаких CreateWindow не вызывал. Конкретно в моём
> случае хватило SetScrollInfo

вот поэтому только [12]


 
GrayFace ©   (2006-09-22 17:08) [22]

Есть два способа - доп. окно скроллбара или WS_VSCROLL в основном окне. Ты делаешь второе, считая что делаешь первое. См. компонент TScrollBar.


 
DevilDevil ©   (2006-09-22 17:09) [23]

Пожалуйста :(

Переозвучте, что же в посте [12] было действенным советом?

> Если только свои рисовать, но это дело объемное и многотрудное.

А традиционными методами обойтись нельзя?


 
DevilDevil ©   (2006-09-22 17:16) [24]

> GrayFace ©   (22.09.06 17:08) [22]

Наконец-то поступил нормальный ответ.

Хорошо. Как реализовать "доп. окно скроллбара" ? Т.е. просто в качестве предка в CreateWindow указать Handle моего компонента? А как различать вертикальный и горизонтальный скроллбары? Как отслеживать их изменения?


 
clickmaker ©   (2006-09-22 17:18) [25]

действенных советов 2
1. SystemParametersInfo с параметром SPI_SETNONCLIENTMETRICS
2. TScrollBar.Create; ScrollBar.Width :=


 
DevilDevil ©   (2006-09-22 17:28) [26]

> clickmaker ©   (22.09.06 17:18) [25]
> 1. SystemParametersInfo с параметром SPI_SETNONCLIENTMETRICS


Поговорка "краткость - сестра таланта" в данном случае теряет смысл. Предоставленной информации мало.

> 2. TScrollBar.Create; ScrollBar.Width :=

Пробовал. Неудачно.


 
clickmaker ©   (2006-09-22 17:35) [27]


> Предоставленной информации мало

остальную информацию предоставит MSDN или Win32 SDK reference

> Пробовал. Неудачно

Быть не может. Пробовал просто положить на форму TScrollBar и поменять Width? А теперь тоже самое, но положить скролбар например на панель. А после обрабатывать OnScroll.


 
GrayFace ©   (2006-09-23 21:06) [28]

DevilDevil ©   (22.09.06 17:28) [26]
> clickmaker ©   (22.09.06 17:18) [25]
> 1. SystemParametersInfo с параметром SPI_SETNONCLIENTMETRICS

Поговорка "краткость - сестра таланта" в данном случае теряет смысл. Предоставленной информации мало.

Help -> Windows SDK. Но, все равно, менять настройки системы под свою программу неприлично.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.038 c
2-1168969169
Garacio
2007-01-16 20:39
2007.02.04
ComboBox (очистить/заполнить)


9-1142779428
Sam Stone
2006-03-19 17:43
2007.02.04
Проникновение объектов друг в друга


15-1168677363
Kostafey
2007-01-13 11:36
2007.02.04
В дебрях IF


15-1168589311
WondeRu
2007-01-12 11:08
2007.02.04
Парсинг


4-1158843366
GanibalLector
2006-09-21 16:56
2007.02.04
Передача строки из доп.потока с основной





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский