Zmiana rozmiaru okna i rysowanie.

0

Hej ! :)

Opisze co nieco co i jak:

  1. Mam strukturę:
struct struktura{
    BITMAP bitmapa;
    HDC hDC;
    HWND hwnd
};
  1. Mam funkcję:
HBITMAP f_RysujBitmape(int dlugosc, int wysokosc);

Bitmapa jest rysowana określonym wzorem matematycznym piksel po pikselu (rozmiary ok. (200,30)). Chcę zrobić, aby po zmianie rozmiaru okna narysowała się bitmapa odpowiednia do rozmiaru okna. Czy to będzie wydajne jak zrobię to w taki sposób, że:

  1. Przy tworzeniu kontrolki rysuję bitmapę.
  2. Po każdym obsłużeniu komunikatu zmiany rozmiaru okna rysuje bitmapę oraz odświeżam kontrolkę.

Moim zdaniem to jest strasznie czasochłonne zajęcie żeby odświeżać kontrolkę np. co 40ms. Macie jakieś alternatywy? A może wszystko powinno działać tym sposobem, którym chcę to zrobić?

0

Jak rozumiem, problem istnieje tylko gdy w systemie włączone jest odświeżanie zawartości okna podczas rozciągania (tak jest domyślnie).
Spróbuj wykorzystać WM_ENTERSIZEMOVE i WM_EXITSIZEMOVE by zablokować rysowanie.

0

Właśnie mi zależy na płynnej animacji. Mam wzór który rysuje mi bitmapę wykorzystując 2 wartości: długość i szerokość. Wykorzystując komunikat WM_TIMER "zwijam kontrolkę" i tutaj musi mu się edytować cała bitmapa. Im szybciej działa timer tym płynniej schowa mi się kontrolka, ale więcej razy będzie musiała się narysować bitmapa. Podwójne buforowanie załatwi sprawę migań, ale co z wydajnością?

0

Rozumiem że tworzysz kontrolkę która po wciśnięciu płynnie się rozwinie w ciągu max 1 sek (lub się zwinie w tym samym czasie). I martwisz się o wydajność w ciągu 1 sekundy?

0

Tak, zgadza się. A nie chcę nawalić kodu żeby go potem usunąć i zrobić inaczej, dlatego przyszedłem tutaj prosić o radę, czy rysowanie na nowo bitmapy przycisku przy każdej zmianie rozmiaru będzie prawidłowe.

w funkcji mam tworzenie bitmapy o wymiarach (x,y) i potem rysuje po niej:

int R,G,B;
for(int y=0; y<cY; y++)
 for(int x=0; x<cX; x++)
 {
    //ustawianie R,G,B
    SetPixel(hdc, x, y, RGB(R,G,B));
 }

Oczywiście wcześniej usuwam poprzednia bitmapę.

EDIT:
Jeszcze myślę, czy nie zrobić po prostu do tego nowego wątku i niech ona się tam po prostu zwija ;)

2

SetPixel - to bardzo powolna instrukcja.
Poszukaj i poczytaj o ScanLine

0

Najszybszym rozwiązaniem będzie uniemożliwienie kontrolce zmiany rozmiaru :P

A tak ogółem to chyba już czas najwyższy żeby się przerzucić na Direct2d.

0

Kk dzięki śliczne !

0

@_13th_Dragon orientujesz się jeszcze może co do jednej rzeczy? Mianowicie:

Jak wysyłam komunikaty do kontrolki - rodzica za pomocą SendMessage() i chcę wysłać własny komunikat skąd wiem, że wysyłając np.

#define ID_KOMUNIKAT 10
SendMessage(hParent, ID_KOMUNIKAT, wParam, lParam) 

Nie powiele tego identyfikatora np. z WM_COMMAND czy WM_DESTROY? Są jakieś przedziały dla użyszkodnika?

0

i ostatnia rzecz póki co:
Jak rozumieć mam według https://msdn.microsoft.com/en-us/library/windows/desktop/ms632680%28v=vs.85%29.aspx ostatni argument funkcji?
Jeżeli przekażę tam wskaźnik na coś będę mógł go odczytać wewnątrz komunikatu WM_CREATE owej kontrolki?
jeżeli tak, to czy to ma wyglądać tak?

char *tekst = "asdasda" 
CreateWindowEx(0, "KLASA", "TEKST", WS_CHILD | WS_VISIBLE, 0, 0, 100, 10, hwnd, NULL, hInstance, tekst) 
case WM_CREATE:
     char* tekst = (char*)lParam 

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