質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

gnuplot

gnuplot(ニュープロット)は、2次元や3次元のグラフ作成ができるソフトウェアです。さまざまな数式やデータ集計などのグラフを描写することが可能で、特に2次元グラフを描画する機能は強力です。

Visual Studio

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

Q&A

解決済

1回答

1988閲覧

windows10 64bit Visual Stduio 2017,MFC gnuplotので波形の作成について

BluePi85

総合スコア22

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

gnuplot

gnuplot(ニュープロット)は、2次元や3次元のグラフ作成ができるソフトウェアです。さまざまな数式やデータ集計などのグラフを描写することが可能で、特に2次元グラフを描画する機能は強力です。

Visual Studio

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

0グッド

1クリップ

投稿2018/06/11 12:17

windows10 64bit Visual Stduio 2017,MFCにて、gnuplotを用いて波形描画を試みています。

サイト(リンク内容)を参考にし、sin波形の描画を行いましたが、
下図のようにコマンドプロンプトも合わせて起動されてしまいました。
コマンドプロンプトを起動せず、gnuplotのみ起動させる方法を教えて頂けないでしょうか?

コード void CgnuplotAppDlg::OnBnClickedButton1() { FILE *fp; fp = _popen("C:\gnuplot\bin\gnuplot.exe", "w"); fprintf(fp, "plot sin(x)\n"); fflush(fp); WaitEnter(); _pclose(fp); } void WaitEnter() { // Enterが押されるまで待つ while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_RETURN) == 0);// Enterが離されるまで待つ while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_RETURN) != 0); }

イメージ説明

また、Visual Studiで作成したダイアログ内に、
下図のようにgunuplotで作成したグラフを埋め込む事は可能でしょうか?
イメージ説明
イメージ説明

申し訳ありませんが、
アドバイスを頂けないでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

_popen を使用する限りコマンドプロンプトを非表示にすることはできません。コマンドプロンプトを表示しないようにするためには CreateProcess を直接使用して標準入出力をリダイレクトする必要があります。

画面に表示する部分は結果を画像ファイルとして出力し、それをダイアログに表示するのが簡単で良いと思います。
サンプル画面

コードにすると以下のような感じです。IDC_PICTURE という名前で Picture Control をダイアログに追加しています。

C++

1void CGnuplotTestDlg::OnBnClickedButton1() 2{ 3 SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES) }; 4 HANDLE hreadtmp, hread; 5 CFile stdinput; 6 STARTUPINFO si = { sizeof(STARTUPINFO) }; 7 PROCESS_INFORMATION pi; 8 CStringA command; 9 10 // 標準入力のリダイレクト準備 11 CreatePipe(&hreadtmp, &stdinput.m_hFile, &sa, 0); 12 DuplicateHandle(GetCurrentProcess(), hreadtmp, GetCurrentProcess(), &hread, 0, TRUE, DUPLICATE_SAME_ACCESS); 13 CloseHandle(hreadtmp); 14 15 // コンソール画面なしで gnuplot.exe を実行 16 si.cb = sizeof(STARTUPINFO); 17 si.dwFlags = STARTF_USESTDHANDLES; 18 si.hStdInput = hread; 19 if (!CreateProcess(L"C:\gnuplot\bin\gnuplot.exe", NULL, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) 20 { 21 CloseHandle(hread); 22 return; 23 } 24 CloseHandle(hread); 25 26 // コマンドを送信 27 command = "set terminal pngcairo\n"; 28 stdinput.Write(command, command.GetLength()); 29 command = "plot sin(x)\n"; 30 stdinput.Write(command, command.GetLength()); 31 command = "replot cos(x)\n"; 32 stdinput.Write(command, command.GetLength()); 33 command = "set out 'test.png'\n"; 34 stdinput.Write(command, command.GetLength()); 35 command = "replot\n"; 36 stdinput.Write(command, command.GetLength()); 37 command = "exit\n"; 38 stdinput.Write(command, command.GetLength()); 39 40 WaitForSingleObject(pi.hProcess, INFINITE); 41 CloseHandle(pi.hThread); 42 CloseHandle(pi.hProcess); 43 44 // 出来上がったイメージを読み込む 45 CImage image; 46 image.Load(L"test.png"); 47 48 // ピクチャーコントロールに表示 49 CStatic* picture = reinterpret_cast<CStatic*>(GetDlgItem(IDC_PICTURE)); 50 picture->SetBitmap(image); 51 52 // 不要ファイルを削除 53 DeleteFile(L"test.png"); 54}

Github にサンプルを上げました。
https://github.com/atata0319/teratail130668

投稿2018/06/16 16:33

atata0319

総合スコア881

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

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

BluePi85

2018/07/02 05:57

atata0319様 ご回答、ありがとうございます。 またご返信遅れてしまい、大変申し訳ありません。 Githubにサンプルまで上げて頂き、誠にありがとうございます。 非常に参考になり、また行いたい事も出来ました。 重ねて、この度は誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問