#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