Nelze zrušit objekt GDI

Jeded Vojka

Nelze zrušit objekt GDI
« kdy: 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);
}


mhi_

Re:Nelze zrušit objekt GDI
« Odpověď #1 kdy: 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);
}

juloj

Re:Nelze zrušit objekt GDI
« Odpověď #2 kdy: 06. 07. 2018, 11:04:57 »
Alebo len

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

mhi_

Re:Nelze zrušit objekt GDI
« Odpověď #3 kdy: 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

.

Re:Nelze zrušit objekt GDI
« Odpověď #4 kdy: 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ší.


Jeded Vojka

Re:Nelze zrušit objekt GDI
« Odpověď #5 kdy: 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.

 :)

mhi_

Re:Nelze zrušit objekt GDI
« Odpověď #6 kdy: 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".

kraxna

Re:Nelze zrušit objekt GDI
« Odpověď #7 kdy: 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.

.

Re:Nelze zrušit objekt GDI
« Odpověď #8 kdy: 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.