找回密码
 加入
搜索
楼主: anchie

[AU3基础] GUICtrlCreatePic控件中的图片如何居中显示[已解决]

 火... [复制链接]
发表于 2010-7-5 17:06:58 | 显示全部楼层
回复 14# t87564833


    其实我也是fans

但是好像稍不注意就会违反了第五条

http://www.autoitx.com/thread-6878-1-1.html
 楼主| 发表于 2010-7-6 03:49:13 | 显示全部楼层
最近理解能力出了点问题。可能理解错了楼主的意思了。
看看这个代码可以吗?
3mile 发表于 2010-7-5 16:37



    运行出错,太复杂,因为运行出错,不知道有没有达到我想要的效果。大哥可以再改一下吗?
发表于 2010-7-6 11:47:05 | 显示全部楼层
是这意思不?

本帖子中包含更多资源

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

×
发表于 2010-7-6 13:56:44 | 显示全部楼层
afan老大,你这个很牛啊。
上代码让大家学学吧。
发表于 2010-7-6 16:11:22 | 显示全部楼层
牛牛牛牛牛奶
发表于 2010-7-6 16:14:46 | 显示全部楼层
回复 18# afan

前辈实在是太厉害了!

是通过计算图片的宽和高出来的吗?
 楼主| 发表于 2010-7-6 19:25:27 | 显示全部楼层
是这意思不?
afan 发表于 2010-7-6 11:47



    NB,可以放出源码吗?
发表于 2010-7-7 10:22:12 | 显示全部楼层
富文本框吗?
发表于 2010-7-7 10:34:22 | 显示全部楼层
本帖最后由 afan 于 2013-1-23 10:28 编辑

回复 19# 3mile
没什么技术含量,不值得学习的~ :)
回复 21# 水木子
是的,就是先取得图片的宽和高,主要是得到宽高比,不然图片会变形。
回复 22# anchie
看来是这意思了…
#include <GDIPlus.au3>

Opt('GUIOnEventMode', 1)

Dim $w_picctrl = 498, $h_picctrl = 298

$Form1 = GUICreate('居中显示图像例子 - afan', 600, 430, -1, -1, -1, 0x00000010)
GUISetOnEvent(-3, '_Exit')
GUISetOnEvent(-13, 'Show')
GUICtrlCreateGraphic(50, 50, $w_picctrl + 2, $h_picctrl + 2)
GUICtrlSetGraphic(-1, 10, 0, 0, $w_picctrl + 2, $h_picctrl + 2)
$ts = GUICtrlCreateLabel('请拖拽任意图片至本框中', 51, 51, $w_picctrl, $h_picctrl, 0x01 + 0x0200)
GUICtrlSetState(-1, 8)
$pic = GUICtrlCreatePic('', 51, 51, 1, 1)
GUICtrlCreateLabel('图片文件路径:', 50, 355, 90, 17)
$ts_File = GUICtrlCreateLabel('', 140, 355, 400, 17)
GUICtrlCreateLabel('图片原始尺寸:', 50, 370, 90, 17)
$ts_size = GUICtrlCreateLabel('', 140, 370, 200, 17)
GUICtrlCreateLabel('格式(后缀名):', 50, 385, 90, 17)
$ts_hzm = GUICtrlCreateLabel('', 140, 385, 90, 17)

GUISetState()
WinSetOnTop($Form1, '', 1)

While 1
        Sleep(10)
WEnd

Func _Exit()
        GUIDelete()
        Exit
EndFunc   ;==>_Exit

Func Show()
        Local $imgfile = @GUI_DragFile, $hImage, $h_img
        _GDIPlus_Startup()
        $hImage = _GDIPlus_ImageLoadFromFile($imgfile)
        $w_img = _GDIPlus_ImageGetWidth($hImage)
        $h_img = _GDIPlus_ImageGetHeight($hImage)
        If $w_img * $h_img = 0 Then
                _GDIPlus_Shutdown()
                Return MsgBox(48, @error, '非图片格式', '', $Form1)
        EndIf
        GUICtrlSetData($ts, '')
        GUICtrlSetData($ts_size, $w_img & ' x ' & $h_img)
        GUICtrlSetData($ts_File, $imgfile)
        GUICtrlSetData($ts_hzm, StringRegExpReplace($imgfile, '.+\\.+\.', ''))
        Local $kgb = $h_picctrl / $w_picctrl
        Local $kgb1 = $h_img / $w_img
        Local $x_py = 0, $y_py = 0, $hBMP, $hObject
        If $w_img > $w_picctrl Or $h_img > $h_picctrl Then
                If $kgb1 > $kgb Then
                        $h_img = $h_picctrl
                        $w_img = Round(1 / $kgb1 * $h_img)
                        $x_py = ($w_picctrl - $w_img) / 2
                Else
                        $w_img = $w_picctrl
                        $h_img = Round($kgb1 * $w_img)
                        $y_py = ($h_picctrl - $h_img) / 2
                EndIf
        Else
                $x_py = ($w_picctrl - $w_img) / 2
                $y_py = ($h_picctrl - $h_img) / 2
        EndIf
        $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
        $hObject = GUICtrlSendMsg($pic, 0x0172, 0, $hBMP)
        _WinAPI_DeleteObject($hObject)
        _GDIPlus_ImageDispose($hImage)
        _WinAPI_DeleteObject($hBMP)
        _GDIPlus_Shutdown()
        GUICtrlSetPos($pic, 51 + $x_py - 1, 51 + $y_py - 1, $w_img, $h_img)
        GUICtrlSetPos($pic, 51 + $x_py, 51 + $y_py)
