🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

824閲覧

数列が記載されたファイルを読み込み、円を数字の場所に複数個書きたい。

wing

総合スコア20

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/11/23 04:18

編集2019/11/26 08:42

前提・実現したいこと

visualstdio2015で少数が縦に列状に並んでいるファイルを読み込んで円を数時の場所に複数表示させるプログラムを作っています。
読み込むファイルに数列があり、それを読み込んで、させたいのですが、
円が一個しか出で来ないので、これをどうにかしたいです。
エラー
式にはpointer to objectが必要です×4
エラー C2109 配列または、ポインターでない変数に添字が使われました。

該当のソースコード

C++
void Ccxp00Dlg::OnBnClickedRead()
{
int x[150], y[150]; // データ用変数

CWnd *cwdPict = GetDlgItem(IDC_PICTURE); // ピクチャボックスの ID を取得 CDC *dcPict = cwdPict->GetDC(); // デバイス・コンテキストの取得 CPen myPen; myPen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); // 赤色を指定 dcPict->SelectObject(&myPen); //COLORREF color = RGB(0, 0, 0); // 色(黒)の指定 CFileDialog cfdFileDlg(TRUE, "txt", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Text Files (*.txt)|*.txt|All files (*.*)|*.*||", this); if (cfdFileDlg.DoModal() == IDOK) { FILE *fp; fp = fopen(cfdFileDlg.GetPathName(), "r"); double x; double y; for (int n = 0; n < 151; n++) { fscanf(fp, "%lf,%lf", &x, &y); fclose(fp); dcPict->Ellipse((int)x[n]- 5, (int)y[n] - 5,(int)x[n]+5, (int)y[n]+ 5); } } myPen.DeleteObject();

試したこと
ネットで、関数の使いかたを調べた

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

MFCでダイアログの上にピクチャボックスを置いてそこに描画しようという感じでしょうか.
現状のコードだと再描画に対応できていないので,ボタンのイベントハンドラではファイル読込処理だけを行い,
描画処理に関してはしかるべき箇所に実装を移動すると良いでしょう.

とりあえず,座標データ保持用の変数:例えばdouble m_X[151]double m_Y[151]をダイアログのメンバにでもしておいて,
ボタンのイベントハンドラではこのメンバにファイル内容を読み込むようにすればどうでしょうか.

void Ccxp00Dlg::OnBnClickedRead() { //(ファイルダイアログの部分は省略) //ファイル読込部分.(エラー処理などは適宜やってください) FILE *fp = fopen(cfdFileDlg.GetPathName(), "r"); for (int n = 0; n < 151; n++) { fscanf(fp, "%lf,%lf", m_X+n, m_Y+n ); //読み込んだ値はメンバ変数X[]とY[]に持つ } fclose(fp); //ピクチャコントロールの再描画を要求 GetDlgItem(IDC_PICTURE)->Invalidate(); }

描画処理に関してはピクチャボックスをオーナードローに設定して,
ダイアログの OnDrawItem() ハンドラ内に書けばよいかと思います.

//動作確認とかしてませんが,描画はだいたいこんな感じでしょうか. void Ccxp00Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { if( nIDCtrl == IDC_PICTURE ) {//ピクチャボックスの描画 //(ペンの設定とかは省略) for (int n = 0; n < 151; n++) { Ellipse( lpDrawItemStruct->hDC, (int)m_X[n]-5, (int)m_Y[n]-5, (int)m_X[n]+5, (int)m_Y[n]+5 ); } } else {//※デフォルトの処理に流す CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct); } }

投稿2019/11/26 09:16

編集2019/11/26 09:18
fana

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wing

2019/11/26 14:43

回答ありがとうございます。オーナードローの設定について詳しく教えてください。
fana

2019/11/27 01:24

特定のキーワードが得られた時点でまずは検索なりしてみてはいかがでしょう. 「MFC オーナードロー」とか何とかで検索すれば必要な情報は丸ごと見つかるかと思います. 自前で描画処理を書きたいコントロールのプロパティのどっかの項目で「オーナードロー」を選択し,そのコントロールの親(今回はダイアログ)のWM_DRAW_ITEMメッセージハンドラに描画コードを実装してやる,的な話です.
guest

0

ベストアンサー

fclose(fp); が for文の中にあるからでしょう。
for文の後に移動してみてください。

double x; double y; を double x[151], y[151]; に変更してください。
int x[150], y[150]; は不要です。

投稿2019/11/23 05:31

編集2019/11/23 05:39
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wing

2019/11/23 05:50

ありがとうございます。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問