Rysowanie w Timerze po Panelu - program coraz bardziej spowalnia

0

Cześć wszystkim, mam problem z jedną rzeczą w moim programie a mianowicie mam Timer

 
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Pos: tpoint;
  kolor: COLORREF;
  X, Y: Integer;
  H: HWND;
  rgb: string;
begin
  H := GetWindowDC(0);
  GetCursorPos(Pos); // pozycja kursora
  Label1.Caption := (IntToStr(Pos.X) + ' ' + IntToStr(Pos.Y)); // labelka pokazuje położenie myszy

  kolor := GetPixel(H, Pos.X, Pos.Y); //biore pixel poprzez wskaźnik
  rgb := 'R: ' + IntToStr(GetRValue(kolor)) + '  G: ' +
    IntToStr(GetGValue(kolor)) + '  B: ' + IntToStr(GetBValue(kolor));  //zamiana hex na rgb
  panel1.Color := kolor; // koloruje Tpanel
  Label3.Caption := rgb; // jedna labelka pokazuje rgb
  Label4.Caption := (kolor.ToHexString()); // druga pokazuje kexa
end;

Krótko mówiąc program pobiera położenie myszy z pulpitu a następnie wyciąga kolor i koloruje Tpanel który jest na formie
dodatkowo wciska w labelki informacje o danym kolorze

Problem jest tego typu ze juz po minucie działania tego programu cały windows mi zwalnia i nie wiem jak sobie z tym poradzić aby to była aplikacja do normalnego użytku. Robie inne programy które ort! ten sposób zaczytywania pixeli i tylko pobieraja rgb (sporadycznie co jakies pol minuty) bez rysowania paneli itp a program zwalnia po 30-120 minutach.

Prosiłbym o pomoc ;)

0

Chłopie ;)
Dziękuje.
5 minut już miele i nie widzę żadnych nieprawidłowości.

1

After painting is complete, the ReleaseDC function must be called to release the device context. Not releasing the window device context has serious effects on painting requested by applications.

2

Programista WinAPI ma obowiązek przeczytać dokumentację na MSDN każdej funkcji której używa.

1
kAzek napisał(a)

Nie rozumiem dlaczego WinApi?

Dlatego że WinAPI ma mnóstwo hacków i pułapek, o których nie wiesz, jeśli nie przeczytasz.
Czy domyślisz się, że trzeba dodać +1 do koloru tła okna w strukturze WNDCLASS?
Czy po GetDC trzeba zrobić ReleaseDC, i kiedy tak a kiedy nie?
Czy poprawne jest użycie HWND_DESKTOP jako parenta okna?
Czy w Windows 7 można założyć dostępność styli, tj. polegać na OpenThemeData? a w Windows 8? dlaczego nie i dlaczego tak?
Dlaczego wywołanie InitCommonControls jest istotne, mimo że ta funkcja nic nie robi?

Nie jestem żadnym ekspertem od WinAPI. Ale wiem jedno: czytać dokumentację MSDN Microsoftu. I zacząć od spisu treści.

0

After painting is complete, the ReleaseDC function must be called to release the device context. Not releasing the window device context has serious effects on painting requested by applications.
DC (device context, kontekst urządzenia) w Windows jest "cennym zasobem". Funkcje GetDC i GetWindowDC nie tworzą nowego DC tylko przydzielają ("wypożyczają") DC z systemowej puli. Dlatego po skończonej robocie trzeba kontekst "oddać" za pomocą ReleaseDC, dzięki czemu może posłużyć do innego celu.
Jeśli robisz tylko GetWindowDC bez release to po jakimś czasie zabierzesz wszystko z puli (i zgubisz, bo kolejne GetWindowDC powoduje wyciek poprzedniego) i przestanie działać rysowanie nie tylko twojego okna, ale całego systemu.

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