Answer the question
In order to leave comments, you need to log in
How to correctly draw a rectangle on the assembler?
I'm trying to create a preliminary rectangle before changing the color, but it doesn't show up.
.386
.model flat,STDCALL
extrn InitCommonControls:Proc, GetModuleHandleA:Proc, ExitProcess:Proc
extrn CreateWindowExA:Proc, RegisterClassA:Proc, GetMessageA:Proc
extrn DispatchMessageA:Proc, DefWindowProcA:Proc, _wsprintfA:Proc
extrn GetDC:Proc, SelectObject:Proc, ReleaseDC:Proc, CreateSolidBrush:Proc
extrn Rectangle:Proc, TextOutA:Proc,SendMessageA:Proc, lstrlen:Proc
extrn DeleteObject:Proc, CreateFontIndirectA:proc, SetTextColor:Proc
extrn SetBkColor:proc
WS_CHILD EQU 40000000h
WS_POPUP EQU 80000000h
WS_VISIBLE EQU 010000000h
WS_DLGFRAME EQU 400000h
WM_KEYDOWN EQU 100h
TBS_TOP EQU 0004h
WM_NOTIFY EQU 4Eh
WM_HSCROLL EQU 114h
ACS_AUTOPLAY equ 0004h
ACM_OPEN equ 1024+100
TBM_SETRANGE EQU 1030
WS_CLIPCHILDREN equ 2000000h
;=====================================================
.data
WC dd 4003h,offset WndProc,5 dup(0),1,0,offset WndClassName
msg dd 0
msMESSAGE dd 0
msWPARAM dd 0,0,0,0,0
AppHWnd dd 0
MainHWnd dd 0
CHILD_CLASS_NAME db 'msctls_trackbar32',0
ANIMATION_CLASSNAME db "SysAnimate32",0
WndClassName db "ABBA",0
COLOR dd 0
Brush dd 0
HDC dd 0
TRACK_ID dd 0
TRACK_ID1 dd 0
FORMAT db 'Колiр = %X',0
WindowCaption db 'Sysanimate Example',0
File1 db 'Wasya.avi',0
PRINT_BUF db 20 dup(0)
PRINT_BUF2 db 20 dup(0)
WS_SYSMENU equ 80000h
MY_NAME DB "Ukrainets| KN-113", 0
hFont dd ?
LOGFONTA:
lfHeight DD 50 ; Висота
lfWidth DD 20 ; Ширина
lfEscapement DD 0 ; Кут нахилу * 10
lfOrientation DD 0 ;
lfWeight DD 500 ; Жирнiсть (1000-Bold)
lfItalic DB 0 ; Курсив
lfUnderline DB 0 ; Пiдкреслення
lfStrikeOut DB 0
lfCharSet DB 1 ; 255 – шрифти DOS
lfOutPrecision DB 0
lfClipPrecision DB 0
lfQuality DB 1
lfPitchAndFamily DB 0
lfFaceName DB 'Century Gothic' ; Назва фонту
Reserv DB 32-6 dup(0)
;=======================================================
.code
Start:
call CreateFontIndirectA, offset LOGFONTA
mov hFont,eax
call GetModuleHandleA,0 ; отримати хендл програми для створення вікна;
mov AppHWnd,eax
call RegisterClassA,offset WC ; зареєструвати новий клас вікон;
call CreateWindowExA,0,eax,OFFSET MY_NAME, WS_VISIBLE or WS_DLGFRAME or WS_SYSMENU or WS_CLIPCHILDREN , 100,50,600,447,0,0,AppHWnd,0
mov MainHWnd,eax
Call DeleteObject,Brush ; нищує хендл поточної щітки
Call CreateSolidBrush,0000000h ; створюється кисть заданого кольору
Mov Brush,eax ; записати хендл кисті;
Call GetDC, hwnd ; одержуємо графічний контекст
Mov HDC,eax ; вікна і зберігаємо його;
Call SelectObject,HDC,Brush ; змінюємо поточну кисть;
Call Rectangle,HDC,203,0,580,270 ; малюємо прямокутник
Call _wsprintfA, offset PRINT_BUF,offset FORMAT,0000000h
call CreateWindowExA,0,offset CHILD_CLASS_NAME,0,WS_CHILD or WS_VISIBLE or TBS_TOP, 203,360,380,35,MainHWnd,2,AppHWnd,0
call SendMessageA,eax,TBM_SETRANGE,1,255*10000h
call CreateWindowExA,0,offset CHILD_CLASS_NAME,0,WS_CHILD or WS_VISIBLE or TBS_TOP, 203,320,380,35,MainHWnd,1,AppHWnd,0
call SendMessageA,eax,TBM_SETRANGE,1,255*10000h
call CreateWindowExA,0,offset CHILD_CLASS_NAME,0,WS_CHILD or WS_VISIBLE or TBS_TOP, 203,280,380,35,MainHWnd,0,AppHWnd,0
call SendMessageA,eax,TBM_SETRANGE,1,255*10000h
;анімація вікна
call CreateWindowExA,0,offset ANIMATION_CLASSNAME,0,WS_CHILD or WS_VISIBLE or ACS_AUTOPLAY, 0,0,0,0,MainHWnd,0,AppHWnd,0
call SendMessageA,eax,ACM_OPEN,0,offset File1
;анімація вікна
call CreateWindowExA,0,offset ANIMATION_CLASSNAME,0,WS_CHILD or WS_VISIBLE or ACS_AUTOPLAY, 0,105,0,0,MainHWnd,0,AppHWnd,0
call SendMessageA,eax,ACM_OPEN,0,offset File1
;анімація вікна
call CreateWindowExA,0,offset ANIMATION_CLASSNAME,0,WS_CHILD or WS_VISIBLE or ACS_AUTOPLAY, 0,210,0,0,MainHWnd,0,AppHWnd,0
call SendMessageA,eax,ACM_OPEN,0,offset File1
;анімація вікна
call CreateWindowExA,0,offset ANIMATION_CLASSNAME,0,WS_CHILD or WS_VISIBLE or ACS_AUTOPLAY, 0,315,0,0,MainHWnd,0,AppHWnd,0
call SendMessageA,eax,ACM_OPEN,0,offset File1
;==========================================================
msg_loop: call GetMessageA,offset msg,MainHWnd,0,0
CMP EAX,-1
JZ STOP
CMP EAX,0
JZ STOP
cmp msMESSAGE,WM_KEYDOWN ; Повідомлення клавіатури
jnz CONTINUE_LOOP
cmp msWPARAM,1bh ; якщо код <ESC>, то STOP
jz STOP
CONTINUE_LOOP:
Call DispatchMessageA,offset msg
Jmp msg_loop
STOP: call ExitProcess,0
;==========================================================
WndProc proc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
Cmp wmsg,WM_NOTIFY ; WM_NOTIFY надходить від кожного
Jnz NO_NOTIFY ; дочірнього вікна, при тому
Mov eax,wparam ; wparam містить ідентифікатор
Xchg eax,TRACK_ID1 ; дочірнього вікна від якого надійшло
Xchg eax,TRACK_ID ; поFвідомлення, який записуємо у TRACK_ID;
NO_NOTIFY: cmp wmsg,WM_HSCROLL ; WM_HSCROLL надходить від
Jnz NO_CHILD ; вікон типу “горизонтальний скролінг”
Mov eax,wparam ; молодша частина wparam – дія,
Shr eax,16 ; старша частина – позиція ковзуна;
Jz NO_CHILD ; якщо позиція = 0, то вийти з процедури;
Mov ebx,TRACK_ID ; TRACK_ID – поточний ідентифікатор, а
Cmp ebx,TRACK_ID1 ; TRACK_ID1 – попередній ідентифікатор
Jnz NO_CHILD ; дочірнього вікна, які повинні співпадати;
Add ebx,offset COLOR ; ідентифікатор використовується
Mov [ebx],al ; як індекс кольору;
Call DeleteObject,Brush ; нищує хендл поточної щітки
Call CreateSolidBrush,COLOR ; створюється кисть заданого кольору
Mov Brush,eax ; записати хендл кисті;
PAINT1: Call GetDC, hwnd ; одержуємо графічний контекст
Mov HDC,eax ; вікна і зберігаємо його;
Call SelectObject,HDC,Brush ; змінюємо поточну кисть;
Call Rectangle,HDC,203,0,580,270 ; малюємо прямокутник
Call _wsprintfA, offset PRINT_BUF,offset FORMAT,COLOR
Add esp,4*3 ; необхідно лише для _wsprintfA;
Call SelectObject,HDC,hFont ; змінюємо поточний шрифт;
call SetTextColor,HDC,0000000h; RGB
call SetBkColor,HDC,COLOR
Call lstrlen,offset PRINT_BUF
Call TextOutA, HDC, 210, 210, offset PRINT_BUF, eax
Call ReleaseDC,hwnd,HDC ; звільняємо графічний контекст;
NO_CHILD: ; мітка виходу з процедури;
Call DefWindowProcA,hwnd,wmsg,wparam,lparam ; стандартний вихід,
Ret ; повернення з процедури;
WndProc endp
End Start
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question