Created
September 9, 2014 17:20
-
-
Save hirosof/b2b9b8d1ab161be0f687 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*---------------------------------------------------------------------------- | |
プログラム名: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