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

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

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


« : 21-12-2007 06:24 » 

у MFC-шного класса CWnd имеется метод SetWindowText , который на самом деле, который немного не виртуальный...

Ситуация следующая: Произвёл от CEdit класс CEditRO  , в котором хочу изменить поведение SetWindowText . И, соответственно, если вызываю функцию через указатель типа CEditRO* , то всё ок , а как быть в случае

GetDlgItem(ID_myEditRO)->SetWindowText(...)

?
Записан

sss
Специалист

ru
Offline Offline

« Ответ #1 : 21-12-2007 06:29 » 

Если метод CEdit::SetWindowText не виртуальный, то никак.
Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #2 : 21-12-2007 06:33 » 

такс, кажись, нашёл решение ) Чичас протестирую

Код:
LRESULT CEditRO::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
if(message==WM_SETTEXT)
{
SetWindowText((const char*)lParam);
return TRUE;
}

return CEdit::DefWindowProc(message, wParam, lParam);
}
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #3 : 21-12-2007 06:35 » 

sss, нет, он не виртуальный , а кроме того - это метод CWnd  , который тоже не
Записан

sss
Специалист

ru
Offline Offline

« Ответ #4 : 21-12-2007 06:42 » 

Алексей1153++, аккуратней. Если CEditRO::SetWindowText посылает сообщения, получаешь петлю рекурсии...
Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #5 : 21-12-2007 06:50 » 

sss, я уже увидел.

вот это решение работает

Код:
class CEditRO: public CEdit
{
 ...
 ...
private:
  bool m_bIsIn_WM_SETTEXT;
  void SetWindowText_forRO(const char* text);
 ...
 ...
};

Код:
CEditRO::CEditRO()
{
  m_bIsIn_WM_SETTEXT=false;
  ...
}

void CEditRO::SetWindowText_forRO(const char* text)
{
  ...
  CEdit::SetWindowText(text);
  ...
}

Код:
LRESULT CEditRO::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{

if(message==WM_SETTEXT)
{
if(!m_bIsIn_WM_SETTEXT)
{
m_bIsIn_WM_SETTEXT=true;
SetWindowText_forRO((const char*)lParam);
m_bIsIn_WM_SETTEXT=false;
return TRUE;
}
}

return CEdit::DefWindowProc(message, wParam, lParam);
}
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #6 : 21-12-2007 06:52 » 

получается хукнутая SetWindowText Улыбаюсь
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines