fenhanxue 发表于 2017-4-26 17:06:55

_WinAPI_CreatePen 颜色与实际的不一致【已解决】

本帖最后由 fenhanxue 于 2017-4-27 11:39 编辑

#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>






$Form1 = GUICreate("Form1", 456, 263, 422, 304)
$Label1 = GUICtrlCreateLabel("颜色", 32, 24, 200, 50)
GUICtrlSetFont(-1,24)
GUICtrlSetColor($Label1,0xEC766C)
$Input1 = GUICtrlCreateInput("0xC08C53", 240, 8, 193, 21)
$Button1 = GUICtrlCreateButton("展示效果", 24, 208, 145, 33)



GUISetState(@SW_SHOW)



While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                        Local $color = GUICtrlRead($Input1)
                       
               
                        GUICtrlSetColor($Label1,$color)

                        ShowLine(500 ,300, 200, 5, $color)

        EndSwitch
WEnd









Func ShowLine($start_x, $start_y, $length, $width, $color)
    Local $hDC, $hPen, $obj_orig

    $hDC = _WinAPI_GetWindowDC(0) ; 全屏场景(桌面)
    $hPen = _WinAPI_CreatePen($PS_SOLID, $width, $color)
    $obj_orig = _WinAPI_SelectObject($hDC, $hPen)

    _WinAPI_DrawLine($hDC, $start_x - $length, $start_y, $start_x - 5, $start_y) ; 水平向左

        Sleep(3000)
    ; 刷新桌面(清除)
    _WinAPI_RedrawWindow(_WinAPI_GetDesktopWindow(), 0, 0, $RDW_INVALIDATE + $RDW_ALLCHILDREN)

    ; 清除资源
    _WinAPI_SelectObject($hDC, $obj_orig)
    _WinAPI_DeleteObject($hPen)
    _WinAPI_ReleaseDC(0, $hDC)
EndFunc   ;==>ShowCross有些颜色,跟实际一样,有些颜色跟实际不一样,例如这个淡黄色的颜色,
实际显示的却是蓝色的。什么原因?怎么解决这个问题?

tubaba 发表于 2017-4-27 08:54:54

本帖最后由 tubaba 于 2017-4-27 08:56 编辑

一个是RGB,一个是BGR

Func RGB2BGR($iColor)
        Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
EndFunc   ;==>RGB2BGR

seniors 发表于 2017-4-27 09:55:56

本帖最后由 seniors 于 2017-4-27 09:59 编辑

winapi中的_WinAPI_CreatePen用的是BGR颜色,应该要转换到RGB格式才是我们正常讲的颜色
楼上的转换函数是错的
应该用_WinAPI_SwitchColor($iColor)来转换
Func _WinAPI_SwitchColor($iColor)
        Return BitOR(BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0x0000FF), -16), BitShift(BitAND($iColor, 0xFF0000), 16))
EndFunc   ;==>_WinAPI_SwitchColor
例子中的RGB颜色0xC08C53,换成BGR应该是0x538CC0

fenhanxue 发表于 2017-4-27 11:37:58

感谢2楼3楼解惑,原来RGB BGR有这么讲究

cfanpc 发表于 2017-4-28 16:01:22

回复 3# seniors


    大神你好多钱啊
页: [1]
查看完整版本: _WinAPI_CreatePen 颜色与实际的不一致【已解决】