どうしたらいいのでしょうか

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
蜻蛉

どうしたらいいのでしょうか

#1

投稿記事 by 蜻蛉 » 15年前

Microsoft Visual Studio 2008 C++のMFCアプリケーションでプログラムを作成しているのですがうまくいかず困ってます。
自分が作成しているプログラムはウインドウに円を描画し
その円をメニューから開くダイアログのラジオボタンとエディットボックスで背景色と円の外線と内部の色を変えるようにするプログラムです
ラジオボタンで変更したい背景の色を選び、エディットボックスに円の外線と内部のRGB値を入力すると
ウインドウに表示された背景色と円の外線と内部の色を変更できるようにしたいです。

円の描画と背景の設定はc----Viewクラスのc----View関数に

コード:

C----View::C----View()
: b_colR(0)
, b_colG(0)
, b_colB(0)
, in_colR(0)
, in_colG(0)
, in_colB(0)
, out_colR(0)
, out_colG(0)
, out_colB(0)
{
	// TODO: 構築コードをここに追加します。

	//背景色のRGB値の変数
	b_colR = 255;
	b_colG = 255;
	b_colB = 255;

	//円外線色のRGB値の変数
	out_colR = 0;
	out_colG = 0;
	out_colB = 0;

	//円内部色のRGB値の変数
	in_colR = 255;
	in_colG = 255;
	in_colB = 255;
}
このような背景色、円の外線の色、円の内部の色のRGB値を格納する変数を宣言し
次にOnDraw関数で

コード:

void C----View::OnDraw(CDC* pDC)
{
	CrssakuhinDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: この場所にネイティブ データ用の描画コードを追加します。

	//変数の定義
	int x, y; //座標値を保存するための変数
	int point_pos_x = 225; //円心のx座標の変数
	int point_pos_y = 225; //円心のy座標の変数

	//ウィンドウの背景色を設定
	CRect myRect;
	GetClientRect(myRect);//ウィンドウの枠を取り込む
	pDC->FillSolidRect(myRect, RGB(b_colR,b_colG,b_colB));//背景色を設定する

	//ペン型の変数を定義
	CPen  outsidePen;
	CPen* pOldPen; //古いペンの格納先

	//ブラシ型の変数を定義
	CBrush  insideBrush;
	CBrush* pOldBrush; //古いブラシの格納先

	//ペンを作成
	outsidePen.CreatePen(PS_SOLID, 4, RGB(out_colR, out_colG, out_colB));

	//ブラシを作成
	insideBrush.CreateSolidBrush(RGB(in_colR, in_colG, in_colB));

	//ペンとブラシを選び、円を描画
	pOldPen = pDC->SelectObject(&outsidePen);
	pOldBrush = pDC->SelectObject(&insideBrush);
	x = point_pos_x;
	y = point_pos_y;
	pDC->Ellipse(x - 40, y - 40, x + 40, y + 40);

	pDC->SelectObject(pOldPen);//ペンを元に戻す
	outsidePen.DeleteObject();

	pDC->SelectObject(pOldBrush);//ブラシを元に戻す
	insideBrush.DeleteObject();
}
円は円心の座標を保存する変数を作成して
その値をもとに先ほど作成した変数と同じRGBの値ペンとブラシを作成し、ウインドウ内に描画
背景はRGB値を先ほど作成した変数と同じ値にします。

次にダイアログのクラスを作成し、そのクラスにスタティックボックスに入力した値を格納する
out_col変数とin_col変数を作成します。
そして、c----Viewクラスにダイアログの関数を作成してその関数に

コード:

void C----View::OnOpt----()
{
	// TODO: ここにコマンド ハンドラ コードを追加します。
            //ラジオボタン
	if(dlgAnime.DoModal() == IDOK){  //OKボタンが押された時
		    switch(dlgAnime.b_col){  //線の色のラジオボタンの値
			     case 0://白
				     b_colR = 0;
				     b_colG = 0;
				     b_colB = 0;
				     break;
			     case 1://赤
				     b_colR = 255;
				     b_colG = 0;
				     b_colB = 0;
				     break;
			     case 2://緑
				     b_colR = 0;
				     b_colG = 255;
				     b_colB = 0;
				     break;
			     case 3://青
				     b_colR = 0;
				     b_colG = 255;
				     b_colB = 0;
				     break;
		}

                         //エディットボックス
		//円の外線色
		out_colR = dlg----.out_colR;
		out_colG = dlg----.out_colG;
		out_colB = dlg----.out_colB;

		//円の内部色
		in_colR = dlg----.in_colR;
		in_colG = dlg----.in_colG;
		in_colB = dlg----.in_colB;
	}
}
ラジオボタンとエディットボックスを記述。

この状態でコンパイルすると正常にコンパイルできるのですが
実際にメニューからダイアログを開きラジオボタンを選択し、エディットボックスの値を変えても
ウインドウ内の描画された円の外線と内部の色と背景色が変わりません。
変えるにははどうしたらいいのでしょうか。

アバター
bitter_fox
記事: 607
登録日時: 15年前
住所: 大阪府

Re: どうしたらいいのでしょうか

#2

投稿記事 by bitter_fox » 15年前

再描画はしてますでしょうか?

もししてないのであれば、

コード:

ウィンドウインスタンス.InvalidateRect(NULL, TRUE);
と言った風に、InvalidateRect関数をダイアログ終了時に呼んでみてください。

kagerou

Re: どうしたらいいのでしょうか

#3

投稿記事 by kagerou » 15年前

InvalidateRect関数をダイアログ終了時に呼ぶようにしたら変化するようななりました
どうやら、再描画をしていなかったみたいです
ありがとうございます

蜻蛉

Re: どうしたらいいのでしょうか

#4

投稿記事 by 蜻蛉 » 15年前

InvalidateRect関数をダイアログ終了時に呼ぶようにしたら変化しました
どうやら、再描画をしていから変化しなかったようです
質問に答えていただきありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る