人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VC++6に関する質問です。
ChooseColor(&cc)で色設定のダイアログを表示しました。
基本色を選択することもできるし、一見正常に動作しているように
思えたのですが、色を選択し、『色の追加』を押しても
『作成した色』に情報が反映されません。

どのようにすれば
選択した色を『作成した色』に追加することができますか?
教えていただきたく宜しくお願いします。


[実際のコーディング内容]
static COLORREF cr = RGB(255, 255, 255);
CHOOSECOLOR cc;
ZeroMemory(&cc,sizeof(CHOOSECOLOR));
cc.lStructSize = sizeof(CHOOSECOLOR);
cc.hwndOwner =(HWND ) this->m_hWnd;
cc.lpCustColors = dwCustColors;
cc.rgbResult = cr;
cc.Flags = CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT;

// カラーダイアログを表示
if(ChooseColor(&cc)){

}


※なお、先ほど
ChooseColor(&cc)関数を呼び出す前に

cc.Flags = CC_ANYCOLOR

として呼び出したとき、作成した色の左上の一個だけ、色を追加
できるようになりました。
理由はわかりませんが他のフラグを追加すると、なぜかまた登録できなくなりました。

1181196973
●拡大する

●質問者: harunoharuno
●カテゴリ:コンピュータ インターネット
✍キーワード:CC Cr RGB VC++ カラー
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● じゃっくそにっく
●100ポイント ベストアンサー

こんにちは。

ポイントとしては、

色選択ダイアログのカスタム色は、

CHOOSECOLOR構造体の、lpCustColorsプロパティに設定する、

DWORDの16個の配列に保存されます。

呼び出し関数内で値を保持するためには、

staticで宣言、もしくは、

値を保持できる変数を外から渡さなければ

なければなりません。

および、

機能を持つ呼び出し関数を書くとこのような感じです。

サンプル(例: ?の機能でカスタム色を肌色系で指定したとき)

[f:id:jack_sonic:20070607200743j:image]

ヘッダファイル DialogFunc.h

// DialogFunc.h
#pragma once

// カラー選択ダイアログ表示関数
// (オーナーウィンドウ, 結果格納COLORREF, 初期カラー, 初期カラーを使うかどうか)
BOOL ColorDlg(HWND hWnd, COLORREF* p_crResult, 
 COLORREF crFirst, BOOL bUseFirstColor, DWORD dwSpCustomColors[] );

ソースファイル DialogFunc.cpp

#include "StdAfx.h" // VC++のときインクルード
///////////////////////////////////////////////////////////
//
//ColorDlg() カラー選択ダイアログ関数
//カスタムカラー配列はstaticで保存されます。
//@param hWnd: オーナーウィンドウ
//@param p_crResult:結果を受け取るCOLORREFのポインタ 
//@paramcrFirst: 初期選択色
//@parambUserFirstColor: 初期選択色を使うかどうか
//@param dwSpCustomColors[] 
//: カスタムカラー配列を独自に指定する場合(NULL: デフォルト保存)
//@return TRUE:選択 , FALSE :キャンセル
//
BOOL ColorDlg(HWND hWnd, COLORREF* p_crResult, 
 COLORREF crFirst, BOOL bUseFirstColor, DWORD dwSpCustomColors[] )
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

// CHOOSECOLOR構造体定義
CHOOSECOLOR cc;
// カスタムカラーボックスのデータ配列定義
// 16個のCOLORREF変数の配列 ( staticで宣言すること)
static DWORD dwDefaultCustomColors[16]; 
// COLORREF構造体定義
static COLORREF crDefaultFirst = RGB(255,255,255);

// CHOOSECOLOR構造体クリア
ZeroMemory(&cc,sizeof(CHOOSECOLOR));
// CHOOSECOLOR構造体サイズ設定
cc.lStructSize = sizeof(CHOOSECOLOR);
// オーナーウィンドウ設定
cc.hwndOwner =(HWND ) hWnd;
// カスタムカラーボックスのデータ配列設定
cc.lpCustColors = ( dwSpCustomColors != NULL)? dwSpCustomColors: dwDefaultCustomColors;

// 初期選択色
cc.rgbResult = (bUseFirstColor == TRUE)? crFirst: crDefaultFirst;
// フラグ設定
// CC_FULLOPEN : カスタムカラー設定表示
// CC_RGBINIT : rgbResultの色を初期選択
// CC_ANYCOLOR : 使用可能な全ての色を表示する
cc.Flags = CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT;

// カラーダイアログを表示
if(ChooseColor(&cc)){
*p_crResult = cc.rgbResult;
return TRUE;
}
return FALSE;
}

使い方

呼び出したいソースファイルの先頭で、

