找回密码
 加入
搜索
查看: 1843|回复: 4

[系统综合] _WinAPI_CreatePen 颜色与实际的不一致【已解决】

[复制链接]
发表于 2017-4-26 17:06:55 | 显示全部楼层 |阅读模式
本帖最后由 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
有些颜色,跟实际一样,有些颜色跟实际不一样,例如这个淡黄色的颜色,
实际显示的却是蓝色的。什么原因?怎么解决这个问题?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 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
发表于 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
 楼主| 发表于 2017-4-27 11:37:58 | 显示全部楼层
感谢2楼3楼解惑,原来RGB BGR有这么讲究
发表于 2017-4-28 16:01:22 | 显示全部楼层
回复 3# seniors


    大神你好多钱啊
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-17 02:46 , Processed in 0.142615 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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