У меня имеется следующий COM-класс:
class ATL_NO_VTABLE Csurface :
public Isurface,
public IPersistStreamInitImpl<Csurface>,
public IOleControlImpl<Csurface>,
public IOleObjectImpl<Csurface>,
public IOleInPlaceActiveObjectImpl<Csurface>,
public IViewObjectExImpl<Csurface>,
public IOleInPlaceObjectWindowlessImpl<Csurface>,
public IPersistStorageImpl<Csurface>,
public ISpecifyPropertyPagesImpl<Csurface>,
public IQuickActivateImpl<Csurface>,
public IDataObjectImpl<Csurface>,
public IProvideClassInfo2Impl<&__uuidof(Csurface), NULL>,
public CComControl<Csurface>
{
public:
Csurface():m_dwMaxVertexes(MAX_VERTEXES)
{
}
DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |
OLEMISC_CANTLINKINSIDE |
OLEMISC_INSIDEOUT |
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST
)
BEGIN_MSG_MAP(Csurface)
CHAIN_MSG_MAP(CComControl<Csurface>)
MESSAGE_HANDLER(WM_CHAR, OnChar)
MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
Событие WM_KEYDOWN наступает, но код нажатой клавиши выдается совсем не тот.
Событие WM_CHAR никогда не наступает!
Что это такое? Что я упустил из виду? Может быть что-то не так?
Здравствуйте, peterbes, Вы писали:
p> У меня имеется следующий COM-класс:
p> p> class ATL_NO_VTABLE Csurface :
p> public Isurface,
p> public IPersistStreamInitImpl<Csurface>,
p> public IOleControlImpl<Csurface>,
p> public IOleObjectImpl<Csurface>,
p> public IOleInPlaceActiveObjectImpl<Csurface>,
p> public IViewObjectExImpl<Csurface>,
p> public IOleInPlaceObjectWindowlessImpl<Csurface>,
p> public IPersistStorageImpl<Csurface>,
p> public ISpecifyPropertyPagesImpl<Csurface>,
p> public IQuickActivateImpl<Csurface>,
p> public IDataObjectImpl<Csurface>,
p> public IProvideClassInfo2Impl<&__uuidof(Csurface), NULL>,
p> public CComControl<Csurface>
p> {
p> public:
p> Csurface():m_dwMaxVertexes(MAX_VERTEXES)
p> {
p> }
p> DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |
p> OLEMISC_CANTLINKINSIDE |
p> OLEMISC_INSIDEOUT |
p> OLEMISC_ACTIVATEWHENVISIBLE |
p> OLEMISC_SETCLIENTSITEFIRST
p> )
p> BEGIN_MSG_MAP(Csurface)
p> CHAIN_MSG_MAP(CComControl<Csurface>)
p> MESSAGE_HANDLER(WM_CHAR, OnChar)
p> MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
p> DEFAULT_REFLECTION_HANDLER()
p> END_MSG_MAP()
p>
p> Событие WM_KEYDOWN наступает, но код нажатой клавиши выдается совсем не
p> тот. Событие WM_CHAR никогда не наступает!
p> Что это такое? Что я упустил из виду? Может быть что-то не так?
События клавиатуры приходят в последовательности WM_KEYDOWN, WM_CHAR, WM_KEYUP. WM_CHAR появляется в результате дефолтовой обработки WM_KEYDOWN. В твоем случае, видимо, ты обрабатываешь WM_KEYDOWN и для него DefWindowProc не вызывается. Либо убери совсем обработку WM_KЕYDOWN либо поставь в обработчике
bHandled = FALSE;
Должно работать.
P.S. D3D мучаем?
-- Всего хорошего!
-- Alexandrov Alex, e-mail: alexandrov_alex@fromru.com
Posted via RSDN NNTP Server 1.7 "Bedlam"
Здравствуйте, alexandrov_alex, Вы писали:
_>События клавиатуры приходят в последовательности WM_KEYDOWN, WM_CHAR, WM_KEYUP. WM_CHAR появляется в результате дефолтовой обработки WM_KEYDOWN. В твоем случае, видимо, ты обрабатываешь WM_KEYDOWN и для него DefWindowProc не вызывается. Либо убери совсем обработку WM_KЕYDOWN либо поставь в обработчике
_>_>bHandled = FALSE;
_>
_>Должно работать.
_>P.S. D3D мучаем?
Спасибо. Мучаем. Твой код очень кстати. Сделаю вышлю тебе сорцы, компонент на архив как freeware. Идея сделать интерпретатор языка с оператором plot. Скриптовый С-like язык я собрал и реализовал в виде ActiveX. Очень хочется прикрутить 3D графику к нему, с GDI(GDI+) я потихоньку распрощаюсь.