65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows Mobile 5 的颜色对话框

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.89/5 (4投票s)

2008 年 11 月 27 日

CPOL

2分钟阅读

viewsIcon

26675

downloadIcon

236

一个使用 Alpha 混合的 Pocket PC 颜色对话框。

引言

我原本打算为我的一个专业项目制作一个颜色对话框,但这个功能最终没有被需要,我只是对颜色对话框应该如何实现有一个初步的想法。我想要一个基于色调的调色板,并想知道为什么我找不到任何像样的免费颜色对话框。也许是因为我没有充分利用 Google,或者是因为移动平台上透明度的固有复杂性。

不过,我找到了一些线索

Alpha 混合来自 Chris Lorton 优秀的 博客

HSL 类是从 geekymonkey 的示例代码对象化的,网址是 geekymonkey。我惊讶地发现不同的 HSL-RGB 转换器会得到不同的结果。这个转换器可以正常工作。

这个颜色对话框并不完美。仍然存在一些微妙的色调滑动(可能因为在移动设备上使用调色板时颜色范围有限)。此外,可能还有其他错误,并且图形设计还可以更好(这不是我的强项),但它应该是一个好的起点。它是为 240 * 300 分辨率设计的,当你切换到水平视图时,一些控件位置值是硬编码的。(我希望有一个视图面板,你可以根据分辨率和方向移动和排列控件)。所以,这是为了让我摆脱束缚... ;)

Using the Code

你可以从测试表单启动对话框。它公开了公共属性(captionfrontcolorbehindcolor),并允许你启动对话框。

在对话框中,你可以通过单击大的色调调色板、单击 RGB 条形图、单色条形图或更改 RGB 框中的值来更改颜色。可以通过单击对话框中相应的控件来交换前景色和背景色。

从调色板和条形图获取颜色是通过简单的 GetPixel 调用完成的。调色板是通过获取当前颜色的 RGB 值的当前色调来创建的。当我们得到它时,我们会将其与由水平白色到透明和垂直黑色到透明图像组合的图像叠加。理论上,从调色板获取颜色不应更改色调。

private void Picker_Paint(object sender, PaintEventArgs e)
{
    if (m_backBuffer != null)
    {
        using (Graphics g = Graphics.FromImage(m_backBuffer))
        {

            g.Clear(this.BackColor);
            IntPtr hdcDest = g.GetHdc();
            if (m_isFore)
            {
                m_hsl.ColorValue = m_FrontColor;
            }
            else
            {
                m_hsl.ColorValue = m_BehindColor;
            }
            m_hsl.Saturation = 1;
            m_hsl.Level = 0.5;
            g.FillRectangle(new SolidBrush(m_hsl.ColorValue), m_paletteRectangle);

            Rectangle plotRect = new Rectangle(m_paletteRectangle.X,
                m_paletteRectangle.Y, m_paletteRectangle.Width + m_paletteRectangle.X,
                m_paletteRectangle.Height + m_paletteRectangle.Y);
            m_imagingImage.Draw(hdcDest, ref plotRect, IntPtr.Zero);
            g.ReleaseHdc(hdcDest);
        }
        e.Graphics.DrawImage(m_backBuffer, 0, 0);
    }
    else
        e.Graphics.Clear(this.BackColor);
    frontPictureBox.BackColor = m_FrontColor;
    backPictureBox.BackColor = m_BehindColor;
}

图像叠加在 Picker_Paint 中完成,函数声明在 IImagingFactory 中,HSL 转换在名为 HSL 的文件中完成。

历史

2008-11-25 发布第一个版本。

© . All rights reserved.