[WinAPI] Jak udostępnić do rysowania tylko część DC

0

Chce stworzyć kontrolki, które nie posiadają własnego okna tylko rysują po canvasie rodzica. Idea jest taka:
okno-rodzic dostaje komunikat WM_PAINT, pobiera update-region (GetUdateRgn) i dla każdej leżącej na regionie kontrolki wywołuje jej metode Paint. Problem w tym, aby kontrolka mogła rysować tylko po update-regionie, tak aby przypadkiem nie zamazać innej kontrolki znajdującej się nad nią samą a nie mieszczącej sie w update-region (nie będzie odrysowana).

user image
W tym przykladzie shape leży na udate-region i bedzie odrysowany. Ale jeśli zostanie odrysowany w całości to zamaże label, który ma leżeć nad nim. Label nie będzie odrysowany, bo nie leży na update-region. Chodzi o to aby shape narysował tylko fragmen zaznaczony na różowo.

Najlepsze rozwiązanie jakie przychodzi mi do głowy to udostępnić kontrolce kopie fragmentu DC rodzica, tak aby kontrolka sobie po nim porysowała, a następnie to co narysowała przenieść zpowrotem na DC rodzica, z tym że wybierając tylko piksle należace do update-region (MaskBlt ?).
Ale wydaje mi sie że wtedy cała zabawa z rysowaniem tylko po update-region nie ma sensu i lepiej odrysować wszystkie kontrolki. Co o tym myślicie ?

Inny pomysł to rysując każdą kontrolke leżącą na update region odrysować również każdą kontrloke leżacą na tej odrysowywanej.

Zamiast regionów ewentualnie moge użyć prostokątów (GetUpdateRect).

0

Spróbuj użyć funkcji CombineRgn. I tak, zakładając, że Shape ma być odmalowany wtedy:

HRGN hrgn1=CreateRectRgn(...);
HRGN hrgn2=CreateRectRgn(...);
HRGN hrgn3;

CombineRgn(hrgn1,hrgnShape,hrgnShape,RGN_COPY);

for(int i=0;i<???;i++)
{
   CombineRgn(hrgn2,hrgn1,hrgnAbove[i],RGN_DIFF);
   hrgn3=hrgn2;
   hrgn2=hrgn1;
   hrgn1=hrgn3;
}

hrgnAbove to regiony wszystkich kontrolek, które są powyżej Shape. Oczywiście dobrze byłoby gdybyś hrgnShape potraktował flagą RGN_AND z regionem update'u okna.

PS. mogłem się gdzieś pomylić ;)

0

Region w jakim rysować z łatwością można uzyskać. Załóżmy, że przekaże hDC i region do funkcji rysującej kontrolke (Paint(HDC, HRGN)). Jak ograniczyć obszar rysowania tylko do tego regionu ?

0

Hmm chodzi Ci o SelectClipRgn???

0
0x666 napisał(a)

Hmm chodzi Ci o SelectClipRgn???
O to chodziło [browar]

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