找回密码
 加入
搜索
查看: 2634|回复: 6

[AU3基础] 关于_ChooseColor的示例[已解决]

[复制链接]
发表于 2017-2-3 22:32:39 | 显示全部楼层 |阅读模式
本帖最后由 cashiba 于 2017-2-6 20:18 编辑
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <WindowsConstants.au3>
Example()
Func Example()
    Local $hGUI, $idCOLORREF, $idBGR, $idRGB, $idMemo
    $hGUI = GUICreate("创建颜色选择对话框", 400, 300)
    $idMemo = GUICtrlCreateEdit("", 2, 55, 396, 200, BitOR($WS_VSCROLL, $WS_HSCROLL))
    GUICtrlSetFont($idMemo, 10, 400, 0, "Courier New")
    $idCOLORREF = GUICtrlCreateButton("COLORREF", 70, 10, 80, 40)
    $idBGR = GUICtrlCreateButton("BGR", 160, 10, 80, 40)
    $idRGB = GUICtrlCreateButton("RGB", 250, 10, 80, 40)
    GUISetState(@SW_SHOW)

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idCOLORREF
                _ShowChoice($hGUI, $idMemo, 0, _ChooseColor(0, 255, 0, $hGUI), "选择的 COLORREF 颜色值为: ")
            Case $idBGR
                _ShowChoice($hGUI, $idMemo, 1, _ChooseColor(2, 0x808000, 1, $hGUI), "选择的 BGR 十六进制颜色值为: ")
            Case $idRGB
                _ShowChoice($hGUI, $idMemo, 2, _ChooseColor(2, 0x0080C0, 2, $hGUI), "选择的 RGB 十六进制颜色值为: ")
        EndSwitch
    WEnd
EndFunc   ;==>Example

Func _ShowChoice($hGUI, $idMemo, $iType, $iChoose, $sMessage)
    Local $sCr
    If $iChoose <> -1 Then

        If $iType = 0 Then ; 此示例将 COLORREF 转换为 RGB
            $sCr = Hex($iChoose, 6)
            GUISetBkColor('0x' & StringMid($sCr, 5, 2) & StringMid($sCr, 3, 2) & StringMid($sCr, 1, 2), $hGUI)
        Else
            GUISetBkColor($iChoose, $hGUI)
        EndIf

        GUICtrlSetData($idMemo, $sMessage & $iChoose & @CRLF, 1)

    Else
        GUICtrlSetData($idMemo, "用户取消选择" & @CRLF, 1)
    EndIf
EndFunc   ;==>_ShowChoice
这段示例是不是有点问题....

   While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idCOLORREF
                _ShowChoice($hGUI, $idMemo, 0, _ChooseColor(0, 255, 0, $hGUI), "选择的 COLORREF 颜色值为: ")
            Case $idBGR
                _ShowChoice($hGUI, $idMemo, 1, _ChooseColor(2, 0x808000, 1, $hGUI), "选择的 BGR 十六进制颜色值为: ")
            Case $idRGB
                _ShowChoice($hGUI, $idMemo, 2, _ChooseColor(2, 0x0080C0, 2, $hGUI), "选择的 RGB 十六进制颜色值为: ")
        EndSwitch
    WEnd

上面的红色数字是不是原本应该为1?
另外:
1、话说BGR这种形式的颜色值倒地有何用处?
2、函数_ChooseColor ( [返回颜色类型 = 0 [, 默认选中颜色= 0 [, 默认选中颜色类型= 0 [,对话框的父窗口句柄= 0]]]] )中
     为啥要加一个"默认选中颜色类型"这个参数?对结果有影响吗?
3、_ShowChoice感觉有点绕....
 楼主| 发表于 2017-2-3 22:44:25 | 显示全部楼层
本帖最后由 cashiba 于 2017-2-3 22:47 编辑
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <WindowsConstants.au3>
Example()
Func Example()
    Local $hdGUI, $idREF, $idBGR, $idRGB, $idEDT
    $hdGUI = GUICreate("创建颜色选择对话框", 400, 300)
    $idEDT = GUICtrlCreateEdit("", 2, 55, 396, 200, BitOR($WS_VSCROLL, $WS_HSCROLL))
             GUICtrlSetFont($idEDT, 10, 400, 0, "Courier New")
        $idHUE = GUICtrlCreateButton("HUE", 70, 10, 80, 40)
    GUISetState(@SW_SHOW)

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $idHUE
                                 $msg=""
                                 $Ret=_ChooseColor(0,0,0,$hdGUI)
                                 $msg="选择的颜色" & @CRLF & "REF值为:" & $Ret & @CRLF
                                 $Ret=_ChooseColor(1,0,0,$hdGUI)
                                 $msg=$msg & "BGR值为:" & $Ret & @CRLF
                                 $Ret=_ChooseColor(2,0,0,$hdGUI)
                                 $msg=$msg & "RGB值为:" & $Ret & @CRLF
                                 $msg=$msg & "----------------------" & @CRLF
                 _ShowChoice($hdGUI,$idEDT,0,$Ret,$msg)
          EndSwitch
    WEnd
EndFunc   ;==>Example

