RDM/2 The Russian Electronic Developer Magazine  
RDM/2 Русский электронный журнал разработчика  
ДомойОт редактораПишите намОбратная связьRU/2

Рисуем 3D рамки

Как это бывает в жизни, иногда очень хочется нарисовать где нибудь в окне программы объемную рамочку (так называему 3D рамку). Делать этого с помощью GPI функций обычно не хочется, потому как слишком хлопотно. Ну вот тогда мы и лезем в описание Presentation Manager в надежде найти там что нибудь этакое 3D-шное. И, на первый взгляд, находим - WinDrawBorder(). Только вот после внимательного изучения описания функции становится ясно, что объемными рамками там даже и не пахнет :(

Мдаа... Работящие люди обычно плюют на все это и быстренько рисуют рамку с помощью полтора десятка строк обращений к GPI функциям, а вот ленивые - лезут в интернет в поисках чего нибудь этакого и недокументированного и, если находят, потом еще тратят время на эксперименты с полученной информацией. Такие вот дела.

Давайте-ка вспомним синтаксис той самой разочаровавшей нас функции:

#define INCL_WINWINDOWMGR /* Or use INCL_WIN, INCL_PM, */
  #include <os2.h>

rc = WinDrawBorder(hps, prcl, cx, cy, clrFore, clrBack, flCmd);
 
  PS        hps;      /*  Presentation-space handle. */
  PRECTL    prcl;     /*  Bounding rectangle for the border. */
  LONG      cx;       /*  Width of border rectangle vertical sides. */
  LONG      cy;       /*  Width of border rectangle horizontal sides. */
  LONG      clrFore;  /*  Color of edge of border. */
  LONG      clrBack;  /*  Color of interior of border. */
  ULONG     flCmd;    /*  Flags controlling the way in which the border is drawn. */
  BOOL      rc;       /*  Success indicator. */
Так-с, а теперь возьмем и самым наглым образом объявим флаги, которых нет в заголовочных файлах OS/2 (Где я их взял? Ну конечно же в интернет! :)
#define DB_RAISED     0x0400
  #define DB_DEPRESSED  0x0800
  #define DB_TROUGH     0x1000
  #define DB_FENCE      0x2000
  #define DB_FIELD      0x4000
Ну-с, а теперь можно посмотреть на то что получится:

1. WinDrawBorder( hps, prcl, 2, 2, 0, 0, DB_RAISED );

Вот такая рамка Очень напоминает стандартную осевую кнопку. Надо заметить что цвета clrFore и clrBack при рисовании этой рамки игнорируются.

2. WinDrawBorder( hps, prcl, 2, 2, 0, 0, DB_DEPRESSED );

Вот такая рамка Опять же очень напоминает стандартную осевую кнопку, только в нажатом состоянии. Надо заметить что цвета clrFore и clrBack вновь игнорируются.

3. WinDrawBorder( ps, prcl, 1, 1, CLR_BLACK, 0, DB_TROUGH );

Вот такая рамка Ба! Да это же наш старый знакомый GROUP BOX, только там вместо черного цвета для clrFore используется темно-серый. Но это уж как Вам захочется. А цвет clrBack снова игнорируется.

4. WinDrawBorder( ps, prcl, 1, 1, CLR_WHITE, 0, DB_FENCE );

Вот такая рамка А вот это я даже сразу и не вспомню - где же я это видел. Но, впрочем, тоже выглядит вполне 3D. Кстати, clrBack, как это не удивительно, опять игнорируется.

5. WinDrawBorder( ps, prcl, 1, 1, CLR_BLACK, CLR_WHITE, DB_FIELD );

Вот такая рамка Ну это уже даже и не рамка, а прямо таки поле ввода какое-то. Хотя тоже может пригодиться. Кроме того, что это не похоже на рамку, здесь еще можно задавать оба цвета - clrFore и clrBack (я и сам то сначала в это не поверил :).

Ну вот и все.

Надеюсь это кому-то пригодится. Потому что нужной лично мне разновидности рамки здесь не оказалось и мне таки пришлось написать полтора десятка строк кода и нарисовать ее самостоятельно :)

Дмитрий А.Стекленев, aka GlassMan(RU)

---
Интересные ссылки: Нетбук hp compaq, macbook pro - игровые sony.

---

---
Комментариев к странице: 0 | Добавить комментарий
---
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов
(C) Russian Underground/2