Поиск:

Ответ в темуСоздание новой темы Создание опроса
> edit control посреди тулбара 
:(
    Опции темы
mrgloom
Дата 24.11.2011, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



возможно ли сделать edit control посреди тулбара?
PM MAIL   Вверх
Earnest
Дата 24.11.2011, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Да, можно, с помощью доводки напильником. 
Примерно так: после загрузки панели нужно добавить в панель сепаратор нужной ширины (чтобы место для контрола было). Потом на месте сепаратор создать дочернее окно-редактор или комбобокс или еще что.
Я подробностей не помню, так что поищи пример в MSDN, должен быть.


--------------------
...
PM   Вверх
mrgloom
Дата 25.11.2011, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



сделал через CMFCToolBarEditBoxButton и ::OnToolbarReset.
(как в примере ToolbarDateTimePicker)

но вот проблема, хочу чтобы при нажатии ентер считывалось значение с эдит контрола и выполнялась функция, 
пробовал через наследование и перегрузку PreTranslateMessage.

как в примере 

Код

class CTestDlg: public CEdit
{
    
}

BOOL CTestDlg::PreTranslateMessage( MSG* pMsg )
{
// TODO: Add your specialized code here and/or call the base classif 
( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN )
{int idCtrl= this->GetFocus()->GetDlgCtrlID();
  if ( idCtrl == IDC_EDIT1 )  
  {    MessageBox( _T("Got it!") );  }
  }
  return CDialog::PreTranslateMessage( pMsg );
}
делаю так 

Код

class CEnterCEdit : public CMFCToolBarEditBoxButton
{
}

/*CMFCToolBarEditBoxButton*/ CEnterCEdit Button (ID_TEST,
                GetCmdMgr ()->GetCmdImage (ID_TEST, FALSE),ES_NUMBER|ES_RIGHT,40);
            int f= m_wndToolBar.ReplaceButton (ID_TEST, Button);
но не работает, пишет error C2661: 'CEnterCEdit::CEnterCEdit' : no overloaded function takes 4 arguments


непонятно как правильно отнаследовать.

Это сообщение отредактировал(а) mrgloom - 25.11.2011, 12:38
PM MAIL   Вверх
Earnest
Дата 25.11.2011, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



"Не работает" и "не компилируется" - это 2 большие разницы!
И какого, спрашивается, оно должно компилироваться, если у CEnterCEdit действительно нет конструктора с 4 аргументами?
В общем, по С++ тебе 2 с плюсом.

Далее, чтобы получить поведение, какое ты хочешь, совсем не нужно делать свой контрол. Более того, боюсь, это не поможет, т.к. Enter будет, скорее всего, перехвачено раньше. Это действительно нужно делать в PreTranslateMessage. Что же у тебя не получается?


--------------------
...
PM   Вверх
mrgloom
Дата 25.11.2011, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Код

class CMainFrame : public CFrameWndEx
{
    ...
}

как я понял PreTranslateMessage я должен делать именно у моего класса контрола, а не у главного класса.
а чтобы это сделать я должен сделать новый класс унаследовать от MFCToolBarEditBoxButton и перегрузить эту вирутальную ф-ию,

так работает 
    
Код

CMFCToolBarEditBoxButton Button (ID_TEST,
                GetCmdMgr ()->GetCmdImage (ID_TEST, FALSE),ES_NUMBER|ES_RIGHT,40);
            int f= m_wndToolBar.ReplaceButton (ID_TEST, Button);
            
        я наследую свой класс CEnterCEdit от CMFCToolBarEditBoxButton и по идее должен работать конструктор базвого класса если он не перегружен.



Это сообщение отредактировал(а) mrgloom - 25.11.2011, 12:59
PM MAIL   Вверх
mrgloom
Дата 25.11.2011, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

class CEnterCEdit : public CMFCToolBarEditBoxButton
{
public:
    CEnterCEdit():CMFCToolBarEditBoxButton(){};
    CEnterCEdit(UINT uiID, int iImage, DWORD dwStyle = ES_AUTOHSCROLL, int iWidth = 0):CMFCToolBarEditBoxButton(UINT uiID, int iImage, DWORD dwStyle = ES_AUTOHSCROLL, int iWidth = 0){};
};


хмм по дефолту вроде берется только пустой конструктор от родительского класса, пробовал так пишет много ошибок.
PM MAIL   Вверх
mrgloom
Дата 25.11.2011, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вроде заработало

Код

class CEnterCEdit : public CMFCToolBarEditBoxButton
{
public:
    CEnterCEdit():CMFCToolBarEditBoxButton(){}
    CEnterCEdit(UINT uiID, int iImage, DWORD dwStyle = ES_AUTOHSCROLL, int iWidth = 0):CMFCToolBarEditBoxButton(uiID, iImage, dwStyle = ES_AUTOHSCROLL, iWidth = 0){}
    virtual BOOL PreTranslateMessage(MSG* pMsg);
};


Код

BOOL CEnterCEdit::PreTranslateMessage(MSG* pMsg) 
{     
    if (pMsg->message == WM_KEYDOWN&&pMsg->wParam == VK_RETURN 
        /*&&GetFocus() == m_EditControl*/)     
    {         
        // handle return pressed in edit control  
        int f=0;
    } 
    return TRUE;
} 


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

Это сообщение отредактировал(а) mrgloom - 25.11.2011, 13:55
PM MAIL   Вверх
mrgloom
Дата 25.11.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



да уж я в 2-х местах ошибся.

но теперь все работает.
надо было так
Код

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
    int f=0;
    if (pMsg->message == WM_KEYDOWN&&pMsg->wParam == VK_RETURN 
        /*&&GetFocus() == m_EditControl*/)    {         
         
        int f=0;
    } 
    return CFrameWndEx::PreTranslateMessage(pMsg);
}


не работает только закоментированая строчка
error C2679: binary '==' : no operator found which takes a right-hand operand of type 'CEnterCEdit' (or there is no acceptable conversion.
PM MAIL   Вверх
Earnest
Дата 27.11.2011, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



В PreTranslate контрола ты не попадаешь, т.к. перехват делается раньше. Я обычно делаю свой класс тулбара, это удобнее в смысле инкапсуляции. Можно и на MainFrame, как ты сделал, но это не кошерно в том же смысле - представь, что приложениее разрастется, не надо перегружать главное окно.
Не компилируется у тебе, скорее всего, потому, что GetFocus возвращает CWnd*, а m_EditControl, скорее всего, не указатель. Если хочешь использовать глобальную ф-ю GetFocus, которая возвращает HWND, пиши ::GetFocus


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


 




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


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

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