Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Вызов функции при любом вызове тулбара


Автор: Nuzur 29.1.2007, 18:49

Знаю что может это признак некоректного планирования. Скорее всего что оно так и есть. НО.
Есть тулбар при клике на любой item вызывалась функция которая проверяла бы кое что. Просто тулбар сейчас не маленький а при его разширении и вовсе будет не красиво. какие есть выходы?

Кроме смены проффесии, страны, пола и сексуальной ориентации есть решения?

Автор: Greeen 30.1.2007, 00:15
можно например определить что итемы тулбара будут иметь идентификаторы скажем из диапазона 5000 - 6000
и тогда ON_COMMAND_RANGE(IDC_FIRST_TLBBTN, IDC_LAST_TLBBTN, OnToolbarButton)

CYourDlg::OnToolbarButton(UINT nID)
{
   // .....
}

Автор: Nuzur 30.1.2007, 13:35
Greeen, Попробывал так но не работает ИД идут по порядку, сделал так

.h
Код

afx_msg void OnToolBar(UINT nID);

.cpp
Код

ON_COMMAND_RANGE(ID_FIRST, ID_LAST, OnToolBar)

и

void CMainFrame::OnToolBar(UINT nID)
{

}


Но дебаггер туды не попадает smile В плане в OnToolBar().

Автор: Greeen 30.1.2007, 23:00
идентификаторы можно изменить в resource.h

Автор: Nuzur 31.1.2007, 11:37
Greeen, идентификаторы идут по порядку. Просто видно для тулбаров оно не предназначено smile Все вроде правильно сделал smile даже вне //}}AFX_MSG_MAP положил и в хедере и в реализации.

Может попробуем пройтись по стандартным проблемам? Может я что-то пропустил?

Автор: Nuzur 31.1.2007, 12:29
Создаю еще один пост дабы те кто столкнется с такой же проблемой был в курсе.

Дело в том что мелкомягкие дают такой вот пример:

Код

...
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
    //{{AFX_MSG_MAP(CMyApp)
    ...
    //}}AFX_MSG_MAP
ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, OnDoSomething)
END_MESSAGE_MAP( )
...


// Generated message-map functions
protected:
    //{{AFX_MSG(CMyApp)   
        ...
    //}}AFX_MSG
    afx_msg void OnDoSomething( UINT nID );
    DECLARE_MESSAGE_MAP()


 в таком варианте у меня ничего не сработало.
А вот если так :

Код

...
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, OnDoSomething)
    //{{AFX_MSG_MAP(CMyApp)
    ...
    //}}AFX_MSG_MAP
END_MESSAGE_MAP( )
...


Но теперь другая БЕДА. Теперь не вызываются функции обработчики, как поправить?
Насколько я понимаю физику процессса, то я получил сообщение в свой обработчик всего тулбара и на том и ладно, типа дальше оно никуда не пошло.
ВНИМАНИЕ ВОПРОС: как вызвать функцию обработчик зная ее ИД?

Автор: Earnest 31.1.2007, 13:25
Оставь MessageMap как был (с обработчиками для каждой команды), но переопредели OnCmdMsg. Сначала общая дополнительная обработка, потом вызов базового метода. Только не забудь, что туда же попадают ON_UPDATE_COMMAND_UI, так что проверяй nCode.

Добавлено @ 13:29 
В карте сообщений срабатывает самый первый обработчик. Естественно, если COMMAND_RANGE стоит вначале, то попав туда, больше никуда не попадешь.

Автор: Nuzur 31.1.2007, 19:15
Earnest, я решил проблему вызовом " в ручную". Но спасибо большое за совет. Просто проблема в том что проект огромный и лезть OnCmdMsg мне страшно так как он иногда сам по себе разваливается и без моего вмешательства.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)