Bitmap als Hintergrundbild eines Dialoges



  • Hallo!

    ich hab ein Problem mit meinem Programm...
    ich lade ein Bitmap und möchte dieses als Hintergrund für meinen Dialog, also anstatt dem 'grau' mein bild.
    das laden funktioniert auch alles soweit, nur das anzeigen... das geht nicht

    ich benutze dazu die Funktion StretchDIBits in der Dialogroutine bei Nachricht WM_ERASEBKGND

    also:

    ...

    BYTE *LoadDIBImage(char *image)
    {
    	DWORD dwFileSize, dwBytesRead;
    	HANDLE hFile;
    	BYTE *pData;
    
    	hFile=CreateFile(image,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    	if(hFile==INVALID_HANDLE_VALUE)
    		return NULL;
    
    	dwFileSize=GetFileSize(hFile,NULL);
    
    	pData=(BYTE *)malloc(dwFileSize);
    	if(pData==NULL) {
    		CloseHandle(hFile);
    		return NULL;
    	}
    
    	ReadFile(hFile,pData,dwFileSize,&dwBytesRead,NULL);
    	if(dwFileSize!=dwBytesRead) {
    		CloseHandle(hFile);
    		free(pData);
    		return NULL;
    	}
    
    	return pData;
    }
    
    case WM_INITDIALOG:
    ...
    pbmfh=(BITMAPFILEHEADER *)LoadImage(name);
    pbmi=(BITMAPINFO *)(pbmfh+1);
    pBits=(BYTE *)pbmfh + pbmfh->bfOffbits;
    sizex=pbmi->bmiHeader.biWidth;
    sizey=pbmi->bmiHeader.biHeight;
    ...
    return TRUE;
    
    case WM_ERASEBKND:
    hdc=(HDC)wParam;
    GetClientRect(hwndDlg,&r);
    StretchDIBits(hdc,0,0,r.right,r.bottom,0,0,sizex,sizey,pBits,pbmi,DIB_RGB_COLORS,SRCCOPY);
    return TRUE;
    

    Der Dialog ist immer ganz schwarz!

    Kann mir da jemand bitte weiterhelfen?
    weiß nicht mehr weiter...

    Danke...
    mfg



  • Warum nimmst du nicht LoadBitmap/LoadImage, CreateCompatibleDC, SelectObject, StrechBlt - scheint mir irgendwie einfacher zu sein 🙄



  • flenders schrieb:

    Warum nimmst du nicht LoadBitmap/LoadImage, CreateCompatibleDC, SelectObject, StrechBlt - scheint mir irgendwie einfacher zu sein 🙄

    Kommt drauf an, ich denke das hat einen anderen gewissen Grund, nicht den Anfängerweg zu gehen.

    @heike
    wann wird den "WM_ERASEBKND" gesendet? Nie

    aber ab und an kommt mal ein "WM_ERASEBKGND", zum beispiel nach einem Resize
    oder InvalidateRect


Anmelden zum Antworten