VC 用BitBlt显示完BMP图像后,用什么函数能把图像清除,恢复到没有载入图像的情况?
OnDraw(CDC*pDC){HBITMAPbitmap;HBITMAPoldbitmap;CDCmemdc;CRectrect;if(FileName=="")bit...
OnDraw(CDC* pDC)
{
HBITMAP bitmap;
HBITMAP oldbitmap;
CDC memdc;CRect rect;
if(FileName=="") bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),NULL,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
else
bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),FileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
memdc.CreateCompatibleDC(pDC);
GetClientRect(rect);
oldbitmap=(HBITMAP)memdc.SelectObject(bitmap);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);
memdc.SelectObject(oldbitmap);
// 显示等待光标
BeginWaitCursor();
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// 获取DIB
HDIB hDIB = pDoc->GetHDIB();
// 判断DIB是否为空
if (hDIB != NULL)
{
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
// 获取DIB宽度
int cxDIB = (int) ::DIBWidth(lpDIB);
// 获取DIB高度
int cyDIB = (int) ::DIBHeight(lpDIB);
::GlobalUnlock((HGLOBAL) hDIB);
CRect rcDIB;
rcDIB.top = rcDIB.left = 0;
rcDIB.right = cxDIB;
rcDIB.bottom = cyDIB;
CRect rcDest;
// 判断是否是打印
if (pDC->IsPrinting())
{
// 是打印,计算输出图像的位置和大小,以便符合页面
// 获取打印页面的水平宽度(象素)
int cxPage = pDC->GetDeviceCaps(HORZRES);
// 获取打印页面的垂直高度(象素)
int cyPage = pDC->GetDeviceCaps(VERTRES);
// 获取打印机每英寸象素数
int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
// 计算打印图像大小(缩放,根据页面宽度调整图像大小)
rcDest.top = rcDest.left = 0;
rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch)
/ ((double)cxDIB * cxInch));
rcDest.right = cxPage;
// 计算打印图像位置(垂直居中)
int temp = cyPage - (rcDest.bottom - rcDest.top);
rcDest.bottom += temp/2;
rcDest.top += temp/2;
}
else
// 非打印
{
// 不必缩放图像
rcDest = rcDIB;
}
// 输出DIB
::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(),
&rcDIB, pDoc->GetDocPalette());
}
// 恢复正常光标
EndWaitCursor();
}
好像把内存中的内容改了可以实现,怎么弄呢? 展开
{
HBITMAP bitmap;
HBITMAP oldbitmap;
CDC memdc;CRect rect;
if(FileName=="") bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),NULL,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
else
bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),FileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
memdc.CreateCompatibleDC(pDC);
GetClientRect(rect);
oldbitmap=(HBITMAP)memdc.SelectObject(bitmap);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);
memdc.SelectObject(oldbitmap);
// 显示等待光标
BeginWaitCursor();
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// 获取DIB
HDIB hDIB = pDoc->GetHDIB();
// 判断DIB是否为空
if (hDIB != NULL)
{
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
// 获取DIB宽度
int cxDIB = (int) ::DIBWidth(lpDIB);
// 获取DIB高度
int cyDIB = (int) ::DIBHeight(lpDIB);
::GlobalUnlock((HGLOBAL) hDIB);
CRect rcDIB;
rcDIB.top = rcDIB.left = 0;
rcDIB.right = cxDIB;
rcDIB.bottom = cyDIB;
CRect rcDest;
// 判断是否是打印
if (pDC->IsPrinting())
{
// 是打印,计算输出图像的位置和大小,以便符合页面
// 获取打印页面的水平宽度(象素)
int cxPage = pDC->GetDeviceCaps(HORZRES);
// 获取打印页面的垂直高度(象素)
int cyPage = pDC->GetDeviceCaps(VERTRES);
// 获取打印机每英寸象素数
int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
// 计算打印图像大小(缩放,根据页面宽度调整图像大小)
rcDest.top = rcDest.left = 0;
rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch)
/ ((double)cxDIB * cxInch));
rcDest.right = cxPage;
// 计算打印图像位置(垂直居中)
int temp = cyPage - (rcDest.bottom - rcDest.top);
rcDest.bottom += temp/2;
rcDest.top += temp/2;
}
else
// 非打印
{
// 不必缩放图像
rcDest = rcDIB;
}
// 输出DIB
::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(),
&rcDIB, pDoc->GetDocPalette());
}
// 恢复正常光标
EndWaitCursor();
}
好像把内存中的内容改了可以实现,怎么弄呢? 展开
5个回答
展开全部
case IDM_QINGKONG:
DeleteMenu(hmenu,1,MF_BYPOSITION);//删除统计菜单项;即是删除动态菜单
DrawMenuBar(hwnd);//重新显示窗口菜单,即是恢复刚开始时候菜单模样
InvalidateRect(hwnd,NULL,1);//重新显示窗口画面
break;
希望能帮到你
DeleteMenu(hmenu,1,MF_BYPOSITION);//删除统计菜单项;即是删除动态菜单
DrawMenuBar(hwnd);//重新显示窗口菜单,即是恢复刚开始时候菜单模样
InvalidateRect(hwnd,NULL,1);//重新显示窗口画面
break;
希望能帮到你
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
晕那里那么复杂。
你使用CBitmap的话,析构函数会自动删除对象句柄,不用调用。
使用HBITMAP bitmap; 的话,在函数末尾加: DeleteObject( bitmap );
你使用CBitmap的话,析构函数会自动删除对象句柄,不用调用。
使用HBITMAP bitmap; 的话,在函数末尾加: DeleteObject( bitmap );
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以用FillRect把某一块矩形填充为某一颜色
追问
有没有一个函数把把某一块矩形的颜色删除,就像橡皮擦似地?
追答
可以用FillRect把这一块矩形填充为白色,不就像当于橡皮擦吗
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你必须先保存原先的图像(或者绘制方式)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
创建多个内存的bmp 想用哪个就贴哪个
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询