Функция 0 — определить и нарисовать окно

From KolibriOS wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Параметры

биты тип значение описание
eax
0–31 uint32 0 Номер функции.
ebx
0–15 uint16 ширина окна Расположение окна относительно оси X.
16–31 int16 позиция окна по X
ecx
0–15 uint16 высота окна Расположение окна относительно оси Y.
16–31 int16 позиция окна по Y
edx
0–23 rgb888 цвет клиентской области
24–27 uint4 тип окна
  • 0 — тип окна I — окно фиксированных размеров;
  • 1 — только определить область окна, ничего не рисовать;
  • 2 — тип окна II — окно изменяемых размеров;
  • 3 — тип окна III — окно со скином;
  • 4 — тип окна IV — окно со скином фиксированных размеров.

Остальные возможные значения (от 5 до 15) зарезервированы, вызов функции с такими значениями игнорируется.

28 bit флаг: текст заголовка Тип окна I–II: игнорируется.

Тип окна III–IV:

  • 0 — нет заголовка;
  • 1 — адрес строки заголовка задаётся в edi.
29 bit флаг: начало координат Начало координат совпадает с:
  • 0 — левым верхним углом окна: 0 по X, 0 по Y;
  • 1 — левым верхним углом клиентской области: <ширина рамки> по X, <высота заголовка> по Y.
30 bit флаг: сплошной фон Клиентская область при отрисовке окна:
  • 0 — заполняется;
  • 1 — не заполняется.
31 bit флаг: градиентный фон Клиентская область заполняется:
  • 0 — сплошным цветом;
  • 1 — градиентом от указанного цвета к чёрному.
esi
0–23 rgb888 цвет заголовка окна Только для окон типа I–II.
24 bit флаг: неперемещаемое окно
  • 0 — окно может быть перемещено пользователем;
  • 1 — окно не может быть перемещено пользователем.
25–27 0 Зарезервированы.
28–31 uint4 стиль заголовка окна Тип окна I–II:
  • 0 — нет градиента;
  • 4 — негативный градиент;
  • 8 — обычный градиент.

Другие значения зарезервированы.

Тип окна III–IV: игнорируется.

edi
0–31 rgb888 цвет рамки окна Только для окон типа I–II.
char* адрес строки заголовка Только для окон типа III–IV при edx28 = 1.

Возвращаемое значение

Функция не возвращает значения.

Примеры

        ;; без макросов

        ; номер функции: 0
        xor     eax, eax
        ; расположение окна: <смещение> * 65536 + <размер>
        ; альтернативы: 100 shl 16 + 300, 0x0064012C
        mov     ebx, 100 * 65536 + 300
        mov     eсx, 200 * 65536 + 150
        ; цвет фона: 0x0080ff (красный 0, зелёный 128, синий 255)
        ; тип окна: III (со скином, изменяемых размеров)
        ; флаги: есть текст заголовка, рисование относительно (0, 0), сплошная заливка фона без градиента
        mov     edx, 0x130080ff
        ; адрес строки заголовка
        mov     edi, window_title
        ; вызов функции
        int     0x40

        ;; то же самое с использованием mcall

        mcall   0, <100, 300>, <200, 150>, 0x130080ff, , window_title

; ...
window_title db 'Foobar', 0
; ...

Примечания

Положение и размеры окна устанавливаются при первом вызове этой функции и игнорируются при последующих; для изменения положения и/или размеров уже созданного окна используйте 67-ю функцию.

Для окон типа III–IV с заголовком (edx28 = 1) строка заголовка устанавливается при первом вызове этой функции и игнорируется при последующих (точнее говоря, игнорируется после вызова функции 12.2 — конца перерисовки); для изменения строки заголовка уже созданного окна используйте функцию 71.1.

Если использовать окна соответствующих стилей, то положение и/или размеры окна могут меняться пользователем. Текущие положение и размеры могут быть получены вызовом функции 9.

Окно должно умещаться на экране. Если переданные координаты и размеры не удовлетворяют этому условию, то соответствующая координата (или, возможно, обе) считается нулем, а если и это не помогает, то соответствующий размер (или, возможно, оба) устанавливается в размер экрана.

Note: Далее обозначим xpos, ypos, xsize, ysize — значения, передаваемые в ebx и ecx. Координаты приводятся относительно левого верхнего угла окна, который, таким образом, задается как (0, 0), координаты правого нижнего угла суть (xsize, ysize).

Размеры окна понимаются в смысле координат правого нижнего угла.

Note: Это же относится и ко всем остальным функциям. Это означает, что реальные размеры на 1 пиксель больше.

Вид окна типа I

  • рисуется внешняя рамка цвета, указанного в edi, шириной 1 пиксель
  • рисуется заголовок — прямоугольник с левым верхним углом (1, 1) и правым нижним (xsize − 1, min(25, ysize)) цвета, указанного в esi (с учетом градиента)
  • если ysize ≥ 26, то закрашивается рабочая область окна — прямоугольник с левым верхним углом (1, 21) и правым нижним (xsize − 1, ysize − 1) (размерами (xsize − 1) × (ysize − 21)) — цветом, указанным в edx (с учетом градиента)
  • если edx28 = 1 и строка заголовка установлена функцией 71.1, то она выводится в соответствующем месте заголовка

Вид окна типа II

  • рисуется внешняя рамка шириной 1 пиксель "затенённого" цвета edi (все составляющие цвета уменьшаются в два раза)
  • рисуется промежуточная рамка шириной 3 пикселя цвета edi
  • рисуется внутренняя рамка шириной 1 пиксель "затенённого" цвета edi
  • рисуется заголовок — прямоугольник с левым верхним углом (4, 4) и правым нижним (xsize − 4, min(20, ysize)) цвета, указанного в esi (с учетом градиента)
  • если ysize ≥ 26, то закрашивается рабочая область окна — прямоугольник с левым верхним углом (5, 20) и правым нижним (xsize − 5, ysize − 5) — цветом, указанным в edx (с учетом градиента)
  • если edx28 = 1 и строка заголовка установлена функцией 71.1, то она выводится в соответствующем месте заголовка

Вид окна со скином (типа III и IV)

  • рисуется внешняя рамка шириной 1 пиксель цвета 'outer' из скина
  • рисуется промежуточная рамка шириной 3 пикселя цвета 'frame' из скина
  • рисуется внутренняя рамка шириной 1 пиксель цвета 'inner' из скина
  • рисуется заголовок (по картинкам из скина) в прямоугольнике (0, 0) – (xsize, _skinh − 1)
  • если ysize ≥ 26, то закрашивается рабочая область окна — прямоугольник с левым верхним углом (5, _skinh) и правым нижним (xsize − 5, ysize − 5) — цветом, указанным в edx (с учетом градиента)
  • определяются две стандартные кнопки: закрытия и минимизации (смотри функцию 8)
  • если edx28 = 1 и в edi (ненулевой) указатель на строку заголовка, то она выводится в заголовке в месте, определяемом скином

Значение переменной _skinh доступно как результат вызова функции 48.4