Re: Application crashes on BitBlt after a while.. need help please
Two errors pointed out below...
"vorange" <orangepic@yahoo.com> wrote in message
news:e5046e63-1541-4b7d-adbe-4fd964573170@26g2000hsk.googlegroups.com...
Hello,
I call InvalidateRect() which calls OnPaint() which in turn calls a
function named DrawCompass().
The application works for a while... but then crashes. It leads me to
believe I have some memory leak or something not releasing resources
in time. The debugger says it crashes on the statement BitBlt.
Apparently it is unable to get a handle to something (i think the DC)
when using BitBlt and fails an ASSERT.
What am I doing wrong? Have I fogotten to delete some pointer in the
code below? Can you spot anything wrong with the code below?
Thank you for your time.
-----------------------------
void ScanDialog::OnPaint()
{
CPaintDC dc(this);
CDC dcMemory;
bool falsetrue = dcMemory.CreateCompatibleDC (&dc);
if(falsetrue == TRUE)
Bad style here. The return value is "non zero". It may not be identical to
TRUE!!
{
DrawCompass(IDC_AZIMUTH, &dcMemory);
}
}
----------------------------
void ScanDialog::DrawCompass(int id, CDC * dcMemory)
{
if(id == IDC_AZIMUTH)
{
pOldBitmap = dcMemory->SelectObject (&bmp); // pOldBitmap is a
CBitmap* pOldBitmap
if(pOldBitmap != NULL)
{
pWndd = GetDlgItem(id);
if(pWndd != NULL)
{
dc2 = pWndd->GetDC(); // dc is a CDC *dc2
You never release this DC!!
ReleaseDC must be called after you finish.
It is also poor practice to be painting on another window during WM_PAINT.
That painting should be done in the context of WM_PAINT for that other
window.
if(dc2 != NULL)
{
pWndd->GetClientRect(&rect); // rect is a CRect
nX = rect.left;
nY = rect.top;
if(dc2->BitBlt(nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight,
dcMemory, 0, 0, SRCCOPY) != 0)
{
dc2->MoveTo(73,67);
dc2->AngleArc(73,67,31,azimuth + 90,360); // azimuth is a
float
dc2->MoveTo(73,67);
}
}
}
dcMemory->SelectObject(pOldBitmap);
}
}
--
Scott McPhillips [VC++ MVP]