Re: Куда исчезает WM_CHAR?
От: alexandrov_alex США  
Дата: 12.10.03 18:14
Оценка: 11 (2)
Здравствуйте, 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"
It's kind of fun to do the impossible (Walt Disney)
Re: Куда исчезает WM_CHAR?
От: om600  
Дата: 12.10.03 18:24
Оценка: 4 (1)
Здравствуйте, peterbes, Вы писали:


P>У меня имеется следующий COM-класс:

.......
P>Событие WM_KEYDOWN наступает, но код нажатой клавиши выдается совсем не тот.
P>Событие WM_CHAR никогда не наступает!

P>Что это такое? Что я упустил из виду? Может быть что-то не так?


Предположение.

В недрах каждой проги для Вин в функции WinMain присутствует главный цикл выборки сообщений. Его задача — извлечь сообщение из очереди (::GetMessage(...)) и направить его на обработку окну, которому оно поступило via ::DispatchMessage(...). Перед этим осуществляется одно маленькое, но важное действие: происходит трансляция _клавиатурных_ сообщений из виртуальных кодов в символьные. То есть WM_KEYDOWN -> WM_SYSCHAR -> WM_CHAR. Это делается функцией ::TranslateMessage(...).

Вот. Ноги растут отсюда.
Куда исчезает WM_CHAR?
От: peterbes Россия  
Дата: 12.10.03 09:24
Оценка:
У меня имеется следующий 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 никогда не наступает!

Что это такое? Что я упустил из виду? Может быть что-то не так?
Re[2]: Куда исчезает WM_CHAR?
От: peterbes Россия  
Дата: 13.10.03 04:54
Оценка:
Здравствуйте, 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+) я потихоньку распрощаюсь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.