Bitmap erstellen und füllen...
-
problem: das programm stürzt an folgender stelle ab
CPaintDC dc(this); //bestehendes CPaintDC CDC memdc; CBitmap hbitmap; memdc.CreateCompatibleDC(&dc); // hier stürzt es ab!
-
weiß denn niemand rat? es eilt doch...

-
Hast du es mal mit 2 CDC's versucht?
-
die funktion die in das CPaintDC zeichnet existiert halt schon. wie würde ich denn dann dieses in ein CDC umwandeln?
-
Es müsste so was sein wie:
CDC* pDC = CDC::CreateDC(dc.m_hDC);Birgt aber gewisse Risiken, weil pDC dann nur noch temporär ist (laut MSDN).
Ich bin immer noch am rätseln, ob dass, was ich weiter oben vorgeschlagen habe eigentlich Sinn macht, weil man doch eigentlich ein CPaintDC übergeben können müsste, auch wenn ein CDC gefragt ist, denn schließlich ist doch CPaintDC von CDC abgeleitet. Meistens geht das so auf jeden Fall. Nur manchmal nicht
. Versuchs doch mal.
-
es ist jetzt folgendermassen:
CPaintDC dc(this); CBitmap hbitmap; dc.SelectObject(&hbitmap); //das dc wird gefüllt WriteBitmap("test.bmp",hbitmap,dc); //obige funktionund es läuft net... GetObject liefert immer FALSE!
-
Ich muss mich korrigieren. Es muss natürlich FromHandle sein und nicht CreateDC. Was mir noch so aufgefallen ist, ist, dass du ein CBitmap an WriteBitmap übergibst, obwohl nen HBITMAP gefragt ist. Schreib doch mal:
(HBITMAP) hbitmap(siehe MSDN).
-
ne also irgendwie liefert GetObject immer 0

