Static Control se znovu nevykresluje – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Static Control se znovu nevykresluje – C / C++ – Fórum – Programujte.comStatic Control se znovu nevykresluje – C / C++ – Fórum – Programujte.com

 

Spuštěný nový filmový web Filmožrouti.cz — vše o Avengers, Pacific Rim, Thor, Star Wars…
TomyB
~ Anonymní uživatel
41 příspěvků
21. 10. 2018   #1
-
0
-

Potřebuji vykreslit průhledný Static uvnitř s textem a ikonou. Což se mi podařilo, ale při minimalizaci anebo přejetetí jiným oknem, se mi zpátky nevykreslí na původní stav. Zkousím to přes WM_PAINT, ale aplikace mi pak zamrzne. Když to celý udelám do paměti vygeneruji bitmapu, tak mám černý pozadí, není průhledný, ale zato se to zase vykresluje.  Co bych měl nastavit?

Díky

Níže výcuc kódu

hButton = CreateWindowEx(WS_EX_TRANSPARENT, L"STATIC", g_Id, WS_CHILD | WS_VISIBLE | SS_BITMAP | SS_NOTIFY, g_X, g_Y, g_Width, g_Height, hWnd, (HMENU)1, g_hInst, NULL);

RECT rect;
		PAINTSTRUCT ps;
		HDC hdc = BeginPaint(hButton, &ps);
		hdc = loadImg(hdc,g_Icon,0,0,"leftmiddle");

		GetClientRect(hButton, &rect);
		RECT rt = {rect.left + 1, rect.top + 1, rect.right - 1, rect.bottom -1 };
		SetBkMode(hdc, TRANSPARENT); //pozadi textu

		CDC*	pDC = CDC::FromHandle(hdc);
		CFont font;
		VERIFY(font.CreateFont(
		   46,                        // nHeight
		   0,                         // nWidth
		   0,                         // nEscapement
		   0,                         // nOrientation
		   100,                 // nWeight
		   FALSE,                     // bItalic
		   FALSE,                     // bUnderline
		   0,                         // cStrikeOut
		   EASTEUROPE_CHARSET,        // nCharSet
		   OUT_DEFAULT_PRECIS,        // nOutPrecision
		   CLIP_DEFAULT_PRECIS,       // nClipPrecision
		   ANTIALIASED_QUALITY,       // nQuality
		   VARIABLE_PITCH | FF_ROMAN, // nPitchAndFamily
		   TEXT("New")));       // lpszFacename

		CFont *pFont = pDC->SelectObject(&font);
		pDC->SetTextColor(g_TextColor);

		CRect crect (rect.left+80,rect.top, rect.right, rect.bottom);
		int height = pDC->DrawText(g_Caption, crect, DT_CALCRECT | DT_WORDBREAK);
		crect = rect;
		crect.top = (rect.bottom - height)/2;
		crect.left = 80; // Odsazen zleva pro vytvoření prostoru na ikonu

		unicodefixL(g_Caption);
		pDC->DrawText(g_Caption,&crect,DT_WORDBREAK);

		pDC->SelectObject(pFont);
		font.DeleteObject();
		EndPaint(hButton, &ps);

Připojen obrázek.

Připojen obrázek.

Nahlásit jako SPAM
IP: 62.245.115.–
TomyB
~ Anonymní uživatel
41 příspěvků
21. 10. 2018   #2
-
0
-

Ještě doplním, že jsem ten WM_PAINT zprovoznil, ale tím že je to průhledné, tak se mi text i ikona znovu zobrazi, ale ponechá tam pozadí to čím jsem to překryl. Jde nějak vyresetovat ten STATIC a by si zase vzal pozadi okna pod ním?

Připojen obrázek.

Nahlásit jako SPAM
IP: 62.245.115.–
TomyB
~ Anonymní uživatel
41 příspěvků
21. 10. 2018   #3
-
0
-

Tak jsem to vyresil, tim ze do pozadi STATICu nahraji obrazek z pozadí ve WM_PAINT.
 

        RECT rect;
        RECT Crect;

        GetWindowRect(hWnd, &rect);
        GetUpdateRect(hWnd, &Crect,TRUE);


        HDC hdcMem = CreateCompatibleDC(GetDC(hWnd));
        HGDIOBJ oldBitmap = SelectObject(hdcMem, hBackground);

        BITMAP bitmap;
        GetObject(hBackground, sizeof(bitmap), &bitmap);
        BitBlt(GetDC(hWnd), 0, 0, Crect.right, Crect.bottom, hdcMem, rect.left, rect.top, SRCCOPY);

        SelectObject(hdcMem, oldBitmap);
        DeleteDC(hdcMem);

Nahlásit jako SPAM
IP: 62.245.115.–
Radek Chalupa
~ Redaktor
+1
Super člen
22. 10. 2018   #4
-
+1
-
Zajímavé

#3 TomyB
Zkusil bych to přes průhledná okna, podívej se na funkci SetLayeredWindowAttributes (před tím musíš ještě nastavit styl WS_EX_LAYERED). Jako průhlednou barvu nastavíš barvu pozadí okna (vybereš nějakou která není v textu ani v té ikoně) a pak to pozadí zůstané průhledné, o to se postará systém.

PS: v tom kreslení bych doporučil se vyhnout těm MFC třídám, je to zbytečný overhead a jenom objektově zapouzdřují odpovídající API fce.

Radek Chalupa

www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.218.–
TomyB
~ Anonymní uživatel
41 příspěvků
26. 10. 2018   #5
-
0
-

#4 Radek Chalupa
Vypadá to, že pod WinCE není podporováno.

Díky

Nahlásit jako SPAM
IP: 62.245.115.–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 88 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032018 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý