komaau3 发表于 2012-12-3 21:39:53

山寨seniors大侠的自绘窗口,向大侠致敬。

long long long long ago ! seniors大侠的《山寨360界面》相信大家都印象深刻把,观后评价:一个字牛,两个字牛逼,哈哈。在此感谢下大侠,看了她的文章总是收获良多。

断断续续花了N久时间来了解GDI,至今总算初窥门径。于是便有了今天这个现学现卖之作。

下面简单介绍下山寨思路:

基于seniors大侠的《山寨360界面》,主要优化了消息响应,资源占用

一、资源占用
采用缓冲机制:读取资源→缓存之→绘制资源→缓存之→更新资源→循环之
本着这样一个思路,实现了快速绘制窗口,并在很大程度上减轻了CPU的压力。
当然,由于个人比较懒,一次性绘制完了所有资源进行了统一缓存,优缺点都有,后期会尝试多级缓冲。

二、消息响应
事件从监视消息内部,映射到外部循环,供程序处理,不会阻断监视消息,从而实现事件的快速响应及更可靠的处理复杂步骤

三、调用方便
写成了UDF,只需从外部调用几个函数即可快速创建窗口,支持多窗口创建及消息响应。
当然目前所发作品只是雏形,很多思路还没优化,甚至需要重新设计

哈哈,如上废话一堆可能除了作者本人其他人很难看懂吧,上图上代码哈:











创建窗口及控件代码
#include "自绘窗口_UDF.au3"

$Form1 = UICreate(600, 400, -1, -1, "小Q书桌", @ScriptDir & "\Images\102.ico",@ScriptDir & "\Images\bk1.jpg", 10)
$SysClose = UICreateButton("关闭", 565, 2, 32, 18, $Form1, 0)
UIButtonSetImage($SysClose, @ScriptDir & "\Images\Close.png", @ScriptDir & "\Images\CloseOver.png", @ScriptDir & "\Images\CloseDown.png", "")
$SysMax = UICreateButton("最大化", 540, 2, 25, 18, $Form1, 0)
UIButtonSetImage($SysMax, @ScriptDir & "\Images\Max.png", @ScriptDir & "\Images\Over.png", @ScriptDir & "\Images\Down.png", "")
$SysMin = UICreateButton("最小化", 515, 2, 25, 18, $Form1, 0)
UIButtonSetImage($SysMin, @ScriptDir & "\Images\Min.png", @ScriptDir & "\Images\Over.png", @ScriptDir & "\Images\Down.png", "")
$SysSet = UICreateButton("选项", 489, 2, 26, 18, $Form1, 0)
UIButtonSetImage($SysSet, @ScriptDir & "\Images\Setting.png", @ScriptDir & "\Images\Over.png", @ScriptDir & "\Images\Down.png", "")
$SysSkin = UICreateButton("更改外观", 460, 2, 16, 16, $Form1, 0)
UIButtonSetImage($SysSkin, @ScriptDir & "\Images\Skin.png", "", "", "")
$SysColor = UICreateButton("配色", 560, 40, 18, 18, $Form1, 0)
UIButtonSetImage($SysColor, @ScriptDir & "\Images\Color.png", "", "", "")


$Button1 = UICreateButton("按钮1", 20, 45, 32, 32, $Form1)
UIButtonSetImage($Button1, @ScriptDir & "\Images\1.png", "", "", "")

$Button2 = UICreateButton("按钮2", 70, 45, 32, 32, $Form1)
UIButtonSetImage($Button2, @ScriptDir & "\Images\2.png", "", "", "")

$Button3 = UICreateButton("按钮3", 120, 45, 32, 32, $Form1)
UIButtonSetImage($Button3, @ScriptDir & "\Images\3.png", "", "", "")

$Button4 = UICreateButton("按钮4", 170, 45, 32, 32, $Form1)
UIButtonSetImage($Button4, @ScriptDir & "\Images\4.png", "", "", "")

$Button5 = UICreateButton("按钮5", 220, 45, 32, 32, $Form1)
UIButtonSetImage($Button5, @ScriptDir & "\Images\5.png", "", "", "")

$Button6 = UICreateButton("按钮6", 270, 45, 32, 32, $Form1)
UIButtonSetImage($Button6, @ScriptDir & "\Images\6.png", "", "", "")

UICtrlSetFocus($Button1);设置Button1焦点
UILoad($Form1)

