这些图标的PNG是从 aero.msstyles 文件中,971 号 png文件中提取的,
我用PHOTOSHOP整理了下,不知道你合不合用,因为我没有把最大化功能
加到GUI中的打算,所以我做的最大化按钮是“灰色” 不可用状态。
这里又有一个取舍:
分层后,PNG的阴影成混沌一块,不分层窗口又不可以扣去背景色透明显示。
我曾经这样写过:注册 WM_PAINT 消息,创建 最小化,最大化,退出按钮的
点选区域LABEL,执行相应的function,向 WM_PATIN_SendMessage。
关于阴影问题,有什么好建议吗?
是否可以注册WM_LBUTTONDOWN消息,再用_WinAPI_PtInRectEx函数判断是否在PNG的绘制矩形中? 本帖最后由 powerofos 于 2011-7-24 14:35 编辑
回复 18# 3mile
如果你是说用判断矩形区域来代替LABEL是可以的,你是这个意思吗?
我简要测试了下,不过点击的区域判断不算非常精准,可以接受。
不过还是用 WM_LBUTTONUP 吧,WINDOWS的按钮也是 如此。#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;~ #Include <WinAPI.au3>
#Include <WinAPIEx.au3>
Opt('MustDeclareVars', 1)
Global $gui, $guiPos, $pic, $picPos
;----- example 3 PNG work araund by Zedna
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#Include <WinAPI.au3>
Global $hGUI, $hImage, $hGraphic, $hImage1, $hform
Global Const $SC_MOVE = 0xF010
_GDIPlus_StartUp()
$hform = GUICreate("abc",600,600,-1,-1)
GUISetBkColor(0xffffff,$hform)
;~ $hGUI = GUICreate("Show PNG", 400, 400,100,0,$WS_POPUP, BitOR($WS_EX_LAYERED,$WS_EX_MDICHILD),$hform);分层
$hGUI = GUICreate("Show PNG", 400, 400,100,0,$WS_POPUP, $WS_EX_MDICHILD,$hform) ;不分层
Global $color = 0xabcdef
GUISetBkColor($color,$hGUI)
_GDIPlus_StartUp()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir&"\png-0011.png")
Global $p_w = _GDIPlus_ImageGetWidth($hImage)
Global $p_H = _GDIPlus_ImageGetWidth($hImage)
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global $p_x = 50
Global $p_y = 50
;~ _WinAPI_SetLayeredWindowAttributes($hGUI,0x010101)
;~ _WinAPI_SetLayeredWindowAttributes($hGUI,$color,255)
GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
GUISetState(@SW_SHOW,$hGUI)
GUISetState(@SW_SHOW,$hform)
;~ _WinAPI_SetParent($hGUI, $hform)
;~ GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
;~ GUIRegisterMsg($WM_LBUTTONDOWN,"WM_LBUTTONDOWN")
GUIRegisterMsg($WM_LBUTTONUP,"WM_LBUTTONUP")
;~ GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
do
until GUIGetMsg() = $GUI_EVENT_CLOSE
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_ShutDown()
Func WM_LBUTTONUP($ihWnd,$iMsg,$iwParam,$ilParam)
If $ihWnd = $hGUI Then
Local $x = BitAND($ilParam, 0xFFFF)
Local $y = BitShift($ilParam, 16)
If _WinAPI_PtInRectEx($x, $y, $p_x, $p_y, $p_x+$p_w, $p_y+$p_H) = 1 Then
;~ MsgBox(0,"", "你点击了PNG")
ToolTip("你点击了PNG")
EndIf
EndIf
EndFunc
Func WM_LBUTTONDOWN($ihWnd,$iMsg,$iwParam,$ilParam)
If $ihWnd = $hGUI Then
Local $x = BitAND($ilParam, 0xFFFF)
Local $y = BitShift($ilParam, 16)
If _WinAPI_PtInRectEx($x, $y, $p_x, $p_y, $p_x+$p_w, $p_y+$p_H) = 1 Then
;~ MsgBox(0,"", "你点击了PNG")
ToolTip("你点击了PNG")
EndIf
EndIf
;~ Switch $ihWnd
;~ Case $hGUI
;~ _SendMessage($hGUI,$WM_SYSCOMMAND,$SC_MOVE+$HTCAPTION,0)
;~ EndSwitch
EndFunc
Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
_WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_UPDATENOW)
_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, $p_x, $p_y)
_WinAPI_RedrawWindow($hGUI, 0, 0, $RDW_VALIDATE)
Return $GUI_RUNDEFMSG
EndFunc
回复 19# powerofos
不精确的原因也许是因为你的第40行获取图形高度这句用错了吧.
这句Global $p_H = _GDIPlus_ImageGetWidth($hImage)
改为Global $p_H = _GDIPlus_ImageGetHeight($hImage) 本帖最后由 powerofos 于 2011-7-24 15:25 编辑
回复 20# 3mile
哈,我刚好用了个 W = H 的PNG,没发现...
我本意是这函数本身是矩形方块,不及Rgn,不过Rgn的话我又不懂。 回复 21# powerofos
http://msdn.microsoft.com/en-us/library/dd162488%28v=VS.85%29.aspx 本帖最后由 powerofos 于 2011-7-24 15:47 编辑
在这谈主题外的问题,不知道合适不,我在官网中别人的帖子发问相关的问题,被嫌弃了。。
不过我还是希望能得到我这个主题问题的答案,就暂时不结贴了。 wow~ Good~
页:
1
[2]