山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他ChoceColorにより色を選択する
概要
色を選択するコモンダイアログを使用するプログラムです。
色を選択するコモンダイアログはChoseColorを呼び出すことにより表示できます。
ChoseColorは、動作を指定するためにCHOSECOLOR 構造体を初期化する必要がありますが、煩雑なので、chosecolor関数を作成して、親ウィンドウのハンドル、色の初期値、追加色を指定できるようにしています。
上図はWindows 7で実行した状態です。
以下、動作を説明する図はWindows 7で実行した状態を表しています。
テスト環境
コンパイラ
Visual C++ 2008 Standard 32/64bitVisual C++ 2013 Express 32/64bit
実行環境
Windows 8.1 Enterprise 64bitWindows 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;
}
ソースファイルと実行ファイルのダウンロード
Copyright (C) 2012 山本ワールド All Rights Reserved.