Icons auf Remotedesktop als schwarze Box



  • Hallo,

    ich habe folgendes Problem. Über Hilfe würde ich mich sehr freuen.

    Problembeschreibung
    MFC Desktop Application
    VisualStudio 2010
    Icons sollen in einem CListCtrl per CImageList dargestellt werden.
    Klappt fast immer außer per RemoteDesktop auf einen Windows 2008 / 2003.
    In dem Fall werden die Icons als schwarzes Quadrat dargestellt.
    Verbinden per VMware vSphere (alternative zu Remotdesktop) -> Icons werden gezeichnet
    Remotdesktop auf Windows XP / 7 / 8 -> Icons werden gezeichnet

    Der Code:

    OnInitDialog()
    {
    	/*
    Standardcode
    */
    
    	// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    	//  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    	SetIcon(m_hIcon, TRUE);			// Großes Symbol verwenden
    	SetIcon(m_hIcon, FALSE);		// Kleines Symbol verwenden
    
    	// TODO: Hier zusätzliche Initialisierung einfügen
    	InitList(); //
    	m_list.SetImageList(imageList, LVSIL_NORMAL);
    
    	//Beschriftung
    	CString buf = _T("testitem");	
    	m_list.InsertItem(0, buf, 0);
    	m_list.SetItemData(0, (DWORD) 0);
    	m_list.SetItemText(0, 0, _T("0"));
    
    	m_list.SetItemState(0, 2, LVIS_SELECTED);
    	m_list.EnsureVisible(0, FALSE);
    }
    
    void CDispomarkierungTestDlg::InitList()
    {
    	imageList = new CImageList();
    	int err = imageList->Create(16, 16, ILC_COLOR32 | ILC_MASK, 1, 1);	//ILC_COLOR16 , ILC_COLOR8 , ... getested 
    	int id = 40;
    	int requiredLength = 3154;
    	LPCSTR picInCharsFromDB = GetBitmapAsText();
    	int width = 24;
    	int heigth = 24;
    	int pixel = 32;
    	int planes = 1;
    	BYTE *picInBytes = new BYTE[requiredLength];
    	int lengthVariable = requiredLength;
    	int* lengthPointer;
    	lengthPointer = &lengthVariable;
    
    	Base64Decode(picInCharsFromDB, requiredLength, picInBytes, lengthPointer);		
    
    	HANDLE hBitMap = CreateBitmap(width, heigth, planes, pixel, picInBytes);
    
    	BITMAP bitmap;
    	GetObject(hBitMap,sizeof(BITMAP),&bitmap);
    
    	CImage image;
    	image.Attach((HBITMAP)hBitMap);
    
    	CBitmap icon;
    	icon.Attach((HBITMAP)hBitMap);
    
    	CBitmap* bitmappointer;
    	bitmappointer = &icon;
    
    	BITMAP bmp;
    	icon.GetBitmap(&bmp);
    
    	CClientDC dcClient(this);
    	CDC memDC;
    	memDC.CreateCompatibleDC(&dcClient);
    
    	HBITMAP hbmMask = ::CreateCompatibleBitmap(memDC.GetSafeHdc(), width, heigth);
    
    	ICONINFO ii = {0};
    	ii.fIcon    = TRUE;
    	ii.hbmColor = icon;
    	ii.hbmMask  = hbmMask;
    
    	HICON hIcon = ::CreateIconIndirect(&ii);
    	::DeleteObject(hbmMask);
    	err = imageList->Add(hIcon);
    }
    

    Quelle im Gesamtprogramm ist eine datenbank in der die bitmap als String gespeichert ist, darum der aufwändige umweg beim laden. Images aus Ressourcen laden funktioniert, ist aber keine Option!
    Treiber wurden auf Server und Clientseite aktualisiert
    Das Gesamtprojekt habe ich hier https://www.hidrive.strato.com/lnk/gRuMg38R gehostet. Danke für eure Hilfe.

    [edit]Codeblock eingefügt, danke für den Tipp



  • Hi,

    wir hatten mal so ein ähnliches Problem. Es lag daran, dass der Server die Anzahl der Farben bei einer Remoteverbindung aus Performance-Gründen (zu dünne DSL-Leitung) limitierte (16 Farben bei Win2000Server und 256 Farben bei Win2003Server). Beim Anschauen mit VNC oder Teamviewer wurde alle korrekt dargestellt.
    Ein ähnliches Phänomen habe ich bei Programmen, die ich unter Win7 entwickelt habe und dann unter XP (mit dem entsprechend installierten redistributable package) laufen lasse.



  • Bitte [code]-Tags benutzen!


Anmelden zum Antworten