EndFunc   ;==>Show

评分

参与人数 2金钱 +90 收起 理由
3mile + 40 佩服
水木子 + 50 学习啦!

查看全部评分

发表于 2010-7-7 10:37:37 | 显示全部楼层
拖动文件到窗体。 这个我还不知道如何实现。 学习学习。
发表于 2010-7-7 10:47:46 | 显示全部楼层
这段代码很精彩,学习了。
#         If $w_img > $w_picctrl Or $h_img > $h_picctrl Then
#                 If $kgb1 > $kgb Then
#                         $h_img = $h_picctrl
#                         $w_img = Round(1 / $kgb1 * $h_img)
#                         $x_py = ($w_picctrl - $w_img) / 2
#                 Else
#                         $w_img = $w_picctrl
#                         $h_img = Round($kgb1 * $w_img)
#                         $y_py = ($h_picctrl - $h_img) / 2
#                 EndIf
#         Else
#                 $x_py = ($w_picctrl - $w_img) / 2
#                 $y_py = ($h_picctrl - $h_img) / 2
#         EndIf
发表于 2010-7-7 11:25:36 | 显示全部楼层
回复 24# afan


    AFAN,给你提个建议好不。。  你的代码中的窗体的样式能不能用GUI常量呢, 别直接用HEX值行不, 我在KODA中找的都头晕了。   还有,你的代码能不能有点注释呢, 让我学的好辛苦。 又是猜又是百度的。。
我给你注释了下, 有什么不对的你指出,让我学习学习。
#include <GDIPlus.au3>
;设置GUI模式为事件模式
Opt('GUIOnEventMode', 1)
;定义图片控件的最大宽度和最大高度
Dim $w_picctrl = 498, $h_picctrl = 298
;创建个支持文件拖放的窗体.0x00000010就是$WS_EX_ACCEPTFILES
$Form1 = GUICreate('居中显示图像例子 - afan', 600, 430, -1, -1, -1, 0x00000010)
;如果窗体事件ID是-3(关闭窗体时候产生的事件ID是-3),则退出.
GUISetOnEvent(-3, '_Exit')
;如果窗体事件的ID是-13(拖动文件到窗体时候产生的事件ID是-13),则执行显示图片函数.
GUISetOnEvent(-13, 'Show')
;创建一个图形控件.
GUICtrlCreateGraphic(50, 50, $w_picctrl + 2, $h_picctrl + 2)
;给图形控件上画一个矩形, 左上角坐标是图形控件的0,0,右下角是图片的最大宽,高
GUICtrlSetGraphic(-1, 10, 0, 0, $w_picctrl + 2, $h_picctrl + 2)
;下面的都比较好理解 就不注释了. 
$ts = GUICtrlCreateLabel('请拖拽任意图片至本框中', 51, 51, $w_picctrl, $h_picctrl, 0x01 + 0x0200)
;设置可接受文件拖放.8就是$GUI_DROPACCEPTED
GUICtrlSetState(-1, 8)
$pic = GUICtrlCreatePic('', 51, 51, 1, 1)
GUICtrlCreateLabel('图片文件路径:', 50, 355, 90, 17)
$ts_File = GUICtrlCreateLabel('', 140, 355, 400, 17)
GUICtrlCreateLabel('图片原始尺寸:', 50, 370, 90, 17)
$ts_size = GUICtrlCreateLabel('', 140, 370, 200, 17)
GUICtrlCreateLabel('格式(后缀名):', 50, 385, 90, 17)
$ts_hzm = GUICtrlCreateLabel('', 140, 385, 90, 17)

;显示窗体并将其置顶.
GUISetState()
WinSetOnTop($Form1, '', 1)

While 1
        Sleep(100)
WEnd

