durchsichtiger button für mäuse jagt
-
hallo.
ich wollte für meinen PDA (wince)
einen moorhuhn abklatsch schreiben.
das heißt ich hab ein bild von einer maus und das wollte ich auf nen button legen und den dann über den bildschirm wandern lassen.das bild auf den button zu bekommen und den button wandern zu lassen war kein problem.nur leider hat meine maus einen hässlichen grauen rahmen
(habe im hintergrund des fensters auch ein bild gelade).
wie bekomme ich den rahmen weg und anstelle des graus das hintergrund bild?ist meine vorgehensweise falsch?
geht es irgentwie anders besser?p.s. ich schreibe unter wince dass heißt ich habe keinen zugriff auf directx oder opengl
ich bin schon ganz froh wenn die meisten winapi-standartbefehle laufen
ok das wars erstmal danke im voraus für eure antworten
-
Lass doch den Button weg un mal nur das Bild?!!
-
ja das wollte ich auch schon machen aber da weiß ich nicht wie ich abfrage ob der benutzer auf das bild geklickt hat.
-
Gibt es unter CE keine Hooks?
-
ich hab doch gesagt das ich froh bin wenn es ein paar winapi befehle kennt
hook
A location in a routine or application in which the programmer can connect or insert other routines for the purpose of debugging or enhancing functionality. Windows CE does not support hooking.
*war ne gute idee
-
Ich hab mal vor einiger Zeit eine Funktion aus dem Inet kopiert die ein Bitmap kopiert und dabei eine Farbe transparent lässt.
dcDest müsste dann der HDC des Buttons sein, dcSrc ist der HDC in den das Mausbitmap selektiert ist.
Im Mausbitmap muss dann der Rand um die Maus eine Bestimmte Farbe haben, zb 0xff00ff(Mangenta). Diesen Wert übergibt man dann in 'crTransparent'.Was die Funktion da genau macht kann ich nicht sagen, habs mir nicht so genau angeschaut ( musste aber ein paar Memory-Leaks entfernen )
bool TransparentBltU( HDC dcDest, // handle to Dest DC int nXOriginDest, // x-coord of destination upper-left corner int nYOriginDest, // y-coord of destination upper-left corner int nWidthDest, // width of destination rectangle int nHeightDest, // height of destination rectangle HDC dcSrc, // handle to source DC int nXOriginSrc, // x-coord of source upper-left corner int nYOriginSrc, // y-coord of source upper-left corner int nWidthSrc, // width of source rectangle int nHeightSrc, // height of source rectangle UINT crTransparent // color to make transparent ) { HDC dc = CreateCompatibleDC(NULL); HBITMAP bitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, GetDeviceCaps(dc, BITSPIXEL), NULL); if(bitmap == NULL) return false; HBITMAP oldBitmap = (HBITMAP)SelectObject(dc, bitmap); if (!BitBlt(dc, 0, 0, nWidthSrc, nHeightSrc, dcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY)) return false; HDC maskDC = CreateCompatibleDC(NULL); HBITMAP maskBitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, 1, NULL); if (maskBitmap == NULL) return false; HBITMAP oldMask = (HBITMAP)SelectObject(maskDC, maskBitmap); SetBkColor(maskDC, RGB(0,0,0)); SetTextColor(maskDC, RGB(255,255,255)); if (!BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,NULL, 0,0,BLACKNESS)) return false; SetBkColor(dc, crTransparent); BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,dc,0,0,SRCINVERT); SetBkColor(dc, RGB(0,0,0)); SetTextColor(dc, RGB(255,255,255)); BitBlt(dc, 0,0,nWidthSrc,nHeightSrc,maskDC,0,0,SRCAND); HDC newMaskDC = CreateCompatibleDC(NULL); HBITMAP newMask; newMask = CreateBitmap(nWidthDest, nHeightDest, 1, GetDeviceCaps(newMaskDC, BITSPIXEL), NULL); SetStretchBltMode(newMaskDC, COLORONCOLOR); HBITMAP oldNewMask = (HBITMAP) SelectObject(newMaskDC, newMask); StretchBlt(newMaskDC, 0, 0, nWidthDest, nHeightDest, maskDC, 0, 0, nWidthSrc, nHeightSrc, SRCCOPY); SelectObject(maskDC, oldMask); HDC newImageDC = CreateCompatibleDC(NULL); HBITMAP newImage = CreateBitmap(nWidthDest, nHeightDest, 1, GetDeviceCaps(newMaskDC, BITSPIXEL), NULL); HBITMAP oldNewImage = (HBITMAP)SelectObject(newImageDC, newImage); StretchBlt(newImageDC, 0, 0, nWidthDest, nHeightDest, dc, 0, 0, nWidthSrc, nHeightSrc, SRCCOPY); SelectObject(dc, oldBitmap); BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, newMaskDC, 0, 0, SRCAND); BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, newImageDC, 0, 0, SRCPAINT); DeleteDC(dc); DeleteDC(newImageDC); DeleteDC(maskDC); DeleteDC(newMaskDC); DeleteObject( dc ); DeleteObject(newImageDC); DeleteObject(maskDC); DeleteObject(newMaskDC); DeleteObject( bitmap ); DeleteObject( newImage ); DeleteObject( newMask ); DeleteObject( oldBitmap ); DeleteObject( oldNewMask ); DeleteObject( oldNewImage ); DeleteObject( oldMask ); DeleteObject( maskBitmap ); return true; }
Du dafst beim Zeichnen des Buttons dann natürlich den Hintergrund nicht löschen, sonst wird es nach wie vor ein grauer Kasten ( WM_ERASEBACKRND oder so abfangen)