_Rekent
2016-12-20 00:56
采纳率: 26.3%
浏览 4.6k

关于C#的Graphics的Paint事件

作为一名小白,最近在做一个类似画板的Winform。
通过button选择一种工具(矩形,圆,线)
然后在picturebox上通过click事件点击,直接在点击位置draw一个相应的图形。
在制作过程中,有这么几个问题:
1.这样直接draw的图形,和用paint事件的图形有什么区别,一直没怎么懂paint的用法
2.后期我想保存文件,使用DrawtoBitmap时,生成的是一张白纸(是不是和没有用paint有关)
3.能对我画的圆进行鼠标拖拽么(基于updown),如何删掉原来的图形

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • tang_cheng 2016-12-20 01:26
    已采纳
    1. 这和windows的机理有关。在windows系统中所有的窗口,子窗口,控件等都是属于一种叫做"窗口"的对象。这个对象会接收很多消息,比如鼠标消息,绘画消息,定时消息等,对不同的消息的不同处理就形成了你所用的按钮,文本框等等各种控件。 但是"窗口"有个最基本的消息就是Paint消息,当有其他窗口层叠在它之上然后移开,或者它的大小改变,或它的显示模式改变都会自动触发这个消息,调用内部函数重新绘制"窗口"。 如果你没在paint消息里绘制,只是直接用draw绘制的东西,在用另一个窗口遮挡然后移开后,会变回原来的图案(一般就是空白)。
    2. DrawtoBitmap应该是调用Paint类消息绘制的。
    3. 拖拽的如果只是线条的话,一般可以采用XOR方式绘制两次就可消除。如果是图形的话,一般是调用窗口的Invalidate函数强制触发Paint消息,在重绘的时候把拖动的图用新的坐标绘制一下。其他图保留原始位置
    点赞 评论
  • qq_27976105 2016-12-20 01:58

    哈哈哈,这么巧,tang_cheng的回复很棒啊,但我还是要冒个泡。
    1、正好在看第一问的相关。
    链接:https://my.oschina.net/u/1469992/blog/271172
    cpaintdc 对象将 windows 的常见固定用语进行封装,调用 beginpaint 函数,然后在设备上下文中绘制,最后调用 endpaint 函数。cpaintdc 构造函数为您调用 beginpaint,析构函数则调用 endpaint。该简化过程将创建 cdc 对象、绘制和销毁 cdc 对象。在框架中,甚至连这个过程的大部分也是自动的。具体说来,框架给 ondraw 函数传递(通过 onpreparedc)准备好的 cpaintdc,您只需绘制到 cpaintdc 中。根据调用 ondraw 函数的返回,cpaintdc 被框架销毁并且将基础设备上下文释放给 windows。
    2、引用“如果你没在paint消息里绘制,只是直接用draw绘制的东西,在用另一个窗口遮挡然后移开后,会变回原来的图案(一般就是空白)。”
    3、孙鑫vc++窗口重绘用的是PTRARRAY来存储图形坐标信息,ivorhorton'sbeginning for c++用的是List。
    ivor 的移动图形是在1、检测鼠标下是否有图形(因为设置了rect就很容易实现,如果有,右键菜单有move菜单,command发送消息,消息处理函数::move(Point);
    没看过,但是ivor应该有c#的beginning,csdn资源应该也有0积分完整文字版pdf。

    点赞 评论

相关推荐 更多相似问题