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


    有道理,下次尽量注释上~ :) 代码迷惑从没用过,因为我这都是些没有技术含量的东东~
页: 1 [2] 3 4
查看完整版本: GUICtrlCreatePic控件中的图片如何居中显示[已解决]