[VC新手系列] : pDC 是从哪里来的, 怎样得到它 ?

tuxw 2003-12-31 10:38:18
在视的 OnDraw 函数中有个 CDC *pDC 参数,请问这个 pDC 是从哪里传来的,我在其它地方怎样得到它?

我知道在视的成员函数比如响应鼠标键的函数中,可以用CClientDC dc(this) 获得 DC 从而可以绘图,但我有个自己生成的类,在这个类的一个函数中我想要在视图中写一些文字或画一些图形,怎样得到 DC 呢?并且得到的 DC 环境(画笔、画刷、文字颜色等)与视的 OnDraw 中的 pDC 是相同的, 请大家帮忙啊
...全文
282 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluebohe 2004-01-02
  • 打赏
  • 举报
回复
这是不简便的方法
//#include "mainfrm.h"
//#include "MyAppView.h"
//#include "MyAppDoc.h"
//CMyAppView* pView=(CMyAppView*)((CMainFrame*)AfxGetApp()->m_pMainWnd)->GetActiveView();
//CMyAppDoc* pDoc=(CMyAppDoc*)((CMainFrame*)AfxGetApp()->m_pMainWnd)->GetActiveDocument();
once168 2004-01-01
  • 打赏
  • 举报
回复
DC的使用:
DC分两种:设备DC和内存DC
设备DC又分两种:显示DC与转出设备DC(如打印机)
内存DC:窗口DC与自定义DC(如preview)

根据上面几种分法,你就知道你要那一个DC了
本个估计你要的是内存DC: CDC::CreateComp...DC()//忘了怎么写,查一个MSDN
如果是窗口DC,须要窗口的句柄(HWND),用CClientDC(窗口)可以创建一个窗口DC类(DC在创建窗口时已创建)
如果是设备DC用CreateDC创建,里面的参数可见MSDN
lambochan 2004-01-01
  • 打赏
  • 举报
回复
可以在你的类绘图函数里接收一个CDC* pDC参数,如:
class MyDrawCode
{
public:
void Draw(CDC* pDC){pDC->TextOut(0,0,"Test..");}
};

在OnDraw()就可以如下使用:
CXXXXView::OnDraw(CDC *pDC)
{
MyDrawCode draw;
draw.Draw(pDC);
}

在视图里其它函数调用也可以直接使用 :
CDC *pDC = GetDC();
MyDrawCode draw;
draw.Draw(pDC);
ReleaseDC(pDC);
====================================================
也可以改成接收一个窗口指针做参数:
class MyDrawCode
{
public:
void Draw(CWnd* pWnd)
};
void MyDrawCode::Draw(CWnd* pWnd)
{
CDC *pDC = pWnd->GetDC();
pDC->TextOut(0,0,"Test..");
pWnd->ReleaseDC(pDC);
}
在View中使用:
MyDrawCode draw;
draw.Draw(this);
==============================

倒~~
错了几句.困
lambochan 2004-01-01
  • 打赏
  • 举报
回复
可以在你的类绘图函数里接收一个CDC* pDC参数,如:
class MyDrawCode
{
public:
Draw(CDC* pDC){pDC->TextOut(0,0,"Test..");}
};

在OnDraw()就可以如下使用:
CXXXXView::OnDraw(CDC *pDC)
{
MyDrawCode draw;
draw.Draw(pDC);
}

在视图里其它函数调用也可以直接使用 :
CDC *pDC = GetDC();
MyDrawCode draw;
draw.Draw(pDC);
ReleaseDC(pDC);
====================================================
也可以改成接收一个窗口指针做参数:
class MyDrawCode
{
public:
Draw(CWnd* pWnd)
};
class MyDrawCode::Draw(CWnd* pWnd)
{
CDC *pDC = pWnd->GetDC();
pDC->TextOut(0,0,"Test..");
pWnd->ReleaseDC(pDC);
}
在View中使用:
MyDrawCode draw;
draw.Draw(this);
tuxw 2004-01-01
  • 打赏
  • 举报
回复
谢谢,我的邮箱是 tuxw9572@sina.com
黄双全 2004-01-01
  • 打赏
  • 举报
回复
给你的类一个SetDC的函数.你需要作图的时候,取得dc传进去.
tuxw 2004-01-01
  • 打赏
  • 举报
回复
感谢大家,bluebohe(薄荷) 的全局变量的方法解决了我的问题

不过既然这是最简单的方法,应该还有其他的方法吧?
wxgdwz5275 2004-01-01
  • 打赏
  • 举报
