如何实现坐标系与位图同时显示

szlyang 2009-08-18 07:19:13
我在ondraw中画坐标 但在onpaint中加载位图时ondraw是不执行的 也就是说位图将坐标系覆盖了 怎么解决捏。盼大侠指点!
...全文
120 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
szlyang 2009-08-20
  • 打赏
  • 举报
回复
大家帮我看看以下代码:坐标系被位图覆盖了
void CYZView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
CDC dc;
CDC *pdc = &dc;
CBitmap bitmap;
CBitmap* pOldBitmap;
CRect client;
CRect rect;
//检取无效区
pDC->GetClipBox(client);
//检取整个客户区
GetClientRect(rect);

if(dc.CreateCompatibleDC(pDC))
{
//创建一个与pDC兼容的内存设备环境
if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()))
{
//创建一与pDC兼容的位图,大小为整个客户区
//使dc与pDC具有同样的映射关系
OnPrepareDC(pdc,NULL);
//将位图选入内存环境
pOldBitmap = pdc->SelectObject(&bitmap);
//使dc的整个客户区都成无效区
pdc->SelectClipRgn(NULL);
//再“与上”检取的无效区,使内存环境与pDC检取的无效区相等
dc.IntersectClipRect(client);
}
}

CBrush brush;
if(!brush.CreateSolidBrush(RGB(0,255,0)))
return;
brush.UnrealizeObject();
//将dc的作图区刷新成背景色
dc.FillRect(client,&brush);

//将所有的画图对象在内存裁减区内重画
//在dc中绘图
CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(0,0,255));
CPen *pOldPen = dc.SelectObject(&pen);
CRect rc;
GetWindowRect(rc);
m_height = rc.Height();
m_width = rc.Width();

dc.MoveTo(10,rc.Height()/2);
dc.LineTo(rc.Width()-10,rc.Height()/2);
dc.MoveTo(rc.Width()/2,10);
dc.LineTo(rc.Width()/2,rc.Height()-10);
dc.SelectObject(pOldPen);

dc.TextOut(rc.Width()/2-1,0,"z");
dc.TextOut(rc.Width()-10,rc.Height()/2-5,"y");

CPen pen2;
pen2.CreatePen(PS_SOLID,2,RGB(255,0,0));
CPen *pOldPen2 = dc.SelectObject(&pen2);
dc.MoveTo(10,m_zpos);
dc.LineTo(rc.Width()-10,m_zpos);
dc.SelectObject(pOldPen);

CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
dc.SelectObject(&bmp);

//Copy Bitmap
//将内存裁减区的位图拷贝到窗口裁减区
pDC->BitBlt(0,0,rect.Width(),rect.Height(),pdc,0,0,SRCCOPY);
dc.SelectObject(pOldBitmap);
szlyang 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 conry 的回复:]
画图也应该在OnDraw,坐标错开就行了
[/Quote]
具体怎么错开呢
szlyang 2009-08-18
  • 打赏
  • 举报
回复
非常感谢大家回复。我把以下代码加到ondraw中时。编译通过,执行则退出。哪儿出问题了呢?
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

// Do not call CView::OnPaint() for painting messages
//定义画布对象
CDC memDC;
//创建一个兼容的画布对象
memDC.CreateCompatibleDC(&dc);
//定义一个位图对象
CBitmap bmp;
//载入位图
bmp.LoadBitmap(IDB_BITMAP1);
//在画布对象中选中位图对象
memDC.SelectObject(&bmp);

//获取位图的宽度和高度
int x,y;
BITMAP bInfo;
bmp.GetBitmap(&bInfo);
x = bInfo.bmWidth;
y = bInfo.bmHeight;

//将位图绘制在视图窗口中
CRect rc;
GetClientRect(rc);
dc.StretchBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,x,y,SRCCOPY);

//删除位图对象
bmp.DeleteObject();
//释放画布对象
memDC.DeleteDC();

//CString cs;
//cs.Format("%d",m_zpos);
//dc.TextOut(10,10,cs);
西山小月 2009-08-18
  • 打赏
  • 举报
回复
both in ondraw
Conry 2009-08-18
  • 打赏
  • 举报
回复
画图也应该在OnDraw,坐标错开就行了

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