【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 |
设置每一个颜色色块的大小,单位为像素 |
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行为新增内容,自定义系统变量)
使用方法:
-
将压缩包内的dialog_colorpicker.pro文件拷贝到IDL8.4安装路径:
C:\Program Files\Exelis\IDL84\lib\utilities\
-
将压缩包内的arrow_pick_up.png和arrow_pick_down.png文件拷贝到路径:
C:\Program Files\Exelis\IDL84\resource\bitmaps\
-
重启IDL 8.4即可使用。
注:本人是在8.4.1版本下测试的,如果8.4运行有问题,欢迎发邮件说明。谢谢。
标签:颜色,自定义,对话框,COLORS,CUSTOM,关键字,IDL,8.5 来源: https://www.cnblogs.com/enviidl/p/16378169.html