回复
up
zzzle 2004-01-01
  • 打赏
  • 举报
回复
② 我在MyView里加个测试函数
void MyView::OnEditTest()
{
CDC *pDC = GetWindowDC();

pDC->MoveTo( 0, 0 );
pDC->LineTo( 500, 500 );
ReleaseDC( pDC );
}
这样倒是可以作图了,但作图环境跟 OnDraw 不一样了,尤其是坐标映射方式不同了,本我的我坐标原点在屏幕中心,Y轴正向是向上的,现在的结果却是 窗口左上角为原点,Y正向朝下了

是的,使用MM_TEXT映射模式的时候,垂直的数值是从屏幕的顶部开始计算的,而水平的值是从左边开始计算的。
其它的模式,垂直的值从屏幕底部,水平的值不变
wangweintk 2003-12-31
  • 打赏
  • 举报
回复
方法很多
ljzcom 2003-12-31
  • 打赏
  • 举报
回复
也可以用GetWindowDc()
zzzle 2003-12-31
  • 打赏
  • 举报
回复
CDC *pDC=getDC();
zhangym365 2003-12-31
  • 打赏
  • 举报
回复
OnDraw函数是通过 MFC 进行调用的虚函数,在需要刷新视图的时候调用。所以用户可以进行重载!
楼主遇到的这种情况建议可以使用这种方式解决!

class CMyView:Public CView
{
void OnDraw(CDC *pdc)
public:
CMyDrawClass m_DrawClass;
}

void CMyView::OnDraw(CDC *pdc)
{
m_DrawClass.YouDraw(pdc);
}

class CMyDrawClass
{
public:
void YouDraw(CDC *pdc)
}
broadoceans 2003-12-31
  • 打赏
  • 举报
回复
pDC 是系统为绘图准备的
因为OnDraw中的pDC在函数退出时即销毁
所以即使你保存也没有用。
建议用以下方法:
HDC hdc = ::GetDC(hwnd);
::TextOut(hdc,...)
BitBlt(hdc,....)
::ReleaseDC(hdc);


还有一种方法,你首先在OnDraw中放入代码(设立标志,什么时候使用)
然后需要使用时先设置标志,然后调用即可。
vcforever 2003-12-31
  • 打赏
  • 举报
回复
可以通过CDC* GetDC( ); 这个函数获得pDC
OnDraw函数是在需要重绘窗口的时候有系统调用的
如果你想强制重绘窗口,可以使用
void Invalidate(
BOOL bErase = TRUE
);
函数来重绘
bluebohe 2003-12-31
  • 打赏
  • 举报
回复
你可以在View类初始化时把this指针赋值给一个全局变量,然后就能使用g_pView->GetDC()等等的函数了,这是最简单的方法
celerityok 2003-12-31
  • 打赏
  • 举报
回复
关注中!学习中!
tuxw 2003-12-31
  • 打赏
  • 举报
回复
谢谢大家,我试了上面的方法,但还是有问题

① CDC *pDC = GetDC() 或 GetWindowDC() 只能在 MyView 的范围内使用,但我自己了一个类跟 MyView 没有关系,我在这个类里用 GetDC() 时编译报错,要我给一个 HWND hWnd 参数,这个hWnd 参数又怎么来的呢?

② 我在MyView里加个测试函数
void MyView::OnEditTest()
{
CDC *pDC = GetWindowDC();

pDC->MoveTo( 0, 0 );
pDC->LineTo( 500, 500 );
ReleaseDC( pDC );
}
这样倒是可以作图了,但作图环境跟 OnDraw 不一样了,尤其是坐标映射方式不同了,本我的我坐标原点在屏幕中心,Y轴正向是向上的,现在的结果却是 窗口左上角为原点,Y正向朝下了

我的 MyView 是从 CZoomView 派生的( CZoomView是CSDN的一个网友给我的,是一个从CScrollView派生来的支持缩放、滚动的类 ),
CZoomView 重载了 CScrollView 的 virtual void OnPrepareDC()
在上面那个测试函数中,如果我在 GetDC(), 后面写一句 OnPrepare( pDC ); 则作图的坐标方式就正常了

③ 现在的问题是我生成的类是用控制外围设备的,这个类跟 MyView 没什么关系,就不知道怎样得到 DC 了,更不能调用 OnPrepare() 了,但我又要根据视图上的内容来控制外围设备,该怎么样操作作了?直接说就是如何让我自己的类能访问窗口上具体某一点是什么颜色?

16,551

社区成员

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

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

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