DI Bitmaps erzeugen
-
Hallo,
ich spiele nun seit einiger Zeit mit CBitmap rum. Aber so wie ich das bis jetz begriffen habe ist CBitmap nicht device unabhängig. ich musste jedes mal einen konstanten RGB Bytestream (3Farbkomponentenx8Bits/Farbkomponente = 24Bit)(r,g,b,r,g,b) in einen Strom mit 32Bit umwandeln.
Zusätzlich muss ich in meinen windows einstellungen 32Bit Farbtiefe einstellen, sonst wird mir auf dem dialog gar nichts angezeit, wenn ich die CBitmaps mittels BitBlt darstelle
Wie kann ich also device unabhängig meine bilder darstellen, sodass ich direkt im 24Bit modus bleiben kann und ich die bilder unabhängig von den windows einstellungen darstellen kann?
Mein erster ansatz wäre von CBitmap wegzukommen und direkt BITMAP bzw. HBITMAP zu verwenden, bringt das was? Wo ist der unterschied zwischen CBitmap und BITMAP?
danke schonmal
mfg, TFTS
-
ok und so gehts:
Membervariablen im Dialog erzeugen:
CDC* m_pVirtualDC; int m_nCurrentWidth; int m_nCurrentHeight;
In die OnInit:
m_pVirtualDC = new CDC; m_pVirtualDC->CreateCompatibleDC(NULL);
Die OnPaint:
void CJpg2bmpDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CPaintDC dc(this); dc.BitBlt(0,0,m_nCurrentWidth,m_nCurrentHeight,m_pVirtualDC,0,0,SRCCOPY); CDialog::OnPaint(); } }
Und diese Funktion aufrufen (zb per Button) mit dem Pfad zur bmp-File als Parameter:
CJpg2bmpDlg::DrawDIBitmap(CString csFilePath) { BITMAP bmParameter; HBITMAP hBitmap; CBitmap *pCBitmap; // Handle auf geladene Bitmap holen hBitmap = (HBITMAP)::LoadImage(0,csFilePath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); pCBitmap = CBitmap::FromHandle(hBitmap); m_pVirtualDC->SelectObject(pCBitmap); pCBitmap->GetBitmap(&bmParameter); m_nCurrentWidth = bmParameter.bmWidth; m_nCurrentHeight = bmParameter.bmHeight; this->Invalidate(); }
wer das ganze für Dokumenten basierende Anwendung braucht kann hier mal gucken:
http://www.cpp-tutor.de/mfc/mfc/kap5/lektion8.htmmfg, TFTS