Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CSpinButtonCtrl, Как сделать? 
:(
    Опции темы
kometa_triatlon
Дата 9.4.2005, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Это просто ужас. Никто ничего не пишет про спин! Все считают, что это и так ясно.
В МСДН тоже ничего толкового, нашел два примера, как работают непонятно, комментариев почти нет. Если конкретно:
— непонятно, почему на форму бросают все кроме spin control: custom control, frame...
— непонятно где и как выполняется привязка к CEdit и где обработка сообщения от кнопок спина.
Вобщем, если можно, по порядку, как мне создать работающий спин в диалоге.


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
Coocky
Дата 9.4.2005, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Цитата
Это просто ужас.

Та НЕ ВИДЕЛ УЖАСОВ.Все впереди.
Цитата
непонятно, почему на форму бросают все кроме spin control: custom control, frame...

Мне тоже не понятно,особенно как сделать последнее.
Цитата
непонятно где и как выполняется привязка к CEdit и где обработка сообщения от кнопок спина.

Господи,ну все же просто.Рисуй Spin.Рисуй поле Edit.Нарисовал?
Теперь заходи в свойства спина.Ставь галочку на Set bddy integer.
Добавь переменые к кспину и едиту.Пусть будет mySpin и myEdit.
Теперь в функции OnInitDialog() пиши
Код

        
mySpin.SetBuddy(&myEdit);            // Устанавливаем привязку к CEdit    
mySpin.SetRange(0,100);            // Ставим диапазон мин и макс.    
mySpin.SetPos(20);            // начальную позицию,к примеру

Теперь клацай на кнопочке smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
kometa_triatlon
Дата 9.4.2005, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 1
Всего: 6



Фу, заработало.
Знаешь, я ведь все это уже сто раз делал. И переменные привязывал и SetBuddy вызывал.
Все кроме одного:
Цитата
Теперь заходи в свойства спина.Ставь галочку на Set bddy integer.

Как всегда, все замешано на мелочи, нигде не описанной.


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
tonchitos
Дата 9.7.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



ммм, а как быть если я хочу не числа а текст прокручивать? я понимаю, надо обработать прокрутку спина, только вот какое сообщение?


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
voov
Дата 9.7.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



текст прокручивать?  а это как интересно? что ты хочешь получить?
PM MAIL   Вверх
tonchitos
Дата 9.7.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



ну положим есть у меня вектор со строками....
и вот их и прокрутить


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
deniska
Дата 10.7.2008, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: 1
Всего: 0



Цитата

надо обработать прокрутку спина, только вот какое сообщение

нужно обрабатывать OnVScroll твоего окна и проверять на совпадение ID спина и scrollbara, который в обработчик передается

Это сообщение отредактировал(а) deniska - 10.7.2008, 08:06
PM MAIL ICQ   Вверх
voov
Дата 10.7.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Ну если вектор, значит там есть индексы. Их прокручивай спином, и при изменении выводи строку по текущему индексу. А изменения можно отслеживать поразному. Например, если есть дружественный эдит, то у него можно смотреть ЕN_СHANGE, а сам эдит сделать невидимым.

PM MAIL   Вверх
tonchitos
Дата 15.7.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



ну вот, у меня почему-то SetPos не работает...
позицию не устанавливает и нолик возвращает....

Код


void ResolveMdlAssDialog::DoDataExchange(CDataExchange* pDX)
{
    CBCGPDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_EDIT1, m_EditSpin);
    DDX_Control(pDX, IDC_SPIN1, m_Spin);
}

BOOL ResolveMdlAssDialog::OnInitDialog()
{
    CBCGPDialog::OnInitDialog();
    //m_Spin.ModifyStyle(
    //m_Spin.SetBuddy(&m_EditSpin);
    m_Spin.SetRange(0, m_ar_pDoc.size());
    m_Spin.SetPos(0);    
    m_EditSpin.SetWindowText((LPCTSTR)m_ar_pDoc[0]->GetPathName());
    return TRUE;  // return TRUE  unless you set the focus to a control
}

void ResolveMdlAssDialog::OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
    int nPos = m_Spin.GetPos() + pNMUpDown->iDelta;

    if (nPos < 0 || nPos >= m_ar_pDoc.size()) 
        return;

    m_Spin.SetPos(nPos);
    m_EditSpin.SetWindowText((LPCTSTR)m_ar_pDoc[nPos]->GetPathName());
    UpdateData(FALSE);    
    *pResult = 0;
}



вот когда я в OnDeltaposSpin1
вызываю
m_Spin.GetPos()  то возвращается мне абракадабра....

что не так?


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
voov
Дата 15.7.2008, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Цитата(Coocky @  9.4.2005,  20:45 Найти цитируемый пост)
Теперь заходи в свойства спина.Ставь галочку на Set bddy integer.
такое делала?

добавь еще 1 эдит и попробуй так
Код

void ResolveMdlAssDialog::DoDataExchange(CDataExchange* pDX)
{
    CBCGPDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_EDIT_SHOW, m_EditShow);
    DDX_Control(pDX, IDC_EDIT1, m_EditSpin);
    DDX_Control(pDX, IDC_SPIN1, m_Spin);
}

BOOL ResolveMdlAssDialog::OnInitDialog()
{
    CBCGPDialog::OnInitDialog();
    //m_Spin.ModifyStyle(
    m_Spin.SetBuddy(&m_EditSpin);
    m_Spin.SetRange(0, m_ar_pDoc.size());
    m_Spin.SetPos(0);   
    m_editspin.ShowWindow(SW_HIDE);   // в этом эдите будут числа (индексы), его можна спрятать от пользователя
    m_EditShow.SetWindowText((LPCTSTR)m_ar_pDoc[0]->GetPathName());
    return TRUE;  // return TRUE  unless you set the focus to a control
}

void ResolveMdlAssDialog::OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
    int nPos = m_Spin.GetPos() + pNMUpDown->iDelta;

    if (nPos < 0 || nPos >= m_ar_pDoc.size()) 
        return;

    m_Spin.SetPos(nPos);
    m_EditShow.SetWindowText((LPCTSTR)m_ar_pDoc[nPos]->GetPathName());
    UpdateData(FALSE);    
    *pResult = 0;
}

PM MAIL   Вверх
tonchitos
Дата 15.7.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



Цитата

Hi there.
do something like this:

Value=(short)m_spin.GetPos()


Цитата


GetPos() IS an int type. There should be no need to cast it to a short. GetPos() would normally return a value no larger that 65535. The reason that it returns a value larger than 65535 is because it is an error getting the value.

If you buddy the spin to an editbox, you should not manipulate the editbox on your own since that will interfere with the spin's operation. Instead the spin will set the editbox.

When you call GetPos() the spin will try to get the value based on what's in the buddy editbox. But you have set the editbox to some content that it doesn't recognize. (The box shows "5 staffs" instead of a simple "5", for example). So it would return an error.

What you need to do is: since you take care of setting the editbox yourself, the spin should no longer be buddied with the editbox. You only buddy when you want the spin to set the editbox automatically.


Нашла тут:
http://www.codeguru.com/forum/showthread.php?t=68516

Добавлено через 2 минуты и 9 секунд
и заработало


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0684 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.