初心者的な質問で申し訳ないのですが、
よくわからないのでご教授お願いします。
まず、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です。よろしくお願いします。
> 1.色は変わるが、そのダイアログの上に何かのフォームを置くと消えてしまう。
OnPaint()内でFillSolidRect()をやってみたらどうでしょう?
> 2.2つのピクチャーボックスの処理を1つにできないか?
同じ関数(今の場合OnColor1())を呼び出すようにメッセージマップを変更すればよいと思い
ます。
クリックされたマウスの位置で GetDlgItem() のIDをかえる等すれば良いでしょう。
または、クリックされた時に呼び出される関数は別にするが、同じ処理の関数を呼び出すように
すると良いのではないでしょうか?この時はIDを引数にする等してどちらのピクチャーボックス
がクリックされたか判断すればOKですね。
> 3.グループボックスを動かすと、ピクチャーボックスは動かない。
これはリソースエディタの時ですよね?
Shiftを押しながら複数選択すると一緒に動かす事が出来ますよ。
お返事ありがとうございます。
助言の通りでできそうですのでやってみたいと思います。
感謝!
ご教授の通りに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);
}
}
ちなみにColor1のみ試しています。
TRACE(色: %d\n, Color1);
と
TRACE(描画: %d\n, Color1);
の部分は同じ値になってます。
DlgColor::OnPaint()がおかしいと思うのですが・・
ピクチャーボックスのタイプを
四角形→フレーム
にしたら直りました。
おさがわせしました。