Func _ShowChoice($hdGUI, $idEDT, $iType, $iChoose, $sMessage)
    Local $sCr
    If $iChoose <> -1 Then
        If $iType = 0 Then ; 此示例将 COLORREF 转换为 RGB
            $sCr = Hex($iChoose, 6)
            GUISetBkColor('0x' & StringMid($sCr, 5, 2) & StringMid($sCr, 3, 2) & StringMid($sCr, 1, 2), $hdGUI)
        Else
            GUISetBkColor($iChoose, $hdGUI)
        EndIf

        GUICtrlSetData($idEDT, $sMessage, 1)

    Else
        GUICtrlSetData($idEDT, "用户取消选择" & @CRLF, 1)
    EndIf
EndFunc   ;==>_ShowChoice

#cs
创建颜色选择对话框.
#include <Misc.au3>
_ChooseColor ( [$iReturnType = 0 [, $iColorRef = 0 [, $iRefType = 0 [, $hWndOwnder = 0]]]] )

参 数
$iReturnType [可选] 定义返回颜色类型, 有效值:
    0 - COLORREF RGB 颜色
    1 - 十六进制 BGR 颜色
    2 - 十六进制 RGB 颜色
$iColorRef [可选] 默认选中颜色
$iRefType [可选] 定义 $iColorRef 默认选中颜色类型, 有效值:
    0 - COLORREF RGB 颜色
    1 - 十六进制 BGR 颜色
    2 - 十六进制 RGB 颜色
$hWndOwnder [可选] 对话框的父窗口句柄
返 回 值
成功: 返回颜色值
失败: 返回 -1
#ce
改了一下,貌似也有点不好,需要选择三次,还不如直接把颜色值进行数字转换了。而且最后呈现的颜色也不对.....
发表于 2017-2-4 12:02:06 | 显示全部楼层
回复 1# cashiba

1:RGB模式与BGR模式,本质上并没有太大区别。
RGB即是代表红、绿、蓝三个通道的颜色,BGR则反之。
目前运用最为广泛的就是RGB模式。

2:默认选中颜色参数,是当你颜色选择对话框时默认选中的颜色!比如将此参数设置为 0xFF0000 那么打开颜色选择对话框时,就会默认选中红色。

3:_ShowChoice 函数实际就是将颜色值转换为 GUISetBkColor 能够使用的颜色值并设置窗口背景色。
 楼主| 发表于 2017-2-4 14:08:03 | 显示全部楼层
回复  cashiba
1:RGB模式与BGR模式,本质上并没有太大区别。
RGB即是代表红、绿、蓝三个通道的颜色, ...
水木子 发表于 2017-2-4 12:02

一点小问题,感谢水版关注!
顺便问下:
Hex与StringtoHex有何不同?
local $sStr="4227327"
Local $sHex=Hex($sStr)
ConsoleWrite("Str: " & $sStr & @CRLF & "Hex: " & $sHex & @CRLF)
$sHex=_StringToHex($sStr)
ConsoleWrite("Str: " & $sStr & @CRLF & "Hex: " & $sHex & @CRLF)
结果不同:
Str: 4227327
Hex: 004080FF
Str: 4227327
Hex: 34323237333237

两者参数含义不同?
Hex(表达式[, 长度])
_StringToHex ( $sString )

另外,004080FF转换为00FF8040
除了用StringMid($sCr, 5, 2) & StringMid($sCr, 3, 2) & StringMid($sCr, 1, 2)方法直接调换字符
用Bitrotate、bitshift怎么写?
发表于 2017-2-6 09:57:09 | 显示全部楼层
回复 4# cashiba

Hex是针对数值型,_StringToHex是作用于字符型,我想应该是这样的吧!

关于004080FF的转换,我瞎弄的。
$sCr = '4080FF'

MsgBox(0, 0, '0x' & StringMid($sCr, 5, 2) & StringMid($sCr, 3, 2) & StringMid($sCr, 1, 2))

MsgBox(0, 0, '0x' & StringRegExpReplace($sCr, '(\w{2})(\w{2})(\w{2})', '\3\2\1'))
 楼主| 发表于 2017-2-6 13:58:08 | 显示全部楼层
回复  cashiba
Hex是针对数值型,_StringToHex是作用于字符型,我想应该是这样的吧!
水木子 发表于 2017-2-6 09:57

谢谢!我也是这样理解的....

十六进制数字高位和低位翻转,看样子用字符截取是简单可行的。上次望文生义,以为BitRotate、BitShift就是干这个的呢
 楼主| 发表于 2017-2-6 14:03:36 | 显示全部楼层
$sCr = '4080FF'
MsgBox(0, 0, '0x' & StringMid($sCr, 5, 2) & StringMid($sCr, 3, 2) & StringMid($sCr, 1, 2))
MsgBox(0, 0, '0x' & StringRegExpReplace($sCr, '(\w{2})(\w{2})(\w{2})', '\3\2\1'))
这段代码挺好的,这两天正好看了一点正则,对组捕获和后向引用有那么点印象,不然还真看不懂。很好的示例....
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-25 11:13 , Processed in 0.085209 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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