Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Jeded Vojka 06. 07. 2018, 10:18:48

Název: Nelze zrušit objekt GDI
Přispěvatel: Jeded Vojka 06. 07. 2018, 10:18:48
Proč se mi nezruší to pero?    

void KresliKostku (int x, int y, int ink)
{
   hPen=CreatePen(PS_SOLID | PS_INSIDEFRAME,1, ink);
   hPen = (HPEN) SelectObject (hdcMem, hPen);
   GetClientRect(hWnd, &block);
   Rectangle(hdcMem, x,y,x+4,y+4);
   SelectObject(hdcMem,hPen);
   DeleteObject(hPen);
}
Název: Re:Nelze zrušit objekt GDI
Přispěvatel: mhi_ 06. 07. 2018, 11:01:36
SelectObject: If the selected object is not a region and the function succeeds, the return value is a handle to the object being replaced

rusite tedy ten puvodni handle, ktery je nejspis nejaky systemovy.


void KresliKostku (int x, int y, int ink)
{
   hPen=CreatePen(PS_SOLID | PS_INSIDEFRAME,1, ink);
   hOldPen = (HPEN) SelectObject (hdcMem, hPen);
   GetClientRect(hWnd, &block);
   Rectangle(hdcMem, x,y,x+4,y+4);
   SelectObject(hdcMem,hOldPen);
   DeleteObject(hPen);
}
Název: Re:Nelze zrušit objekt GDI
Přispěvatel: juloj 06. 07. 2018, 11:04:57
Alebo len

...
Rectangle(...
hPen = SelectObject(...
DeleteObject(hPen);
Název: Re:Nelze zrušit objekt GDI
Přispěvatel: mhi_ 06. 07. 2018, 11:16:30
Alebo len

...
Rectangle(...
hPen = SelectObject(...
DeleteObject(hPen);

Alebo len "DeleteObject(SelectObject(...));", to je jeste min nazorne :-). A nahore by slo optimalizovat Create a SelectObj. S trochou snahy by to slo mozna jeste pomoci operatoru carka cele dat do jednoho statementu v nejake if forme ;-o
Název: Re:Nelze zrušit objekt GDI
Přispěvatel: . 06. 07. 2018, 11:18:23
Alebo len

...
Rectangle(...
hPen = SelectObject(...
DeleteObject(hPen);
I když řešení se swapnutím je chytré a pěkné, to předchozí je čitelnější.
Název: Re:Nelze zrušit objekt GDI
Přispěvatel: Jeded Vojka 06. 07. 2018, 11:31:23
mhi_ : dík moc.
Funguje to.
Od včerejška jsem studoval dvě knihy (R.Chalupa Visual C++  a Ch. Petzold progr. ve WinAPI), ale stejně nejlepší je rychlá odpověď od někoho zkušeného.

 :)
Název: Re:Nelze zrušit objekt GDI
Přispěvatel: mhi_ 06. 07. 2018, 11:47:03
Neni zac. GDI a USER funkce Win API, ale obecne i vetsina NT kernelu nejsou az zase tak blbe navrzene, jak si spousta lidi od Linuxu mysli. Problem je v tom, ze na relativne dobry navrh se zacaly cpat ruzne hacky. treba jak je resene DPIAwareness ve Win7-Win10 je desive.

IBM (OS/2) a MS (NT/Win16) tehdy nabrali docela slusne mozky, existuje nekolik clanku insideru (resp. primo autoru), kde ten vyvoj popisuji. Nemaji treba problem priznat, ze v OS/2 zvolili blbe koordinaty a u Win to "opravili".
Název: Re:Nelze zrušit objekt GDI
Přispěvatel: kraxna 07. 07. 2018, 00:39:58
Neni zac. GDI a USER funkce Win API, ale obecne i vetsina NT kernelu nejsou az zase tak blbe navrzene, jak si spousta lidi od Linuxu mysli. Problem je v tom, ze na relativne dobry navrh se zacaly cpat ruzne hacky. treba jak je resene DPIAwareness ve Win7-Win10 je desive.

No, nutno rict, ze DPI awareness a jeho ekvivalentny jsou resene hruzostrasne v cele rade API. Asi nejlepe resene me to prislo v GTK.
Název: Re:Nelze zrušit objekt GDI
Přispěvatel: . 07. 07. 2018, 00:51:38
A v těch knihách je to taky takhle blbě a ty nevíš k čemu je přiřazení, že ti to nepřijde divné? To by ses asi měl držet něčeho jednoduššího.