DrawIcon und TextOut



  • Hi,

    jetzt fehlen mir nur noch 2 kleine Lösungen für mein Programm 😉

    momentan zeichne ich Bitmaps über:

    HBITMAP hbm = (HBITMAP) LoadImage(NULL, node->file, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    HDC hdcBitmap = CreateCompatibleDC(hdc);
    HBITMAP hbmOld = (HBITMAP) SelectObject(hdcBitmap, hbm);
    TransparentBlt(hdc, 0, 0, 64, 64, hdcBitmap, 0, 0, 64, 64, RGB(255,0,255));
    

    1. Wenn ich mit TextOut einen String ausgebe, der über so einer Bitmap liegt, so fehlt an der Stelle die Bitmap(d.h. ein Reckteck, das den Text enthält, fehlt einfach). Ich will aber einfach einen Text darüberlegen, sodass überall wo kein Pixel von dem Text ist, die bitmap sichtbar ist)

    2. Ich würde anstelle von Bitmaps lieber mit Icons arbeiten. Allerdings ist es mir nicht gelungen, ein Icon anzuzeigen. Weder indem Ich bei der LoadImage funktion sage, ich lade ein IMAGE_ICON und dann DrawIcon, noch das Icon laden, dann mittels einer Funktion, die ich gefunden habe, inn eine Bitmap verwandeln und dann anzeigen. Es ist einfach nie etwas passiert(auch kein Fehler/Absturtz)

    Hoffentlich weiß jemand Rat



  • 1. SetBkMode vorm Text zeichnen aufgerufen?
    2. Rückgabewerte der Funktionen angeschaut?



  • 1. funktioniert super, danke

    Bis auf den letzten Schritt scheint alles zu funktionieren. Laut Windowshilfe gibt es einen Parameterfehler

    (vermutlich hab ich mit dem GetLastError() irgendeinen Mist gebaut? aber die anderen Funktionen geben ja auch nicht NULL zurück... 😕 )

    HBITMAP BitmapFromIcon(HICON hIcon)
    {
       HDC hDC = CreateCompatibleDC(NULL);
       HBITMAP hBitmap = CreateCompatibleBitmap(hDC, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON));
       HBITMAP hOldBitmap = (HBITMAP)SelectObject(hDC, hBitmap);
       DrawIcon(hDC, 0, 0, hIcon);
       SelectObject(hDC, hOldBitmap);
       DeleteDC(hDC);
    
       return hBitmap;
    }
    
    HANDLE hdl = LoadImage(NULL, node->file, IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
    			if (hdl == NULL) {
    				std::cout << "Fehler0" << std::endl;
    			}
    			HICON hi = (HICON) hdl;
    			if (hi == NULL) {
    				std::cout << "Fehler1" << std::endl;
    			}
    			HBITMAP hbm = BitmapFromIcon(hi);
    			if (hbm == NULL) {
    				std::cout << "Fehler2" << std::endl;
    			}
    
    			HDC hdcBitmap = CreateCompatibleDC(hdc);
    			if (hdcBitmap == NULL) {
    				std::cout << "Fehler3" << std::endl;
    			}			
    			HBITMAP hbmOld = (HBITMAP)SelectObject(hdcBitmap, hbm);
    			if (hbmOld == NULL) {
    				std::cout << "Fehler4" << std::endl;
    			}
    
    			if (TransparentBlt(hdc, 64 * i, 0, 64,  64, hdcBitmap, 0, 0, 64,  64, RGB(255,0,255)) == FALSE) {
    				std::cout << "Fehler5" << std::endl;
    			}
    
    LPTSTR lpszFunction = TEXT("TransparentBlt");
    LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;
    DWORD dw = GetLastError(); 
    
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,dw,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf,0, NULL );
    
        lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); 
       std::cout << lpszFunction << " failed with error " << dw << ": " << lpMsgBuf << std::endl;
    

    Ausgabe:
    Fehler5
    TransparentBlt failed with error 87: 0x2455e8



  • Hmm, sieht mir eigentlich richtig aus der TransparentBlt-Aufruf. Ist hdc evtl. ungültig?

    Hier hätte ich noch was vorzuschlagen:

    HBITMAP BitmapFromIcon(HICON hIcon) 
    { 
       HDC hdcScreen=GetDC(NULL);
       HDC hDC = CreateCompatibleDC(hdcScreen); 
       HBITMAP hBitmap = CreateCompatibleBitmap([u]hdcScreen[/u], GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON)); 
       HBITMAP hOldBitmap = (HBITMAP)SelectObject(hDC, hBitmap); 
       DrawIcon(hDC, 0, 0, hIcon); 
       SelectObject(hDC, hOldBitmap); 
       DeleteDC(hDC); 
       ReleaseDC(hdcScreen);
    
       return hBitmap; 
    }
    

    ...siehe: http://www.c-plusplus.net/forum/viewtopic-var-t-is-270726.html 😉



  • ich komme näher.
    vermutlich funktioniert das mit der Transparenz nicht richtig. Ich bin jetzt auf BitBlt umgestiegen(vorerst) mit ROP-Code SRCCOPY. Dann wird das icon angezeigt, allerdings nur schwarz weiß, wobei es schwarz ist, wo das icon farbig oder transparent ist. wo es weiß ist bleibts weiß...



  • Bezüglich schwarz/weiss: Schau dir mal meinen vorherigen Post näher an 😉



  • "vorzuschlagen" hab ich als verbesserungsmöglichkeit interpretiert, und da ich einen error gekriegt habe(weil RelaseDC noch ein (NULL, ... gefehlt hat, hab ich das erstmal weggelassen, sry.

    ABer jetzt wird es richtig angezeigt(bis auf das die transparenz weg ist, aber das krieg ich morgen sicherlich noch hin. wenn nicht melde ich mich wieder)

    Vielen Dank nochmal 👍

    EDIT: Geht wunderbar 😃 👍 😃 👍


Anmelden zum Antworten