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

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

ee
Offline Offline

« : 05-07-2007 22:14 » 

Как скрыть на тулбаре (Visible, или хотя бы Enable) какую либо кнопку? Есть 3 кнопки в ряд PLAY, PAUSE, STOP.
Хочу на нажатие PLAY разрешать (или даже показывать) кнопку PAUSE и при этом прятать (или хотя бы запрещать) саму кнопку PLAY.

Пробовал следующим образом

Код:
CWnd *btn=this->GetDlgItem(ID_КНОПКИ_ПРИСВОЕННОЙ_В_РЕДАКТОРЕ_РЕСУРСОВ);
btn->ShowWindow(SW_HIDE);

Так не работает =(. Что делать? Как дальше быть? СпаситЕ! Не спи - замерзнешь!
Записан
Джон
просто
Администратор

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

« Ответ #1 : 06-07-2007 08:51 » 

Скрыть - никак. Во всяком случае просто - никак. А вот выключить ничего нет проще.
Например у тебя ID этой кнопки

ID_TBBUTTON1

тогда добавляешь ф-ю

.h
void OnUpdateMyTBButton1(CCmdUI* pCmdUI);

.cpp

в карту сообщений

ON_UPDATE_COMMAND_UI(ID_TBBUTTON1, OnUpdateMyTBButton1)

и само тело ф-ции

void <здесь твой класс обычно CMainFrame>::OnUpdateMyTBButton1(CCmdUI* pCmdUI)
{
   pCmdUI->Enable(FALSE);
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #2 : 06-07-2007 09:37 » 

Спасибо за совет попытаюсь отключить. А заменить изображение на кнопке другим? Например был треугольничек PLAY, а заменить его на две линии PAUSE?
Записан
Джон
просто
Администратор

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

« Ответ #3 : 06-07-2007 10:03 » 

Тоже можно, но сложней. У меня ща времени нет (а под рукой тоже ничего нет, чтоб сразу дать). ПОсмотри примеры в MSDN, будут трудности - разберёмся.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #4 : 06-07-2007 10:20 » 

добавил в h:

Код:
afx_msg void OnUpdateStartReplayBtn(CCmdUI* pCmdUI);
afx_msg void OnUpdatePauseReplayBtn(CCmdUI* pCmdUI);

добавил в cpp:
Код:
BEGIN_MESSAGE_MAP(CPageControl, CDialog)
...
ON_UPDATE_COMMAND_UI(ID_STARTREPLAY, &CPageControl::OnUpdateStartReplayBtn)
ON_UPDATE_COMMAND_UI(ID_PAUSEREPLAY, &CPageControl::OnUpdatePauseReplayBtn)
...
END_MESSAGE_MAP()


Код:
void CPageControl::OnUpdateStartReplayBtn(CCmdUI* pCmdUI)
{
   pCmdUI->Enable(FALSE);
}

void CPageControl::OnUpdatePauseReplayBtn(CCmdUI* pCmdUI)
{
   pCmdUI->Enable(FALSE);
}


не совсем работает.... вернее не работает совсем. Кнопки как нажимались, так и продолжают нажиматься
« Последнее редактирование: 06-07-2007 10:23 от Tuborg » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #5 : 06-07-2007 10:30 » 

Tuborg, в диалоге (в отличие от мейнфрейма) нужно ещё движения сделать. Щас не найду, в FAQ поищи, там я, по моему, писал. Если что - вечером
Записан

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

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

« Ответ #6 : 06-07-2007 11:24 » 

А что есть CPageControl?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #7 : 06-07-2007 11:53 » 

судя по
BEGIN_MESSAGE_MAP(CPageControl, CDialog)
 - нечто от диалога
Записан

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

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

« Ответ #8 : 06-07-2007 11:59 » 

Точно, а я и не увидел. У диалога так сразу не прокатит.

Tuborg, посмотри теорию размещения тулбаров на диалоге, особенно ON_UPDATE_COMMAND_UI
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #9 : 06-07-2007 12:21 » 

Да это класс от CDialog, в котором я реализовал класс Алексей1153++ по добавлению закладок.
Записан
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #10 : 06-07-2007 12:23 » 

нашёл немного проще метод... но пока глючит, как с глюками поборюсь дам отчёт =)
Записан
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #11 : 06-07-2007 13:45 » 

Выход нашёлся, не знаю насколько прямой, оцените его прямость/кривость.

На Исходниках.Ру нашёлся класс CToolBarEx  который позволяет в тулбар пихать комбо и любые другие элементы. Там во внутренностях наткнулся на следующие private функции (глюки уже исправил - там нехватало пару условий для нормальной работы):

Код:
void CToolBarEx::_GetButton(int nIndex, TBBUTTON* pButton) const
{
CToolBarEx* pBar = (CToolBarEx*)this;
VERIFY(pBar->DefWindowProc(TB_GETBUTTON, nIndex, (LPARAM)pButton));
// TBSTATE_ENABLED == TBBS_DISABLED so invert it
if ((pButton->fsState & TBSTATE_ENABLED)==0) // was TBBS_DISABLED без этого условия всё работает довольно таки криво
pButton->fsState^=TBBS_DISABLED;
}



Код:
void CToolBarEx::_SetButton(int nIndex, TBBUTTON* pButton)
{
// get original button state
TBBUTTON button;
VERIFY(DefWindowProc(TB_GETBUTTON, nIndex, (LPARAM)&button));

// prepare for old/new button comparsion
button.bReserved[0] = 0;
button.bReserved[1] = 0;
// TBSTATE_ENABLED == TBBS_DISABLED so invert it
if ((pButton->fsState & TBSTATE_ENABLED)==1) // was TBSTATE_ENABLED без этого условия всё работает                    довольно таки криво
pButton->fsState ^= TBSTATE_ENABLED;
pButton->bReserved[0] = 0;
pButton->bReserved[1] = 0;

// nothing to do if they are the same
if (memcmp(pButton, &button, sizeof(TBBUTTON)) != 0)
{
// don't redraw everything while setting the button
DWORD dwStyle = GetStyle();
ModifyStyle(WS_VISIBLE, 0);
VERIFY(DefWindowProc(TB_DELETEBUTTON, nIndex, 0));
VERIFY(DefWindowProc(TB_INSERTBUTTON, nIndex, (LPARAM)pButton));
ModifyStyle(0, dwStyle & WS_VISIBLE);

// invalidate appropriate parts
if (((pButton->fsStyle ^ button.fsStyle) & TBSTYLE_SEP) ||
((pButton->fsStyle & TBSTYLE_SEP) && pButton->iBitmap != button.iBitmap))
{
// changing a separator
Invalidate();
}
else
{
// invalidate just the button
CRect rect;
if (DefWindowProc(TB_GETITEMRECT, nIndex, (LPARAM)&rect))
InvalidateRect(rect);
}
}

теперь обращаюсь к этим функциям. (где-то в классе объявил TBBUTTON pConnectBtn, pStartBtn, pPauseBtn, pStopBtn;)
1. При инициализации
Код:
         pConnectBtn.fsState=TBSTATE_ENABLED;
pStartBtn.fsState=TBSTATE_ENABLED;
pPauseBtn.fsState=TBSTATE_HIDDEN;

m_wndToolBar._SetButton(2,&pConnectBtn);
m_wndToolBar._SetButton(6,&pStartBtn);
m_wndToolBar._SetButton(7,&pPauseBtn);
m_wndToolBar._SetButton(8,&pStopBtn);

если не хотим скрывать кнопки, а только блокировать, то пишем pPauseBtn.fsState=0; (вместо TBSTATE_HIDDEN)

2. При нажатии на кнопку PLAY:
Код:
            pStartBtn.fsState=TBSTATE_HIDDEN;
    pPauseBtn.fsState=TBSTATE_ENABLED;

    m_wndToolBar._SetButton(6,&pStartBtn); // 6 - позиция кнопки Start на тулбаре
    m_wndToolBar._SetButton(7,&pPauseBtn); // 7 - позиция кнопки Pause на тулбаре

3. При нажатии на кнопку PAUSE и STOP:
Код:
            pPauseBtn.fsState=TBSTATE_HIDDEN;
    pStartBtn.fsState=TBSTATE_ENABLED;

    m_wndToolBar._SetButton(6,&pStartBtn);
    m_wndToolBar._SetButton(7,&pPauseBtn);

Прошу прокомментировать кривость данного подхода (в особенности какое влияние на устойчивость системы может, например, оказать).
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #12 : 06-07-2007 19:52 » 

Tuborg,
https://forum.shelek.ru/index.php/topic,11802.new.html#new
в самом начале второго поста
Записан

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

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

« Ответ #13 : 07-07-2007 00:26 » 

Лёш, вырубаюсь не могу. Елси время будет попробуй вот такую штуку - если заработает запускай в серию

добавь в диалог такую штуку

afx_msg LRESULT OnKickIdle(WPARAM, LPARAM);

ON_MESSAGE(WM_KICKIDLE, OnKickIdle)


LRESULT CMyDlg::OnKickIdle(WPARAM, LPARAM)
{
   m_wndToolBar.OnUpdateCmdUI ((CFrameWnd*) this, TRUE);
   return 0;
}

После этого самые нормальные OnUpdate должны заработать


Tuborg, код пока не смотрел - очень уж много наворочено. Знаю точно только одно - чтобы вставить в ТБ любой контрол необходимо добавить в него разделители - только их размер можно менять, размер нормальных ТБ кнопок зависит от битмапа. Проще говоря они должны быть одинаковыми.

Но я всё хотел спросить - а нафига в диалоге ТoolBar??? Это же и так контейнер для всех контролов? А ТБ - как раз решение для НЕ диалоговых приложений. Чем в диалоге простые кнопки не устраивают? Там их можно и удалять и вставлять и менять как угодно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #14 : 07-07-2007 05:21 » 

ой, чёт я про меню то и подумал сначала, а не про тулбар Улыбаюсь))

сорри, за то что пытался запутать себя и других (

вечером попробую эту штуку

Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines