Skip to content

Instantly share code, notes, and snippets.

@hirosof
Created September 9, 2014 17:20
Show Gist options
  • Save hirosof/b2b9b8d1ab161be0f687 to your computer and use it in GitHub Desktop.
Save hirosof/b2b9b8d1ab161be0f687 to your computer and use it in GitHub Desktop.
/*----------------------------------------------------------------------------
プログラム名:HSConsoleRedirect
バージョン:0.0.3.0
プログラム概要:
開発言語:Microsoft Visual C++ 2013
統合開発環境:Microsoft Visual Studio 2013 Ultimate Edition
開発開始日:
最終更新日:
-------------------------------------------------------------------------------
更新日一覧
2014/09/07・・・UI構成①
2014/09/08・・・UI構成②
2014/09/09・・・UI構成③
--------------------------------------------------------------------------------
*/
//インクルード
#include <windows.h>
#include <Shlwapi.h>
#include <Shobjidl.h>
#include "CHSPipe.h" //自作パイプ関数
#include "ControlFunc.h" //コントロール
#include "SupportFunc.h"
#include "resource.h"
#include "Lib/HSVersionInfoDlg.h"
#pragma comment(lib,"Shlwapi.lib")
#pragma comment(lib,"HSVersionInfoDlg.lib")
//マニフェスト登録
#pragma comment(linker,"\"/manifestdependency:type='win32' " \
"name='Microsoft.Windows.Common-Controls' " \
"version='6.0.0.0' " \
"processorArchitecture='*' " \
"publicKeyToken='6595b64144ccf1df' " \
"language='*'\"")
//プロトタイプ
ATOM RegistWindowClass(HINSTANCE); /* ウィンドウクラスの登録 */
BOOL CreateMainWindow(HINSTANCE, int); /* ウィンドウの作成 */
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp); /* ウィンドウプロシージャー */
BOOL ChooseExecuteFileDialog(HWND hParent, wchar_t *lpszFileName);
//マクロ部
#define PRONAME "HSConsoleRedirect" //プログラム名
#define PROVER "0.0.3.0" //プログラムバージョン
#define PRONAME_TXT TEXT(PRONAME) //プログラム名(テキスト)
#define PROVER_TXT TEXT(PROVER) //プログラムバージョン(テキスト)
//CMID(Control Menu ID)
#define CMID_CHOOSEEXECUTEFILE 100
#define CMID_CHOOSEOPENTEXTFILE 101
#define CMID_STDIN_DIRECTINPUT 102
#define CMID_CHOOSESAVETEXTFILE 103
#define CMID_SHOWSTDOUTDATA 104
#define CMID_EXECUTEPRPOCESS 105
#define CMID_SAVESETTINGS 106
#define CMID_LOADSETTINGS 107
//定数部
const SIZE WindowClientSize = { 640, 555 };
const bool WindowSizeChangeByUserFlag = false;
const COLORREF WindowBackgroundColor = RGB(240, 240, 240);
//グローバル変数部
TCHAR szClassName[] = PRONAME_TXT; //ウィンドウクラス名
HINSTANCE hInstance = NULL;
/*
ターゲット実行ファイル
*/
namespace HSCR_Target {
//変数
HWND hGroupBox, hLabelExecute, hLabelExecuteParam;
HWND hTextBoxExecuteFilePath, hTextBoxExecuteParam;
HWND hButtonChooseExecuteFile;
WNDPROC GroupBoxBaseWndProc = NULL;
//関数
BOOL ChooseTargetFile(HWND hParent);
BOOL SetupControls(HWND hParent, HFONT hFont, HFONT hChildFont);
BOOL SetSubClass(void);
BOOL UnsetSubClass(void);
LRESULT CALLBACK WndProcGroupBox(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
}
/*
stdin用
*/
namespace HSCR_ForStdIn {
//変数
HWND hGroupBox;
HWND hCheckBox_Enable;
HWND hRadioBox_FromFile;
HWND hRadioBox_FromDirectInput;
HWND hTextBoxTextFilePath, hButtonChooseTextFile, hButtonToDirectInput;
WNDPROC GroupBoxBaseWndProc = NULL;
char *lpszStdinString = nullptr;
BOOL ChooseStdinTextFile(HWND hParent);
void SetSubItemState(void);
//関数
BOOL SetupControls(HWND hParent, HFONT hFont, HFONT hChildFont);
BOOL SetSubClass(void);
BOOL UnsetSubClass(void);
void Dispose(void);
LRESULT CALLBACK WndProcGroupBox(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
INT_PTR CALLBACK DlgProc_StdinDialog(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
}
/*
stdout,stderror用
*/
namespace HSCR_ForStdOutWithStdError {
//変数
HWND hGroupBox;
WNDPROC GroupBoxBaseWndProc = NULL;
HWND hRadioBox_ToFile;
HWND hTextBoxSaveTextFilePath, hButtonChooseSaveTextFile;
HWND hRadioBox_ToDirectOutput;
HWND hButtonShowStdoutFromDirectOutput;
BOOL ChooseStdoutTextFile(HWND hParent);
void SetSubItemState(void);
BOOL SetupControls(HWND hParent, HFONT hFont, HFONT hChildFont);
BOOL SetSubClass(void);
BOOL UnsetSubClass(void);
LRESULT CALLBACK WndProcGroupBox(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
}
/*
タイムアウト設定
*/
namespace HSCR_TimeOut {
HWND hGroupBox;
WNDPROC GroupBoxBaseWndProc = NULL;
HWND hCheckBox_Enable;
BOOL SetupControls(HWND hParent, HFONT hFont, HFONT hChildFont);
void SetSubItemState(void);
BOOL SetSubClass(void);
BOOL UnsetSubClass(void);
LRESULT CALLBACK WndProcGroupBox(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
}
/*
その他
*/
namespace HSCR_Other {
HWND hGroupBox;
WNDPROC GroupBoxBaseWndProc = NULL;
HWND hButton_SaveSettings, hButton_LoadSettings;
BOOL SetupControls(HWND hParent, HFONT hFont, HFONT hChildFont);
BOOL SetSubClass(void);
BOOL UnsetSubClass(void);
LRESULT CALLBACK WndProcGroupBox(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
}
//メイン関数
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) {
MSG msg;
BOOL bRet;
//COM初期化
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
//インスタンスハンドルをグローバル変数にコピー
hInstance = hCurInst;
//カレントディレクトリ変更
char path[MAX_PATH + 1];
GetModuleFileNameA(NULL, path, MAX_PATH);
PathRemoveFileSpecA(path);
SetCurrentDirectoryA(path);
//ウィンドウクラスの登録
if (!RegistWindowClass(hCurInst)) return FALSE;
//ウィンドウ作成
if (!CreateMainWindow(hCurInst, nCmdShow)) return FALSE;
//メッセージループ
while ((bRet = GetMessage(&msg, NULL, 0, 0))) {
if (bRet == -1) {
MessageBox(NULL, TEXT("GetMessageエラー"), TEXT("Error"), MB_OK);
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//COM 解放
CoUninitialize();
return (int)msg.wParam;
}
//ウィンドウクラス登録関数
ATOM RegistWindowClass(HINSTANCE hInst) {
WNDCLASSEX wc; //WNDCLASSEX構造体
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc = WndProc; //プロシージャ名
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst; //インスタンス
wc.hIcon = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = CreateSolidBrush(WindowBackgroundColor);
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU); //メニュー名
wc.lpszClassName = szClassName;
wc.hIconSm = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED);
return RegisterClassEx(&wc);
}
//メインウィンドウを作る関数
BOOL CreateMainWindow(HINSTANCE hInst, int nCmdShow) {
HWND hwnd;
int WindowStyle;
//ウィンドウスタイル
WindowStyle = WS_OVERLAPPEDWINDOW;
//ウィンドウサイズ固定ならばオーバーラップウィンドウから
//サイズ変更境界と最大化ボタンを無効化にする
if (WindowSizeChangeByUserFlag == 0)
WindowStyle &= ~WS_THICKFRAME & ~WS_MAXIMIZEBOX;
//ウィンドウサイズを計算
RECT windowRect = { 0 };
windowRect.right = WindowClientSize.cx;
windowRect.bottom = WindowClientSize.cy;
if (AdjustWindowRectEx(&windowRect, WindowStyle, TRUE, NULL) == FALSE)return FALSE;
windowRect.right += abs(windowRect.left);
windowRect.bottom += abs(windowRect.top);
//ウィンドウ作成
hwnd =
CreateWindowEx(NULL,
szClassName,
//タイトルバーにこの文字列が表示されます
PRONAME_TXT,
WindowStyle,//ウィンドウの種類
CW_USEDEFAULT, //x座標
CW_USEDEFAULT,//y座標
windowRect.right, //幅
windowRect.bottom,//高さ
NULL,//親ウィンドウのハンドル、親を作るときはNULL
NULL,//メニューハンドル、クラスメニューを使うときはNULL
hInst,//インスタンスハンドル
NULL);
if (!hwnd)return FALSE;
//ウィンドウ表示
ShowWindow(hwnd, nCmdShow);
//ウィンドウ更新
UpdateWindow(hwnd);
return TRUE;
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
//クライアントサイズ保管場所
RECT rcClientSize;
//クライアントサイズ取得
GetClientRect(hwnd, &rcClientSize);
static HFONT hFontControl,hFontChildControl;
static HWND hButton_RunProcess;
//メッセージごとの処理
switch (msg) {
case WM_CREATE:
//フォント作成
hFontControl = HSCreateFont(TEXT("メイリオ"), 14);
hFontChildControl = HSCreateFont(TEXT("メイリオ"), 12);
//対象コンソールアプリケーション設定グループ
HSCR_Target::SetupControls(hwnd, hFontControl, hFontChildControl);
HSCR_Target::SetSubClass();
//stdin
HSCR_ForStdIn::SetupControls(hwnd, hFontControl, hFontChildControl);
HSCR_ForStdIn::SetSubClass();
//stdout,stderror
HSCR_ForStdOutWithStdError::SetupControls(hwnd, hFontControl, hFontChildControl);
HSCR_ForStdOutWithStdError::SetSubClass();
//timeout
HSCR_TimeOut::SetupControls(hwnd, hFontControl, hFontChildControl);
HSCR_TimeOut::SetSubClass();
//その他
HSCR_Other::SetupControls(hwnd, hFontControl, hFontChildControl);
HSCR_Other::SetSubClass();
hButton_RunProcess = HSCreateButton(hwnd, TEXT("上記の設定でプログラムを実行する"), 5, 500, 630, 50 , (HMENU)CMID_EXECUTEPRPOCESS);
SetFontToControl(hButton_RunProcess, hFontControl);
break;
case WM_DESTROY:
HSCR_Target::UnsetSubClass();
HSCR_ForStdIn::UnsetSubClass();
HSCR_ForStdOutWithStdError::UnsetSubClass();
HSCR_TimeOut::UnsetSubClass();
HSCR_Other::UnsetSubClass();
DeleteObject(hFontControl);
DeleteObject(hFontChildControl);
PostQuitMessage(0);
break;
case WM_COMMAND:
switch (LOWORD(wp)) {
case ID_APPVERSION:
{
HSVersionInfoData vid;
memset(&vid, 0, sizeof(vid));
//構造体に各種設定
vid.lpszProgramName = PRONAME_TXT;
vid.Common.AppType = HSVI_APPTYPE_BASIC;
vid.Common.hOwnerWindow = hwnd;
vid.Copyright.lpszDeveloperName = TEXT("Hiroaki Software");
vid.Copyright.StartYear = 2014;
vid.Copyright.EndYear = 2014;
vid.Common.hSoftLogoBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_APPLOGOBITMAP));
vid.Common.TransparentColorForLogoBitmap = HSVI_MRGB(255, 255, 255);
vid.AppDefine.bEnable = TRUE;
vid.AppDefine.lpszTitle = TEXT("説明");
vid.AppDefine.lpszContents = TEXT("コンソールアプリケーションへリダイレクトを行うソフトです。");
//バージョンをセット
HSVI_VersionTextToStruct(PROVER_TXT, &vid);
//バージョン情報ダイアログ表示
HSVI_Dialog(&vid);
DeleteObject(vid.Common.hSoftLogoBitmap);
}
break;
case ID_APPEXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
default:
break;
}
break;
default:
return DefWindowProc(hwnd, msg, wp, lp);
}
return 0;
}
//ターゲット設定
namespace HSCR_Target {
BOOL SetupControls(HWND hParent, HFONT hFont, HFONT hChildFont) {
hGroupBox = HSCreateGroupBox(hParent, TEXT("対象コンソールアプリケーション設定"), 5, 5, 630, 100);
if (hGroupBox) {
SetFontToControl(hGroupBox, hFont);
hLabelExecute = HSCreateStaticText(hGroupBox, TEXT("実行ファイルパス:"), 5, 30, 150, 30, HSStaticTextAlign_Right);
hTextBoxExecuteFilePath = HSCreateTextBox(hGroupBox, NULL, 155, 30, 400, 30, FALSE , TRUE);
hButtonChooseExecuteFile = HSCreateButton(hGroupBox, TEXT("参照"), 560, 30, 60, 30, (HMENU)CMID_CHOOSEEXECUTEFILE);
hLabelExecuteParam = HSCreateStaticText(hGroupBox, TEXT("パラメータ:"), 5, 65, 150, 30, HSStaticTextAlign_Right);
hTextBoxExecuteParam = HSCreateTextBox(hGroupBox, NULL, 155, 65, 400, 30);
//実行ファイル名
SetFontToControl(hLabelExecute, hChildFont);
SetFontToControl(hTextBoxExecuteFilePath, hChildFont);
SetFontToControl(hButtonChooseExecuteFile, hChildFont);
//パラメータ
SetFontToControl(hLabelExecuteParam, hChildFont);
SetFontToControl(hTextBoxExecuteParam, hChildFont);
return TRUE;
}
return FALSE;
}
BOOL SetSubClass(void) {
if (hGroupBox == NULL)return FALSE;
if (GroupBoxBaseWndProc)return FALSE;
GroupBoxBaseWndProc = (WNDPROC)GetWindowLong(hGroupBox, GWL_WNDPROC);
SetWindowLong(hGroupBox, GWL_WNDPROC, (LONG)WndProcGroupBox);
return TRUE;
}
BOOL UnsetSubClass(void) {
if (hGroupBox == NULL)return FALSE;
if (GroupBoxBaseWndProc == NULL)return FALSE;
SetWindowLong(hGroupBox, GWL_WNDPROC, (LONG)GroupBoxBaseWndProc);
GroupBoxBaseWndProc = NULL;
return TRUE;
}
BOOL ChooseTargetFile(HWND hParent) {
wchar_t ExePath[MAX_PATH];
memset(ExePath, 0, sizeof(ExePath));
GetWindowTextW(hTextBoxExecuteFilePath, ExePath, MAX_PATH);
if (ChooseExecuteFileDialog(hParent, ExePath)) {
SetWindowTextW(hTextBoxExecuteFilePath, ExePath);
int length = lstrlen(ExePath);
SendMessage(hTextBoxExecuteFilePath, EM_SETSEL, length, length);
return TRUE;
} else {
return FALSE;
}
}
LRESULT CALLBACK WndProcGroupBox(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
if (msg == WM_COMMAND) {
switch (LOWORD(wp)) {
case CMID_CHOOSEEXECUTEFILE:
ChooseTargetFile(GetParent(hwnd));
return 0;
}
}
return CallWindowProc(GroupBoxBaseWndProc, hwnd, msg, wp, lp);
}
};
/*
stdin用
*/
namespace HSCR_ForStdIn {
/*
HWND hGroupBox;
HWND hCheckBox_Enable;
HWND hRadioBox_FromFile;
HWND hRadioBox_FromDirectInput;
HWND hTextBoxTextFilePath, hButtonChooseTextFile, hButtonToDirectInput;
*/
BOOL SetupControls(HWND hParent, HFONT hFont, HFONT hChildFont) {
hGroupBox = HSCreateGroupBox(hParent, TEXT("標準入力(stdin) 設定"), 5, 110, 630, 150);
if (hGroupBox) {
SetFontToControl(hGroupBox, hFont);
hCheckBox_Enable = HSCreateCheckBox(hGroupBox, TEXT("有効にする"), 5, 25, 100, 30);
SetCheckButtonState(hCheckBox_Enable, TRUE);
SetFontToControl(hCheckBox_Enable, hChildFont);
//枠を用意する
HSCreateBorderBoxStaticControl(hGroupBox, 5, 60, 620 , 80);
HSCreateBorderStaticControl(hGroupBox, 7, 100, 617);
HSCreateBorderStaticControl(hGroupBox, 230, 62, 78, HSBorderStaticStyle_Vertical);
//テキストファイルから入力
hRadioBox_FromFile = HSCreateRadioButton(hGroupBox, TEXT("テキストファイルから入力"), 10, 65, 215, 30, TRUE);
hTextBoxTextFilePath = HSCreateTextBox(hGroupBox, NULL, 235, 65, 315, 30, FALSE,TRUE);
hButtonChooseTextFile = HSCreateButton(hGroupBox, TEXT("参照"), 555, 65, 60, 30, (HMENU)CMID_CHOOSEOPENTEXTFILE);
SetFontToControl(hRadioBox_FromFile, hChildFont);
SetFontToControl(hTextBoxTextFilePath, hChildFont);
SetFontToControl(hButtonChooseTextFile, hChildFont);
//右のボタンから直接入力
hRadioBox_FromDirectInput = HSCreateRadioButton(hGroupBox, TEXT("別画面から直接入力"), 10, 105, 215, 30);
hButtonToDirectInput = HSCreateButton(hGroupBox, TEXT("ダイアログで内容を入力"), 235, 105, 315, 30, (HMENU)CMID_STDIN_DIRECTINPUT);
SetFontToControl(hRadioBox_FromDirectInput, hChildFont);
SetFontToControl(hButtonToDirectInput, hChildFont);
SetRadioButtonState(hRadioBox_FromDirectInput, TRUE);
SetSubItemState();
return TRUE;
}
return FALSE;
}
BOOL SetSubClass(void) {
if (hGroupBox == NULL)return FALSE;
if (GroupBoxBaseWndProc)return FALSE;
GroupBoxBaseWndProc = (WNDPROC)GetWindowLong(hGroupBox, GWL_WNDPROC);
SetWindowLong(hGroupBox, GWL_WNDPROC, (LONG)WndProcGroupBox);
return TRUE;
}
BOOL UnsetSubClass(void) {
if (hGroupBox == NULL)return FALSE;
if (GroupBoxBaseWndProc == NULL)return FALSE;
SetWindowLong(hGroupBox, GWL_WNDPROC, (LONG)GroupBoxBaseWndProc);
GroupBoxBaseWndProc = NULL;
return TRUE;
}
BOOL ChooseStdinTextFile(HWND hParent) {
wchar_t TextPath[MAX_PATH];
memset(TextPath, 0, sizeof(TextPath));
GetWindowTextW(hTextBoxTextFilePath, TextPath, MAX_PATH);
if (ChooseOpenTextFileDialog(hParent, TextPath)) {
SetWindowTextW(hTextBoxTextFilePath, TextPath);
int length = lstrlen(TextPath);
SendMessage(hTextBoxTextFilePath, EM_SETSEL, length, length);
return TRUE;
} else {
return FALSE;
}
}
void SetSubItemState(void) {
HWND hFromTextFileItems[] = { hTextBoxTextFilePath, hButtonChooseTextFile };
HWND hFromDirectInput[] = { hButtonToDirectInput };
BOOL bEnable = GetCheckButtonState(hCheckBox_Enable);
HWND hTargets[] = { hRadioBox_FromDirectInput, hRadioBox_FromFile,
hTextBoxTextFilePath, hButtonChooseTextFile, hButtonToDirectInput };
for (size_t i = 0; i < (sizeof(hTargets) / sizeof(HWND)); i++) {
EnableWindow(hTargets[i], bEnable);
}
if (bEnable) {
if (GetRadioButtonState(hRadioBox_FromFile)) {
for (size_t i = 0; i < (sizeof(hFromDirectInput) / sizeof(HWND)); i++) {
EnableWindow(hFromDirectInput[i], FALSE);
}
for (size_t i = 0; i < (sizeof(hFromTextFileItems) / sizeof(HWND)); i++) {
EnableWindow(hFromTextFileItems[i], TRUE);
}
} else if (GetRadioButtonState(hRadioBox_FromDirectInput)) {
for (size_t i = 0; i < (sizeof(hFromDirectInput) / sizeof(HWND)); i++) {
EnableWindow(hFromDirectInput[i], TRUE);
}
for (size_t i = 0; i < (sizeof(hFromTextFileItems) / sizeof(HWND)); i++) {
EnableWindow(hFromTextFileItems[i], FALSE);
}
}
}
}
void Dispose(void) {
if (lpszStdinString) {
delete []lpszStdinString;
lpszStdinString = nullptr;
}
}
LRESULT CALLBACK WndProcGroupBox(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
if (msg == WM_COMMAND) {
HWND TargetHandle = (HWND)lp;
bool bChangeState = (TargetHandle == hCheckBox_Enable);
bChangeState |= (TargetHandle == hRadioBox_FromFile);
bChangeState |= (TargetHandle == hRadioBox_FromDirectInput);
if (bChangeState){
SetSubItemState();
} else {
switch (LOWORD(wp)) {
case CMID_CHOOSEOPENTEXTFILE:
ChooseStdinTextFile(GetParent(hwnd));
break;
case CMID_STDIN_DIRECTINPUT:
DialogBox(hInstance, MAKEINTRESOURCE(IDD_STDIN_INPUTDIALOG), GetParent(hwnd), DlgProc_StdinDialog);
break;
default:
break;
}
}
return 0;
} else {
return CallWindowProc(GroupBoxBaseWndProc, hwnd, msg, wp, lp);
}
}
INT_PTR CALLBACK DlgProc_StdinDialog(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) {
if (msg == WM_INITDIALOG) {
}else if (msg == WM_COMMAND) {
switch (LOWORD(wp)) {
case IDOK:
EndDialog(hDlg, IDOK);
break;
case IDCANCEL:
PostMessage(hDlg, WM_CLOSE, 0, 0);
break;
default:
break;
}
}else if (msg == WM_CLOSE) {
EndDialog(hDlg, IDCANCEL);
} else {
return FALSE;
}
return TRUE;
}
}
/*
stdout,stderror用
*/
namespace HSCR_ForStdOutWithStdError {
/*
HWND hCheckBox_Enable;
HWND hRadioBox_ToFile;
HWND hTextBoxSaveTextFilePath, hButtonChooseSaveTextFile;
HWND hRadioBox_ToDirectOutput;
HWND hButtonShowStdoutFromDirectOutput;
*/
BOOL SetupControls(HWND hParent, HFONT hFont, HFONT hChildFont) {
//初期Y位置 = 215
hGroupBox = HSCreateGroupBox(hParent, TEXT("標準出力(stdout) 及び標準エラー出力(stderror)設定"), 5, 265, 630, 115);
if (hGroupBox) {
SetFontToControl(hGroupBox, hFont);
//枠を用意する
HSCreateBorderBoxStaticControl(hGroupBox, 5, 30, 620, 80);
HSCreateBorderStaticControl(hGroupBox, 7, 70, 617);
HSCreateBorderStaticControl(hGroupBox, 230, 32, 78, HSBorderStaticStyle_Vertical);
//テキストファイルに出力
hRadioBox_ToFile = HSCreateRadioButton(hGroupBox, TEXT("テキストファイルに出力"), 10, 35, 215, 30, TRUE);
hTextBoxSaveTextFilePath = HSCreateTextBox(hGroupBox, NULL, 235, 35, 315, 30,FALSE, TRUE);
hButtonChooseSaveTextFile = HSCreateButton(hGroupBox, TEXT("参照"), 555, 35, 60, 30, (HMENU)CMID_CHOOSESAVETEXTFILE);
SetFontToControl(hRadioBox_ToFile, hChildFont);
SetFontToControl(hTextBoxSaveTextFilePath, hChildFont);
SetFontToControl(hButtonChooseSaveTextFile, hChildFont);
//別画面で表示
hRadioBox_ToDirectOutput = HSCreateRadioButton(hGroupBox, TEXT("別画面で表示"), 10, 75, 215, 30);
hButtonShowStdoutFromDirectOutput = HSCreateButton(hGroupBox, TEXT("ダイアログで内容を再表示"), 235, 75, 315, 30, (HMENU)CMID_SHOWSTDOUTDATA);
SetFontToControl(hRadioBox_ToDirectOutput, hChildFont);
SetFontToControl(hButtonShowStdoutFromDirectOutput, hChildFont);
SetRadioButtonState(hRadioBox_ToDirectOutput, TRUE);
SetSubItemState();
return TRUE;
}
return FALSE;
}
void SetSubItemState(void) {
HWND hFromTextFileItems[] = { hTextBoxSaveTextFilePath, hButtonChooseSaveTextFile };
HWND hFromDirectInput[] = { hButtonShowStdoutFromDirectOutput };
if (GetRadioButtonState(hRadioBox_ToFile)) {
for (size_t i = 0; i < (sizeof(hFromDirectInput) / sizeof(HWND)); i++) {
EnableWindow(hFromDirectInput[i], FALSE);
}
for (size_t i = 0; i < (sizeof(hFromTextFileItems) / sizeof(HWND)); i++) {
EnableWindow(hFromTextFileItems[i], TRUE);
}
} else if (GetRadioButtonState(hRadioBox_ToDirectOutput)) {
for (size_t i = 0; i < (sizeof(hFromDirectInput) / sizeof(HWND)); i++) {
EnableWindow(hFromDirectInput[i], TRUE);
}
for (size_t i = 0; i < (sizeof(hFromTextFileItems) / sizeof(HWND)); i++) {
EnableWindow(hFromTextFileItems[i], FALSE);
}
}
}
BOOL SetSubClass(void) {
if (hGroupBox == NULL)return FALSE;
if (GroupBoxBaseWndProc)return FALSE;
GroupBoxBaseWndProc = (WNDPROC)GetWindowLong(hGroupBox, GWL_WNDPROC);
SetWindowLong(hGroupBox, GWL_WNDPROC, (LONG)WndProcGroupBox);
return TRUE;
}
BOOL UnsetSubClass(void) {
if (hGroupBox == NULL)return FALSE;
if (GroupBoxBaseWndProc == NULL)return FALSE;
SetWindowLong(hGroupBox, GWL_WNDPROC, (LONG)GroupBoxBaseWndProc);
GroupBoxBaseWndProc = NULL;
return TRUE;
}
BOOL ChooseStdoutTextFile(HWND hParent) {
wchar_t TextPath[MAX_PATH];
memset(TextPath, 0, sizeof(TextPath));
GetWindowTextW(hTextBoxSaveTextFilePath, TextPath, MAX_PATH);
if (ChooseSaveTextFileDialog(hParent, TextPath)) {
SetWindowTextW(hTextBoxSaveTextFilePath, TextPath);
int length = lstrlen(TextPath);
SendMessage(hTextBoxSaveTextFilePath, EM_SETSEL, length, length);
return TRUE;
} else {
return FALSE;
}
}
LRESULT CALLBACK WndProcGroupBox(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
if (msg == WM_COMMAND) {
HWND TargetHandle = (HWND)lp;
bool bChangeState = (TargetHandle == hRadioBox_ToFile);
bChangeState |= (TargetHandle == hRadioBox_ToDirectOutput);
if (bChangeState) {
SetSubItemState();
} else {
switch (LOWORD(wp)) {
case CMID_CHOOSESAVETEXTFILE:
ChooseStdoutTextFile(GetParent(hwnd));
break;
default:
break;
}
}
return 0;
} else {
return CallWindowProc(GroupBoxBaseWndProc, hwnd, msg, wp, lp);
}
}
}
/*
タイムアウト設定
*/
namespace HSCR_TimeOut {
//HWND hGroupBox;
//WNDPROC GroupBoxBaseWndProc = NULL;
//HWND hCheckBox_Enable;
HWND hStatic_LeftShowString, hStatic_RightShowString;
HWND hEdit_Timeout;
BOOL SetupControls(HWND hParent, HFONT hFont, HFONT hChildFont) {
hGroupBox = HSCreateGroupBox(hParent, TEXT("タイムアウト設定"), 5, 385, 295, 100);
if (hGroupBox) {
SetFontToControl(hGroupBox, hFont);
hCheckBox_Enable = HSCreateCheckBox(hGroupBox, TEXT("使用する"), 5, 25, 85, 30);
SetFontToControl(hCheckBox_Enable, hChildFont);
hStatic_LeftShowString = HSCreateStaticText(hGroupBox, TEXT("タイムアウト時間:"), 25, 60, 145, 30);
SetFontToControl(hStatic_LeftShowString, hChildFont);
hEdit_Timeout = HSCreateTextBox(hGroupBox, TEXT("99999"), 170, 56, 65, 30, TRUE);
int Style = GetWindowLong(hEdit_Timeout, GWL_STYLE);
SetWindowLong(hEdit_Timeout, GWL_STYLE, Style | ES_CENTER);
SetFontToControl(hEdit_Timeout, hChildFont);
hStatic_RightShowString = HSCreateStaticText(hGroupBox, TEXT("ミリ秒"), 240, 60, 50, 30);
SetFontToControl(hStatic_RightShowString, hChildFont);
SetSubItemState();
//HSCreateBorderBoxStaticControl(hGroupBox, 25, 60, 145, 25);
return TRUE;
}
return FALSE;
}
void SetSubItemState(void) {
if (GetCheckButtonState(hCheckBox_Enable)) {
EnableWindow(hEdit_Timeout, TRUE);
} else {
EnableWindow(hEdit_Timeout, FALSE);
}
}
BOOL SetSubClass(void) {
if (hGroupBox == NULL)return FALSE;
if (GroupBoxBaseWndProc)return FALSE;
GroupBoxBaseWndProc = (WNDPROC)GetWindowLong(hGroupBox, GWL_WNDPROC);
SetWindowLong(hGroupBox, GWL_WNDPROC, (LONG)WndProcGroupBox);
return TRUE;
}
BOOL UnsetSubClass(void) {
if (hGroupBox == NULL)return FALSE;
if (GroupBoxBaseWndProc == NULL)return FALSE;
SetWindowLong(hGroupBox, GWL_WNDPROC, (LONG)GroupBoxBaseWndProc);
GroupBoxBaseWndProc = NULL;
return TRUE;
}
LRESULT CALLBACK WndProcGroupBox(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
if (msg == WM_COMMAND) {
if (((HWND)(lp)) == hCheckBox_Enable) {
SetSubItemState();
return 0;
}
}
return CallWindowProc(GroupBoxBaseWndProc, hwnd, msg, wp, lp);
}
}
/*
その他
*/
namespace HSCR_Other {
//HWND hGroupBox;
//WNDPROC GroupBoxBaseWndProc = NULL;
/*
#define CMID_SAVESETTINGS 106
#define CMID_LOADSETTINGS 107
HWND hButton_SaveSettings, hButton_LoadSettings;
*/
BOOL SetupControls(HWND hParent, HFONT hFont, HFONT hChildFont) {
hGroupBox = HSCreateGroupBox(hParent, TEXT("その他"), 339, 385, 295, 100);
if (hGroupBox) {
SetFontToControl(hGroupBox, hFont);
hButton_LoadSettings = HSCreateButton(hGroupBox, TEXT("設定を読み込む"), 5, 30, 285, 30, (HMENU)CMID_LOADSETTINGS);
SetFontToControl(hButton_LoadSettings, hChildFont);
hButton_SaveSettings = HSCreateButton(hGroupBox, TEXT("設定を保存する"), 5, 65, 285, 30, (HMENU)CMID_SAVESETTINGS);
SetFontToControl(hButton_SaveSettings, hChildFont);
return TRUE;
}
return FALSE;
}
BOOL SetSubClass(void) {
if (hGroupBox == NULL)return FALSE;
if (GroupBoxBaseWndProc)return FALSE;
GroupBoxBaseWndProc = (WNDPROC)GetWindowLong(hGroupBox, GWL_WNDPROC);
SetWindowLong(hGroupBox, GWL_WNDPROC, (LONG)WndProcGroupBox);
return TRUE;
}
BOOL UnsetSubClass(void) {
if (hGroupBox == NULL)return FALSE;
if (GroupBoxBaseWndProc == NULL)return FALSE;
SetWindowLong(hGroupBox, GWL_WNDPROC, (LONG)GroupBoxBaseWndProc);
GroupBoxBaseWndProc = NULL;
return TRUE;
}
LRESULT CALLBACK WndProcGroupBox(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
return CallWindowProc(GroupBoxBaseWndProc, hwnd, msg, wp, lp);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment