色を反転させる Xor Color - C#

色(Color)を反転させるメソッドがないので自分で作ってみました。

二つできたので一応処理速度も比較してみましたが、違いはないのでお好みで。
必要ならAlpha値も追加すべきですが、Alpha値は反転させる対象にしない方が無難ですね。

ちなみに「0xff」は255、「0xffffff」は16777215でも何の問題もない。

Sample1

Color XorColor1(Color color)
{
    return Color.FromArgb(
        color.R ^ 0xff,
        color.G ^ 0xff,
        color.B ^ 0xff);
}

Sample2

Color XorColor2(Color color)
{
    return Color.FromArgb(
        (byte)~color.R,
        (byte)~color.G,
        (byte)~color.B);
}


他にも絶対値を返すMath.absを使用して
Color XorColor3(Color color)
{
Color.FromArgb(
        Math.Abs(color.R - 0xff),
        Math.Abs(color.G - 0xff),
        Math.Abs(color.B - 0xff));
}
このように書いてみたが、あまりスマートに感じられなかったので個人的な感覚で却下。
一応これでも可能です。


シンプルな形で。

Sample4

Color XorColor4(Color color)
{
    return Color.FromArgb(
        0xff - color.R,
        0xff - color.G,
        0xff - color.B);
}


Sample5

Color XorColor5(Color color)
{
    return Color.FromArgb(color.ToArgb() ^ 0xffffff);
}

ProcessCmdKeyでトラップされる順番 - C#

コントロールでキーストロークをトラップ方法として、ProcessCmdKeyをオーバーライドする方法が紹介されていますが、フォームとそのフォームに置かれているコントロールではどちらが先にキーストロークをトラップするのか。

結論から言えばフォームに配置されたコントロールが先にトラップします。
当たり前ですが、フォーカスを取得できるコントロールのみがトラップ可能です。

KeyDownイベントよりも先に発生します。

戻り値にtrueを返すことでKeyDownイベントでトラップされなくなります。
また、それより上階層のコントロール(フォームなど)にもトラップされなくなります。

using System.Windows.Forms;
using System.Text;

namespace ShortCutKey_Capture_Sample
{
    class xTextBox : TextBox
    {
        private bool fastFlag;
        public xTextBox()
        {
            fastFlag = false;
            this.KeyDown +=new KeyEventHandler(xTextBox_KeyDown);
        }

        void xTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            ShowFaster("KeyDown", e.KeyData);
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            const int WM_KEYDOWN = 0x100;
            const int WM_SYSKEYDOWN = 0x104;

            if ((msg.Msg == WM_KEYDOWN) ||
                (msg.Msg == WM_SYSKEYDOWN))
            {
                ShowFaster("ProcessCmdKey", keyData);
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        void ShowFaster(string methodName, Keys keyData)
        {
            switch (keyData)
            {
                case Keys.Control | Keys.N:
                    if (fastFlag)
                    {
                        fastFlag = false;
                    }
                    else
                    {
                        fastFlag = true;
                        this.Text = methodName + " Captured.";
                    }
                    break;
            }
        }
    }
}


キーの組み合わせはこのような書き方で取得することができます。
switch (e.KeyData)
{
    case Keys.Control | Keys.N:
        this.Text = "KeyDown <CTRL> + n Captured";
        break;
    case Keys.Shift | Keys.N:
        this.Text = "<SHIFT> + n Captured";
        break;
    case Keys.Alt | Keys.N:
        this.Text = "<ALT> + n Captured";
        break;
    case Keys.Alt | Keys.Control | Keys.N:
        this.Text = "<ALT> + <CTRL> + n Captured";
        break;
}

Sony Style(ソニースタイル)
デル株式会社

Recent Posts