powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Creating "MFC ActiveX Control"
10 сообщений из 10, страница 1 из 1
Creating "MFC ActiveX Control"
    #34751729
RubinDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я создал проектик "MFC ActiveX Control". Класс СXxxCtrl нарисовался на автопилоте. И даже кружочек в контроле рисуется! Осталось как-то вместо отрисовки кружка встроить в контрол экзепляр от некоего CWnd-наследника. Вопросы:
1. Почему OnDraw для моего OleControl вызывается, а Create НЕ вызывается вообще. Подозреваю, что pDC, который прилетает в OnDraw - это pDC контейнера моего контрола. Это круто, но.. хочется свое Нормальное, Персональное окно для контрола, с реальным m_hWnd, чтобы было куда дочерние окна вставлять.
2. Как следствие из первого - я замучался вставлять экземпляр наследника от CWnd в мой контрол. Как это по-хорошему делается? Если можно - то лучше с примерами кода. Пасиба ;)
...
Рейтинг: 0 / 0
Creating "MFC ActiveX Control"
    #34751882
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подобное лучше писать на чистом api (ну или почти чистом, обернув часто вызываемое), а тут мало того что MFC так еще и ActiveX, простенький контрол будет жирно весить
...
Рейтинг: 0 / 0
Creating "MFC ActiveX Control"
    #34755226
Hryuckinnen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы делаем так.

1. Убедись, что в MESSAGE_MAP есть ON_WM_CREATE и ON_WM_SIZE;
2. В классе CXxxCtrl сделай две функции:
Код: plaintext
1.
2.
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);

3. В OnCreate тупо создаешь свой диалог (можно у диалога поставить свойство Visible в True, тогда он сам тут же и отрисуется).
4. В OnDraw ничего не рисуешь.
5. В OnSize делаешь следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void DocLinksCtrl::OnSize(UINT nType, int cx, int cy)
{
	COleControl::OnSize(nType, cx, cy);

	if ( nType == SIZE_MINIMIZED )
		return;

	CRect rect( 0 , 0 ,cx,cy);

	if ( ТвойДиалог.GetSafeHwnd() ) 
		ТвойДиалог.MoveWindow(&rect);
}
И последний момент: у диалога ставишь свойство Style не Overlapped, а Child. Тогда он будет рисоваться внутри контрола.
...
Рейтинг: 0 / 0
Creating "MFC ActiveX Control"
    #34756345
RubinDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исчерпывающе! Спасибо огромЕнное! :)
...
Рейтинг: 0 / 0
Creating "MFC ActiveX Control"
    #34756829
Hryuckinnen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всегда пожалуйста;)
...
Рейтинг: 0 / 0
Creating "MFC ActiveX Control"
    #34759763
RubinDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку...
Сделал все так, как сказано. С одним исключением - своего диалога у меня нет. Но есть НЕЧТО, наследующее CWnd и очень хитро (с визуальной точки зрения) себя отрисовывающее. С технической точки зрения отрисовываются только тексты и рамки.
На данный момент, я уперся в то, что это НЕЧТО не желает отрисовываться после открытия тех зон, которые были перекрыты другими окнами. Перерисовка происходит только в момент возврата фокуса моему приложению. Какими таблетками это можно полечить?
...
Рейтинг: 0 / 0
Creating "MFC ActiveX Control"
    #34762034
Hryuckinnen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в стиль окна этого НЕЧТО добавить CS_SAVEBITS?
...
Рейтинг: 0 / 0
Creating "MFC ActiveX Control"
    #34762057
Hryuckinnen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, фигню посоветовал...
...
Рейтинг: 0 / 0
Creating "MFC ActiveX Control"
    #34763754
Hryuckinnen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот подумал тут на досуге... Окна отрисовываются, когда получают WM_PAINT. Получают они его вне зависимости от того, имеют ли они фокус. Если часть окна не хочет рисоваться, значит, окно либо где-то недополучает WM_PAINT, либо вольно с ним обходится (например, сначала проверяет, есть ли у него фокус, а потом рисуется).

Ситуация с недополучением сообщений бывает в Active-X-контролах и решается следующим образом:

1. В MESSAGE_MAP добавить ON_WM_MOUSEACTIVATE()
2. Добавить к контролу метод afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int CXXXCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
	if ( !m_bUIActive )
		OnActivateInPlace (TRUE, NULL); // == UI-Activate the control

	return COleControl::OnMouseActivate(pDesktopWnd, nHitTest, message);
}

Если не поможет, надо смотреть код отрисовки, и еще немаловажно, в какое приложение вставлен контрол, может быть, оно виновато.
...
Рейтинг: 0 / 0
Creating "MFC ActiveX Control"
    #34769485
RubinDm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда. Такой рецепт, если не подскажут, можно до потери пульса выдумывать, и так и не выдумать :-/
Контрол вставлялся в наипростейшую форму .Net прилодения (FW2). Короче, не хватило у меня терпения лабать его на плюсах. Cлабал на Шарп'ах. Но... :) Cнова с нюансами. Надеюсь, многоуважаемые модеры не покуцают меня и не выгонят в ветку C# (?) :) Тема, скорее о механизмах отрисовки в системе, нежели о средстве реализации конкретной задачи.

Вобщем, в контроле дофига чего рисуется. Контрол длинный, виден не целиком. Условно - пусть это будет грид. Отрисовка умная (относительно). Т.е. рисуется только graphics.ClipRectangle ( +\- чуток за его краями, с расчетом на то, что от отрисовки за пределами ClipRectangle хуже никому не сделается). Спецэффект выражается в частичной недорисовке тех частей контрола, которые были вне ClientRect до начала скроллинга (контрол воткнут в ScrollBox). Т.е. начинаем скролить и видим, что из 10 WP_PAINTов 6 - отработаны на ура и целиком, 3 - частично, а 1 не отработан вообще. Эффект рандомный, т.е. недорисовки всегда разные.

PS: очень не хочется рисовать тот-же грид тупо, лейблами. надеюсь, до этого не дойдет. :)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Creating "MFC ActiveX Control"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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