[GDI]Kolory

0

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

0

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.

0

A może rozwinąłbyś trochę z tym beginpaintem?

0

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.

0

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                                                         

1 użytkowników online, w tym zalogowanych: 0, gości: 1