dmc1989
@dmc1989

Как правильно отрисовать прямоугольник на assembler?

Пытаюсь создать предварительный прямоугольник, перед изменением цвета, но он не отображается.
.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

Заранее спасибо.
  • Вопрос задан
  • 336 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как правильно отрисовать прямоугольник на assembler?

Так же, как и на C. Т.е. как минимум делать это в обработчике сообщения WM_PAINT, а чтобы сообщение посылалось -- использовать UpdateWindow.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы