精华内容
参与话题
问答
  • onDraw

    2020-08-24 21:02:49
  • 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 自定义View中的onDraw里的drawBitmap 有一个半圆的图片,是一个统计图(就是油箱表的那样),还有一个指针的图片要把指针添加到图片里,然后传值让那个指针根据而移动。 找不到什么方法,所以求教下...
  • <div><p>You have objects allocations in onDraw() method which in class LinearProgressButton.</p><p>该提问来源于开源项目:dmytrodanylyk/android-morphing-button</p></div>
  • onDraw函数

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

    注意事项:

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

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

    展开全文
  • 1.绘图概念 GDI绘图分为背景和前景两个画布的绘制,Invalidate()函数强制重绘制, Invalidate() 如果参数为true则在OnPaint函数对背景先进行绘制,再对前景进行绘制; 如果参数为false则在OnPaint函数对背景不...

    1.绘图概念

    GDI绘图分为背景和前景两个画布的绘制,Invalidate()函数强制重绘制,
    Invalidate()
        如果参数为true则在OnPaint函数对背景先进行绘制,再对前景进行绘制;
        如果参数为false则在OnPaint函数对背景不绘制,只对前景进行绘制;

    绘制前景方法:
        void xxx::OnPaint() 
        {
            CPaintDC dc(this);
        }
    绘制背景方法:
        BOOL xxx::OnEraseBkgnd(CDC* pDC) 
        {
            CDialog::OnEraseBkgnd(pDC);

            return TRUE;
        }            

    绘图的一般方法:
        背景绘制函数两面只绘制背景,前景绘制函数只绘制前景,
        当背景改变时,前景里面的透明元素需要重新或许区域背景

    2.绘图中的Invalidate、OnDraw、OnPaint

    CWnd::Invalidate

    void Invalidate( BOOL bErase = TRUE );

      该函数的作用是使 整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。 这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数 OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw 来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。 
      它和 UpdateWindow( )区别在于: 
      UpdateWindow()的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很 低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重 绘。

     

    CWnd::OnPaint
    afx_msg void OnPaint(); 
      说明: 
      当Windows或应用程序请求重画应用程序窗口的一部分时,框架调用这个成员函数。WM_PAINT在调用UpdateWindow或 RedrawWindow成员函数时发出。当设置了RDW_INTERNALPAINT标志并调用RedrawWindow成员函数时,窗口可能会接收到 内部重画消息。在这种情况下,窗口可能没有更新区域。应用程序必须调用GetUpdateRect成员函数以确定窗口是否具有更新区域。如果 GetUpdateRect返回0,则应用程序不应调用BeginPaint和EndPaint成员函数。 
      应用程序负责检查是否需要内部重画或更新,这可通过查看每条WM_PAINT消息的内部数据结构来完成,因为一条WM_PAINT可能是由于一个无效区域或由于使用RDW_INTERNALPAINT标志调用了RedrawWindow成员函数而引起的。 
      Windows只发送一次内部WM_PAINT消息。在通过UpdateWindow成员函数向窗口发送了内部WM_PAINT消息以后,将不会再向 窗口发送其它WM_PAINT消息,直到再次使用RDW_INTERNALPAINT标志调用了RedrawWindow成员函数。

     

    OnDraw与OnPaint有什么区别?
    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 RedrawWindowmember 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 处理成员函数。

    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 thedocument. The framework calls this method to perform screendisplay, printing, and print preview, and it passes a differentdevice context in each case. There is no defaultimplementation.


    ///CView默认的标准的重画函数
    void CView::OnPaint() //见VIEWCORE.CPP
    {

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

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

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

    展开全文
  • public void onDraw(Canvas canvas){ //Paint bmpPaint = new Paint(); //将cacheBitmap绘制到该View组件上 canvas.drawBitmap(cacheBitmap,0,0,mBitmapPaint);//显示旧的画布 //沿着path绘制 if(mpath != ...
  • 以下是对Android通过onDraw实现在View中绘图操作的示例代码进行了详细的分析介绍,需要的朋友可以过来参考下
  • OnDraw坐标

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

    ondraw中使用canvas绘图的坐标均为相对自己的坐标系

    展开全文
  • 主要介绍了Android 中View.onDraw(Canvas canvas)的使用方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
  • 请问MFC中OnDraw函数能不能在不是Cxxview的类中使用? 如果能,要怎样调用?
  • ondraw

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

    2020-03-27 18:52:01
    首先我们要知道,OnPaint()是CWnd的类成员函数,负责响应WM_PAINT消息。 其次,在单文档应用程序中,...(这里要清除一个误区:我们在单文档应用程序里VIEW类只看到了OnDraw函数,而在对话框应用程序里只看到了OnP...
  • 窗口改变后,会产生无效区域,这个无效的区域需要重画。一般Windows会发送两个消息WM_PAINT...这就需要OnDraw()或 OnPaint()来重画窗口 先要明确CView类派生自CWnd类。而OnPaint()是CWnd的类成员,同时负责响应WM_P
  • ViewGroup onDraw调用和不调用 view 的绘制一般都是,测量(onMeasure),布局(onLayout)和绘制(onDraw)。自定义View一般是复写上述三个方法。但是自定义View如果是继承ViewGroup,会发现onDraw不会调用。 android ...
  • MFC OnDraw()函数 画图

    2020-07-06 17:03:24
    MFC OnDraw()函数 画图。 以及DrawText()函数的nFormat参数。
  • 绘图ondraw重新绘制

    2019-04-29 14:47:40
    OnDraw的重新绘制 相信有不少小伙伴在绘制图形过程中遇到过想刷新界面或者想重绘图形吧。我最近在做一个关于绘图的程序也遇到了这个问题。当然网上也有不少解决办法的问题,但是我感觉不太全面。下面我较为全面的...
  • OnDraw函数

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

    2020-11-27 15:21:20
    自定义view的一个重点就是实现去重写他的绘制过程,也就是View.onDraw(Canvas canvas)方法,它里面就是绘制图形的过程了,比如说一个Button,绘制按钮和按钮上的文字都是在它自己的onDraw方法中完成的。如果你想给...
  • OnPaint和OnDraw的区别

    2019-10-16 21:23:16
    OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同? 答: OnDraw()和OnPaint()好象兄弟俩,因为它们的工作类似。至于不见了的问题简单,因为当你的窗口改变后,会产生无效区域,这个无效的区域需要重画。一般...
  • 在view中调用 /** * 通过canvas复制view的bitmap */ private Bitmap getCurCanvas() { int width = getWidth(); int height = getHeight(); Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap....
  • 文章目录自定义View没有调用onDraw总结一下 自定义View没有调用onDraw   我们在自定义View的时候有时会发现,重写的onDraw没有生被调用?这是为什么呢?大概率是因为你的自定义View继承自ViewGroup或者其子类,并...
  • 如果你想要自定义viewgroup调用onDraw方法,必须在构造函数中调用setWillNotDraw(false);或者设置背景色。
  • 之前两篇文章分析了 onMeasure 过程和 onLayout 过程,不熟悉的童鞋可以回头去复习下,本篇文章来分析绘制过程的最后一个 onDraw 过程。这个过程的绘制使用到的 Paint 和 Canvas 在之前也有讲解到,在本篇的练习代码...

空空如也

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

ondraw