Talk:SysFn00/ru: Difference between revisions
mNo edit summary |
mNo edit summary |
||
(23 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{| | __NOTOC__ {{DISPLAYTITLE: Функция 0 — определить и нарисовать окно}} | ||
! | == Параметры == | ||
{| border="1" id="table1" class="wikitable sysfunc" | |||
|- | |||
! class="header" | биты | |||
! class="header" | тип | |||
! class="header" | значение | |||
! class="header" | описание | |||
|- | |- | ||
! | ! colspan="4" class="register" | eax | ||
|- | |- | ||
| class="bits" | 0–31 | |||
| | | class="type" | [[DataTypes/ru#UInt32|uint32]] | ||
| | | 0 | ||
| | | Номер функции. | ||
|- | |- | ||
! colspan="4" class="register" | ebx | |||
|- | |- | ||
| class="bits" | 0–15 | |||
| | | class="type" | [[DataTypes/ru#UInt16|uint16]] | ||
| | | ширина окна | ||
| | | rowspan="2" | Расположение окна относительно оси X. | ||
|- | |- | ||
| | | class="bits" | 16–31 | ||
| | | class="type" | [[DataTypes/ru#Int16|int16]] | ||
| позиция окна по X | |||
|- | |- | ||
! | ! colspan="4" class="register" | ecx | ||
|- | |- | ||
| | | class="bits" | 0–15 | ||
| | | class="type" | [[DataTypes/ru#UInt16|uint16]] | ||
| высота окна | |||
| rowspan="2" | Расположение окна относительно оси Y. | |||
|- | |- | ||
| | | class="bits" | 16–31 | ||
| | | class="type" | [[DataTypes/ru#Int16|int16]] | ||
| позиция окна по Y | |||
|- | |- | ||
| | ! colspan="4" class="register" | edx | ||
| | |- | ||
| class="bits" | 0–23 | |||
| class="type" | [[DataTypes/ru#RGB888|rgb888]] | |||
| цвет клиентской области | |||
| | |||
|- | |||
| class="bits" | 24–27 | |||
| class="type" | [[DataTypes/ru#UInt4|uint4]] | |||
| тип окна | |||
| | | | ||
* 0 | * 0 — тип окна I — окно фиксированных размеров; | ||
* 1 | * 1 — только определить область окна, ничего не рисовать; | ||
* 2 | * 2 — тип окна II — окно изменяемых размеров; | ||
* 3 | * 3 — тип окна III — окно со скином; | ||
* 4 | * 4 — тип окна IV — окно со скином фиксированных размеров. | ||
Остальные возможные значения (от 5 до 15) зарезервированы, вызов функции с такими значениями игнорируется. | |||
|- | |- | ||
| | | class="bits" | 28 | ||
| | | class="type" | [[DataTypes/ru#Bit|bit]] | ||
| 1 | | флаг: текст заголовка | ||
| Тип окна I–II: игнорируется. | |||
Тип окна III–IV: | |||
* 0 — нет заголовка; | |||
* 1 — адрес строки заголовка задаётся в edi. | |||
|- | |||
| class="bits" | 29 | |||
| class="type" | [[DataTypes/ru#Bit|bit]] | |||
| флаг: начало координат | |||
| Начало координат совпадает с: | |||
* 0 — левым верхним углом окна: 0 по X, 0 по Y; | |||
* 1 — левым верхним углом клиентской области: <ширина рамки> по X, <высота заголовка> по Y. | |||
|- | |||
| class="bits" | 30 | |||
| class="type" | [[DataTypes/ru#Bit|bit]] | |||
| флаг: сплошной фон | |||
| Клиентская область при отрисовке окна: | |||
* 0 — заполняется; | |||
* 1 — не заполняется. | |||
|- | |||
| class="bits" | 31 | |||
| class="type" | [[DataTypes/ru#Bit|bit]] | |||
| флаг: градиентный фон | |||
| Клиентская область заполняется: | |||
* 0 — сплошным цветом; | |||
* 1 — градиентом от указанного цвета к чёрному. | |||
|- | |||
! colspan="4" class="register" | esi | |||
|- | |||
| class="bits" | 0–23 | |||
| class="type" | [[DataTypes/ru#RGB888|rgb888]] | |||
| цвет заголовка окна | |||
| Только для окон типа I–II. | |||
|- | |||
| class="bits" | 24 | |||
| class="type" | [[DataTypes/ru#Bit|bit]] | |||
| флаг: неперемещаемое окно | |||
| | |||
* 0 — окно может быть перемещено пользователем; | |||
* 1 — окно не может быть перемещено пользователем. | |||
|- | |- | ||
| | | class="bits" | 25–27 | ||
| | | | ||
| | | 0 | ||
| Зарезервированы. | |||
|- | |- | ||
| | | class="bits" | 28–31 | ||
| | | class="type" | [[DataTypes/ru#UInt4|uint4]] | ||
| | | стиль заголовка окна | ||
| Тип окна I–II: | |||
* 0 — нет градиента; | |||
* 4 — негативный градиент; | |||
* 8 — обычный градиент. | |||
Другие значения зарезервированы. | |||
Тип окна III–IV: игнорируется. | |||
|- | |- | ||
! colspan="4" class="register" | edi | |||
|- | |- | ||
| class="bits" rowspan="2" | 0–31 | |||
| | | class="type" | [[DataTypes/ru#RGB888|rgb888]] | ||
| | | цвет рамки окна | ||
Только для окон типа I | | Только для окон типа I–II. | ||
|- | |- | ||
| class="type" | [[DataTypes/ru#C_String|char*]] | |||
| | | адрес строки заголовка | ||
| | | Только для окон типа III–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–IV с заголовком ('''edx'''<sub>28</sub> = 1) строка заголовка устанавливается при первом вызове этой функции и игнорируется при последующих (точнее говоря, игнорируется после вызова [[SysFn12/ru|функции 12.2]] — конца перерисовки); для изменения строки заголовка уже созданного окна используйте [[SysFn71/ru|функцию 71.1]]. | |||
Если использовать окна соответствующих стилей, то положение и/или размеры окна могут меняться пользователем. Текущие положение и размеры могут быть получены вызовом [[SysFn09/ru|функции 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''' (с учетом градиента) | |||
* если '''edx'''<sub>28</sub> = 1 и строка заголовка установлена [[SysFn71/ru|функцией 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''' (с учетом градиента) | |||
* если '''edx'''<sub>28</sub> = 1 и строка заголовка установлена [[SysFn71/ru|функцией 71.1]], то она выводится в соответствующем месте заголовка | |||
=== Вид окна со скином (типа III и IV) === | |||
* рисуется внешняя рамка шириной 1 пиксель цвета 'outer' из скина | |||
* рисуется промежуточная рамка шириной 3 пикселя цвета 'frame' из скина | |||
* рисуется внутренняя рамка шириной 1 пиксель цвета 'inner' из скина | |||
* рисуется заголовок (по картинкам из скина) в прямоугольнике (0, 0) – ('''xsize''', _skinh − 1) | |||
* если '''ysize''' ≥ 26, то закрашивается рабочая область окна — прямоугольник с левым верхним углом (5, _skinh) и правым нижним ('''xsize''' − 5, '''ysize''' − 5) — цветом, указанным в '''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 | тип окна |
Остальные возможные значения (от 5 до 15) зарезервированы, вызов функции с такими значениями игнорируется. |
28 | bit | флаг: текст заголовка | Тип окна I–II: игнорируется.
Тип окна III–IV:
|
29 | bit | флаг: начало координат | Начало координат совпадает с:
|
30 | bit | флаг: сплошной фон | Клиентская область при отрисовке окна:
|
31 | bit | флаг: градиентный фон | Клиентская область заполняется:
|
esi | |||
0–23 | rgb888 | цвет заголовка окна | Только для окон типа I–II. |
24 | bit | флаг: неперемещаемое окно |
|
25–27 | 0 | Зарезервированы. | |
28–31 | uint4 | стиль заголовка окна | Тип окна I–II:
Другие значения зарезервированы. Тип окна 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.
Окно должно умещаться на экране. Если переданные координаты и размеры не удовлетворяют этому условию, то соответствующая координата (или, возможно, обе) считается нулем, а если и это не помогает, то соответствующий размер (или, возможно, оба) устанавливается в размер экрана.
Размеры окна понимаются в смысле координат правого нижнего угла.
Вид окна типа 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
|