Заметки по WinAPI

  • очередь особщений, структура MSG typedef struct tagMSG {

      HWND   hwnd;
      UINT   message;
      WPARAM wParam;
      LPARAM lParam;
      DWORD  time;
      POINT  pt;
    

    } MSG, PMSG, LPMSG;

  • system, user, app, registered

    • system 0x0000-0x03FF - определенные системой
    • user 0x0400-0x07FF - для private window classes
    • app 0x0800-0xBFFF - private messages для приложений версии 4.0
    • registered 0xC000-0xFFFF - registered - регистрируются с помощью RegisterWindowMessage
      • используется для сообщений которые должны слаться между разными процессами и между окон разных классов
      • уникальны для всей системы
      • если два приложения зарегистрируют сообщение с одинаковой строкой, то им вернется один и тот же идентификатор (в этом вся фишка) UINT WINAPI RegisterWindowMessage( In LPCTSTR lpString );
  • цикл обработки сообщений BOOL WINAPI GetMessage(

      _Out_     LPMSG lpMsg,            // куда записывать инфо
      _In_opt_  HWND hWnd,            // какому окну предназанчается сообщение (если NULL - текущий пооток)
      _In_      UINT wMsgFilterMin,    // минимальное допустимое значение сообщение
      _In_      UINT wMsgFilterMax    // максимально ...
    

    ); TranslateMessage( MSG ) - транслирует соощение о virtual-key в сообщения онажатии конкретной клавиши (новые сообщения постятся в очередь текущего потока) DispatchMessage( MSG ) - передает сообщение оконной процедуре

  • ввод с клавиатуры, мыши, команд меню и нотификации от контролов

    • Клава (с шестого этажа)
      • WM_KEYDOWN ( о системных клавишах )
        • wParam - код клавиши
        • lParam - побитовая кодировка контекста (количество повторов при зажатии клавиши, зажат ли Alt или Ctrl)
      • WM_CHAR ( о символьных клавишах ) - они появляются только после TranslateMessage
        • wParam - код клавиши
        • lParam - тот же что и у WM_KEYDOWN
    • Мышь
      • WM_*BUTTONDOWN/UP/DBLCLK // последнее - если класс определен с нужным флагом
        • lParam - координаты, вытаскиваются макросами GET_X_LPARAM GET_Y_LPARAM
        • wParam - доп инфа (зажат ли Ctrl или Shift, или другие кнопки мыши)
      • WM_NC*BUTTONDOWN
        • сообщения о действиях мыши в неклиентской зоне
        • обычно игнорятся приложением (система сама их обрабатывает)
  • очереди, приоритет и т д

    • читать Рихтера
  • subclass superclass

    • subclassing
      • возможность обрабатывать сообщения окна X, до того, как X начал их обрабатывать
      • требование, оно должно быть в этом же процессе
      • для одного окна
        • вызываем SetWindowLong и подменяем оконную процедуру (и сохраняем адрес старой, чтобы могли посылать сообщения далее)
          • пример - запретить EditControl'у принимать некоторый свойствы
      • для всех
        • вызываем SetWindowClass иподменяем оконную процедуру
          • пометка: для функции нам надознать хэндл окна, потому обычно создается скрытое окно этого класса и его хэндл посылается в SetClassLong
      • отличие, мы не создаем отдельный класс, а подменяем либо в окне, либо в существующем классе
      • важно: УДАЛЯТЬ все созданные subclass притом в порядке обратном их созданию
    • superclassing
      • создаем класс, основанный на некотором baseклассе + некоторые фичи
      • также, за счет этого, мы можем оброабатывать WM_CREATE и WM_NCCREATE
      • проделываем так:
        • GetClassInfo
        • подменяем hInstance, wndProc и имя
        • регистрируем новый класс