;换肤窗口
$Form2 = UICreate(290, 230, -1, -1, "更换皮肤", @ScriptDir & "\Images\102.ico",@ScriptDir & "\Images\skinBK.png", 5)
WinSetOnTop($Form2, "", 1)
$Bk1 = UICreateButton("皮肤1", 5, 35, 90, 60, $Form2, 0)
UIButtonSetImage($Bk1, @ScriptDir & "\Images\bk1.jpg", @ScriptDir & "\Images\skinOver.png", @ScriptDir & "\Images\skinOver.png", "")
$Bk2 = UICreateButton("皮肤2", 100, 35, 90, 60, $Form2, 0)
UIButtonSetImage($Bk2, @ScriptDir & "\Images\bk2.jpg", @ScriptDir & "\Images\skinOver.png", @ScriptDir & "\Images\skinOver.png", "")
$Bk3 = UICreateButton("皮肤3", 195, 35, 90, 60, $Form2, 0)
UIButtonSetImage($Bk3, @ScriptDir & "\Images\bk3.jpg", @ScriptDir & "\Images\skinOver.png", @ScriptDir & "\Images\skinOver.png", "")
$Bk4 = UICreateButton("皮肤4", 5, 100, 90, 60, $Form2, 0)
UIButtonSetImage($Bk4, @ScriptDir & "\Images\bk4.jpg", @ScriptDir & "\Images\skinOver.png", @ScriptDir & "\Images\skinOver.png", "")
$Bk5 = UICreateButton("皮肤5", 100, 100, 90, 60, $Form2, 0)
UIButtonSetImage($Bk5, @ScriptDir & "\Images\bk5.jpg", @ScriptDir & "\Images\skinOver.png", @ScriptDir & "\Images\skinOver.png", "")
$Bk6 = UICreateButton("皮肤6", 195, 100, 90, 60, $Form2, 0)
UIButtonSetImage($Bk6, @ScriptDir & "\Images\bk6.jpg", @ScriptDir & "\Images\skinOver.png", @ScriptDir & "\Images\skinOver.png", "")
$Bk7 = UICreateButton("皮肤7", 5, 165, 90, 60, $Form2, 0)
UIButtonSetImage($Bk7, @ScriptDir & "\Images\bk7.jpg", @ScriptDir & "\Images\skinOver.png", @ScriptDir & "\Images\skinOver.png", "")
$Bk8 = UICreateButton("皮肤8", 100, 165, 90, 60, $Form2, 0)
UIButtonSetImage($Bk8, @ScriptDir & "\Images\bk8.jpg", @ScriptDir & "\Images\skinOver.png", @ScriptDir & "\Images\skinOver.png", "")
$Bk9 = UICreateButton("皮肤9", 195, 165, 90, 60, $Form2, 0)
UIButtonSetImage($Bk9, @ScriptDir & "\Images\bk9.jpg", @ScriptDir & "\Images\skinOver.png", @ScriptDir & "\Images\skinOver.png", "")
$BkColse = UICreateButton("关闭", 255, 2, 32, 18, $Form2, 0)
UIButtonSetImage($BkColse, @ScriptDir & "\Images\Close.png", @ScriptDir & "\Images\CloseOver.png", @ScriptDir & "\Images\CloseDown.png", "")
UILoad($Form2)
;建立子窗口
$Child1 = UIChild($Form1, 591, 280, 8, 100)
$Label1 = GUICtrlCreateLabel("按钮1", 8, 12, 140, 35)
GUICtrlSetFont(-1, 18)
GUICtrlSetColor(-1, 0x0066B2)
$Input1 = GUICtrlCreateInput("很爱很爱你,所以愿意", 162, 20, 249, 21)
$Button7 = GUICtrlCreateButton("修改标题", 288, 64, 119, 45)

GUISetState(@SW_SHOW, $Child1)
GUISetState(@SW_SHOW, $Form1)
GUISetState(@SW_HIDE, $Form2)
UIRegister($Form1)

While 1
        $nMsg = UIGetMsg()
        Switch $nMsg
                Case $SysClose, $GUI_EVENT_CLOSE
                        Exit
                Case $SysMax
                       
                Case $SysMin
                        GUISetState(@SW_MINIMIZE, $Form1)
                Case $SysSet
                        GUICtrlSetData($Label1, UICtrlRead($SysSet))
                Case $SysColor
                        GUICtrlSetData($Label1, UICtrlRead($SysColor))
                Case $SysSkin
                        GUISetState(@SW_SHOW, $Form2)
                Case $Button1
                        GUICtrlSetData($Label1, UICtrlRead($Button1))
                Case $Button2
                        GUICtrlSetData($Label1, UICtrlRead($Button2))
                Case $Button3
                        GUICtrlSetData($Label1, UICtrlRead($Button3))
                Case $Button4
                        GUICtrlSetData($Label1, UICtrlRead($Button4))
                Case $Button5
                        GUICtrlSetData($Label1, UICtrlRead($Button5))
                Case $Button6
                        GUICtrlSetData($Label1, UICtrlRead($Button6))
                Case $Button7
                        UISetTitle($Form1, GUICtrlRead($Input1));设置标题
                        UILoad($Form1)
                Case $BkColse
                        GUISetState(@SW_HIDE, $Form2)
                Case $Bk1
                        UISetBK($Form1, @ScriptDir & "\Images\bk1.jpg")
                        UILoad($Form1)
                Case $Bk2
                        UISetBK($Form1, @ScriptDir & "\Images\bk2.jpg")
                        UILoad($Form1)
                Case $Bk3
                        UISetBK($Form1, @ScriptDir & "\Images\bk3.jpg")
                        UILoad($Form1)
                Case $Bk4
                        UISetBK($Form1, @ScriptDir & "\Images\bk4.jpg")
                        UILoad($Form1)
                Case $Bk5
                        UISetBK($Form1, @ScriptDir & "\Images\bk5.jpg")
                        UILoad($Form1)
                Case $Bk6
                        UISetBK($Form1, @ScriptDir & "\Images\bk6.jpg")
                        UILoad($Form1)
                Case $Bk7
                        UISetBK($Form1, @ScriptDir & "\Images\bk7.jpg")
                        UILoad($Form1)
                Case $Bk8
                        UISetBK($Form1, @ScriptDir & "\Images\bk8.jpg")
                        UILoad($Form1)
                Case $Bk9
                        UISetBK($Form1, @ScriptDir & "\Images\bk9.jpg")
                        UILoad($Form1)
        EndSwitch
