Unity | 调用Windows颜色弹窗(方法一)
一、引入windows dll:public class DllScript{[DllImport("comdlg32.dll", CharSet = CharSet.Auto)]public static extern bool ChooseColorA(ref CHOOSECOLOR pChoosecolor);//对应的win32API[DllImpo...
·
一、引入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;
}
}
}
三、效果展示:
更多推荐
已为社区贡献4条内容
所有评论(0)