找回密码
 加入
搜索
查看: 5600|回复: 9

[图形处理] GDI+在透明窗口上创建半透明图形出现杂色[已解决]

  [复制链接]
发表于 2015-10-6 19:04:56 | 显示全部楼层 |阅读模式
本帖最后由 xyold1 于 2015-10-10 20:12 编辑

我要在透明的子窗体上作图,显示一些信息,而在画半透明图的时候出现了一些问题



#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>

#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)

_Main()

Func _Main()
    Local $hGUI, $hGraphic, $hPen,$hGUI2

    ; Create GUI
    $hGUI = GUICreate("GDI+", 400, 300)
            GUISetState()
        $hGUI2 = GUICreate("透明", 280, 220, 0,0, $WS_POPUP, BitOR($WS_EX_LAYERED,$WS_EX_MDICHILD),$hGUI)
 GUISetBkColor(0x00ff00)
          _API_SetLayeredWindowAttributes($hGUI2, 0x00ff00)
    GUISetState()

    ; Draw line
    _GDIPlus_Startup ()
;~          $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI2)
    $hPen = _GDIPlus_PenCreate (0x55ff0000,10)
    _GDIPlus_GraphicsDrawLine ($hGraphic, 10, 150, 390, 150, $hPen)

    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    ; Clean up resources
    _GDIPlus_PenDispose ($hPen)
    _GDIPlus_GraphicsDispose ($hGraphic)
    _GDIPlus_Shutdown ()

EndFunc   ;==>_Main



Func _API_SetLayeredWindowAttributes($hwnd, $i_transcolor, $Transparency = 255, $isColorRef = False)

        Local Const $AC_SRC_ALPHA = 1
        Local Const $ULW_ALPHA = 2
        Local Const $LWA_ALPHA = 0x2
        Local Const $LWA_COLORKEY = 0x1
        If Not $isColorRef Then
                $i_transcolor = Hex(String($i_transcolor), 6)
                $i_transcolor = Execute('0x00' & StringMid($i_transcolor, 5, 2) & StringMid($i_transcolor, 3, 2) & StringMid($i_transcolor, 1, 2))
        EndIf
        Local $Ret = DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $hwnd, "long", $i_transcolor, "byte", $Transparency, "long", $LWA_COLORKEY + $LWA_ALPHA)
        Select
                Case @error
                        Return SetError(@error, 0, 0)
                Case $Ret[0] = 0
                        Return SetError(4, 0, 0)
                Case Else
                        Return 1
        EndSelect
EndFunc   ;==>_API_SetLayeredWindowAttributes



上面的代码$hGUI2是屏蔽了00ff00颜色的透明窗口,用红色半透明的画笔DrawLine,线不是红色的
如下图

不是下面的半透明红色

那么如何让半透明的颜色正确显示呢
是在别的控件上画图
还是更改窗体透明的方式呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2015-10-7 09:59:53 | 显示全部楼层
等高手。。。。。。。。。。。。。
 楼主| 发表于 2015-10-7 14:37:04 | 显示全部楼层
人少了 今时不同往日
发表于 2015-10-9 09:31:06 | 显示全部楼层
要用_WinAPI_UpdateLayeredWindowEx,而不是_API_SetLayeredWindowAttributes
 楼主| 发表于 2015-10-9 12:59:36 | 显示全部楼层
回复 4# seniors
Gdi+的大神呀
可能 是我AU3的版本低吧,没找到_WinAPI_UpdateLayeredWindowEx 只有_WinAPI_UpdateLayeredWindow
本来不是计算机的,对我而言 这个函数的参数是相当复杂,下面这个例子加载一个png图片就行了,可怎么让用Gdi自绘的图形显示呢
有说WS_EX_LAYERED属性是不可以设置给子窗口的。_WinAPI_UpdateLayeredWindow 是不是也不能在子窗口上做图呢
Func SetBitmap($hGUI, $hImage, $iOpacity)
        Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
        $hScrDC = _WinAPI_GetDC(0)
        $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
        $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
                
        $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
        $tSize = DllStructCreate($tagSIZE)
        $pSize = DllStructGetPtr($tSize)
        DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
        DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
        $tSource = DllStructCreate($tagPOINT)
        $pSource = DllStructGetPtr($tSource)
        $tBlend = DllStructCreate($tagBLENDFUNCTION)
        $pBlend = DllStructGetPtr($tBlend)
        DllStructSetData($tBlend, "Alpha", $iOpacity)
        DllStructSetData($tBlend, "Format", 1)
        _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
        _WinAPI_ReleaseDC(0, $hScrDC)
        _WinAPI_SelectObject($hMemDC, $hOld)
        _WinAPI_DeleteObject($hBitmap)
        _WinAPI_DeleteDC($hMemDC)
EndFunc
发表于 2015-10-9 15:14:04 | 显示全部楼层
本帖最后由 seniors 于 2015-10-9 15:15 编辑

反正我是能的,我用的版本3.3.7.15,可以用在子窗口,另外,55ff0000看上是粉红是因为和下面的窗口颜色混合后的效果。我改成99ff0000这样是半透明,颜色红些了
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>
#include <GDIPlusEx.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
 
_Main()
 
Func _Main()
    Local $hGUI, $hGraphic, $hPen,$hGUI2
 
    ; Create GUI
    $hGUI = GUICreate("GDI+", 400, 300)
        GUICtrlCreateLabel("放点字看看透明效果",10,140)
        GUISetState()
        $hGUI2 = GUICreate("透明", 280, 220, 0,0, $WS_POPUP, BitOR($WS_EX_LAYERED,$WS_EX_MDICHILD),$hGUI)
    GUISetState()
 
    ; Draw line
        _GDIPlus_Startup ()
        Local $hBitmap = _WinAPI_CreateBitmap(280, 220, 1, 32)
        Local $hCDC = _WinAPI_CreateCompatibleDC(0)
        Local $hOld = _WinAPI_SelectObject($hCDC, $hBitmap)
        Local $hGraphic = _GDIPlus_GraphicsCreateFromHDC($hCDC)
    $hPen = _GDIPlus_PenCreate (0x99ff0000,10)
    _GDIPlus_GraphicsDrawLine ($hGraphic, 10, 150, 390, 150, $hPen)
        ; Clean up resources
    _GDIPlus_PenDispose ($hPen)
    _GDIPlus_GraphicsDispose ($hGraphic)
    _GDIPlus_Shutdown ()
        _WinAPI_SelectObject($hCDC, $hOld)
        _WinAPI_DeleteDC($hCDC)
        _WinAPI_UpdateLayeredWindowEx($hGUI2, -1, -1, $hBitmap, 255, 1)
        _WinAPI_DeleteObject($hBitmap)
        _WinAPI_EmptyWorkingSet()
 
    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
 
EndFunc   ;==>_Main

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +50 收起 理由
xyold1 + 50

查看全部评分

发表于 2015-10-9 15:24:30 | 显示全部楼层
另外说明一下SetLayeredWindowAttributes后,窗口就不是分层窗口(WS_EX_LAYERED)了,也就是不具有透明属性了
 楼主| 发表于 2015-10-9 18:15:01 | 显示全部楼层
回复 7# seniors

谢谢,seniors就是厉害,你发的好多教程由于版本的原因没学,更新au3版本定要多研究
发表于 2019-2-8 21:02:15 | 显示全部楼层
稍微补充下
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>
;#include <GDIPlusEx.au3>
#include <WindowsConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPISys.au3>
#include <WinAPIProc.au3>
发表于 2019-2-9 13:47:13 | 显示全部楼层
谢谢分享,楼主好心人
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 07:16 , Processed in 0.086098 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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