

                  КЛАСС "BITMAP" ДЛЯ MS-WINDOWS
                  -----------------------------


     Вашему  вниманию  предлагается  небольшой модуль, реализующий
дополнительный класс окон в среде Microsoft Windows.  Единственная
функция такого  окна -  отображать картинку  (Bitmap), имя которой
указано в  качестве текста  в окне,  т.е. новый  класс по  способу
применения  полностью  аналогичен  классу  "STATIC"  с   атрибутом
SS_ICON.  Например,  для  замены  в  диалоге   иконки  (ICON)   на
картинку (BITMAP) с помощью ресурсного редактора нужно:

     - класс "STATIC-ICON" заменить  на "Custom Control" с  именем
       класса "BitmapWnd".

     - в   строку  "Text"  занести   имя  ресурса  BITMAP картинки,
       которая должна находиться в этом месте диалога.

     - в теле главной программы зарегистрировать новый класс вызовом
       функции "BMP_Register"  ("uses BMPClass"  для  паскалевского
       варианта).


                      Несколько замечаний:

- (для особо продвинутых  читателей) Конечно, в недрах  MS-Windows
  можно найти  много всего  готового, но  в такой неустаканившийся
  период  лучше   не  полагаться   на  то,   чего  нет   в  списке
  документированных функций.

- Код   написан  по  принципу:  "в кратчайший срок получен искомый
  результат, а для  совершенствования нет предела".  Вот несколько
  путей:

     - При изменении  размера окна уничтожается  текущий экземпляр
       и  создается  новая  копия  Bitmap  в  памяти. Самый тупой,
       медленный,  но   сразу  работающий   способ.  Простор   для
       совершенствования.

     - Если не удалось найти BITMAP ресурс с указанным именем,  то
       образ  картинки  в  памяти  закрашивается  черным   цветом.
       Гораздо лучше установить флаг  - сообщение о неудаче  и при
       рисовании просто закрашивать окно кисточкой, а не  занимать
       память ничего не содержащим образом картинки.

     - Мне на сегодня  не известен способ реализовать  такой класс
       в  виде  DLL.  Проблема  заключается  в  получении   хэндла
       экземпляра аппликации  (hInstance), создавшей  текущее окно
       (m->hwnd в  терминах конкретной  программы), для  доступа к
       его пространству  ресурсов (а  не той  DLL, где  реализован
       данный  класс!)  Попытка  воспользоватся  хэндлом  задачи с
       помощью  функции  "GetWindowTask"  мне  не удалась (hTask и
       hInstance  -  разные  вещи).  Моя  глубокая признательность
       всем, кто захочет поделиться информацией.

- Текст   Demo  программы  не  следует  рассматривать  как  пример
  Windows  аппликации.  Там  половина   сделана  не  по   правилам
  исключительно для краткости.

- Текст самого  класса далеко не  полный, но то,  что реализовано,
  работает правильно.

- По поводу #include "N_Wirth.h" и необычного "C" стиля:
     - каждый извращается, как умеет
     - с первого раза, конечно, может показаться очень непривычно
     - но с другой стороны в этом что-то есть
     - а лично мне, так О-О-ОЧЕНЬ удобно.



      Информация: MSC v5.1 и Windows.h из поставки SDK 3.0

   Хороший стиль  требует максимального  использования компилятора
для поиска слабых  мест в программе  (для v5.1 это  опция -W3, для
v6.0  -WX).  На  максимальном   уровне  предупреждений  MSC   v5.1
обижается на бестактность, допущенную в оригинальном Windows.h:  в
нескольких  местах  битовые  поля  упакованных  структур имеют тип
BYTE (unsigned char). Поставьте WORD, и все будет хорошо.


     Способ распространения - FreeWare. Но убедительная просьба  -
не  ковыряйте  "N_Wirth.h"!  Просто  выбросьте,  если  не   хотите
использовать, как есть.


                                                         20-Nov-91
                                              Константин Е. Исаков
                                             (095) 458-2206 (дом.)
