其他分享
首页 > 其他分享> > 【IDL】IDL 8.5 中的颜色选择对话框

【IDL】IDL 8.5 中的颜色选择对话框

作者:互联网

看到某位QQ好友(IDL高手)的状态改成了"苍天啊,IDL终于有颜色选择组件了"。然后我就知道该推广下了,应该有人会有这个需求。当然,这是IDL 8.5新增的功能,所以…

有人看到这里可能就准备接受现实了,但是我们这次相对来说是一个好消息,因为IDL提供了此功能的源代码,所以IDL 8.4同样可以使用,需要进行简单的配置即可。但是因为源代码中用到了很多IDL的新特性(如变量的静态属性和静态方法、ISA的Number关键字等),所以低版本如果想使用此功能,需要更改的地方太多了太多了太多了,我尝试了下,最终放弃了。有兴趣的可以尝试下。

闲言碎语不要讲,表一表IDL 8.5中的颜色选择对话框的使用方法。

调用格式

Result = DIALOG_COLORPICKER( [, BOX_SIZE=variable] [, COLORS=array] [, CUSTOM_COLORS=array] [, CUSTOM_TITLE=string] [, CUSTOM_OUT=variable] [, DIALOG_PARENT=widget_id] [, /FRAMELESS] [, /MODAL] [, NCOLS=variable] [, NROWS=variable] [, PREFERRED_COLORS=array] [, PREFERRED_TITLE=string] [, TITLE=string] [, WCALLER=variable] [, XOFFSET=variable] [, YOFFSET=variable]

简单介绍下关键字的含义(所有关键字均为可选关键字):

关键字

含义

BOX_SIZE

设置每一个颜色色块的大小,单位为像素

COLORS

自定义默认颜色,输入为3×n的数组,n表示颜色个数

CUSTOM_COLORS

自定义新的颜色,输入为3×n的数组,n表示颜色个数

CUSTOM_TITLE

自定义新的颜色区域的标题

CUSTOM_OUT

输出用户通过界面交互新添加的颜色

DIALOG_PARENT

指定父组件的ID

FRAMLESS

使用此关键字时,界面无外边框。

注:如果MODAL关键字被设定,则此关键字无效。

MODAL

使用此关键字,则对话框变为MODAL状态。

注:此关键字需要搭配WCALLER关键字使用,否则会被忽略;如果使用了此关键字,则FRAMELESS关键字被忽略。

NCOLS

颜色块的列数,默认为8。

NROWS

颜色块的行数,默认为8。

PREFERRED_COLORS

自定义首选颜色,输入为3×n的数组,n表示颜色个数

PREFERRED_TITLE

自定义首选颜色区域标题。

TITLE

对话框标题。默认为"Select Color"。

WCALLER

设置此关键字为启动颜色选择对话框的组件ID,那么颜色选择对话框将尽可能显示在此组件的下方。

XOFFSET

X方向偏移量

YOFFSET

Y方向偏移量

示例代码

示例1:最简单调用方法

IDL> color = DIALOG_COLORPICKER()
IDL> print, color
255 175 29

运行效果如下图所示,可以选择Standard和Custom两种颜色模式。当选中某一个颜色时,返回color变量即为对应的R、G、B的值;如果单击关闭按钮,则返回0值。


图:颜色选择对话框

示例2:修改大小、行列数

 
IDL> color = DIALOG_COLORPICKER(box_size=40, ncols=6, nrows=7)

图:修改大小、行列号

示例3:自定义默认颜色

IDL中提供了几十个自带颜色表,我们可以使用其中的颜色设定。代码如下:

IDL> XLOADCT ;启动颜色表,选择第4个颜色表,如下左图
IDL> TVLCT,r,g,b,/get ;获取R、G、B
IDL> colors = TRANSPOSE([[r],[g],[b]],[1,0]) ;转换为3×N
IDL> HELP, colors
COLORS BYTE = Array[3, 256]
IDL> colors = CONGRID(colors, 3, 64) ;重采样到64个颜色
IDL> color = DIALOG_COLORPICKER(colors=colors)

图:自定义默认颜色

示例4:添加首选、自定义颜色

首选和自定义颜色分别对应PREFERRED_COLORS 和CUSTOM_COLORS关键字,分别对应PREFERRED_TITLE 和CUSTOM_TITLE关键字可以设置标题,这里不再演示。

示例代码如下:

IDL> Cc = [[232,17,35],[12,162,16],[0,120,215],[116,17,169],[249,99,12]]
IDL> Pc = [[255,0,0],[255,192,0],[255,255,0],[146,208,80],[0,176,80],[0,176,240],[0,112,192],[112,48,160]]
IDL>color= DIALOG_COLORPICKER(custom_colors=Cc,preferred_colors=Pc)

 运行效果如下图所示。

注:Preferred Colors中的颜色与PREFERRED_COLORS关键字中提供数组顺序一致;而Custom Colors中的颜色与CUSTOM_COLORS关键字中提供数组顺序相反。

图:添加首选和自定义颜色

示例5:综合应用

除了以上直接以函数方式调用之外,还可以在用户界面中使用此组件。

;+
; :Description:
; Describe the procedure.
;
; :Author: duhj@geoscene.cn
;
; :Date: 2015-9-14 16:47:29
;-
 
;事件处理
PRO dcp_test_event, ev
COMPILE_OPT idl2
;获取信息
WIDGET_CONTROL, ev.TOP, GET_UVALUE=pState
;获取Label组件ID
wLabel = (*pState).WLABEL
;初始化自定义颜色
custom_colors = !NULL
IF PTR_VALID((*pState).CUSTOM_COLORS) THEN $
custom_colors = *((*pState).CUSTOM_COLORS)
 
;调用颜色选择组件,使用custom_out保存自定义颜色
color = DIALOG_COLORPICKER(WCALLER=ev.ID, $
CUSTOM_OUT=custom_out, $
CUSTOM_COLORS=custom_colors, $
BOX_SIZE=30)
 
;如果存在自定义颜色,则保存在结构体中
IF N_ELEMENTS(custom_out) NE 0 THEN $
(*pState).CUSTOM_COLORS = PTR_NEW(custom_out)
 
;如果返回颜色,则绘制颜色,修改标签
IF (color.LENGTH EQ 3) THEN BEGIN
WIDGET_CONTROL, wLabel, $
SET_VALUE=' Color: ['+(color.toString()).join(',')+']'
;在Draw组件中绘制颜色
DEVICE, DECOMPOSED=1
WSET, (*pState).WINID
;RGB转换为索引
index=LONG(color[0])+256L*LONG(color[1])+256L^2*LONG(color[2])
ERASE, index
ENDIF ELSE BEGIN
;如果没有选择颜色
IF WIDGET_INFO(wLabel, /VALID_ID) THEN $
WIDGET_CONTROL, wLabel, SET_VALUE=' No color selected'
ENDELSE
END
 
;主过程
PRO dcp_test
COMPILE_OPT idl2
;修改界面默认字体为雅黑,抱歉,我是个雅黑控,o(∩_∩)o
WIDGET_CONTROL, DEFAULT_FONT='Microsoft Yahei*20'
;界面搭建
wTlb = WIDGET_BASE(/ROW)
wButton = WIDGET_BUTTON(wTlb, value='Select Color')
wDraw = WIDGET_DRAW(wTlb, XSIZE=40, YSIZE=40)
wLabel = WIDGET_LABEL(wTlb, value='', XSIZE=180)
WIDGET_CONTROL, wTlb, /REALIZE
WIDGET_CONTROL, wDraw, GET_VALUE=winID
;将需要的信息保存在顶级Base(wTlb)的Uvalue中
pState = {WLABEL:wLabel, $ ;Label组件ID
CUSTOM_COLORS:PTR_NEW(), $ ;保存自定义颜色
WINID:winID} ;绘图窗口ID
WIDGET_CONTROL, wTlb, SET_UVALUE=PTR_NEW(pState)
;事件处理
XMANAGER, 'dcp_test', wTlb, /NO_BLOCK
END

运行效果如下图所示,单击Select Color按钮,弹出下方的颜色选择组件,选择后自动在按钮右侧绘图窗口显示所选颜色,并在后边的标签中显示对应的R、G、B值。

如果选择的是Custom选项卡中的颜色,会自动记录颜色,并在Standard下方的Custom Colors中显示历史记录。

图:用户界面中的颜色选择组件

IDL8.4使用颜色选择对话框的方法

IDL 8.5提供了此功能的源代码,但是不能直接调用,需要做一些小的修改。比如,需要自定义一个系统变量!magic,需要另外两个图标文件等等。

源代码和图标文件下载地址http://pan.baidu.com/s/1i36LmAx

注:此源代码经过简单修改(第712~715行为新增内容,自定义系统变量)

使用方法:

  1. 将压缩包内的dialog_colorpicker.pro文件拷贝到IDL8.4安装路径:

    C:\Program Files\Exelis\IDL84\lib\utilities\

  2. 将压缩包内的arrow_pick_up.png和arrow_pick_down.png文件拷贝到路径:

    C:\Program Files\Exelis\IDL84\resource\bitmaps\

  3. 重启IDL 8.4即可使用。

    注:本人是在8.4.1版本下测试的,如果8.4运行有问题,欢迎发邮件说明。谢谢。

标签:颜色,自定义,对话框,COLORS,CUSTOM,关键字,IDL,8.5
来源: https://www.cnblogs.com/enviidl/p/16378169.html