Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Прокрутка содержимого окна  (Прочитано 25585 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« : 21-04-2008 12:26 » 

Допустим есть окно. На нем расположено около 300 кнопочек, размером скажем 100 на 100. Т.е. в окне не поместяться. Каким образом сделать прокрутку содержимого данного окна? Можно ли это сделать с диалоговым окном?
Я думал рисовать полностью все содержимое окна в виртуальном DC и в зависимости от положения полос прокрутки и размера окна выводить только нужную часть. Вернее нужно то всего сопоставить начальную точку окна и какую-нибудь точку виртуального DC. Но как и где это дописать, что-то не придумывается. Да и наверное уже есть решения.
Подскажите пожалуйста с чего начать или ссылку какую-нибудь по теме киньте.
Заранее спасибо Улыбаюсь
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 21-04-2008 13:12 » 

tom4ik85, ты ж экспериментатор. Ага Тем более у тебя это неплохо получается.

Вот и попробуй. Возьми диалоговое окно, размести на нём только кнопку и полосу прокрутки (Scroll Bar). Затем внимательно почитай какие параметры есть у контролла (объектный класс CScrollBar). На основе этой информации заставь свою кнопку "ездить" по диалогу вверх-вниз - в зависимости от положения движка. Если ты сможешь это сделать с одной кнопкой - сможешь с 300. Ага

Но сначала сделай просто изменение позиции кнопки. След. этапом будет контейнер в который можно будет добавить кучу кнопок, после чего он будет сообщать полосе прокрутки необходимые данные и принимать от неё необходимые команды. Или сделаешь свой контрол-контейнер, или ... Ага Самое главное - понять как работает Scrool Bar.

Есть такой принцип: "Если хочешь что-то понять - объясни это другому." Улавливаешь на что намекаю? Ага
« Последнее редактирование: 21-04-2008 13:13 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 21-04-2008 13:17 » 

Улавливаю Улыбаюсь
Я только еще с прошлой статьей не разобрался Улыбаюсь
Ладно, буду экспериментировать.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 21-04-2008 14:28 » 

Ничего страшного. Там не так всё плохо с той статьёй. У меня просто руки не доходят.

А если по скроллу вопросы будут - кидай сюда. Лучше в виде тест-проектика. Хотя там на самом деле всё очень просто - голая теория.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #4 : 21-04-2008 16:12 » 

Уже нашел такую интересную функцию ScrollWindow() Улыбаюсь
Сейчас как раз изучаю Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 21-04-2008 16:50 » 

tom4ik85, ScrollWindow() - это бе ) Лучше:

1) двигать кнопы, как Джон говорит
2) или создатьдиалог без бордера, на котором будут кнопки (неподвижные), а диалог в качестве элемента управления разместить на другом диалоге. Этот диалог-элемент и двигать в соответствии с положениями полос прокруток - а кнопки сами будут с ним ездить
Записан

tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #6 : 21-04-2008 17:17 » 

А почему ScrollWindow() это бе?

Щас попробую подвигать диалог в диалоге )

А может тогда в CWnd все кпопки разместить??
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 21-04-2008 17:21 » 

tom4ik85, ну, может бе - это моё имхо, пробуй, сравнивай

можно и на CWnd, в принципе то )
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 21-04-2008 19:12 » 

tom4ik85, не заморачивайся. Зачем тебе ещё окно дополнительно вешать? Кстати простая кнопка - тоже окно. Тебе надо научится работать с полосой прокрутки: получать от неё данные о перемещении движка, управлять ею, устанавливать текущую позицию и тд и тп

С этим опытом ты сделаешь любую прокрутку.

Где ты вобще ищещь-то? Вот всё что тебе надо
http://msdn2.microsoft.com/en-us/library/zz1h061h(vs.71).aspx

А вот здесь его ф-ции
http://msdn2.microsoft.com/en-us/library/3azzex5f(VS.71).aspx

Всего 12 вместе с конструктором. Откуда ты выдрал ScrollWindow не понимаю?

Всё что от тебя требуется - составить правильную пропорцию. Ага
« Последнее редактирование: 21-04-2008 19:14 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #9 : 21-04-2008 19:35 » 

Я прочитал это все. начал разбираться со скробаром и где-то в примерах мсдн нашел упоминание про ScrollWindow.
Вот и спросил Улыбаюсь
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 21-04-2008 23:47 » 

Если ты попытаешься отследить все упоминания в примерах МСДН, то... всю оставшуюся жизнь посвятишь этому.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #11 : 22-04-2008 06:31 » 

Со скролбаром я разобрался.
Двигал одну кнопку я так:
Код:
GetDlgItem(IDC_BUTTON1)->MoveWindow(50, 50*m_nPosFromScroll, 100, 50);
Но как-то мне не очень хочется для всех моих IDC_... переписывать.
А если вдруг понадобится поменять что-то местами или как-нибудь изменить расположение - то начнется кошмар.
А если я размещу это все на CWnd, то все решается проще:
если двигать - то сразу весь контейнер.
если менять расположение - то в логических координатах контейнера.
« Последнее редактирование: 22-04-2008 06:35 от tom4ik85 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 22-04-2008 06:39 » 

tom4ik85, делай массив с ID , а сдвигать надо отностильно изначального положения (или относительно 0,0 )
Записан

tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #13 : 22-04-2008 06:51 » 

забыл показать как скроллбар работает, хотя там ничего сложного нет.
Код:
void CMyCtrl_1Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
int min, max, ncurPos;
GetScrollRange(SB_HORZ, &min, &max);
      ncurPos = GetScrollPos(SB_HORZ);
