Jak narysować w GDI linię jakiegoś koloru innego niż czarny( bo do tego wystarczy samo polecenie line). Co muszę zrobić by przybrała inną barwę?
Miło by było, gdybytście dali przykład w Asmie :P
Ale GDI windowsowe?
Jeżeli tak, to musisz stworzyc obiekt Pen, wybrac go dla aktualnego urzadzenia i dalej juz rysujesz normalnie.
Nie mam windowsa, wiec z pamieci:
uchwytPiora dd ?
...
invoke CreatePen, PS_SOLID, 1, 0000ffh ;czerwony, o grubosci 1, ciagly
mov [uchwytPiora], eax
invoke SelectObject, [hdc], [uchwytPiora] ;hdc to uchwyt kontekstu urzadzenia, np. z BeginPaint uzyskanego
...
invoke DeleteObject, [uchwytPiora] ;gdzies na koniec, np. przy wychodzeniu z programu nalezy usunac obiekt... oczywiscie wczesniej dobrze byloby przywrocic oryginalny obiekt przez SelectObject
To taki pseudokod w FASMie.
A może rozwinąłbyś trochę z tym beginpaintem?
A może rozwinąłbyś trochę z tym beginpaintem?
Jutro, jak nie zapomnę, skrobnę i wkleję kod całego programu (i wytłumaczę :) ). Dzisiaj już nie mam czasu.
No dobra. Więc schemat procedury obsługi okna powinien wyglądać tak:
case uMsg of
WM_CREATE:
Utwórz pioro używając CreatePen
WM_PAINT:
Wywołaj BeginPaint podając adres do struktury PAINTSTRUCT
Zapamiętaj zwrócony uchwyt kontekstu.
Wybierz pióro dla kontekstu, używając SelectObject, zapamiętująć zwracane stare pióro.
Rysuj, czego potrzebujesz
Wybierz stare pióro, używająć SelectObject.
Zakończ rysowanie (EndPaint)
WM_DESTROY:
Usuń utworzony obiekt przez DeleteObject
Zamknij program (PostQuitMessage).
end;
A to kod okna (FASM):
proc WndProc, hWnd, uMsg, wParam, lParam
ps PAINTSTRUCT
hdc dd ?
enter
cmp [uMsg], WM_CREATE
jne @f
invoke CreatePen, 0, 0, 0ffh
mov [pen], eax
xor eax, eax
return
@@:
cmp [uMsg], WM_PAINT
jne @f
lea eax, [ps]
invoke BeginPaint, [hWnd], eax
mov eax, [ps.hdc]
mov [hdc], eax
mov [rect.top], 0
mov [rect.left], 0
mov [rect.bottom], 300
mov [rect.right], 500
lea eax, [rect]
invoke SelectObject, [hdc], [pen]
mov [old_pen], eax
invoke Rectangle, [hdc], 100, 100, 300, 300
invoke SelectObject, [hdc], [old_pen]
lea eax, [ps]
invoke EndPaint, [hWnd], eax
xor eax, eax
return
@@:
cmp [uMsg], WM_DESTROY ;jeżeli niszczymy okno, to koniec
jne @f
invoke DeleteObject, [pen]
invoke PostQuitMessage, NULL
xor eax,eax
return
@@:
invoke DefWindowProc, [hWnd], [uMsg], [wParam], [lParam] ;domyślna wiadomość
return
endp