// インクルード
#include "DialogFunc.h"

と宣言してインクルードし、

ダイアログクラスCColorSampleDialogで、

ボタンおよびハンドラが2個あるとして、(OnButton1,OnButton2)

ボタン1でカスタム色を保持する色選択ダイアログを表示するなら、

void CColorSampleDlg::OnButton1() 
{
COLORREF crSelected;
COLORREF crFirst = RGB(133,133,122);
// 最初の色を指定して呼び出し
if( ColorDlg( this->m_hWnd, &crSelected, crFirst ,TRUE,NULL ) )
{
// 色が選択されたとき
}

}

ボタン2でカスタム色を最初から指定して呼び出すなら

void CColorSampleDlg::OnButton2() 
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
COLORREF crSelected;
COLORREF crFirst = RGB(133,133,122);
// カスタムカラー配列を最初から独自指定する場合
static DWORD dwCustomColor[16];
static int first = 1;
// 最初の1回だけ実行
if(first == 1)
{
for(int i=0; i < 16 ; i++)
{
// 肌色系の階のカスタムカラー配列にする
dwCustomColor[i] = RGB(255, 150+ i*5, 100 + i* 5);
}

first =2;
}
// カスタムカラー配列を独自指定して呼び出し
if( ColorDlg( this->m_hWnd, &crSelected, crFirst ,TRUE, dwCustomColor ) )
{

}
}

というような感じで使います。


サンプル実行ファイル+プロジェクトファイルはこちらです。

VC++/カスタム色を使った色選択ダイアログの表示 - 情報処理研究所 ジャックズラボ(jack's Lab)

◎質問者からの返答

いつも回答してありがとうございます。

早速教えていただいた方法を拝見し、

プログラムに組み込んでみました。

jack_sonic さんに教えていただいた

コーディングそのものだと、色の追加も正常に

に出来たのですが、

dwCustomColor[i] = RGB(255, 150+ i*5, 100 + i* 5);

dwCustomColor[i] = RGB(255, 255, 255);

の設定にし試したところ、以下の現象を確認しました。

・色の設定ダイアログを表示後、作成した色を選択すると、

右側のカラーパレットから色を選んでも『色|純色』

が変更されず、『色の追加』を押しても『作成した色』に反映されない。

これは何故なのでしょうか?

出来ればはじめの色は白にしたいと思っているのですが

無理なのでしょうか?

再度回答いただきたく宜しくお願いします。

[追記]

dwCustomColor[i] = RGB( 255, 255,230+i);

でやっても、『色の追加』を押しても『作成した色』に反映されない現象が発生しました。

これは何故なのでしょうか?jack_sonic

さんが初期設定の色として指定した

ものにルールがあるのならそれに付いても教えていただきたく宜しくお願いします。


2 ● じゃっくそにっく
●100ポイント

>harunoharuno様 への返信

どうも、1の回答をしたjack_sonicです。

白にした場合は、プログラムのことではなく、

色選択ダイアログの操作上の注意点があります。

ちょっとわかりにくいのですが、

色選択ダイアログは、右側の縦の「明るさスライダー」と、

ポインタによって色合いを選択する「色合いパレット」

の2つによって色彩情報値を決定するという仕様を持っています。

白色が選ばれている状態だと、明るさ値が最大に設定されます。

色彩の法則で、明るさが最大の色=白色だけであるという法則があるために、

明るさスライダーが最大値にポイントされている状態ですと、

色合いパレットのポインタを操作しても色が変わることが

できません。

色選択ダイアログの仕様で、

白色から色を変える場合は、明るさスライダーを先に下げてから

操作することで色を変えられます。

図解いたします。

白色時の注意点

[f:id:jack_sonic:20070607222729j:image]


違うことでしたらすみません。また状況を教えてください。

◎質問者からの返答

わーーーーーーっ。。。

驚きです。明るさが原因だったなんて、、、

試してみましたが、デフォルトの色が白でも

問題なく色の追加ができました。

いろいろ試していたけど、

ここが原因だったなんて、、、、、脱力しました。

でも、わかって救われました。ありがとうございます

願わくば、デフォルトを白にして

明るさの初期設定を低めにすることが出来たら嬉しいですが、

それは出来ませんよね?

[追記]

あっすいません。

あせってしまい訳の解らないこと言ってしまいました。

デフォルトの明るさは中間位置になっていますね。

明るい色を選択した後に明るさが最大になるようなので

これが嫌ならダイアログを作り直すしかなさそう・・・。

でもそこまでするものでもないし、標準的なものが一番よいし

カラーダイアログの仕様として理解しておきます。

何度も助けていただき本当に重ねて御礼いたしますm(_ _)m

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