happytc 发表于 2011-6-22 08:47:43

问个GDI的最简单问题[已解决]

本帖最后由 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

pusofalse 发表于 2011-6-22 09:27:25

“仅仅删直线,别的不删” —— 这很明显是没明白绘图过程才说的。只要是在一个设备场景中绘的图,你若要擦除某一部分的直线,其“下面”的背景图片也同会被擦除。所有的绘图操作都应该在WM_PAINT消息函数中完成。仅删除那条直线,只有在接收到WM_PAINT消息后,重绘一次背景图片。
截取左键弹起,实际上只有注册WM_LBUTTONUP消息才是最有效率的做法。

happytc 发表于 2011-6-22 09:40:54

回复 2# pusofalse

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


“截取左键弹起,实际上只有注册WM_LBUTTONUP消息才是最有效率的做法。” --- 看来只有这个途径了
总想再简单点。

pusofalse 发表于 2011-6-22 09:59:22

你可能认为这条直线和背景图片 处于不同的层面上,就像两张不同大小而重叠在一起的纸,只要移去上面那张绘有直线的纸,就可以显现出下面的那张绘有背景的纸。但事实并非如此,它们都处于一个层面,这就像在一块黑板上画图,在某个区域画一条直线,这个区域原有的内容就会被覆盖住,若要恢复原有内容,就必须要擦除这个区域的内容再次进行绘制。

happytc 发表于 2011-6-22 10:17:51

回复 4# pusofalse


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

其实就是想做到象QQ截图那样子的:以当前屏幕为背景,再添加些图像

pusofalse 发表于 2011-6-22 10:46:43

我不知QQ是怎么做的,猜想那个框就是个可移动的透明窗口。箭头、椭圆都是画在这个窗口中的,这跟你顶楼的代码原理一样。每截取到一次左键弹起事件,说明当前的绘制已经结束,就截一下这个窗口的图,并把截取的位图句柄放在一个数组中,撤消操作就是对这个数组进行Redim操作。

sunmon 发表于 2011-9-11 12:23:33

看不懂,研究一下
页: [1]
查看完整版本: 问个GDI的最简单问题[已解决]