ピクチャーボックスの色が消える – プログラミング – Home

ピクチャーボックスの色が消える
 
通知
すべてクリア

[解決済] ピクチャーボックスの色が消える


ちゃっぴー
 ちゃっぴー
(@ちゃっぴー)
ゲスト
結合: 22年前
投稿: 20
Topic starter  

初心者的な質問で申し訳ないのですが、
よくわからないのでご教授お願いします。

まず、1つのダイアログボックスがありまして、
グループボックスの中に2つのピクチャーボックスがあります。

ピクチャーボックス1をクリックでカラーダイアログ(ChooseColor)を出してから
色を選択し、OKを押すとピクチャーボックス1が選択した色になる。

のような感じにしたいのですが、

1.色は変わるが、そのダイアログの上に何かのフォームを置くと消えてしまう。

2.2つのピクチャーボックスの処理を1つにできないか?
  (下のソースだとDlgColor::OnColor1()のソースだけにしたい。DlgColor::OnColor2()を
作らないようにしたい)

3.グループボックスを動かすと、ピクチャーボックスは動かない。
  VBの場合、一緒に移動すると思うのですが、VCd一緒に移動できたらそのやり方を教えて
ください。

void DlgColor::OnColor1()
{
COLORREF CustColors[16];
CHOOSECOLOR cc;
int r;
ZeroMemory(CustColors, sizeof(CustColors));
ZeroMemory(&cc, sizeof(cc));
cc.lStructSize = sizeof(cc);
cc.Flags = CC_ANYCOLOR;
cc.lpCustColors = CustColors;
cc.rgbResult = RGB(0,0,0);

r = ChooseColor(&cc);
if (r) {
CWnd* myPICT=GetDlgItem(IDC_COLOR1);
CClientDC myDC(myPICT);
CRect myRECT;
myPICT->GetClientRect(myRECT);

myDC.FillSolidRect(myRECT , cc.rgbResult);
}
}

環境はMFC Win200 SP5です。よろしくお願いします。


引用未解決
トピックタグ
ひろぴー
 ひろぴー
(@ひろぴー)
ゲスト
結合: 22年前
投稿: 182
 

> 1.色は変わるが、そのダイアログの上に何かのフォームを置くと消えてしまう。
OnPaint()内でFillSolidRect()をやってみたらどうでしょう?

> 2.2つのピクチャーボックスの処理を1つにできないか?
同じ関数(今の場合OnColor1())を呼び出すようにメッセージマップを変更すればよいと思い
ます。
クリックされたマウスの位置で GetDlgItem() のIDをかえる等すれば良いでしょう。

または、クリックされた時に呼び出される関数は別にするが、同じ処理の関数を呼び出すように
すると良いのではないでしょうか?この時はIDを引数にする等してどちらのピクチャーボックス
がクリックされたか判断すればOKですね。

> 3.グループボックスを動かすと、ピクチャーボックスは動かない。
これはリソースエディタの時ですよね?
Shiftを押しながら複数選択すると一緒に動かす事が出来ますよ。


返信引用
ちゃっぴー
 ちゃっぴー
(@ちゃっぴー)
ゲスト
結合: 22年前
投稿: 20
Topic starter  

お返事ありがとうございます。

助言の通りでできそうですのでやってみたいと思います。
感謝!


返信引用
ちゃっぴー
 ちゃっぴー
(@ちゃっぴー)
ゲスト
結合: 22年前
投稿: 20
Topic starter  

ご教授の通りにOnPaintでFillSolidRectを呼ぶようにしたのですが、
色がつかなくなってしまいました。
何が悪いのか検討がつきません。
ご指摘頂けたらよろしくお願いします。

void DlgColor::OnColor1()
{
ColorSet(IDC_COLOR1);
}

void DlgColor::OnColor2()
{
ColorSet(IDC_COLOR2);
}

void DlgColor::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト

CWnd* myPICT=GetDlgItem(IDC_COLOR1);
CClientDC myDC(myPICT);
CRect myRECT;
myPICT->GetClientRect(myRECT);
myDC.FillSolidRect(myRECT , Color1);
TRACE(描画: %d\n, Color1);

}

void DlgColor::ColorSet(int index)
{
COLORREF CustColors[16];
CHOOSECOLOR cc;
int r;
ZeroMemory(CustColors, sizeof(CustColors));
ZeroMemory(&cc, sizeof(cc));
cc.lStructSize = sizeof(cc);
cc.Flags = CC_ANYCOLOR;
cc.lpCustColors = CustColors;
cc.rgbResult = RGB(0,0,0);

r = ChooseColor(&cc);
if (r) {
if(index == IDC_COLOR1) Color1 = cc.rgbResult;
TRACE(色: %d\n, Color1);
}
}


返信引用
ちゃっぴー
 ちゃっぴー
(@ちゃっぴー)
ゲスト
結合: 22年前
投稿: 20
Topic starter  

ちなみにColor1のみ試しています。

TRACE(色: %d\n, Color1);
  と
TRACE(描画: %d\n, Color1);

の部分は同じ値になってます。

DlgColor::OnPaint()がおかしいと思うのですが・・


返信引用
ちゃっぴー
 ちゃっぴー
(@ちゃっぴー)
ゲスト
結合: 22年前
投稿: 20
Topic starter  

ピクチャーボックスのタイプを
 四角形→フレーム
にしたら直りました。

おさがわせしました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました