一、引入windows dll: 

public class DllScript
{
    [DllImport("comdlg32.dll", CharSet = CharSet.Auto)]
    public static extern bool ChooseColorA(ref CHOOSECOLOR pChoosecolor);//对应的win32API
    [DllImport("comdlg32.dll")]
    public extern static int CommDlgExtendedError();
    public static bool ChooseColorA1(ref CHOOSECOLOR pChoosecolor)
    {
        return ChooseColorA(ref pChoosecolor);
    }
}
[StructLayout(LayoutKind.Sequential)]
public struct CHOOSECOLOR
{
    public Int32 lStructSize;//指定结构的长度(字节)
    public IntPtr hwndOwner;//拥有对话框的窗口的句柄。该成员可以是任意有效的窗口句柄,或在对话框没有所有者时,可为NULL
    public IntPtr hInstance;//如果Flag成员设置了CC_ENABLETEMPLATEHANDLE标识符时,该成员是一个包含了对话框模板的内存对象的句柄。如果 CC_ENABLETEMPLATE 标识符被设置时,该成员是一个包含了对话框的模块句柄。如果上述两个标识符都未被设置,则该成员被忽略。
    public Int32 rgbResult;//如果该成员为0或CC_RGBINIT未被设置,初始颜色是黑色
    public IntPtr lpCustColors;//指向一个包含16个值的数组,该数组包含了对话框中自定义颜色的红、绿、蓝(RGB)值。
    public Int32 Flags;//一个可以让你初始化颜色对话框的位集
    public long lCustData; //指定应用程序自定义的数据,该数据会被系统发送给钩子程序
    public UIntPtr lpfnHook;//指向CCHookProc钩子程序的指针,该钩子可以处理发送给对话框的消息。该成员只在CC_ENABLEHOOK标识被设定的情况下才可用,否则该成员会被忽略。
    [MarshalAs(UnmanagedType.LPWStr)]
    public string lpTemplateName;//指向一个NULL结尾的字符串,该字符串是对话框模板资源的名字。
}

二、Unity端代码: 

using System;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;

public class SkinColor : MonoBehaviour {

    private Transform UIRoot;

    public Button skinBtn;//换肤按钮

    private Image TopImage;//要换色的背景1

    private Image firstPage_bg;// 要换色的背景2

     Color color = new Color();

    private void Awake()
    {
        UIRoot = GameObject.FindGameObjectWithTag("UI").transform;

        skinBtn = UIRoot.Find("Panel/MainPage/Title/skin").GetComponent<Button>();

        TopImage = UIRoot.Find("Panel/MainPage/Top").GetComponent<Image>();

        firstPage_bg= UIRoot.Find("Panel/MainPage/FirstPage/bg").GetComponent<Image>();
    }

    void Start()
    {
        skinBtn.onClick.AddListener(delegate
        {
            CHOOSECOLOR choosecolor = new CHOOSECOLOR();
            choosecolor.lStructSize = Marshal.SizeOf(choosecolor);
            choosecolor.hwndOwner = IntPtr.Zero;
            choosecolor.rgbResult = 0x808080;//颜色转成int型
            choosecolor.lpCustColors = Marshal.AllocCoTaskMem(64);
            choosecolor.Flags =  0x00000001;
            if (DllScript.ChooseColorA1(ref choosecolor))
            {
                Marshal.FreeHGlobal(choosecolor.lpCustColors);
                int result = choosecolor.rgbResult;
                color.b = ((result & 0xFF0000) >> 16) / 255f;
                color.g = ((result & 0x00FF00) >> 8) / 255f;
                color.r = ((result & 0x0000FF)) / 255f;
                color.a = 1;
                ChangeSkin(color, TopImage,firstPage_bg);
            }
            else
            {
                Debug.Log(DllScript.CommDlgExtendedError());
            }
            string save = color.r.ToString() + "," + color.g.ToString() + "," + color.b.ToString();
            Debug.Log(save);
        });

    }
	public void ChangeSkin( Color color,params Image[] images)
    {
        foreach (var item in images)
        {
            item.color = color;
        }
    }
	
}

三、效果展示:

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