powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / subclassing conrol-ов в mfc
13 сообщений из 13, страница 1 из 1
subclassing conrol-ов в mfc
    #33155733
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Многоуважаемые,

расскажите, пожалуйста, кратенько все основные моменты реализации subclassing-а контролов в mfc. winapi часть мне хорошо известна, так что мне только четко куда/что в mfc.

СПАСИБО
...
Рейтинг: 0 / 0
subclassing conrol-ов в mfc
    #33155738
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А там ничег делать не надо. Создаешь оконный cpp-объект, создаешь его методом окно - и оно уже сабклассировано. А если нужно существующее окно привязать - вызываешь метод Attach. Потом, если нужно - Detach.
И все.
...
Рейтинг: 0 / 0
subclassing conrol-ов в mfc
    #33155751
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
смотри help для CWnd::SubclassWindow и CWnd::SubclassDlgItem
...
Рейтинг: 0 / 0
subclassing conrol-ов в mfc
    #33156273
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм, это получается, что в MFC все контролы по дефолту сабкласенные?.. кошмАр! все больше ненавижу mfc. :/
...
Рейтинг: 0 / 0
subclassing conrol-ов в mfc
    #33156443
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не, народ. что-то у меня не выходит. Не понимаю я, как с этим работать.

вот смотрите, что у меня (не) получается:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// .h
class CMyEdit : public CEdit
{
protected:
    DECLARE_MESSAGE_MAP()
    int OnCreate(LPCREATESTRUCT lpCreateStruct);
    LRESULT OnSetMargins(LPARAM, WPARAM);
};

Код: plaintext
1.
2.
3.
4.
5.
//.cpp
BEGIN_MESSAGE_MAP()
   ON_WM_CREATE()
   ON_MESSAGE(EM_SETMARGINS, OnSetMargins)
END_MESSAGE_MAP()

int CMyEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
int iRes = CEdit::OnCreate(lpCreateStruct);
//здесь добавлены мои функции
return iRes;
}

LRESULT CMyEdit::OnSetMargins(LPARAM, WPARAM)
{
// а здесь я хочу послать в настоящую wndproc edit control-a мессаж
// EM_SETMARGINS со своими данными.
//вобщем, по сути это заглушка на EM_SETMARGINS.
// но как послать в настоящую wndproc???
return 0;
}

спасибо тем, кто дочитает до сюда
...
Рейтинг: 0 / 0
subclassing conrol-ов в mfc
    #33156698
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что есть термин:

"настоящая wndproc" ?

если базовый класс, от которого наследовались - прям зовите его методы и усё. Если нужно дотянуться до других обьектов в этом процессе - ну то мона разными средствами (передача через указатель, ссылку, ну и много мона писать на этот счёт). "послать" можно кого угодно и куда угодно. Но думаю Вам так же грубо и ответят :) Или другими словами - для приёма мессаги (синхронно) потребуеться тот кто будет принимать эту мессагу. Т.е. другой процесс (либо поток). Если асинхронно - то там гибче. Но от этого яснее не становиться :)

Что нуна то получить на выходе ?

(круглый)
...
Рейтинг: 0 / 0
subclassing conrol-ов в mfc
    #33156878
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хе-хе.
"настоящая wndproc"
Вобщем, в винде есть предопределенные окна -- контролы. Они создаются с заданными WNDPROC
(
Код: plaintext
1.
2.
3.
4.
5.
struct WNDCLASS
{
 WNDPROC lpfnWndProc;
 ....
};

К примеру, если попробовать пооткрывать разные приложения и спайем посмотреть на адрес wndproc у edit-ов, то он почти всегда будет одинаковым. Изменить wndproc можно -- и это называется subclassing-ом.

Так вот. У виндового контрола "EDIT", как показывает мне spy 0x773Е3B41. Вот это я и называю настоящей wndproc.

Судя по всему, mfc заменяет стандартную оконную процедуру и пересылает контролу необработанные сообщения.

А я не могу никак разобраться, что к чему в этом мфс.
В моей проблемной функции:
Код: plaintext
1.
2.
3.
4.
5.
LRESULT CMyEdit::OnSetMargins(LPARAM, WPARAM)
{
   CEdit::SetMargins( 20 ,  20 );
   return  0 ;
}

если я так делаю, то у меня CEdit::SetMargins(20, 20); опять попадает сюда же., стек переполняется и до свидания. А реальный wndproc control-а сообщение EM_SETMARGINS не идет.
...
Рейтинг: 0 / 0
subclassing conrol-ов в mfc
    #33157016
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вызов оригинальной WNDPROC осуществляется вызовом метода Default().
...
Рейтинг: 0 / 0
subclassing conrol-ов в mfc
    #33157046
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нет, погоди, наверное тебе нужно было не это.
А
LRESULT CWnd::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)

Оно устроено так :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
...
protected:
	WNDPROC m_pfnSuper; // for subclassing of controls
...


LRESULT CWnd::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
{
	if (m_pfnSuper != NULL)
		return ::CallWindowProc(m_pfnSuper, m_hWnd, nMsg, wParam, lParam);

	WNDPROC pfnWndProc;
	if ((pfnWndProc = *GetSuperWndProcAddr()) == NULL)
		return ::DefWindowProc(m_hWnd, nMsg, wParam, lParam);
	else
		return ::CallWindowProc(pfnWndProc, m_hWnd, nMsg, wParam, lParam);
}

Ну можешь либо ее звать, либо самому что-то такое же изобразить.
...
Рейтинг: 0 / 0
subclassing conrol-ов в mfc
    #33157057
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeraTJХм, это получается, что в MFC все контролы по дефолту сабкласенные?.. кошмАр! все больше ненавижу mfc. :/

А как ты хочешь еще и сообщения обрабатывать, и виртуальные методы оконные делать ? И не все, а только те, к которым привязанны оконные CPP-объекты.

А будешь еще MFC ругать - помогать не буду
...
Рейтинг: 0 / 0
subclassing conrol-ов в mfc
    #33157396
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор ... либо самому что-то такое же изобразить.
- п.п. "либо самой что-то такое же изобразить". ;)


за DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam) ОГРОМНОЕ спасибо! Заработало так, как нужно.

авторА будешь еще MFC ругать - помогать не буду

А с mfc у меня своя песня... Весь мой WTL-ный проект заставили переводить на MFC, так у меня типа "переходный период". ОЧЕЕЕНЬ тяжело..
( хотя вообще мне и без виртуальных методов оконных было очень даже
неплохо ), однако Обещаю больше на MFC не гнать.
...
Рейтинг: 0 / 0
subclassing conrol-ов в mfc
    #33157456
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВесь мой WTL-ный проект заставили переводить на MFC а какая была мотивировка?
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
subclassing conrol-ов в mfc
    #33157608
SeraTJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Та купили либу -- навеску на mfc код. Вся такая "custrom draw" - контрольчики, темы красивенькие. бр.... Вобщем, пользователи будут счастливы.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / subclassing conrol-ов в mfc
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]