Func _Exit() ;退出时,先删除窗体后退出
        GUIDelete()
        Exit
EndFunc   ;==>_Exit

Func Show()
        ;将窗体接收到的拖放文件赋值给$imgfile,定义2个变量
        Local $imgfile = @GUI_DragFile, $hImage, $h_img
        ;初始化GDI库
        _GDIPlus_Startup()
        ;调用函数创建基于文件的图像对象
        $hImage = _GDIPlus_ImageLoadFromFile($imgfile)
        ;获取图像的宽
        $w_img = _GDIPlus_ImageGetWidth($hImage)
        ;获取图像的高
        $h_img = _GDIPlus_ImageGetHeight($hImage)
        ;如果宽高相乘等于0,则代表图像是错误的. 关闭GDI库,并弹出错误提示
        If $w_img * $h_img = 0 Then
                _GDIPlus_Shutdown()
            Return MsgBox(48, @error, '非图片格式', '', $Form1)
        EndIf
        ;LABEL控件清空.
        GUICtrlSetData($ts, '')
        ;将图形文件大小控件的数据设置为GDI函数获取的值
        GUICtrlSetData($ts_size, $w_img & ' x ' & $h_img)
        ;设置文件完整路径控件为 $imgfile
        GUICtrlSetData($ts_File, $imgfile)
        ;正则读取后缀名.
        GUICtrlSetData($ts_hzm, StringRegExpReplace($imgfile, '.+\\.+\.', ''))
        ;计算图片控件的宽高比 
        Local $kgb = $h_picctrl / $w_picctrl
        ;计算GDI获取的宽高比
        Local $kgb1 = $h_img / $w_img
        Local $x_py = 0, $y_py = 0, $hBMP, $hObject
        ;如果GDI获取的宽度大于图片控件的最大宽度 或者高度大于图片文件的最大高度
        If $w_img > $w_picctrl Or $h_img > $h_picctrl Then
                ;检测GDI获取的宽高比是否大于图片控件的宽高比
                If $kgb1 > $kgb Then
                        ;如果大于, 则将GDI获取的高度设置为图片控件的最大高度
                        $h_img = $h_picctrl
                        ;按照GDI读取出的宽高比计算宽度
                        $w_img = Round(1 / $kgb1 * $h_img)
                        ;边缘的横轴偏移等于最大宽度减去算出的宽度然后除以2(这个边缘偏移是左右各一半。)
                        $x_py = ($w_picctrl - $w_img) / 2
                Else
                        ;如果小于,则固定宽度, 算高度和纵轴偏移。原理同上。
                        $w_img = $w_picctrl
                        $h_img = Round($kgb1 * $w_img)
                        $y_py = ($h_picctrl - $h_img) / 2
                EndIf
        Else
                ;如果拖放进的图片比设置的最大宽高小。则直接计算边缘偏移
            $x_py = ($w_picctrl - $w_img) / 2
                $y_py = ($h_picctrl - $h_img) / 2
        EndIf
        ;创建位图的映射表
        $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
        ;0x0172 这个消息我没查到是做什么的, 我猜的的更新图片控件用的吧
        $hObject = GUICtrlSendMsg($pic, 0x0172, 0, $hBMP)
        ;删除用过的句柄
        _WinAPI_DeleteObject($hObject)
        _GDIPlus_ImageDispose($hImage)
        _WinAPI_DeleteObject($hBMP)
        ;关闭GDI库
        _GDIPlus_Shutdown()
        ;设置图片控件的宽高。
        GUICtrlSetPos($pic, 51 + $x_py - 1, 51 + $y_py - 1, $w_img, $h_img)
        ;设置图片控件的位置。
        GUICtrlSetPos($pic, 51 + $x_py, 51 + $y_py)
EndFunc   ;==>Show

评分

参与人数 1金钱 +30 收起 理由
afan + 30 谢谢帮忙0x0172=$STM_SETIMAGE

查看全部评分

发表于 2010-7-7 11:30:57 | 显示全部楼层
回复 27# lanfengc


    呵呵,我是偷懒惯了…… 另一方面是不想包含那些(大多是仅含有常量的)头文件,尽量缩小编译后的体积~
发表于 2010-7-7 11:42:31 | 显示全部楼层
回复 28# afan


    那你给代码中用到的HEX值的那句加个注释, 然后编译的时候在代码迷惑里加上去掉注释的参数就可以了。  这样别人看你的代码会觉得舒服很多。
发表于 2010-7-7 11:45:12 | 显示全部楼层
回复 29# lanfengc


    有道理,下次尽量注释上~ :) 代码迷惑从没用过,因为我这都是些没有技术含量的东东~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-27 13:43 , Processed in 0.301634 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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