Uživatelsky kreslená tlačítka - mouse over (ODS_HOTLIGHT) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Uživatelsky kreslená tlačítka - mouse over (ODS_HOTLIGHT) – C / C++ – Fórum – Programujte.comUživatelsky kreslená tlačítka - mouse over (ODS_HOTLIGHT) – C / C++ – Fórum – Programujte.com

 

ProXicT0
Návštěvník
6. 4. 2014   #1
-
0
-

Zdravím,
chtěl bych nějakým způsobem zachytit, když je kurzor myši na uživatelsky kresleném tlačítku. 
Zkoušel jsem ODS_HOTLIGHT, ale to nedělá nic. Dále jsem zkoušel testovat bod v oblasti (PtInRect), ale pozice kurzoru pomocí WM_MOUSEMOVE se zjišťuje pouze s kurzorem v klientské oblasti.
Koukal jsem na strukturu NMBCHOTITEM a BCN_HOTITEMCHANGE, ale nic jsem o tom nenašel. 
Asi vím, jak bych to dělal přes subclassing, ale to bych musel subclassnout každé tlačítko, které bych chtěl uživatelsky kreslit. Jde mi hlavně o to, aby ta funkce byla co nejjednodušší. 

LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT)lParam;

	if(lpDIS->hwndItem == buttonHwnd)
	{
		if(lpDIS->itemState & ODS_SELECTED)
		{
			HBRUSH brush = CreateSolidBrush(Select_ButtonBrush); // Button inside color
			HPEN pen = CreatePen(PS_INSIDEFRAME, 0, Select_ButtonBorder); // Button border color

			HGDIOBJ old_pen = SelectObject(lpDIS->hDC, pen);	//Select colors ˇ
			HGDIOBJ old_brush = SelectObject(lpDIS->hDC, brush);

			FillRect(lpDIS->hDC, &lpDIS->rcItem, CreateSolidBrush(Select_Base_Brush)); // Base color (to ensure transparency when round button is used)
			RoundRect(lpDIS->hDC, lpDIS->rcItem.left, lpDIS->rcItem.top, lpDIS->rcItem.right, lpDIS->rcItem.bottom, 5, 5); // Color the button with colors already set above...^

			SetTextColor(lpDIS->hDC, Select_TextColor); // Button Text Color
			SetBkColor(lpDIS->hDC, Select_ButtonBrush); // Text background color (May be same to ensure text transparency)
			DrawText(lpDIS->hDC, "Apply", -1, &lpDIS->rcItem, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

			SelectObject(lpDIS->hDC, old_pen);
			SelectObject(lpDIS->hDC, old_brush);
			DeleteObject(pen); // Cleanup
		}
		else if(lpDIS->itemState & ODS_HOTLIGHT) // Nereaguje...
		{
			HBRUSH brush = CreateSolidBrush(ButtonBrush); // Button inside color
			HPEN pen = CreatePen(PS_INSIDEFRAME, 0, ButtonBorder); // Button border color

			HGDIOBJ old_pen = SelectObject(lpDIS->hDC, pen);	//Select colors ˇ
			HGDIOBJ old_brush = SelectObject(lpDIS->hDC, brush);

			FillRect(lpDIS->hDC, &lpDIS->rcItem, CreateSolidBrush(Base_Brush)); // Base color (to ensure transparency when round button is used)
			RoundRect(lpDIS->hDC, lpDIS->rcItem.left, lpDIS->rcItem.top, lpDIS->rcItem.right, lpDIS->rcItem.bottom, 5, 5); // Color the button with colors already set above...^

			SetTextColor(lpDIS->hDC, TextColor); // Button Text Color
			SetBkColor(lpDIS->hDC, ButtonBrush); // Text background color (May be same to ensure text transparency)
			DrawText(lpDIS->hDC, "Apply", -1, &lpDIS->rcItem, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

			SelectObject(lpDIS->hDC, old_pen);
			SelectObject(lpDIS->hDC, old_brush);
			DeleteObject(pen); // Cleanup
		}
	}

Předem díky.

Nahlásit jako SPAM
IP: 77.240.98.–
Radek Chalupa
~ Redaktor
+1
Super člen
7. 4. 2014   #2
-
0
-

#1 ProXicT
Pokud si kód pro subclassing a vykreslení buttonu zabalíš do třídy, stačí z ní publikovat 2 metody, třeba nějak takhle: nastavit(HWND) a kreslit(DRAWITEMSTRICT*).

Pak jen na začátku vytvoříš pro každý button instanci, zavoláš nastavit a v obsluze WM_DRAWITEM (s testem na aktuální HWND) budeš volat metodu kreslit příslušné instance té třídy.

Takže ten rutinní kód bude docela jednoduchý:-)

Radek Chalupa 
- individuální konzultace, školení programování (C/C++, WinAPI, COM, ActiveX, ATL, C#, NET Framework, MFC) 
- vývoj software na zakázku 
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
ProXicT0
Návštěvník
7. 4. 2014   #3
-
0
-

#2 Radek Chalupa
Jestli je to opravdu jediná možnost, tak to tak asi udělám, ale opravdu není snažší způsob?

Nahlásit jako SPAM
IP: 2a00:1028:838a:4076:4d0c:...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×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, 117 hostů

Podobná vlákna

Kreslená grafika — založil Ron

Mouse & "PerformClick" — založil Trebor

Mouse events — založil Petr

Moderátoři diskuze

 

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