switch(nSBCode)
{
case SB_LINELEFT:
if(ncurPos > min)ncurPos--; // 1 раз нажали на стрелочку влево
break;
case SB_LINERIGHT:
if(ncurPos < max)ncurPos++; // 1 раз нажали на стрелочку вправо
break;
case SB_PAGELEFT:
if(ncurPos > (min - 10))ncurPos-=10; // нажали на полосе прокрутки слева от
                                                 // ползунка и крутим по страницам
                                                 // (у меня по 10 точек)
else ncurPos = min; //если дошли до конца, то не двигаемся дальше :)
break;
case SB_PAGERIGHT:
if(ncurPos < (max + 10))ncurPos+=10; // аналогично вправо
else ncurPos = max;
break;
case SB_THUMBPOSITION:
ncurPos = nPos; // зажали, перенесли и отпустили на nPos
break;
case SB_THUMBTRACK:
ncurPos = nPos; // пока не отпустили но уже переместили из прошлого пункта :)
break;
}
SetScrollPos(SB_HORZ, ncurPos);
GetDlgItem(IDC_BUTTON1)->MoveWindow(10*ncurPos, 0, 50, 50);
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
Записан
tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #14 : 22-04-2008 07:02 » 

Что-то типа:
Код:
//сначала в OnInitDialog
...
for(int i = 0; i<16; i++)
{
for(int j = 0; j<16; j++)
{
m_aMy[i*16 + j].Create(NULL,
                                   "",
                                   WS_VISIBLE,
                                   CRect(92*i, 92*j, 92+92*i,92+92*j),
                                   this,
                                   1000 + j + 16*i);
}
}
...
А потом при движении
Код:
...
for(int i = 0; i<16; i++)
{
for(int j = 0; j<16; j++)
{
GetDlgItem(1000 + 16*i + j)->MoveWindow(m_dxScroll, m_dyScroll, 92, 92);
}
}
...
а m_dxScroll и m_dyScroll переменные члены, которые отслеживают значения ползунков.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #15 : 22-04-2008 08:43 » 

Со скролбаром я разобрался.
Двигал одну кнопку

Вот и чудненько. Остальное уже дело техники и фантазии, хотя я бы в первую очередь сказал - условий поставленной задачи.

хотя там ничего сложного нет.

Ага  Более того, я так думаю, что самое ценное было для тебя - научиться работать с МСДН, точнее практически использовать инфу. Просто ради интереса - перечитай свой первый вопрос в этой теме и поймёшь всю проблематику ответа на подобные вопросы. Ага

Вместо 1000 + j + 16*i используй лучше #define. Ну и последний цикл нужно упростить. У тебя же одномерный массив ID. Ага


Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #16 : 22-04-2008 11:16 » 

Решил реализовать такую фишку. Когда зажимаешь левую кнопку в окне, то изображение двигается вместе с мышкой. Так в картах обычно делают. Так вот с этим проблемма, т.к. у меня все элементы впритык стоят друг к дружке и сообщение WM_MOUSEMOVE и WM_LBUTTONDOWN не приходят в главное окно.
Оно и понятно - ведь оно идет моим контролам. А как сделать чтоб эти сообщения и в окошке можно было отработать? Вызывать функции OnMouseMove() родительского окна в обработке их же в элементе?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 22-04-2008 11:20 » 

Хммм вопрос номер 0: а как ты потом собираешься отличить нажатие на кнопке от перетаскивания окна?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #18 : 22-04-2008 11:25 » new

Либо по условию вызывать обработчик родителя, либо не знаю как Жаль
В том то и дело, что пока еще не придумал.
Вызываю его GetParent()->SendMessage(WM_MOUSEMOVE);
Не знаю правда насколько это корректно делать.
« Последнее редактирование: 22-04-2008 11:31 от tom4ik85 » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #19 : 22-04-2008 15:13 » 

Вобще-то для таких случаев (передача сообщения родителю) служит NOTIFICATION. Но в твоём случае надо сначала решить проблему номер 0. Можно например сделать с Ctrl те если он нажат, то тогда перетаскиваем.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
tom4ik85
Участник

ua
Offline Offline
Пол: Мужской

« Ответ #20 : 23-04-2008 09:14 » 

Скорее всего у меня этой проблемы не будет. От элемента управления мне нужен только двойной щелчек.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #21 : 23-04-2008 10:25 » 

Аааа ну тогда это у тебя не кнопка, а окно. Посмотрел про NOTIFICATION?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #22 : 23-04-2008 14:50 » 

Цитата
Решил реализовать такую фишку. Когда зажимаешь левую кнопку в окне, то изображение двигается вместе с мышкой. Так в картах обычно делают. Так вот с этим проблемма, т.к. у меня все элементы впритык стоят друг к дружке и сообщение WM_MOUSEMOVE и WM_LBUTTONDOWN не приходят в главное окно.
Оно и понятно - ведь оно идет моим контролам. А как сделать чтоб эти сообщения и в окошке можно было отработать? Вызывать функции OnMouseMove() родительского окна в обработке их же в элементе?
Это легко решается следующим кодом в событии WM_MOUSEDOWN:
Код:
ReleaseCapture;
SendMessage(Handle, WM_SysCommand, 0xF012, 0);//здесь Handle - это хендл перетаскиваемого окна
предварительно надо будет установить системный параметр SPI_SETDRAGFULLWINDOWS
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines