精华内容
下载资源
问答
  • OnDraw

    2019-09-30 13:09:23
    void CSFCView::OnDraw(CDC* pDC){// return; CSFCDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(m_pPrgInfo==NULL) return; if(g_PrjMg.GetShowType()!=SHOW_EDIT) { CSize cz = m_sizeTotal; cz...

    void CSFCView::OnDraw(CDC* pDC)
    {
    // return;
    CSFCDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    if(m_pPrgInfo==NULL)
    return;

    if(g_PrjMg.GetShowType()!=SHOW_EDIT)
    {
    CSize cz = m_sizeTotal;
    cz.cx*=m_fRate;
    cz.cy*=m_fRate;
    SetScrollSizes(MM_TEXT, cz);
    }

    m_ScrollSize.cx = GetScrollPos(SB_HORZ);
    m_ScrollSize.cy = GetScrollPos(SB_VERT);

    CRect rt;
    GetClientRect(rt);
    m_ClientRect.CopyRect(rt);
    CBitmap *pmb;
    CDC *gdc = GetDC();
    int iWidth = (float)rt.Width()/m_fRate;
    int iHeight = (float)rt.Height()/m_fRate;
    if( gdc==NULL || !m_Bitmap.CreateCompatibleBitmap(gdc, iWidth, iHeight))
    {
    return;
    }

    if (m_MainDC.m_hDC == NULL)
    {
    if(!m_MainDC.CreateCompatibleDC(gdc))
    {
    return;
    }
    }
    pmb = m_MainDC.SelectObject(&m_Bitmap);
    CBrush brush(RGB(255,255,255));
    m_MainDC.FillRect(CRect(0, 0,iWidth, iHeight), &brush);
    m_Bitmap.DeleteObject();
    brush.DeleteObject();
    ReleaseDC(gdc);
    m_pPrgInfo->m_GraphMg.SetScrollSize(CSize((float)m_ScrollSize.cx/m_fRate, (float)m_ScrollSize.cy/m_fRate));
    m_pPrgInfo->m_GraphMg.Draw(&m_MainDC);

    if(m_bLDown && m_ElemType == SGT_LINE && m_pPrgInfo!=NULL)
    {
    m_pPrgInfo->m_GraphMg.DrawLine(&m_MainDC, m_HitPt, m_ptEnd);
    }

    //刷新背景色为白色
    pDC->FillSolidRect(CRect(0, 0,rt.Width(), rt.Height()), RGB(255,255,255));

    pDC->StretchBlt(
    m_ScrollSize.cx,
    m_ScrollSize.cy,
    rt.Width(),
    rt.Height(),
    &m_MainDC,
    0,
    0,
    iWidth,
    iHeight,
    SRCCOPY);

    }

    转载于:https://www.cnblogs.com/ShiShouTHS/p/11563872.html

    展开全文
  • onDraw

    2020-08-24 21:02:49
  • ondraw

    2008-04-16 13:44:00
    OnDraw与OnPaint有什么区别?(转)2007-11-15 17:30 学习中遇到一个问题,OnDraw与OnPaint有什么区别?上网搜索了一下,又查了一下MSDN和MFC的一些源文件,现整理如下。
    OnDraw与OnPaint有什么区别?(转)
    2007-11-15 17:30

    学习中遇到一个问题,OnDraw与OnPaint有什么区别?上网搜索了一下,又查了一下MSDN和MFC的一些源文件,现整理如下。

     

    OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。

    OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,没有响应消息的功能.当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows发送WM_PAINT消息。该视图的OnPaint 处理函数通过创建CPaintDC类的DC对象来响应该消息并调用视图的OnDraw成员函数.OnPaint最后也要调用OnDraw,因此一般在OnDraw函数中进行绘制。


    The WM_PAINT message is sent when the UpdateWindow or RedrawWindow member function is called.

     

    在OnPaint中,将调用BeginPaint,用来获得客户区的显示设备环境,并以此调用GDI函数执行绘图操作。在绘图操作完成后,将调用EndPaint以释放显示设备环境。而OnDraw在BeginPaint与EndPaint间被调用。

    1) 在mfc结构里OnPaint是CWnd的成员函数. OnDraw是CView的成员函数.
    2) OnPaint()调用OnDraw(),OnPrint也会调用OnDraw(),所以OnDraw()是显示和打印的共同操作。

    OnPaint是WM_PAINT消息引发的重绘消息处理函数,在OnPaint中会调用OnDraw来进行绘图。OnPaint中首先构造一个CPaintDC类得实例,然后一这个实例为参数来调用虚函数OnPrepareDC来进行一些绘制前的一些处理,比设置映射模式,最后调用OnDraw。而OnDraw和OnPrepareDC不是消息处理函数。所以在不是因为重绘消息所引发的OnPaint导致OnDraw被调用时,比如在OnLButtonDown等消息处理函数中绘图时,要先自己调用OnPrepareDC。
    至于CPaintDC和CClientDC根本是两回事情 CPaintDC是一个设备环境类,在OnPaint中作为参数传递给OnPrepareDC来作设备环境的设置。真正和CClientDC具有可比性的是CWindowDC,他们一个是描述客户区域,一个是描述整个屏幕。
    如果是对CVIEW或从CVIEW类派生的窗口绘图时应该用OnDraw。

     

    OnDraw()和OnPaint()有什么区别呢?
    首先:我们先要明确CView类派生自CWnd类。而OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,并且没有响应消息的功能。这就是为什么你用VC成的程序代码时,在视图类只有OnDraw没有OnPaint的原因。而在基于对话框的程序中,只有OnPaint。
    其次:我们在第《每天跟我学MFC》3的开始部分已经说到了。要想在屏幕上绘图或显示图形,首先需要建立设备环境DC。其实DC是一个数据结构,它包含输出设备(不单指你17寸的纯屏显示器,还包括打印机之类的输出设备)的绘图属性的描述。MFC提供了CPaintDC类和CWindwoDC类来实时的响应,而CPaintDC支持重画。当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows 将 WM_PAINT 消息发送给它。该视图的OnPaint 处理函数通过创建 CPaintDC 类的DC对象来响应该消息并调用视图的 OnDraw 成员函数。通常我们不必编写重写的 OnPaint 处理成员函数。
    ///CView默认的标准的重画函数
    void CView::OnPaint() //见VIEWCORE.CPP
    {

    CPaintDC dc(this);
    OnPrepareDC(&dc);
    OnDraw(&dc);    //调用了OnDraw
    }
    ///CView默认的标准的OnPrint函数
    void CView::OnPrint(CDC* pDC, CPrintInfo*)
    {
    ASSERT_VALID(pDC);
    OnDraw(pDC);   // Call Draw
    }

    既然OnPaint最后也要调用OnDraw,因此我们一般会在OnDraw函数中进行绘制。下面是一个典型的程序。
    ///视图中的绘图代码首先检索指向文档的指针,然后通过DC进行绘图调用。
    void CMyView::OnDraw( CDC* pDC )
    {

    CMyDoc* pDoc = GetDocument();
    CString s = pDoc->GetData();
    GetClientRect( &rect ); // Returns a CString CRect rect;
    pDC->SetTextAlign( TA_BASELINE | TA_CENTER );
    pDC->TextOut( rect.right / 2, rect.bottom / 2, s, s.GetLength() );
    }
    最后:现在大家明白这哥俩之间的关系了吧。因此我们一般用OnPaint维护窗口的客户区(例如我们的窗口客户区加一个背景图片),用OnDraw维护视图的客户区(例如我们通过鼠标在视图中画图)。当然你也可以不按照上面规律来,只要达到目的并且没有问题,怎么干都成。补充:我们还可以利用Invalidate(),ValidateRgn(),ValidateRect()函数强制的重画窗口,具体的请参考MSDN吧。

     

    OnDraw中可以绘制用户区域。OnPaint中只是当窗口无效时重绘不会保留CClientDC绘制的内容。

    这两个函数有区别也有联系:

    1、区别:OnDraw是一个纯虚函数,定义为virtual void OnDraw( CDC* pDC ) = 0; 而OnPaint是一个消息响应函数,它响应了WM_PANIT消息,也是是窗口重绘消息。

    2、联系:我们一般在视类中作图的时候,往往不直接响应WM_PANIT消息,而是重载OnDraw纯虚函数,这是因为在CVIEW类中的WM_PANIT消息响应函数中调用了OnDraw函数,如果在CMYVIEW类中响应了WM_PAINT消息,不显式地调用OnDraw函数的话,是不会在窗口重绘的时候调用OnDraw函数的。

    应用程序中几乎所有的绘图都在视图的 OnDraw 成员函数中发生,必须在视图类中重写该成员函数。(鼠标绘图是个特例,这在通过视图解释用户输入中讨论。)


    OnDraw 重写:
    通过调用您提供的文档成员函数获取数据。
    通过调用框架传递给 OnDraw 的设备上下文对象的成员函数来显示数据。
    当文档的数据以某种方式更改后,必须重绘视图以反映该更改。默认的 OnUpdate 实现使视图的整个工作区无效。当视图变得无效时,Windows 将 WM_PAINT 消息发送给它。该视图的 OnPaint 处理函数通过创建 CPaintDC 类的设备上下文对象来响应该消息并调用视图的 OnDraw 成员函数。

    当没有添加WM_PAINT消息处理时,窗口重绘时,由OnDraw来进行消息响应...当添加WM_PAINT消息处理时,窗口重绘时,WM_PAINT消息被投递,由OnPaint来进行消息响应.这时就不能隐式调用OnDraw了.必须显式调用(   CDC *pDC=GetDC(); OnDraw(pDC);   )..
    隐式调用:当由OnPaint来进行消息响应时,系统自动调用CView::OnDraw(&pDC).


    想象一下,窗口显示的内容和打印的内容是差不多的,所以,一般情况下,统一由OnDraw来画。窗口前景需要刷新时,系统会会调用到OnPaint,而OnPaint一般情况下是对DC作一些初始化操作后,调用OnDraw()。


    OnEraseBkGnd(),是窗口背景需要刷新时由系统调用的。明显的一个例子是设置窗口的背景颜色(你可以把这放在OnPaint中去做,但是会使产生闪烁的现象)。  
    至于怎么界定背景和前景,那要具体问题具体分析了,一般情况下,你还是很容易区别的吧。

     

    的确,OnPaint()用来响应WM_PAINT消息,视类的OnPaint()内部根据是打印还是屏幕绘制分别以不同的参数调用OnDraw()虚函数。所以在OnDraw()里你可以区别对待打印和屏幕绘制。
    其实,MFC在进行打印前后还做了很多工作,调用了很多虚函数,比如OnPreparePrint()等。


    对于OnDraw()
    This method is called by the framework to render an image of the document. The framework calls this method to perform screen display, printing, and print preview, and it passes a different device context in each case. There is no default implementation.

     
    展开全文
  • onDraw函数

    千次阅读 2018-12-19 22:47:32
    onDraw()函数中不允许创建任意变量,因为当需要重绘时就会调用onDraw()函数,所以在onDraw()函数中创建的变量就会一直被重复创建,这样会引起频繁的程序GC(回收内存),进而引起程序卡顿。 一般在自定义控件的构造函数中...

    注意事项:

    onDraw()函数中不允许创建任意变量,因为当需要重绘时就会调用onDraw()函数,所以在onDraw()函数中创建的变量就会一直被重复创建,这样会引起频繁的程序GC(回收内存),进而引起程序卡顿。

    一般在自定义控件的构造函数中创建变量,既在初始化时一次性被创建,开始绘制图画的过程中不要在绘制函数里创建任意变量;

    展开全文
  • OnDraw坐标

    2018-02-23 14:21:18
    ondraw中使用canvas绘图的坐标均为相对自己的坐标系
  • OnDraw函数

    2016-12-25 13:54:00
     在View类中定义了OnDraw函数,当窗口初次出现时会产生WM_PAINT消息,让窗口重绘,而且每次窗口要出现时都会进入OnDraw函数,因此通过此函数可以在窗口中显示图形或文字信息。其定义如图示:  由此定义可...
  • OnDraw OnPaint

    2015-01-09 11:50:39
    OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。 OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,没有响应消息的功能
  • OnDraw和OnPaint

    2021-01-26 16:28:25
    OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同?(引用自百度) OnDraw()和OnPaint()好象兄弟俩,因为它们的工作类似。 至于不见了的问题简单,因为当你的窗口改变后,会产生无效区域,这个无效的区域需要重...
  • view ondraw

    2015-07-17 17:19:00
    要使输出的东西始终能在窗口中看到 就可以使用该函数 窗口从到有的时候就会产生WM_PAINT消息,让窗口发生重绘 这是程序就会执行到ONDRAW函数处 所以如果是要使输入的图形或者文字始终能够在窗口中进行显示的话就...
  • onDraw绘画

    2016-03-17 21:52:06
     onDraw() 这里必须要的变量有 Canvas 和Paint Canvas canvas = new Canvas(bitmap); 为什么要传bitmap ?为了让与画布紧密连接 称为装载画布 用来存储 画布上的系数信息 所以当你调用 Canvas.drawXX()的时候 ...
  • 转onpaint ondraw

    2017-06-15 10:48:47
    Onpaint和OnDraw的区别 (一) OnPaint 和 OnDraw  (1)OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。  (2)OnPaint()是CWnd的类成员...
  • onDraw dispatchDraw

    2015-06-04 10:49:24
    值得注意的是ViewGroup容器组件的绘制,当它没有背景时直接调用的是dispatchDraw()方法, 而绕过了draw()方法,当它有背景的时候...因此要在ViewGroup上绘制东西的时候往往重写的是dispatchDraw()方法而不是onDraw()方法
  • OnDraw function for my custom View is being called infinitely and is looping !! What could be possible reason??Here is my custom view:-public class Balls extends View{private static final String TAG =...
  • CTreeView OnDraw

    2011-06-11 11:12:00
    CListView使用的是...这时OnDraw是不会被调用的。 类似的CTreeView等等都不会调用OnDraw. 此类视图,你应该是通过往列表里添加记录来表达你的数据,而不是 "绘制 "。 通常只有自己直接派生CView时才重载OnDraw
  • onDraw画圆环

    千次阅读 2016-06-21 14:35:18
    @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub // super.onDraw(canvas); int centre = getWidth() / 2; // 获取大半径 int radiu
  • view.ondraw

    2016-08-01 18:37:00
    protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); canvas.drawColor(Color.WHITE); //设置画布颜色 paint.setColor(Color.BLACK); ...
  • 文章目录自定义View没有调用onDraw总结一下 自定义View没有调用onDraw   我们在自定义View的时候有时会发现,重写的onDraw没有生被调用?这是为什么呢?大概率是因为你的自定义View继承自ViewGroup或者其子类,并...
  • I am trying to draw an animation... To do so I have extended View and overridden the onDraw() method. What I would expect is that each time onDraw() is called the canvas would be in the state that I l...
  • Android View onDraw 不执行

    千次阅读 2016-03-23 11:32:09
    在ViewGroup中ondraw总是不执行,或者说不被调用.原因:if a ViewGroup background is null ,the funtion "ondraw" will not be call., but the "dispatchDraw" always will be call. 结论出处: onDraw(...) in ...
  • Android 中View.onDraw(Canvas canvas)的使用方法 View通过View.onDraw(Canvas canvas)来Draw. 我们可以定义自己的继承于View的TestView,然后重载View.onDraw(Canvas canvas). 对于自定义的TestView如何与Activity...
  • onDraw与dispatchDraw

    2017-02-24 16:02:32
    绘制VIew本身的内容,通过调用View.onDraw(canvas)函数实现绘制自己的孩子通过dispatchDraw(canvas)实现 View组件的绘制会调用draw(Canvas canvas)方法,draw过程中主要是先画Drawable背景,对 drawable调用...
  • <div><p>You have objects allocations in onDraw() method which in class LinearProgressButton.</p><p>该提问来源于开源项目:dmytrodanylyk/android-morphing-button</p></div>
  • ViewGroup onDraw调用和不调用 view 的绘制一般都是,测量(onMeasure),布局(onLayout)和绘制(onDraw)。自定义View一般是复写上述三个方法。但是自定义View如果是继承ViewGroup,会发现onDraw不会调用。 android ...
  • OnDraw与OnPaint对比

    2017-02-06 22:41:11
    OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。 OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,没有响应消息的功能...
  • 以下是对Android通过onDraw实现在View中绘图操作的示例代码进行了详细的分析介绍,需要的朋友可以过来参考下
  • 绘图ondraw重新绘制

    2019-04-29 14:47:40
    OnDraw的重新绘制 相信有不少小伙伴在绘制图形过程中遇到过想刷新界面或者想重绘图形吧。我最近在做一个关于绘图的程序也遇到了这个问题。当然网上也有不少解决办法的问题,但是我感觉不太全面。下面我较为全面的...
  • This will also remove the unused privates from fnc_onDraw3d. <p>This will create lag from changing Nametag settings to them being visible. Sadly cachedCall can only use 1 Event and I used <code>cba_...
  • Android onDraw

    千次阅读 2010-09-01 14:32:00
    做java的都知道,绘图肯定首先需要一个Canvas,然后在用Graphics在上面绘制自己想要图案。...以下是自定义View的一段代码: <br />@Override public void onDraw(Canvas canvas) { // 首先定
  • onDraw什么时候被调用?

    千次阅读 2019-01-10 16:57:26
    1、onDraw是在View初化完成之后开始调用 2、postInvalidate()是重绘的,也就是调用postInvalidate()后系统会重新调用onDraw方法画一次 onDraw实例: Java code @Override public void onDraw(Canvas canvas) { // ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,621
精华内容 3,048
关键字:

ondraw