ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-06-15 14:04:19  阅读:213  来源: 互联网

标签:颜色 自定义 对话框 COLORS CUSTOM 关键字 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有