Hallo,
ich habe folgendes Problem. Würde mich über Hilfe 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 gehostet
https://www.hidrive.strato.com/lnk/gRuMg38R. Danke für eure Hilfe.
Welche Farbtiefe haben die Icons? Die RDP-Sitzung wird mit einer anderen Farbtiefe arbeiten als die lokale Konsolensitzung, und wenn Icons keine passende Farbtiefe (Bit pro Pixel) haben, werden sie nicht korrekt dargestellt. In Icons können mehrere unterschiedliche Farbtiefen und Größen enthalten sein; sieh Dir mal mit dem Resourcen-Editor des Visual Studio Deine Icons an. Und Deine Imagelist scheint auch nur 32bpp zu kennen; reduziere das mal auf das, was in der aktiven Sitzung tatsächlich verwendet wird (sollte mit GetSystemMetrics feststellbar sein).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.