-
Du könntest dir mit GetLastError() ne brauchbare Fehlermeldung holen.
-
ich versteh dieses GetObject nicht...
CPaintDC dc(this); // device context for painting CDC memdc; memdc.CreateCompatibleDC(&dc); CBitmap bitmap; memdc.SelectObject(&bitmap); dc.BitBlt(0,0,180,180,&memdc,0,0,SRCCOPY); BITMAP bmp; if (GetObject((HBITMAP)bitmap, sizeof(BITMAP), &bmp)==0) AfxMessageBox("nuuuuuuull");es gibt immer 0 aus obwohl doch alles wunderbar sein sollte? GetLastError gibt auch nur nen Zahlenwust aus.
-
Das GetObject packt den Inhalt von bitmap in bmp. Geh mal mit der Zahl von GetLastError in die MSDN-Suchfunktion oder -Inhaltsfunktion, dort gibt es eine Tabelle, da steht mehr drin.
-
ne, unter 1240568 findet er da nix...
-
Hab den Code grad ausprobiert, weil ich ein ähnliches Problem hab. Bei mir liefert GetObject auch immer 0.
-
Ich mach dass immer so:
......
.......
.......
int error=GetLastError();
CString str;
str.Format("%d",error);
MessageBox(str);Mit der Zahl findet man auch was.
-
Die Tabelle findet man unter Win32 API unter Error Codes im MSDN Inhalt. Geht allerdings nur bis 11031, wohl wahr.
-
Vielleicht mach ich auch was komplett falsch. So ruf ich übrignes die Funktion auf:
CDC pDC; pDC.CreateCompatibleDC(m_Graph.GetDC()); CBitmap CBmp; pDC.SelectObject(&CBmp); CRect rect; m_Graph.GetWindowRect(&rect); pDC.BitBlt(0,0,rect.right,rect.bottom,m_Graph.GetDC(),0,0,0); WriteBitmap(FileName,(HBITMAP)CBmp,pDC);Vielleicht liegt ja da schon der Fehler.
Mit GetLastError bekomm ich übrigens 0 raus, also eigentlich kein Fehler. Aber trotzdem gibt GetObject 0. hmmmm....Phips!
-
ich hab jetzt
CBitmap bitmap;durch
HBITMAP bitmap=CreateCompatibleBitmap(dc, 32, 32);ersetzt und es scheint besser. allerdings ist mein bitmap komplett schwarz...
-
Hi, bei mir hat er es jetzt so gemacht.
void CBitmapDlg::OnButton1() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); CPaintDC memdc(this); CBitmap* pOldBitmap=memdc.SelectObject(&bitmap); BITMAP bmp; if(GetObject((HBITMAP) bitmap, sizeof(BITMAP), &bmp)) { BITMAPINFOHEADER BmpInfoHdr; BITMAPFILEHEADER BmpFileHdr; BmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER); BmpInfoHdr.biWidth = bmp.bmWidth; BmpInfoHdr.biHeight = bmp.bmHeight; BmpInfoHdr.biPlanes = bmp.bmPlanes; BmpInfoHdr.biBitCount = 24; BmpInfoHdr.biCompression = BI_RGB; BmpInfoHdr.biSizeImage = bmp.bmWidth*bmp.bmHeight*3; BmpFileHdr.bfType = 0x4d42; BmpFileHdr.bfReserved1 = 0; BmpFileHdr.bfReserved2 = 0; BmpFileHdr.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof (BITMAPINFOHEADER); BmpFileHdr.bfSize = BmpFileHdr.bfOffBits+BmpInfoHdr.biSizeImage; bmp.bmBits = (void*)GlobalAlloc(GMEM_FIXED, BmpInfoHdr.biSizeImage); if(GetDIBits(memdc, (HBITMAP) bitmap, 0, BmpInfoHdr.biHeight, bmp.bmBits, (BITMAPINFO*)&BmpInfoHdr, DIB_RGB_COLORS) == BmpInfoHdr.biHeight) { HANDLE hFile = CreateFile("WWWWWWw.bmp", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); if(hFile != INVALID_HANDLE_VALUE) { DWORD dwTmp; WriteFile(hFile, &BmpFileHdr, sizeof(BITMAPFILEHEADER), &dwTmp, NULL); WriteFile(hFile, &BmpInfoHdr, sizeof(BITMAPINFOHEADER), &dwTmp, NULL); WriteFile(hFile, bmp.bmBits, BmpInfoHdr.biSizeImage, &dwTmp, NULL); } CloseHandle(hFile); } GlobalFree(bmp.bmBits); memdc.SelectObject(pOldBitmap); } }
-
So macht er es auch:
void CBitmapDlg::OnButton1() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen CBitmap bitmap,bitmap2; bitmap.LoadBitmap(IDB_BITMAP1); CPaintDC memdc(this); CDC cDC; cDC.CreateCompatibleDC(&memdc); CBitmap* pOldBitmap2=cDC.SelectObject(&bitmap2); cDC.BitBlt(0,0,100,100,&memdc,0,0,SRCCOPY); CBitmap* pOldBitmap=memdc.SelectObject(&bitmap); BITMAP bmp; if(GetObject((HBITMAP) bitmap, sizeof(BITMAP), &bmp)) { BITMAPINFOHEADER BmpInfoHdr; BITMAPFILEHEADER BmpFileHdr; BmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER); BmpInfoHdr.biWidth = bmp.bmWidth; BmpInfoHdr.biHeight = bmp.bmHeight; BmpInfoHdr.biPlanes = bmp.bmPlanes; BmpInfoHdr.biBitCount = 24; BmpInfoHdr.biCompression = BI_RGB; BmpInfoHdr.biSizeImage = bmp.bmWidth*bmp.bmHeight*3; BmpFileHdr.bfType = 0x4d42; BmpFileHdr.bfReserved1 = 0; BmpFileHdr.bfReserved2 = 0; BmpFileHdr.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof (BITMAPINFOHEADER); BmpFileHdr.bfSize = BmpFileHdr.bfOffBits+BmpInfoHdr.biSizeImage; bmp.bmBits = (void*)GlobalAlloc(GMEM_FIXED, BmpInfoHdr.biSizeImage); if(GetDIBits(cDC, (HBITMAP) bitmap, 0, BmpInfoHdr.biHeight, bmp.bmBits, (BITMAPINFO*)&BmpInfoHdr, DIB_RGB_COLORS) == BmpInfoHdr.biHeight) { HANDLE hFile = CreateFile("WWWWWWaaaw.bmp", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); if(hFile != INVALID_HANDLE_VALUE) { DWORD dwTmp; WriteFile(hFile, &BmpFileHdr, sizeof(BITMAPFILEHEADER), &dwTmp, NULL); WriteFile(hFile, &BmpInfoHdr, sizeof(BITMAPINFOHEADER), &dwTmp, NULL); WriteFile(hFile, bmp.bmBits, BmpInfoHdr.biSizeImage, &dwTmp, NULL); } CloseHandle(hFile); } GlobalFree(bmp.bmBits); memdc.SelectObject(pOldBitmap); } }
-
bei mir tut ers jetzt auch wunderbar, nur die diner die mittels
dc.FillSolidRectins dc geschrieben werden sind nicht im bitmap, sprich es ist leer...