Difference between revisions of "Talk:SysFn00/ru"

From KolibriOS wiki
Jump to navigation Jump to search
m
m
 
(20 intermediate revisions by the same user not shown)
Line 1: Line 1:
{| border="1" width="100%" id="table1" class="wikitable" style="font-size:80%"
+
__NOTOC__ {{DISPLAYTITLE: Функция 0 — определить и нарисовать окно}}
colspan="3" style="background:#ddddff" | <p align="center">Параметры
+
== Параметры ==
 +
 
 +
{| border="1" id="table1" class="wikitable sysfunc"
 +
|-
 +
!  class="header" | биты
 +
class="header" | тип
 +
!  class="header" | значение
 +
!  class="header" | описание
 
|-  
 
|-  
width="6%" colspan="3" align="center" | <b>eax</b>
+
!  colspan="4" class="register" | eax
 
|-  
 
|-  
align="center" | <tt>&nbsp;0..31</tt>
+
class="bits" | 0&ndash;31
|  0  
+
|  class="type" | [[DataTypes/ru#UInt32|uint32]]
width="67%" | номер функции  
+
|  0
 +
Номер функции.
 
|-  
 
|-  
width="6%" colspan="3" align="center" | <b>ebx</b>
+
!  colspan="4" class="register" | ebx
 
|-  
 
|-  
align="center" | <tt>&nbsp;0..15</tt>
+
class="bits" | 0&ndash;15
размер по оси x
+
|  class="type" | [[DataTypes/ru#UInt16|uint16]]
width="67%" rowspan="2" | обозначим далее xpos и xsize координатой и размером по оси x
+
ширина окна
 +
|  rowspan="2" | Расположение окна относительно оси X.
 
|-  
 
|-  
align="center" | <tt>16..31</tt>
+
class="bits" | 16&ndash;31
координата по оси x
+
|  class="type" | [[DataTypes/ru#Int16|int16]]
 +
позиция окна по X
 
|-  
 
|-  
width="6%" colspan="3" align="center" | <b>ecx</b>
+
!  colspan="4" class="register" | ecx
 
|-  
 
|-  
align="center" | <tt>&nbsp;0..15</tt>
+
class="bits" | 0&ndash;15
размер по оси y
+
|  class="type" | [[DataTypes/ru#UInt16|uint16]]
width="67%" rowspan="2" | обозначим далее ypos и ysize координатой и размером по оси y
+
высота окна
 +
|  rowspan="2" | Расположение окна относительно оси Y.
 
|-  
 
|-  
align="center" | <tt>16..31</tt>
+
class="bits" | 16&ndash;31
координата по оси y
+
|  class="type" | [[DataTypes/ru#Int16|int16]]
 +
позиция окна по Y
 
|-  
 
|-  
width="6%" colspan="3" align="center" | <b>edx</b>
+
!  colspan="4" class="register" | edx
 
|-  
 
|-  
align="center" | <tt>&nbsp;0..&nbsp;7</tt>
+
class="bits" | 0&ndash;23
|  синая компонента цвета
+
class="type" | [[DataTypes/ru#RGB888|rgb888]]
rowspan="3" | цвет рабочей области окна (игнорируется для стиля Y=2)
+
цвет клиентской области
 +
 
|-  
 
|-  
align="center" | <tt>&nbsp;8..15</tt>
+
class="bits" | 24&ndash;27
зелёная компонента цвета
+
|  class="type" | [[DataTypes/ru#UInt4|uint4]]
 +
тип окна
 +
|
 +
* 0 &mdash; тип окна I &mdash; окно фиксированных размеров;
 +
* 1 &mdash; только определить область окна, ничего не рисовать;
 +
* 2 &mdash; тип окна II &mdash; окно изменяемых размеров;
 +
* 3 &mdash; тип окна III &mdash; окно со скином;
 +
* 4 &mdash; тип окна IV &mdash; окно со скином фиксированных размеров.
 +
Остальные возможные значения (от 5 до 15) зарезервированы, вызов функции с такими значениями игнорируется.
 
|-  
 
|-  
align="center" | <tt>16..23</tt>
+
class="bits" | 28
красная компонента цвета
+
|  class="type" | [[DataTypes/ru#Bit|bit]]
 +
флаг: текст заголовка
 +
|  Тип окна I&ndash;II: игнорируется.
 +
 
 +
Тип окна III&ndash;IV:
 +
* 0 &mdash; нет заголовка;
 +
* 1 &mdash; адрес строки заголовка задаётся в edi.
 
|-  
 
|-  
align="center" | <tt>24..27</tt>
+
class="bits" | 29
стиль окна
+
|  class="type" | [[DataTypes/ru#Bit|bit]]
|
+
флаг: начало координат
* 0 - тип I - окно фиксированных размеров
+
| Начало координат совпадает с:
* 1 - только определить область окна, ничего не рисовать
+
* 0 &mdash; левым верхним углом окна: 0 по X, 0 по Y;
* 2 - тип II - окно изменяемых размеров
+
* 1 &mdash; левым верхним углом клиентской области: &lt;ширина рамки&gt; по X, &lt;высота заголовка&gt; по Y.
* 3 - окно со скином
+
|-  
* 4 - окно со скином фиксированных размеров
+
|  class="bits" | 30
остальные возможные значения (от 5 до 15) зарезервированы, вызов функции с такими Y игнорируется
+
|  class="type" | [[DataTypes/ru#Bit|bit]]
 +
|  флаг: сплошной фон
 +
|  Клиентская область при отрисовке окна:
 +
* 0 &mdash; заполняется;
 +
* 1 &mdash; не заполняется.
 +
|-  
 +
|  class="bits" | 31
 +
|  class="type" | [[DataTypes/ru#Bit|bit]]
 +
|  флаг: градиентный фон
 +
|  Клиентская область заполняется:
 +
* 0 &mdash; сплошным цветом;
 +
* 1 &mdash; градиентом от указанного цвета к чёрному.
 
|-  
 
|-  
| align="center" | <tt>28</tt>
+
! colspan="4" class="register" | esi
|  A
 
|  1 - у окна есть заголовок; для стилей Y=3,4 адрес строки заголовка задаётся в edi, для прочих стилей используется подфункция 1 функции 71
 
 
|-  
 
|-  
align="center" | <tt>29</tt>
+
class="bits" | 0&ndash;23
B
+
|  class="type" | [[DataTypes/ru#RGB888|rgb888]]
1 - координаты всех графических примитивов задаются относительно клиентской области окна
+
цвет заголовка окна
 +
Только для окон типа I&ndash;II.
 
|-  
 
|-  
align="center" | <tt>30</tt>
+
class="bits" | 24
C
+
|  class="type" | [[DataTypes/ru#Bit|bit]]
| 1 - не закрашивать рабочую область при отрисовке окна
+
флаг: неперемещаемое окно
 +
|
 +
* 0 &mdash; окно может быть перемещено пользователем;
 +
* 1 &mdash; окно не может быть перемещено пользователем.
 
|-  
 
|-  
align="center" | <tt>31</tt>
+
class="bits" | 25&ndash;27
D
+
|   
1 - градиентная заливка рабочей области, 0 - нормальная
+
|  0
 +
|  Зарезервированы.
 
|-  
 
|-  
! width="6%" colspan="3" align="center" | <b>esi</b>
+
| class="bits" | 28&ndash;31
 +
|  class="type" | [[DataTypes/ru#UInt4|uint4]]
 +
|  стиль заголовка окна
 +
|  Тип окна I&ndash;II:
 +
* 0 &mdash; нет градиента;
 +
* 4 &mdash; негативный градиент;
 +
* 8 &mdash; обычный градиент.
 +
Другие значения зарезервированы.
 +
 
 +
Тип окна III&ndash;IV: игнорируется.
 
|-  
 
|-  
| width="26%" colspan="2" | 0xXYRRGGBB
+
! colspan="4" class="register" | edi
|  width="67%" |  
 
Только для окон типа I и II
 
Цвет заголовка:
 
* RR, GG, BB определяют сам цвет
 
* Y=0 - обычное окно, Y=1 - неперемещаемое окно
 
* X определяет градиент заголовка: X=0 - нет градиента, X=8 - обычный градиент, для окон типа II X=4 - негативный градиент
 
* прочие значения X и Y зарезервированы
 
 
|-  
 
|-  
! width="6%" colspan="3" align="center" | <b>edi</b>
+
| class="bits" rowspan="2" | 0&ndash;31
 +
|  class="type" | [[DataTypes/ru#RGB888|rgb888]]
 +
|  цвет рамки окна
 +
|  Только для окон типа I&ndash;II.
 
|-  
 
|-  
width="26%" colspan="2" | 0x00RRGGBB
+
class="type" | [[DataTypes/ru#C_String|char*]]
width="67%" |  
+
адрес строки заголовка
  Только для окон типа I и II.
+
|  Только для окон типа III&ndash;IV при '''edx'''<sub>28</sub> = 1.
Цвет рамки окна
 
 
|}
 
|}
 +
 +
== Возвращаемое значение ==
 +
 +
Функция не возвращает значения.
 +
 +
== Примеры ==
 +
 +
<source>
 +
        ;; без макросов
 +
 +
        ; номер функции: 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
 +
; ...
 +
</source>
 +
 +
== Примечания ==
 +
 +
Положение и размеры окна устанавливаются при первом вызове этой функции и игнорируются при последующих; для изменения положения и/или размеров уже созданного окна используйте 67-ю функцию.
 +
 +
Для окон типа III&ndash;IV с заголовком ('''edx'''<sub>28</sub> = 1) строка заголовка устанавливается при первом вызове этой функции и игнорируется при последующих (точнее говоря, игнорируется после вызова [[SysFn12/ru|функции 12.2]] &mdash; конца перерисовки); для изменения строки заголовка уже созданного окна используйте [[SysFn71/ru|функцию 71.1]].
 +
 +
Если использовать окна соответствующих стилей, то положение и/или размеры окна могут меняться пользователем. Текущие положение и размеры могут быть получены вызовом [[SysFn09/ru|функции 9]].
 +
 +
Окно должно умещаться на экране. Если переданные координаты и размеры не удовлетворяют этому условию, то соответствующая координата (или, возможно, обе) считается нулем, а если и это не помогает, то соответствующий размер (или, возможно, оба) устанавливается в размер экрана.
 +
 +
{{note | Далее обозначим '''xpos''', '''ypos''', '''xsize''', '''ysize''' &mdash; значения, передаваемые в '''ebx''' и '''ecx'''. Координаты приводятся относительно левого верхнего угла окна, который, таким образом, задается как (0, 0), координаты правого нижнего угла суть ('''xsize''', '''ysize''').}}
 +
 +
Размеры окна понимаются в смысле координат правого нижнего угла.
 +
 +
{{note | Это же относится и ко всем остальным функциям. Это означает, что реальные размеры на 1 пиксель больше.}}
 +
 +
=== Вид окна типа I ===
 +
 +
* рисуется внешняя рамка цвета, указанного в '''edi''', шириной 1 пиксель
 +
* рисуется заголовок &mdash; прямоугольник с левым верхним углом (1, 1) и правым нижним ('''xsize''' &minus; 1, min(25, '''ysize''')) цвета, указанного в '''esi''' (с учетом градиента)
 +
* если '''ysize''' &ge; 26, то закрашивается рабочая область окна &mdash; прямоугольник с левым верхним углом (1, 21) и правым нижним ('''xsize''' &minus; 1, '''ysize''' &minus; 1) (размерами ('''xsize''' &minus; 1) &times; ('''ysize''' &minus; 21)) &mdash; цветом, указанным в '''edx''' (с учетом градиента)
 +
* если '''edx'''<sub>28</sub> = 1 и строка заголовка установлена [[SysFn71/ru|функцией 71.1]], то она выводится в соответствующем месте заголовка
 +
 +
=== Вид окна типа II ===
 +
 +
* рисуется внешняя рамка шириной 1 пиксель "затенённого" цвета '''edi''' (все составляющие цвета уменьшаются в два раза)
 +
* рисуется промежуточная рамка шириной 3 пикселя цвета '''edi'''
 +
* рисуется внутренняя рамка шириной 1 пиксель "затенённого" цвета '''edi'''
 +
* рисуется заголовок &mdash; прямоугольник с левым верхним углом (4, 4) и правым нижним ('''xsize''' &minus; 4, min(20, '''ysize''')) цвета, указанного в '''esi''' (с учетом градиента)
 +
* если '''ysize''' &ge; 26, то закрашивается рабочая область окна &mdash; прямоугольник с левым верхним углом (5, 20) и правым нижним ('''xsize''' &minus; 5, '''ysize''' &minus; 5) &mdash; цветом, указанным в '''edx''' (с учетом градиента)
 +
* если '''edx'''<sub>28</sub> = 1 и строка заголовка установлена [[SysFn71/ru|функцией 71.1]], то она выводится в соответствующем месте заголовка
 +
 +
=== Вид окна со скином (типа III и IV) ===
 +
 +
* рисуется внешняя рамка шириной 1 пиксель цвета 'outer' из скина
 +
* рисуется промежуточная рамка шириной 3 пикселя цвета 'frame' из скина
 +
* рисуется внутренняя рамка шириной 1 пиксель цвета 'inner' из скина
 +
* рисуется заголовок (по картинкам из скина) в прямоугольнике (0, 0) &ndash; ('''xsize''', _skinh &minus; 1)
 +
* если '''ysize''' &ge; 26, то закрашивается рабочая область окна &mdash; прямоугольник с левым верхним углом (5, _skinh) и правым нижним ('''xsize''' &minus; 5, '''ysize''' &minus; 5) &mdash; цветом, указанным в '''edx''' (с учетом градиента)
 +
* определяются две стандартные кнопки: закрытия и минимизации (смотри [[SysFn08/ru|функцию 8]])
 +
* если '''edx'''<sub>28</sub> = 1 и в '''edi''' (ненулевой) указатель на строку заголовка, то она выводится в заголовке в месте, определяемом скином
 +
 +
Значение переменной _skinh доступно как результат вызова [[SysFn48/ru|функции 48.4]]
 +
 +
{{System functions}}
 +
[[Category: SysCalls]]

Latest revision as of 20:38, 1 January 2011

Параметры

биты тип значение описание
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