本文对早期实现的渐变颜色选择器进行了修订,修订的动机是读者对早期实现的评论。改动仅限于用户界面组件的定位以及渐变面板和按钮面板的实现。有关细节,请参阅原始文章。
当选择起始颜色或结束颜色时,调用fill_gradient_PAN
方法。
此方法确保已选择起始和结束颜色。如果是这样,该方法执行以下操作:
bool fill_gradient_PAN() {
if (have_end_color && have_start_color) {
gradient_PAN.Visible = true;
gradient_PAN.Invalidate();
number_of_colors_LAB.Visible = true;
number_of_colors_NUD.Value = number_of_colors;
number_of_colors_NUD.Visible = true;
generate_BUT.Visible = true;
}
return true;
}
渐变面板具有PAN_OnPaint
事件处理程序。
void PAN_OnPaint(object sender, PaintEventArgs e) {
base.OnPaint(e);
e.Graphics.FillRectangle(
new LinearGradientBrush(
gradient_PAN.ClientRectangle,
start_color,
end_color,
0.0F),
gradient_PAN.ClientRectangle);
}
在这次修订中,渐变面板的左侧与起始颜色按钮的水平中心对齐,右侧与结束颜色按钮的水平中心对齐。颜色数量标签和数字上下控制已移至起始和结束颜色按钮之间的中间位置。
当点击“生成”按钮时,工具的GUI大部分将被渲染。在大多数情况下,这涉及到使各种对象可见。然而,生成按钮面板更为复杂。
bool fill_button_PAN() {
int right_most = 0;
int spacing = 0;
int top = 2;
colors.Clear();
colors = get_linear_gradient_colors(start_color, end_color, number_of_colors);
foreach (Control control in button_PAN.Controls) {
if (control is Button) {
control.Click -= new EventHandler(gradient_BUT_Click);
}
}
button_PAN.Controls.Clear();
buttons.Clear();
spacing = (button_PAN.Size.Width - (BUTTON_WIDTH * number_of_colors)) / (number_of_colors - 1);
for (int i = 0; i < number_of_colors; i++) {
Button button = new Button();
int left = (i * (spacing + BUTTON_WIDTH));
button.FlatStyle = FlatStyle.Popup;
button.Location = new Point(left, top);
button.Size = BUTTON_SIZE;
button.Click += new EventHandler(gradient_BUT_Click);
right_most = button.Location.X + button.Size.Width;
button.BackColor = colors[i];
button.UseVisualStyleBackColor = false;
buttons.Add(button);
}
if (right_most < (button_PAN.Size.Width - EPSILON)) {
int pixels = 1;
int start = 0;
start = buttons.Count - (button_PAN.Size.Width - right_most);
for (int i = start; i < buttons.Count; i++) {
Point location = buttons[i].Location;
location.X += pixels++;
buttons[i].Location = location;
}
}
for (int i = 0; i < buttons.Count; i++) {
Button button = buttons[i];
button_PAN.Controls.Add(button);
}
button_PAN.Visible = true;
reset_BUT.Visible = true;
copy_format_GB.Visible = true;
ascending_PB.Visible = true;
copy_left_to_right_BUT.Visible = true;
descending_PB.Visible = true;
copy_right_to_left_BUT.Visible = true;
return true;
}
在fill_button_PAN
中的主要变化是消除了依赖于渐变面板内容来确定按钮面板中按钮的背景颜色。为此,调用get_linear_gradient_colors
方法来填充颜色列表,其成员将被分配给每个按钮作为其背景颜色。
LinearGradientBrush