hash_2000
Интересующийся
Offline
|
|
« : 30-06-2008 04:18 » |
|
недавно начал изучать ATL и наткнулся на "интересную" проблему .. создаю класс ATL control и при добавлении обработчика сообщений допустим WM_SIZE или WM_CREATE или еще какого угодно, контрол на них вообще не реагирует #pragma once #include "resource.h" // main symbols #include <atlctl.h>
// IMyControl [ object, uuid(3E18D9E6-F336-4DF1-AC60-D226C996A8FD), dual, helpstring("IMyControl Interface"), pointer_default(unique) ] __interface IMyControl : public IDispatch { };
// CMyControl [ coclass, threading("apartment"), vi_progid("My_test_control.MyControl"), progid("My_test_control.MyControl.1"), version(1.0), uuid("DB8EBB51-06E3-48FB-83C9-663E96AE7930"), helpstring("MyControl Class"), support_error_info(IMyControl), registration_script("control.rgs") ]
class ATL_NO_VTABLE CMyControl : public IMyControl, public IPersistStreamInitImpl<CMyControl>, public IOleControlImpl<CMyControl>, public IOleObjectImpl<CMyControl>, public IOleInPlaceActiveObjectImpl<CMyControl>, public IViewObjectExImpl<CMyControl>, public IOleInPlaceObjectWindowlessImpl<CMyControl>, public IPersistStorageImpl<CMyControl>, public ISpecifyPropertyPagesImpl<CMyControl>, public IQuickActivateImpl<CMyControl>, public IDataObjectImpl<CMyControl>, public IProvideClassInfo2Impl<&__uuidof(CMyControl), NULL>, public CComControl<CMyControl> { public:
CMyControl() { }
DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE | OLEMISC_CANTLINKINSIDE | OLEMISC_INSIDEOUT | OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_SETCLIENTSITEFIRST )
BEGIN_PROP_MAP(CMyControl) PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4) PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4) END_PROP_MAP()
BEGIN_MSG_MAP(CMyControl) MESSAGE_HANDLER(WM_SIZE, OnSize) MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) CHAIN_MSG_MAP(CComControl<CMyControl>) DEFAULT_REFLECTION_HANDLER() END_MSG_MAP() // IViewObjectEx DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
// IMyControl public:
HRESULT OnDraw(ATL_DRAWINFO& di); DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct(); void FinalRelease(); LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { //СЮДА НЕ ПОПАДАЕТ } LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); { //СЮДА НЕ ПОПАДАЕТ } };
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #1 : 30-06-2008 06:07 » |
|
hash_2000, а как и куда ты его добавляешь?
|
|
|
Записан
|
while (8==8)
|
|
|
hash_2000
Интересующийся
Offline
|
|
« Ответ #2 : 30-06-2008 06:38 » |
|
просто с помощью мастера в vc++.net 7 создаю контрол .. добавляю так же с помошью мастера обработку сообщений WM_SIZE или WM_CREATE или еще какойто ... создаю проект на бейсике, добавляю туда свой откомпилированый контрол, компилирую.начинаю трассировать свой контрол,открываю откомпилированым в бейсике exe'шником, на точках останова которые я поставил в обработчиках сообщений не останавливается... вот бы узнать почему? может какаието опции в проекте добавить нужно или родительские классы ..
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #3 : 30-06-2008 06:43 » |
|
hash_2000, не останавливается отладчик или вообще управление не передается? Добавь в обработчики MessageBox. Если работают - добавь __asm int 3. Вообще не понятно - какой отладчик ты используешь VC или VB ?
|
|
|
Записан
|
while (8==8)
|
|
|
hash_2000
Интересующийся
Offline
|
|
« Ответ #4 : 30-06-2008 06:58 » |
|
не работает совсем .. по всякому пробовал ... в функцию не передается управление ..
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 30-06-2008 07:41 » |
|
а что за контрол то ? (ужас, сколько мусора) class ATL_NO_VTABLE CMyControl : public IMyControl, public IPersistStreamInitImpl<CMyControl>, public IOleControlImpl<CMyControl>, public IOleObjectImpl<CMyControl>, public IOleInPlaceActiveObjectImpl<CMyControl>, public IViewObjectExImpl<CMyControl>, public IOleInPlaceObjectWindowlessImpl<CMyControl>, public IPersistStorageImpl<CMyControl>, public ISpecifyPropertyPagesImpl<CMyControl>, public IQuickActivateImpl<CMyControl>, public IDataObjectImpl<CMyControl>, public IProvideClassInfo2Impl<&__uuidof(CMyControl), NULL>, public CComControl<CMyControl>
может просто CWnd в качестве родителя сделать ? (если я что то не так понял - сорри)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 30-06-2008 07:48 » |
|
упс, CWnd - это образно выражаясь )) То же не MFC явно
|
|
|
Записан
|
|
|
|
hash_2000
Интересующийся
Offline
|
|
« Ответ #7 : 30-06-2008 07:53 » |
|
это же ATL ... тут немного другая иерархия классов ... и ATL совсем недавно изучать начал .. а тут такое!!этот контрол практически то же самое что и в MFC призводный от CWnd ... если есть studio net 7 сделай "new project->ATL Project->Finish" потом "Project->new class->atl->atl control->Finish" почти тоже самое должно получиться
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #8 : 30-06-2008 07:59 » |
|
Попробуй половить в DllGetClassObject... Посмотри есть там вызовы и какие результаты.
|
|
|
Записан
|
while (8==8)
|
|
|
hash_2000
Интересующийся
Offline
|
|
« Ответ #9 : 30-06-2008 08:08 » |
|
самое странное что в когда ковырялся в MSDN'е нашел там пример где все сообщения обрабатываются нормально .. сидел сравнивал ... ну практически все то же самое !!! только там рабоатет, а у меня нет !! уже неделю долблюсь и ничего понять не могу .. може кто знает где можно найти справку (с примерами желательно) на русском языке
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #10 : 30-06-2008 08:14 » |
|
hash_2000, дай ссылку на MSDN... Вообще тебе наверное надо было new project->ATL Server Project->Finish
|
|
|
Записан
|
while (8==8)
|
|
|
hash_2000
Интересующийся
Offline
|
|
« Ответ #11 : 30-06-2008 08:27 » |
|
ссылку не помню, чтото найти не могу.проект называется SmartGravityBubbleCtrl.и мне не "server project" нужен а обычный нормальный контрол без чегото лишнего ...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 30-06-2008 08:44 » |
|
hash_2000, а в спае++ видать сообщения то - летят они к окну вообще ? Может там какой нибудь аналог статиковского стиля notify надо поставить ?
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #13 : 30-06-2008 08:49 » |
|
hash_2000, твой ATL проект - сервер контролов.
|
|
|
Записан
|
while (8==8)
|
|
|
hash_2000
Интересующийся
Offline
|
|
« Ответ #14 : 30-06-2008 08:52 » |
|
sss,наверное да.я же написал что не разобрался с ATL.и как мне отловить эти сообщения ... или это вообще невозможно
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #15 : 30-06-2008 08:54 » |
|
hash_2000, не я не прав... Сейчас попробовал.
|
|
|
Записан
|
while (8==8)
|
|
|
sss
Специалист
Offline
|
|
« Ответ #16 : 30-06-2008 09:11 » |
|
Вот сейчас только попробовал. Создал ATL Project, добавил контрол от Button. Запустил в ActiveX Control Test Container и поймал нажатие. Как ты добавляешь обработчик события? Смотри какой работает COMMAND_CODE_HANDLER(BN_CLICKED, OnBNClicked)!!!
|
|
|
Записан
|
while (8==8)
|
|
|
hash_2000
Интересующийся
Offline
|
|
« Ответ #17 : 30-06-2008 09:15 » |
|
все ... товарищи я разобрался ... такие сообщения вроде WM_SIZE, WM_ERASEBKGND (пока что еще не знаю какие еще входят в этот список, но это выяснить уже не сложно будет) будут работать в том случае если гдето в конструкторе дописать строчку а сообщения вроде WM_LBUTTONDBLCLK ... можно ловить и без установки этого параметра
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #18 : 01-07-2008 00:15 » |
|
hash_2000, этот флажок можно указать в окне мастера.
|
|
|
Записан
|
while (8==8)
|
|
|
hash_2000
Интересующийся
Offline
|
|
« Ответ #19 : 01-07-2008 02:49 » |
|
ну да можно.только я нашел этот параметр разбирая исходник примера из MSDN.поэтому и указал так.
|
|
|
Записан
|
|
|
|
hash_2000
Интересующийся
Offline
|
|
« Ответ #20 : 02-07-2008 10:07 » |
|
тут же хотелось бы продолжить, раз уж заговорил об ATL. Может кто подскажет как сделать контрол невидимый во время выполнения приложения как например Timer Control в Бейсике. Можно конечно убрать прорисовку, но может быть существует какой нибудь специяльный способ.
|
|
|
Записан
|
|
|
|
|