调用PolyBezier函数在内存中画曲线然后再拷贝到DC上显示不出来

SuperKick 2018-01-12 07:35:48
加精
先上代码:
void CShowDlg::_DrawMotionCurve( HDC hdc, const _SHOW_DRAW_CARD_& Card )
{
HDC hMemDC = NULL;
hMemDC = CreateCompatibleDC( hdc );

if( Card.Polyline.size() >= 4 )
{
CPen* pPenBlue = new CPen;
if ( NULL != pPenBlue )
{
pPenBlue->CreatePen( PS_DOT, 1, RGB( 0, 0, 255 ) );

POINT polyline[MAX_POLY_POINT];
std::list<POINT>::const_iterator lit_pt;
int i = 0;
for( lit_pt = Card.Polyline.begin(); lit_pt != Card.Polyline.end(); lit_pt++ )
{
polyline[i] = *lit_pt;
i++;
}

HGDIOBJ hOldPen = SelectObject( hMemDC, pPenBlue );

PolyBezier( hMemDC, polyline, Card.Polyline.size() );

SelectObject( hMemDC, hOldPen );

delete pPenBlue;
}
}

BitBlt( hdc, 0, 0, 700, 700, hMemDC, 0, 0, SRCCOPY );

DeleteDC( hMemDC );
}

目的:先在内存中调用PolyBezier画曲线,然后拷贝到实际的DC上显示。现在的问题是采用这种方式曲线显示不出来。如果把hMemDC换成hdc是可以的。
hdc的获得方式是:
HDC hdc = ::GetDC( this->GetSafeHwnd() );
...全文
5550 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2018-01-14
  • 打赏
  • 举报
回复
引用 7 楼 SuperKick 的回复:
[quote=引用 6 楼 worldy 的回复:] CreateCompatibleDC( hdc )后,必须创建兼容位图或者设备无关位图CreateCompatibleBitmap,或者CreateDIBSection,然后,将位图选入hMemDC, 再进行绘图操作 CreateCompatibleDC,会附带创建一个位图,但是创建的位图只有一个像素.
也就是说我只用调用CreateCompatibleBitmap创建绘图的位图即可,不用再用CreateCompatibleDC创建一个新的MemDC,对吧。[/quote] 不对,创建memDC过程 hDC=CreateCompatibleDC hBmp=CreateCompatibleBitmap SelectObject(hDC,hBmp,...) 然后,你才可以画图
zgl7903 2018-01-14
  • 打赏
  • 举报
回复
绘制位图和双缓冲差不多, 只是不需要再创建内存位图

void DrawBmp(HDC hDC, LPRECT rcDst, HBITMAP hBmp)
{
  //获取位图信息
  BITMAP bmphd = {0};
  GetObject(hBmp, sizeof(bmphd), &bmphd);

  //创建兼容内存DC & 选入位图
  HDC hMemDC = CreateCompatibleDC(hDC);
  int nSaveDC = SaveDC(hMemDC);
  SelectObject(hMemDC, hBmp);

  //设置缩放半色调
  int iPrvMode = SetStretchBltMode(hDC, HALFTONE);
  //缩放贴图
  StretchBlt(hDC, 
    rcDst->left, rcDst->top, rcDst->right-rcDst->left, rcDst->bottom-rcDst->top,
    hMemDC, 
    0, 0, bmphd.bmWidth, bmphd.bmHeight,
    SRCCOPY);
  //恢复缩放显示模式
  SetStretchBltMode(hDC, iPrvMode);

  //结束清理
  RestoreDC(hMemDC, nSaveDC);
  DeleteDC(hMemDC);
}

void Draw(HDC hDC)
{
  //获取像素大小
  int cx = GetDeviceCaps(hDC, HORZRES);
  int cy = GetDeviceCaps(hDC, VERTRES);
  
  HDC hMemDC = CreateCompatibleDC(hDC); //创建兼容DC
  int nSaveDC = SaveDC(hMemDC); //Save DC
  HBITMAP hBmp = CreateCompatibleBitmap(hDC, cx, cy); //创建兼容位图
  SelectObject(hMemDC, hBmp); //选入位图

  //填充背景色
  RECT rcRect = {0,0, cx, cy};
  FillRect(hMemDC, &rcRect, (HBRUSH)GetStockObject(WHITE_BRUSH));

  //其它绘制代码
  {
    //

    //贴一张位图
    //使用LoadImage 或 LoadBitmap 加载位图 hMyBmp (注意相应释放)
    RECT rcBmp = {10, 10, 100, 100};
    DrawBmp(hMemDC, &rcBmp, hMyBmp);
  }

  //贴图
  BitBlt(hDC, 0, 0, cx, cy, hMemDC, 0, 0, SRCCOPY);
  
  //结束清理
  RestoreDC(hMemDC, nSaveDC);
  DeleteObject(hBmp);
  DeleteDC(hMemDC);

}

