关于vc中CDC的一个简单问题

shanpobaiyang 2009-05-28 10:53:23
在windows编程里面,我自己定义了几个如OnDraw的函数,它们主要的功能就是绘图,它们都有一个参数CDC *pDC,我如果想要在别的地方调用这个函数,而此处有没有可用的CDC指针,就必须自己创建一个CDC指针,应该怎样去创建这个指针啊?
...全文
513 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shanpobaiyang 2009-05-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 glacier3d 的回复:]
OnKeyDown里更新视图
OnDraw里调用DrawSnake绘制
[/Quote]
我写的是一个小游戏,如果每次按键都更新一次的话,那么屏幕就会很闪,好像可以只更新局部,但是忘记怎么更新的了,哪位可以指导一下?
多谢了
码侬 2009-05-28
  • 打赏
  • 举报
回复
首先弄清什么是DC

DC是 "Device Content" , MS VC++ 的 MFC图形设备接口 的 设备描述表。它是MFC的主要对象之一。通过CDC类进行各种绘图操作,例如选笔,选色,选涂色的花样,选“画”字的大小字体,画直线曲线多变性,画图像(照片)等,可以“画”到屏幕上,“画”到打印机上,“画”到文件里。

简言之,你想在什么对象上绘图,(比如:屏幕、一个窗口、或者打印机),在MFC中,每一个对象都会关联一个dc,得到该dc就可以了。

至于得到dc的方法,1楼说的很详细了。
创建一个对话框,试试下面的函数(都是按钮相应函数):

void CHdctestDlg::OnGetdcApinull() 
{
HDC hDC=::GetDC(NULL);
::MoveToEx(hDC,10,10,NULL);
LineTo(hDC,800,600);
::ReleaseDC(NULL,hDC);
// TODO: Add your control notification handler code here

}

void CHdctestDlg::OnGetdcApi()
{
HDC hDC=::GetDC(m_hWnd);
::MoveToEx(hDC,0,0,NULL);
LineTo(hDC,200,200);
::ReleaseDC(NULL,hDC);
// TODO: Add your control notification handler code here

}

void CHdctestDlg::OnGetdcCwnd()
{
CDC *pDC = GetDC();
pDC->MoveTo(0,0);
pDC->LineTo(300,200);
ReleaseDC(pDC);
// TODO: Add your control notification handler code here

}

void CHdctestDlg::OnCclientdc()
{
CClientDC dc(this);
CBrush brush(RGB(255,0,0));
dc.Rectangle(0,0,50,50);
dc.FillRect(CRect(1,1,25,25),&brush);
CBrush brush1(RGB(255,255,0));
dc.FillRect(CRect(25,25,49,49),&brush1);
// TODO: Add your control notification handler code here

}

void CHdctestDlg::OnCwindowsdc()
{
CWindowDC dc(this);
CPen pen(PS_SOLID,3,RGB(0,255,0));
CPen *pOldPen = dc.SelectObject(&pen);
dc.MoveTo(0,0);
dc.LineTo(300,50);
dc.SelectObject(pOldPen);
// dc.MoveTo(300,50);
dc.LineTo(0,100);
// TODO: Add your control notification handler code here

}

void CHdctestDlg::OnPointer()
{
CWindowDC* pDC;
pDC = new CWindowDC(this);
pDC->MoveTo(0,100);
pDC->LineTo(300,150);
delete pDC;
// TODO: Add your control notification handler code here

}

void CHdctestDlg::OnCpaintdc()
{
CPaintDC dc(this);
CPen pen(PS_SOLID,3,RGB(0,255,0));
dc.SelectObject(&pen);
dc.MoveTo(0,0);
dc.LineTo(50,300);

// TODO: Add your control notification handler code here

}
anranran 2009-05-28
  • 打赏
  • 举报
回复
void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CClient dc(this);
void DrawSnake(&dc);
}
glacier3d 2009-05-28
  • 打赏
  • 举报
回复
OnKeyDown里更新视图
OnDraw里调用DrawSnake绘制
xsc2001 2009-05-28
  • 打赏
  • 举报
回复
你的CDC得根据你绘图的地方调用时传递过去,这就取决去你在什么地方绘图,如果你是在系统的OnPaint或者OnDraw里调用,则已经有了CDC对象,直接传其指针就行,一般如果在对话框或者窗体上绘图则通过CDC *pDC = GetDC();获取当前窗口的CDC后再传过去,在调用完后别忘了用ReleaseDC(pDC);将其释放。
shanpobaiyang 2009-05-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aaaa3105563 的回复:]
1、hdc = BeginPaint (hwnd, &ps) ; 其它行程序 EndPaint (hwnd, &ps) ; 2、hdc = GetDC (hwnd) ; 其它行程序 ReleaseDC (hwnd, hdc) ; 3 hdc = GetWindowDC (hwnd) ; 其它行程序 ReleaseDC (hwnd, hdc) 4、hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData) ; 其它行程序 DeleteDC (hdc) ; 5、hdcMem = CreateCompatibleDC (hdc) ; 其它行程序 DeleteDC (hdcMem) ; 6、hdcMeta = CreateMetaFile (pszFilename) ;其…
[/Quote]
这些函数倒是有些了解,但还是不会具体应用,例如我现在自己在视类中编写了一个函数void DrawSnake(CDC *pDC),现在我想在同一个视类中的void CSnakeView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 这个函数中调用我自己写的函数DrawSnake,这个指针pDC我应该如何去创建?
phisherr 2009-05-28
  • 打赏
  • 举报
回复
楼上很全哦
aaaa3105563 2009-05-28
  • 打赏
  • 举报
回复
1、hdc = BeginPaint (hwnd, &ps) ; 其它行程序 EndPaint (hwnd, &ps) ; 2、hdc = GetDC (hwnd) ; 其它行程序 ReleaseDC (hwnd, hdc) ; 3hdc = GetWindowDC (hwnd) ; 其它行程序 ReleaseDC (hwnd, hdc) 4、hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData) ; 其它行程序DeleteDC (hdc) ; 5、hdcMem = CreateCompatibleDC (hdc) ; 其它行程序 DeleteDC (hdcMem) ; 6、hdcMeta = CreateMetaFile (pszFilename) ;其它行程序 hmf = CloseMetaFile (hdcMeta) ;

19,464

社区成员

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

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