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

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

ru
Offline 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
Специалист

ru
Offline Offline

« Ответ #1 : 30-06-2008 06:07 » 

hash_2000, а как и куда ты его добавляешь?
Записан

while (8==8)
hash_2000
Интересующийся

ru
Offline Offline

« Ответ #2 : 30-06-2008 06:38 » 

просто с помощью мастера в vc++.net 7 создаю контрол .. добавляю так же с помошью мастера обработку сообщений WM_SIZE или WM_CREATE или еще какойто ...
создаю проект на бейсике, добавляю туда свой откомпилированый контрол, компилирую.начинаю трассировать свой контрол,открываю откомпилированым в бейсике exe'шником, на точках останова которые я поставил в обработчиках сообщений не останавливается... вот бы узнать почему? может какаието опции в проекте добавить нужно или родительские классы ..
Записан
sss
Специалист

ru
Offline Offline

« Ответ #3 : 30-06-2008 06:43 » 

hash_2000, не останавливается отладчик или вообще управление не передается? Добавь в обработчики MessageBox. Если работают - добавь __asm int 3. Вообще не понятно - какой отладчик ты используешь VC или VB ?
Записан

while (8==8)
hash_2000
Интересующийся

ru
Offline Offline

« Ответ #4 : 30-06-2008 06:58 » 

не работает совсем .. по всякому пробовал ... в функцию не передается управление ..
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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 в качестве родителя сделать ? Улыбаюсь

(если я что то не так понял - сорри)
Записан

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

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


« Ответ #6 : 30-06-2008 07:48 » 

упс, CWnd - это образно выражаясь )) То же не MFC явно
Записан

hash_2000
Интересующийся

ru
Offline 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
Специалист

ru
Offline Offline

« Ответ #8 : 30-06-2008 07:59 » 

Попробуй половить в DllGetClassObject... Посмотри есть там вызовы и какие результаты.
Записан

while (8==8)
hash_2000
Интересующийся

ru
Offline Offline

« Ответ #9 : 30-06-2008 08:08 » 

самое странное что в когда ковырялся в MSDN'е нашел там пример где все сообщения обрабатываются нормально .. сидел сравнивал ... ну практически все то же самое !!! только там рабоатет, а у меня нет !! уже неделю долблюсь и ничего понять не могу .. може кто знает где можно найти справку (с примерами желательно) на русском языке
Записан
sss
Специалист

ru
Offline Offline

« Ответ #10 : 30-06-2008 08:14 » 

hash_2000, дай ссылку на MSDN... Вообще тебе наверное надо было new project->ATL Server Project->Finish
Записан

while (8==8)
hash_2000
Интересующийся

ru
Offline Offline

« Ответ #11 : 30-06-2008 08:27 » 

ссылку не помню, чтото найти не могу.проект называется SmartGravityBubbleCtrl.и мне не "server project" нужен а обычный нормальный контрол без чегото лишнего ...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #12 : 30-06-2008 08:44 » 

hash_2000, а в спае++ видать сообщения то - летят они к окну вообще ? Может там какой нибудь аналог  статиковского стиля notify надо поставить ?
Записан

sss
Специалист

ru
Offline Offline

« Ответ #13 : 30-06-2008 08:49 » 

hash_2000, твой ATL проект - сервер контролов.
Записан

while (8==8)
hash_2000
Интересующийся

ru
Offline Offline

« Ответ #14 : 30-06-2008 08:52 » 

sss,наверное да.я же написал что не разобрался с ATL.и как мне отловить эти сообщения ... или это вообще невозможно
Записан
sss
Специалист

ru
Offline Offline

« Ответ #15 : 30-06-2008 08:54 » 

hash_2000, не я не прав... Сейчас попробовал.
Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #16 : 30-06-2008 09:11 » new

Вот сейчас только попробовал. Создал ATL Project, добавил контрол от Button.  Запустил в ActiveX Control Test Container и поймал нажатие. Как ты добавляешь обработчик события? Смотри какой работает COMMAND_CODE_HANDLER(BN_CLICKED, OnBNClicked)!!!
Записан

while (8==8)
hash_2000
Интересующийся

ru
Offline Offline

« Ответ #17 : 30-06-2008 09:15 » 

все ... товарищи я разобрался ... такие сообщения вроде WM_SIZE, WM_ERASEBKGND (пока что еще не знаю какие еще входят в этот список, но это выяснить уже не сложно будет) будут работать в том случае если гдето в конструкторе дописать строчку
Код:
m_bWindowOnly = TRUE;
а сообщения вроде WM_LBUTTONDBLCLK ... можно ловить и без установки этого параметра
Записан
sss
Специалист

ru
Offline Offline

« Ответ #18 : 01-07-2008 00:15 » 

hash_2000, этот флажок можно указать в окне мастера.
Записан

while (8==8)
hash_2000
Интересующийся

ru
Offline Offline

« Ответ #19 : 01-07-2008 02:49 » 

ну да можно.только я нашел этот параметр разбирая исходник примера из MSDN.поэтому и указал так.
Записан
hash_2000
Интересующийся

ru
Offline Offline

« Ответ #20 : 02-07-2008 10:07 » 

тут же хотелось бы продолжить, раз уж заговорил об ATL. Может кто подскажет как сделать контрол невидимый во время выполнения приложения как например Timer Control в Бейсике.
Можно конечно убрать прорисовку, но может быть существует какой нибудь специяльный способ.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines