读书人

SelectObject,TransparentBlt函数有关

发布时间: 2012-04-17 15:06:33 作者: rapoo

SelectObject,TransparentBlt函数问题?
用BITMAP来显示指示灯

//每收到数据刷新灯状态
m_nBmpId1=IDB_BMP_GRAY;
InvalidateRect(&m_rect,false);
m_nBmpId2=IDB_BMP_GREEN;
InvalidateRect(&m_rect,false);


void CMyDlg::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); //这里调用下面的函数
DrawLamp(m_nBmpId1,IDC_PIC1);
DrawLamp(m_nBmpId2,IDC_PIC2);
}
}


void CMyDlg::DrawLamp(UINT dwBmpId, UINT dwPicID)
{
CBitmap m_bitmap;
CDC ImageDC;
m_bitmap.LoadBitmap(dwBmpId);
ImageDC.CreateCompatibleDC(GetDC());//创建内存DC
CBitmap *pOldImageBMP = ImageDC.SelectObject(&m_bitmap);

((CStatic *)GetDlgItem(dwPicID))->GetWindowRect(&m_rect);
ScreenToClient(&m_rect);

if (!TransparentBlt(GetDC()->GetSafeHdc(), m_rect.left, m_rect.top,
m_rect.Width(), m_rect.Height(), ImageDC.m_hDC, 0, 0,
45, 41, RGB(255,255,255)))
{
DWORD dwError=GetLastError(); //问题出在这里:程序一开始运行正常,
AfxMessageBox("error"); //但执行了大概两三个小时后进入这个IF里面,dwError为6,
} //说是句柄无效,为什么会这样子,请问是什么原因?该如何改?
ImageDC.SelectObject(pOldImageBMP);
m_bitmap.DeleteObject();
pOldImageBMP->DeleteObject();
ImageDC.DeleteDC();
}

[解决办法]
出现这中情况,一般都是gdi资源泄漏的问题,楼主再好好找找,用windows任务管理器查看gdi使用情况
[解决办法]
CDC *pDC=GetDC();

ImageDC.CreateCompatibleDC(pDC);

...TransparentBlt(pDC->GetSafeHdc()...)

this->ReleaseDC(pDC);
[解决办法]
有几处你是调用GetDC(),但没有ReleaseDC()
[解决办法]
GDI资源泄漏吧
[解决办法]
releaseDC 释放设备上下文资源
[解决办法]
releaseDC 释放设备上下文资源

读书人网 >VC/MFC

热点推荐