xsjtxy
发表于 2010-7-5 17:06:58
回复 14# t87564833
其实我也是fans{:face (301):}
但是好像稍不注意就会违反了第五条
http://www.autoitx.com/thread-6878-1-1.html
anchie
发表于 2010-7-6 03:49:13
最近理解能力出了点问题。可能理解错了楼主的意思了。
看看这个代码可以吗?
3mile 发表于 2010-7-5 16:37 http://www.autoitx.com/images/common/back.gif
运行出错,太复杂,因为运行出错,不知道有没有达到我想要的效果。大哥可以再改一下吗?
afan
发表于 2010-7-6 11:47:05
是这意思不?
3mile
发表于 2010-7-6 13:56:44
afan老大,你这个很牛啊。
上代码让大家学学吧。
ghl781258
发表于 2010-7-6 16:11:22
牛牛牛牛牛奶
水木子
发表于 2010-7-6 16:14:46
回复 18# afan
前辈实在是太厉害了!
是通过计算图片的宽和高出来的吗?
anchie
发表于 2010-7-6 19:25:27
是这意思不?
afan 发表于 2010-7-6 11:47 http://www.autoitx.com/images/common/back.gif
NB,可以放出源码吗?
lanfengc
发表于 2010-7-7 10:22:12
富文本框吗?
afan
发表于 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
lanfengc
发表于 2010-7-7 10:37:37
拖动文件到窗体。 这个我还不知道如何实现。 学习学习。
3mile
发表于 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
lanfengc
发表于 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
afan
发表于 2010-7-7 11:30:57
回复 27# lanfengc
呵呵,我是偷懒惯了…… 另一方面是不想包含那些(大多是仅含有常量的)头文件,尽量缩小编译后的体积~
lanfengc
发表于 2010-7-7 11:42:31
回复 28# afan
那你给代码中用到的HEX值的那句加个注释, 然后编译的时候在代码迷惑里加上去掉注释的参数就可以了。这样别人看你的代码会觉得舒服很多。
afan
发表于 2010-7-7 11:45:12
回复 29# lanfengc
有道理,下次尽量注释上~ :) 代码迷惑从没用过,因为我这都是些没有技术含量的东东~