MFC中的Invalidate、OnDraw、OnPaint函数

  1. void Invalidate( BOOL bErase = TRUE );
    该函数的作用是使整个窗口客户区无效,窗口的客户区无效意味着需要重绘。
    例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。

  2. 与UpdateWindow( )的区别
    UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。

OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。为什么需要OnDraw呢,是为了让OnDraw一个函数服务于不同的绘图环境,比如显示器,打印机,绘图仪 ,mfc在调用OnDraw之前会把适当的CDC对象传给OnDraw函数。这样窗口的打印功能就可以和显示共用一个函数。

  1. OnPaint 和 OnDraw
    OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。
    当没有添加WM_PAINT消息处理时,窗口重绘时,由OnDraw来进行消息响应…
    当添加WM_PAINT消息处理时,窗口重绘时,WM_PAINT消息被投递,由OnPaint来进行消息响应.这时就不能隐式调用OnDraw了.必须显式调用( CDC *pDC=GetDC(); OnDraw(pDC); )…
    隐式调用:当由OnPaint来进行消息响应时,系统自动调用CView::OnDraw(&pDC).
发布了0 篇原创文章 · 获赞 1 · 访问量 421
展开阅读全文

请问我如何把edittext的文字通过onDraw放在画板上

05-04

我想做一个画板,现在想实现插入文字功能,目前点击屏幕时能弹出popupwindow,然后可以编辑EditText,请问如果在点击其他地方的时候让文字留在画板上 这是showTextPopup方法部分 ``` public void showTextPopup(float preX,float preY){ int x = (int) preX; int y = (int) preY; dp = new DrawPath(); dp.mOffX = preX; dp.mOffY = preY; dp.paint = mpaint; EditText mEditText = new EditText(getContext()); mEditText.setText("输入文字"); PopupWindow mTextPopup = new PopupWindow(mEditText, WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,true); mEditText.setFocusable(true); mEditText.setFocusableInTouchMode(true); //让popup显示在软键盘上面 mTextPopup.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); mEditText.requestFocus(); mTextPopup.setOutsideTouchable(true); mTextPopup.setBackgroundDrawable(new BitmapDrawable()); //自动弹出软键盘,会导致布局变化,重测量、绘制 InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Service.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS); mTextPopup.showAtLocation(this, Gravity.TOP | Gravity.LEFT, x, y); invalidate(); } ``` 这是DrawPath类 ``` static class DrawPath{ public Path path;//路径 public Paint paint;//画笔 public Editable mText;//文本 //public int mWidth;//宽度 public float mOffX;//X轴偏移 public float mOffY;//Y轴偏移 } ``` 点击事件 ``` public boolean onTouchEvent(MotionEvent event){ //获取拖动事件的发生位置 float x = event.getX(); float y = event.getY(); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: //从前一个点绘制到当前点之后,把当前点定义成下次绘制的一个点 if(currentStyle==3){ showTextPopup(x,y); } mpath = new Path(); //每一次记录的路径对象是不一样的 dp = new DrawPath(); dp.path = mpath; dp.paint = mpaint; mpath.moveTo(x,y); preX = x; preY = y; invalidate(); break; case MotionEvent.ACTION_MOVE: mpath.quadTo(preX,preY,x,y); preX = x; preY = y; break; case MotionEvent.ACTION_UP: mpath.lineTo(preX,preY); cachecanvas.drawPath(mpath,mpaint); //将一条完整的路径保存下来 savePath.add(dp); mpath = null;//重新置空 break; } invalidate(); //返回true表明处理方法已经处理该事件 return true; } ``` onDraw方法 ``` public void onDraw(Canvas canvas){ //Paint bmpPaint = new Paint(); //将cacheBitmap绘制到该View组件上 canvas.drawBitmap(cacheBitmap,0,0,mBitmapPaint);//显示旧的画布 //沿着path绘制 if(mpath != null) { canvas.drawPath(mpath, mpaint); } } ``` 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览