WEnd

附件,图片源码等:

komaau3 发表于 2012-12-3 21:44:30

本帖最后由 komaau3 于 2012-12-5 19:21 编辑

匆忙发帖,
提示函数名重复的朋友可以参考21楼解决办法,也可以更新下au3版本,本人使用3.3.9.4 SVN版

附加点介绍,
创建按钮函数:宽,高,X,Y,标题,图标icon,背景图,圆角
返回窗口句柄
例:UICreate(600, 400, -1, -1, "小Q书桌", @ScriptDir & "\Images\102.ico",@ScriptDir & "\Images\bk1.jpg", 10)

创建按钮函数:提示文本,X,Y,宽,搞,所属窗口(默认最后一个创建的窗口),是否允许有焦点
例:UICreateButton("关闭", 565, 2, 32, 18, $Form1, 0)
返回控件ID

设置图片函数,分别对应图片:普通状态,鼠标悬浮状态,按下状态,焦点状态
Hover和按下图片如果为空,默认会使用默认风格进行Hover及按下绘制,并自适应不同大小按钮

设置控件焦点函数UICtrlSetFocus($Button1);设置Button1焦点

UILoad($Form1),所有控件创建完成后调用,内部绘制窗口资源
UIRegister($Form1)注册监视消息,最后调用即可

UISetBK($Form1, @ScriptDir & "\Images\bk1.jpg")修改窗口背景,调用完成需UILoad
UISetTitle($Form1, GUICtrlRead($Input1));修改窗口标题,调用完成需UILoad

A3fan 发表于 2012-12-3 22:18:58

这么精彩的,没人顶?

jkq920 发表于 2012-12-4 02:29:03

这么精彩{:face (356):}{:face (356):}

weeks1 发表于 2012-12-4 08:05:12

学习一下啊,,

tiger_47 发表于 2012-12-4 08:26:53

本帖最后由 tiger_47 于 2012-12-4 08:28 编辑

頂一下!好!
{:1_496:}
下載研究、研究!
沒想到,檔案是免費的!
{:1_518:}

seniors 发表于 2012-12-4 08:29:59

青出于蓝而胜于蓝,对你非常适合
我也一直想写成UDF,看到代码太多,头大了

chenronting 发表于 2012-12-4 11:17:23

很厉害啊, 我上次也看过, 代码实在难懂。谢谢分享。

楼上风云 发表于 2012-12-4 11:24:20

回复 1# komaau3

UDF了,方便了外部调用。这个过程,是需要功力的。
改造式的跟贴,实质也是一种创新。

xiaochuan 发表于 2012-12-4 12:17:54

下来研究,多谢楼主分享{:face (280):}

komaau3 发表于 2012-12-4 12:37:56

回复 7# seniors

是啊,不知不觉代码行数就出来啦,大概是因为GDI+参数太多吧,哈哈。UDF化有优点优缺点,虽说也跟大家分享了源码,但估计看懂的成本要更高了

xiehuahere 发表于 2012-12-4 12:53:07

成也界面,败也界面。无论如何,仍然有许多许多值得学习的地方。看我哪天才能初窥门径。

seniors 发表于 2012-12-4 14:15:34

回复 11# komaau3
UDF化,我认为很好,下次,我来在你的基础上,添加其它控件,比如labal,edit,等常用的

虎虎虎 发表于 2012-12-4 18:58:55

高手高手高高手,顶上学习。。

komaau3 发表于 2012-12-4 19:39:35

回复 13# seniors

恩么这也是我想做的 哈哈 一点一点完善 期待大侠作品早日诞生   
另外还有个问题 就是控件图片的标准问题,像其他主流软件那样 一个控件的不同状态的图片PS在一张图片上 这样UDF写起来兼容性可能会好点,参数更少更短点,最后XML布局 哈哈 目前只是想想
页: [1] 2 3 4
查看完整版本: 山寨seniors大侠的自绘窗口,向大侠致敬。