|
|
|
Creating "MFC ActiveX Control"
|
|||
|---|---|---|---|
|
#18+
Я создал проектик "MFC ActiveX Control". Класс СXxxCtrl нарисовался на автопилоте. И даже кружочек в контроле рисуется! Осталось как-то вместо отрисовки кружка встроить в контрол экзепляр от некоего CWnd-наследника. Вопросы: 1. Почему OnDraw для моего OleControl вызывается, а Create НЕ вызывается вообще. Подозреваю, что pDC, который прилетает в OnDraw - это pDC контейнера моего контрола. Это круто, но.. хочется свое Нормальное, Персональное окно для контрола, с реальным m_hWnd, чтобы было куда дочерние окна вставлять. 2. Как следствие из первого - я замучался вставлять экземпляр наследника от CWnd в мой контрол. Как это по-хорошему делается? Если можно - то лучше с примерами кода. Пасиба ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2007, 17:37 |
|
||
|
Creating "MFC ActiveX Control"
|
|||
|---|---|---|---|
|
#18+
подобное лучше писать на чистом api (ну или почти чистом, обернув часто вызываемое), а тут мало того что MFC так еще и ActiveX, простенький контрол будет жирно весить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2007, 18:39 |
|
||
|
Creating "MFC ActiveX Control"
|
|||
|---|---|---|---|
|
#18+
Мы делаем так. 1. Убедись, что в MESSAGE_MAP есть ON_WM_CREATE и ON_WM_SIZE; 2. В классе CXxxCtrl сделай две функции: Код: plaintext 1. 2. 3. В OnCreate тупо создаешь свой диалог (можно у диалога поставить свойство Visible в True, тогда он сам тут же и отрисуется). 4. В OnDraw ничего не рисуешь. 5. В OnSize делаешь следующее: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 15:32 |
|
||
|
Creating "MFC ActiveX Control"
|
|||
|---|---|---|---|
|
#18+
Исчерпывающе! Спасибо огромЕнное! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2007, 21:00 |
|
||
|
Creating "MFC ActiveX Control"
|
|||
|---|---|---|---|
|
#18+
Всегда пожалуйста;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 09:18 |
|
||
|
Creating "MFC ActiveX Control"
|
|||
|---|---|---|---|
|
#18+
В догонку... Сделал все так, как сказано. С одним исключением - своего диалога у меня нет. Но есть НЕЧТО, наследующее CWnd и очень хитро (с визуальной точки зрения) себя отрисовывающее. С технической точки зрения отрисовываются только тексты и рамки. На данный момент, я уперся в то, что это НЕЧТО не желает отрисовываться после открытия тех зон, которые были перекрыты другими окнами. Перерисовка происходит только в момент возврата фокуса моему приложению. Какими таблетками это можно полечить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2007, 22:14 |
|
||
|
Creating "MFC ActiveX Control"
|
|||
|---|---|---|---|
|
#18+
А в стиль окна этого НЕЧТО добавить CS_SAVEBITS? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2007, 15:54 |
|
||
|
Creating "MFC ActiveX Control"
|
|||
|---|---|---|---|
|
#18+
Пардон, фигню посоветовал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2007, 15:58 |
|
||
|
Creating "MFC ActiveX Control"
|
|||
|---|---|---|---|
|
#18+
Я вот подумал тут на досуге... Окна отрисовываются, когда получают 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. Если не поможет, надо смотреть код отрисовки, и еще немаловажно, в какое приложение вставлен контрол, может быть, оно виновато. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2007, 11:08 |
|
||
|
Creating "MFC ActiveX Control"
|
|||
|---|---|---|---|
|
#18+
Мда. Такой рецепт, если не подскажут, можно до потери пульса выдумывать, и так и не выдумать :-/ Контрол вставлялся в наипростейшую форму .Net прилодения (FW2). Короче, не хватило у меня терпения лабать его на плюсах. Cлабал на Шарп'ах. Но... :) Cнова с нюансами. Надеюсь, многоуважаемые модеры не покуцают меня и не выгонят в ветку C# (?) :) Тема, скорее о механизмах отрисовки в системе, нежели о средстве реализации конкретной задачи. Вобщем, в контроле дофига чего рисуется. Контрол длинный, виден не целиком. Условно - пусть это будет грид. Отрисовка умная (относительно). Т.е. рисуется только graphics.ClipRectangle ( +\- чуток за его краями, с расчетом на то, что от отрисовки за пределами ClipRectangle хуже никому не сделается). Спецэффект выражается в частичной недорисовке тех частей контрола, которые были вне ClientRect до начала скроллинга (контрол воткнут в ScrollBox). Т.е. начинаем скролить и видим, что из 10 WP_PAINTов 6 - отработаны на ура и целиком, 3 - частично, а 1 не отработан вообще. Эффект рандомный, т.е. недорисовки всегда разные. PS: очень не хочется рисовать тот-же грид тупо, лейблами. надеюсь, до этого не дойдет. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2007, 02:38 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34759763&tid=2028269]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
183ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 518ms |

| 0 / 0 |
