概要

色を選択するコモンダイアログを使用するプログラムです。
色を選択するコモンダイアログはChoseColorを呼び出すことにより表示できます。
ChoseColorは、動作を指定するためにCHOSECOLOR 構造体を初期化する必要がありますが、煩雑なので、chosecolor関数を作成して、親ウィンドウのハンドル、色の初期値、追加色を指定できるようにしています。

上図はWindows 7で実行した状態です。
以下、動作を説明する図はWindows 7で実行した状態を表しています。

テスト環境

コンパイラ

Visual C++ 2008 Standard 32/64bit
Visual C++ 2013 Express 32/64bit

実行環境

Windows 8.1 Enterprise 64bit
Windows 7 EnterPrise Service Pack 1 64bit
Windows Vista Ultimate Service Pack 2 32bit
Windows XP Professional Service Pack 3 32bit

プログラムソースの概要

_tWinMain関数

Windowsから最初に_tWinMain関数が呼び出されます。
chosecolor関数を呼び出して色を取得します。

chosecolor

CHOSECOLOR構造体に初期設定をしてからChoseColorを呼び出します。
コモンダイアログで色が選択された場合は選択された色を、色が選択されていない場合は、初期値を返します。
CHOSECOLOR構造体はメンバーが多いためZeroMemory APIで全部クリアしてから必要なメンバーのみ設定します。
CHOSECOLOR構造体の主要メンバーは以下の通りです。

lStructSizeメンバー

CHOSECOLOR構造体のサイズを指定します。sizeofが使用できます。

hwndOwnerメンバー

ダイアログボックスの親ウィンドウを指定します。親ウィンドウがない場合はNULLを指定します。

lpCustColorsメンバー

16個のCOLORREFを持つ配列へのポインタを指定します。これは追加された色の保存に使われます。

gbResultメンバー

色の初期値を指定します。
FlagsメンバーでCC_RGBINITが設定されているとこのメンバー有効となります。

Flagsメンバー

ダイアログボックスの動作を設定します。
CC_RGBINIT
色の初期値を有効にします。

プログラムソース


// ChooseColorコモンダイアログボックスサンプル
// Visual C++ 2013 32/64bit

#include <windows.h>
//#include <stdio.h>
#include <tchar.h>

COLORREF choosecolor(HWND hWnd, COLORREF cr, COLORREF add_cr[16]);

//      追加された色

COLORREF add_color[] = {
        RGB(0, 0, 0), //0黒
        RGB(0, 0, 255), //1青
        RGB(0, 128, 0), //2緑青
        RGB(0, 255, 0), //3緑
        RGB(192, 0, 192), //4明るい紫
        RGB(255, 0, 0), //5赤
        RGB(255, 255, 0), //6黄色
        RGB(255, 255, 255), //7白
        RGB(0, 0, 128), //8濃い青
        RGB(0, 128, 128), //9濃い緑青
        RGB(0, 128, 0), //10濃い緑
        RGB(128, 0, 128), //11濃い明るい紫
        RGB(128, 0, 0), //12濃い赤
        RGB(192, 192, 0), //13濃い黄色
        RGB(192, 192, 192), //14明るい灰色
        RGB(128, 128, 128)  //15暗い灰色
};


// 最初に呼び出される関数

int WINAPI _tWinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, TCHAR* lpsCmdLine, int nCmdShow){
        TCHAR buf[32];

        COLORREF cr = RGB(0, 0, 0);     //      選択された色
        cr = choosecolor(0, cr, add_color);
        int r = GetRValue(cr);
        int g = GetGValue(cr);
        int b = GetBValue(cr);
        _stprintf_s(buf, sizeof(buf) / sizeof(TCHAR), TEXT("赤緑青 0x%0.2x%0.2x%0.2x"), r, g, b);
        MessageBox(0, buf, _TEXT("選択された色"), MB_OK);
        return 0;
}

COLORREF choosecolor(HWND hWnd, COLORREF cr, COLORREF dwCustColors[16]){
        CHOOSECOLOR cc;
        ZeroMemory(&cc, sizeof(CHOOSECOLOR));
        cc.lStructSize = sizeof(CHOOSECOLOR);
        cc.hwndOwner = hWnd;
        cc.lpCustColors = dwCustColors;
        cc.rgbResult = cr;
        cc.Flags = CC_RGBINIT;
        if (ChooseColor(&cc)) {
                cr = cc.rgbResult;
        }
        return cr;
}

ソースファイルと実行ファイルのダウンロード