SuperKick 2018-01-13
  • 打赏
  • 举报
回复
引用 6 楼 worldy 的回复:
CreateCompatibleDC( hdc )后,必须创建兼容位图或者设备无关位图CreateCompatibleBitmap,或者CreateDIBSection,然后,将位图选入hMemDC, 再进行绘图操作 CreateCompatibleDC,会附带创建一个位图,但是创建的位图只有一个像素.
也就是说我只用调用CreateCompatibleBitmap创建绘图的位图即可,不用再用CreateCompatibleDC创建一个新的MemDC,对吧。
SuperKick 2018-01-13
  • 打赏
  • 举报
回复
引用 7 楼 SuperKick 的回复:
[quote=引用 6 楼 worldy 的回复:] CreateCompatibleDC( hdc )后,必须创建兼容位图或者设备无关位图CreateCompatibleBitmap,或者CreateDIBSection,然后,将位图选入hMemDC, 再进行绘图操作 CreateCompatibleDC,会附带创建一个位图,但是创建的位图只有一个像素.
也就是说我只用调用CreateCompatibleBitmap创建绘图的位图即可,不用再用CreateCompatibleDC创建一个新的MemDC,对吧。[/quote] 即可以和画物体的函数公用一个MemDC。
worldy 2018-01-13
  • 打赏
  • 举报
回复
CreateCompatibleDC( hdc )后,必须创建兼容位图或者设备无关位图CreateCompatibleBitmap,或者CreateDIBSection,然后,将位图选入hMemDC, 再进行绘图操作 CreateCompatibleDC,会附带创建一个位图,但是创建的位图只有一个像素.
SuperKick 2018-01-13
  • 打赏
  • 举报
回复
hMemDC是采用下面的代码创建的:

HDC hMemDC = hMemDC = CreateCompatibleDC( hdc ); 
SuperKick 2018-01-13
  • 打赏
  • 举报
回复
补充说明一下:我上面贴出来的代码是用来画运动轨迹,画完运动轨迹,我还要把物体画出来(用BitBlt画一个BMP图)。请问画轨迹和画物体BMP图这两个动作能公用一个hMemDC吗?
SuperKick 2018-01-13
  • 打赏
  • 举报
回复
多谢二位回帖,我马上试试。
zgl7903 2018-01-13
  • 打赏
  • 举报
回复
要选入位图做画布

void Draw(HDC hDC)
{
  //获取像素大小
  int cx = GetDeviceCaps(hDC, HORZRES);
  int cy = GetDeviceCaps(hDC, VERTRES);
  
  HDC hMemDC = CreateCompatibleDC(hDC); //创建兼容DC
  int nSaveDC = SaveDC(hMemDC); //Save DC
  HBITMAP hBmp = CreateCompatibleBitmap(hDC, cx, cy); //创建兼容位图
  SelectObject(hMemDC, hBmp); //选入位图

  //填充背景色
  RECT rcRect = {0,0, cx, cy};
  FillRect(hMemDC, &rcRect, (HBRUSH)GetStockObject(WHITE_BRUSH));

  //其它绘制代码
  {

  }

  //贴图
  BitBlt(hDC, 0, 0, cx, cy, hMemDC, 0, 0, SRCCOPY);
  
  //结束清理
  RestoreDC(hMemDC, nSaveDC);
  DeleteObject(hBmp);
  DeleteDC(hMemDC);

}
schlafenhamster 2018-01-13
  • 打赏
  • 举报
回复
如果已经 有 一个BMP ,则 只要 SelectObject(hMemDC, hBmp); //选入位图
schlafenhamster 2018-01-12
  • 打赏
  • 举报
回复
hMemDC = CreateCompatibleDC( hdc ); 后, 怎么没有 CreateCompatibleBitmap ?没地方画 ! CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap bmp; bmp.CreateCompatibleBitmap(&dc,90,32); CBitmap *old = memDC.SelectObject(&bmp);

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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