找回密码
 加入
搜索
查看: 45576|回复: 56

[特效] 山寨seniors大侠的自绘窗口,向大侠致敬。

 火... [复制链接]
发表于 2012-12-3 21:39:53 | 显示全部楼层 |阅读模式
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


附件,图片源码等:

本帖子中包含更多资源

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

×

评分

参与人数 14金钱 +643 贡献 +70 收起 理由
ura + 30
Windows8 + 23 能给我一份GDI教程吗?Thanks
lpxx + 50 + 5
298311657 + 80 + 20 good
南一 + 30

查看全部评分

 楼主| 发表于 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
发表于 2012-12-3 22:18:58 | 显示全部楼层
这么精彩的,没人顶?
发表于 2012-12-4 02:29:03 | 显示全部楼层
这么精彩
发表于 2012-12-4 08:05:12 | 显示全部楼层
学习一下啊,,
发表于 2012-12-4 08:26:53 | 显示全部楼层
本帖最后由 tiger_47 于 2012-12-4 08:28 编辑

頂一下!好!

下載研究、研究!
沒想到,檔案是免費的!
发表于 2012-12-4 08:29:59 | 显示全部楼层
青出于蓝而胜于蓝,对你非常适合
我也一直想写成UDF,看到代码太多,头大了
发表于 2012-12-4 11:17:23 | 显示全部楼层
很厉害啊, 我上次也看过, 代码实在难懂。谢谢分享。
发表于 2012-12-4 11:24:20 | 显示全部楼层
回复 1# komaau3

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

评分

参与人数 1金钱 +50 收起 理由
komaau3 + 50 感谢

查看全部评分

发表于 2012-12-4 12:17:54 | 显示全部楼层
下来研究,多谢楼主分享
 楼主| 发表于 2012-12-4 12:37:56 | 显示全部楼层
回复 7# seniors

是啊,不知不觉代码行数就出来啦,大概是因为GDI+参数太多吧,哈哈。UDF化有优点优缺点,虽说也跟大家分享了源码,但估计看懂的成本要更高了
发表于 2012-12-4 12:53:07 | 显示全部楼层
成也界面,败也界面。无论如何,仍然有许多许多值得学习的地方。看我哪天才能初窥门径。
发表于 2012-12-4 14:15:34 | 显示全部楼层
回复 11# komaau3
UDF化,我认为很好,下次,我来在你的基础上,添加其它控件,比如labal,edit,等常用的
发表于 2012-12-4 18:58:55 | 显示全部楼层
高手高手高高手,顶上学习。。
 楼主| 发表于 2012-12-4 19:39:35 | 显示全部楼层
回复 13# seniors

恩么  这也是我想做的 哈哈 一点一点完善 期待大侠作品早日诞生   
另外还有个问题 就是控件图片的标准问题,像其他主流软件那样 一个控件的不同状态的图片PS在一张图片上 这样UDF写起来兼容性可能会好点,参数更少更短点,最后XML布局 哈哈 目前只是想想
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-21 16:40 , Processed in 0.085970 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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