找回密码
 加入
搜索
查看: 3645|回复: 6

[图形处理] 问个GDI的最简单问题[已解决]

  [复制链接]
发表于 2011-6-22 08:47:43 | 显示全部楼层 |阅读模式
本帖最后由 happytc 于 2011-8-25 23:51 编辑

如下面的代码,画了一条直线,如何删除这条直线?
另外,如何最简单判继鼠标左键UP(左键Down可以用_IsPressed("01") )?不想注册个消息函数来做


#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>
#include <ScreenCapture.au3>
#Include <Misc.au3>

Opt('MustDeclareVars', 1)

_Main()

Func _Main()
        Local $hGUI, $hBMP, $hBitmap, $hGraphic, $MousePosOri, $MousePosNew
        
        $hBMP = _ScreenCapture_Capture ("", 0, 0, @DesktopWidth -350, @DesktopHeight-350)
        $hGUI = GUICreate("", @DesktopWidth-350, @DesktopHeight-350, $WS_POPUP, $WS_EX_TOPMOST)
        GUISetState()

        _GDIPlus_Startup ()
        $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP ($hBMP)
        $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
        _GDIPlus_GraphicsDrawImage ($hGraphic, $hBitmap, 0, 0)
        _GDIPlus_GraphicsDrawLine($hGraphic, 0, 0, 200, 200)

        Do
                If _IsPressed("01") Then
                        ;这里如何写删除上面_GDIPlus_GraphicsDrawLine画的直线,仅仅删直线,别的不删                        
                EndIf
        Until GUIGetMsg() = $GUI_EVENT_CLOSE

        _GDIPlus_GraphicsDispose ($hGraphic)
        _GDIPlus_BitmapDispose ($hBitmap)
        _WinAPI_DeleteObject ($hBMP)
        _GDIPlus_ShutDown ()        
EndFunc
发表于 2011-6-22 09:27:25 | 显示全部楼层
“仅仅删直线,别的不删” —— 这很明显是没明白绘图过程才说的。只要是在一个设备场景中绘的图,你若要擦除某一部分的直线,其“下面”的背景图片也同会被擦除。所有的绘图操作都应该在WM_PAINT消息函数中完成。仅删除那条直线,只有在接收到WM_PAINT消息后,重绘一次背景图片。
截取左键弹起,实际上只有注册WM_LBUTTONUP消息才是最有效率的做法。
 楼主| 发表于 2011-6-22 09:40:54 | 显示全部楼层
回复 2# pusofalse

我还以为有这样可以单独删除某个图形的方法,汗!
现在我做的就是全部clear后重画,觉得这样没有效率呢
对GDI的确,非常地不熟,只是想到有图层的说法,以为可以单独删掉一些呢


“截取左键弹起,实际上只有注册WM_LBUTTONUP消息才是最有效率的做法。” --- 看来只有这个途径了
总想再简单点。
发表于 2011-6-22 09:59:22 | 显示全部楼层
你可能认为这条直线和背景图片 处于不同的层面上,就像两张不同大小而重叠在一起的纸,只要移去上面那张绘有直线的纸,就可以显现出下面的那张绘有背景的纸。但事实并非如此,它们都处于一个层面,这就像在一块黑板上画图,在某个区域画一条直线,这个区域原有的内容就会被覆盖住,若要恢复原有内容,就必须要擦除这个区域的内容再次进行绘制。
 楼主| 发表于 2011-6-22 10:17:51 | 显示全部楼层
回复 4# pusofalse


    那老大,请问一下:
QQ截图里,用鼠标拖个框后,可以再添加上象箭头,椭圆之类的后,还可以一个个地取消,它是怎么做的?难道它的背景不是用HBITMAP handle ?

其实就是想做到象QQ截图那样子的:以当前屏幕为背景,再添加些图像
发表于 2011-6-22 10:46:43 | 显示全部楼层
我不知QQ是怎么做的,猜想那个框就是个可移动的透明窗口。箭头、椭圆都是画在这个窗口中的,这跟你顶楼的代码原理一样。每截取到一次左键弹起事件,说明当前的绘制已经结束,就截一下这个窗口的图,并把截取的位图句柄放在一个数组中,撤消操作就是对这个数组进行Redim操作。
发表于 2011-9-11 12:23:33 | 显示全部楼层
看不懂,研究一下
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-19 18:58 , Processed in 0.079605 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表