Posted: Fri Jun 24, 2005 2:59 pm
Если кому-нибудь интересно, я выложил исходники своей кривой незаконченной GUI-библиотеки:
http://poddubny.hut1.ru
http://poddubny.hut1.ru
В том то и дело! Я например для того асм и учу, чтоб под меось покодить. А на С я и так смогу, но нет желания.Иван Поддубный wrote:Для асма нужна поддержка ООП, которой пока нет.
Code: Select all
struc TRect
{
.X1 dw 0
.Y1 dw 0
.X2 dw 0
.Y2 dw 0
}
struc GControl
{ .C_START:
.ID dw 0
.Focus db 0
.Area TRect
.Activate dd 0 ;pointer
.DefaultAction dd 0 ;pointer
.C_END:
}
Control GControl
Cursor dw 0
Registered dw 0 ;iteration
XMouse dw 0 ;temporarely here...
YMouse dw 0 ;Will be used Evt.XMouse or Evt.Mouse.X instead
ControlSize = Control.C_END-Control.C_START
Components rb 2*(ControlSize) ; Array of Components [1..MaxCount] MaxCount=...? List is better, but now i haven't it
RegisterControl:
;19 байт на структуру
inc [Registered] ;i=i+1
mov ebx,Components ;загоняем указатель на массив компонент
xor edx,edx ;очищаем переменный регистр
mov dx,[Control.ID] ;ID
mov word [ebx+Components+Cursor+0],dx ;записываем слово (ID)
mov dl,[Control.Focus]
mov byte [ebx+Components+Cursor+2],dl ;записываем байт (бит еденица или ноль - тип булев) признак фокуса
mov dx,[Control.Area.X1]
shl edx,16
mov dx,[Control.Area.Y1]
mov dword [ebx+Components+Cursor+2+1],edx ; записали верхнюю точку прямоугольника области контрола
mov dx,[Control.Area.X2]
shl edx,16
mov dx,[Control.Area.Y2]
mov dword [ebx+Components+Cursor+2+1+4],edx ; записали нижнюю точку прямоугольника области контрола
mov edx,[Control.Activate]
mov dword [ebx+Components+Cursor+2+1+4+4],edx ; записали адрес обработчика события активации контрола
mov edx,[Control.DefaultAction]
mov dword [ebx+Components+Cursor+2+1+4+4+4],edx ; записали адрес обработчика события поумолчанию (текст, флажок, скролл и тп)
mov eax,dword [Registered]
mov edx,[ControlSize]
add eax,dword [Cursor]
ret
FocusLoop:
.I dw 0
xor eax,eax
mov ebx,Components
mov cx,[Registered]
.@@BeginScanControlFocus:
inc [.I]
mov eax,dword [.I]
mov edx,[ControlSize]
mul edx
mov dx,word [ebx+eax+3]
;проверка X>=Х1?
;...
cmp [E.XMouse],dx
jnge .@@NotInArea
mov dx,word [ebx+eax+3+2]
;проверка Y>=Y1?
cmp [E.YMouse],dx
jnge .@@NotInArea
mov dx,word [ebx+eax+3+2+2]
;X<=X2?
cmp [E.XMouse],dx
jnle .@@NotInArea
mov dx,word [ebx+eax+3+2+2+2]
cmp [E.YMouse],dx
jnle .@@NotInArea
;Y<=Y2?
;now cursor in Area of Control, must call .Activate (highlight for example)
mov edx,[ebx+eax+3+2+2+2+2] ;get pointer to .Activate method
cmp edx,0
je .@@NotInArea
call edx ;call .Activate
.@@NotInArea:
loop .@@BeginScanControlFocus
.@@EndScanning:
ret
Интересный вопрос...А что такое ООП???
