_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/07/02 05:57