ダイアログボックスを使ってInputBoxと同様のものを作ることができるのを知って、次のような書き方で使いまわせるInputBoxを作ろうと思います。 引数は DialogBoxの第三引数のウィンドウハンドル、表示する文字列、入力された文字列格納する変数 の3つで、3つめがない場合はstd::string型を返すようにします。
VisualC++2010のプロジェクトへの追加でリソースが選べなかったのでリソースはフリーソフトのResEditで作りました。
作成されたrcファイルをリソースファイルのフォルダへ、resource.hファイルをヘッダーファイルのフォルダに既存の項目の追加で追加しました。
しかし、rcファイルを開こうとするとサポートされていないと出て開けません。テキストエディタで開くと中身はプログラムのようなのでヘッダファイル同様includeしました。
そしてコンパイルしてみたらrcファイルでエラーが出ました。リソース作成ソフトで作成されたものなのでrcファイルは間違ってないと思うのですがrcファイルの使い方がまちがっているんでしょうか?
ソースとエラーです。
inputbox.rc
// Generated by ResEdit 1.5.10
// Copyright (C) 2006-2012
// http://www.resedit.net
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"
//
// Dialog resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
INPUTBOX01 DIALOG 0, 0, 180, 95
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Input"
FONT 8, "Ms Shell Dlg"
{
DEFPUSHBUTTON "OK", IDOK, 50, 73, 80, 16
EDITTEXT IDC_EDIT1, 45, 48, 90, 17, ES_AUTOHSCROLL
CTEXT "", IDC_STATIC, 20, 12, 140, 24, SS_CENTER
}
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
INPUTBOX00 DIALOG 0, 0, 180, 95
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "Input"
FONT 8, "Ms Shell Dlg"
{
DEFPUSHBUTTON "OK", IDOK, 24, 70, 50, 15
PUSHBUTTON "キャンセル", IDCANCEL, 107, 70, 50, 15
EDITTEXT IDC_EDIT1, 25, 47, 130, 16, ES_AUTOHSCROLL
CTEXT "", IDC_STATIC, 20, 12, 140, 25, SS_CENTER
}
#include <DxLib.h>
#include <iostream>
using namespace std;
extern int inputbox(HWND hw, char* text, char str[]);
extern string inputbox(HWND hw, char* text);]
extern HINSTANCE hinst;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
hinst = hInstance;
// string版+ウィンドウ作成前
int i;
string str;
str = inputbox(NULL,"数字を入力してください");
sscanf_s(str.c_str(),"%d,",&i);
DxLib_Init();
// 表示
printfDx("%d ",i);
ScreenFlip();
// char版+ウィンドウ作成後
int j;
char cstr[100];
inputbox(GetMainWindowHandle(),"数字を入力してください",cstr);
sscanf_s(str.c_str(),"%d,",&j);
// 表示
printfDx("%d ",j);
ScreenFlip();
WaitKey();
DxLib_End();
return 0;
}
// inputbox
#include <iostream>
#include "inputbox.rc"
using namespace std;
HINSTANCE hinst;
static char dbretstr[100];
BOOL CALLBACK DlgProc(HWND , UINT , WPARAM , LPARAM);
int inputbox(HWND hw, char* text, char str[]){
DialogBox( hinst, "INPUTBOX00", hw, DlgProc );
strcpy(str,dbretstr);
return 0;
}
string inputbox(HWND hw, char* text){
DialogBox( hinst, "INPUTBOX00", hw, DlgProc );
string str_in = dbretstr;
return str_in;
}
BOOL CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
switch( msg ){
case WM_INITDIALOG: // ダイアログボックスが作成されたとき
SetDlgItemText(hDlg, IDC_STATIC, "文字列を入力してください");
return TRUE;
case WM_COMMAND: // ダイアログボックス内の何かが選択されたとき
switch( LOWORD( wp ) ){
case IDOK: // 「OK」ボタンが選択された
GetDlgItemText(hDlg, IDC_EDIT1, dbretstr, 100);
case IDCANCEL: // 「キャンセル」ボタンが選択された
// ダイアログボックスを消す
EndDialog( hDlg, 0 );
break;
}
return TRUE;
}
return FALSE;
}
1>c:\documents and settings\administrator\~\inputbox.rc(16): error C2143: 構文エラー : ';' が '定数' の前にありません。
1>c:\documents and settings\administrator\~\inputbox.rc(16): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\documents and settings\administrator\~\inputbox.rc(21): error C2143: 構文エラー : ';' が '{' の前にありません。
1>c:\documents and settings\administrator\~\inputbox.rc(21): error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
1>c:\documents and settings\administrator\~\inputbox.rc(29): error C2143: 構文エラー : ';' が '定数' の前にありません。
1>c:\documents and settings\administrator\~\inputbox.rc(29): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\documents and settings\administrator\~\inputbox.rc(29): error C2086: 'int LANGUAGE' : 再定義されました。
1> c:\documents and settings\administrator\~\inputbox.rc(16) : 'LANGUAGE' の宣言を確認してください。
1>c:\documents and settings\administrator\~\inputbox.rc(34): error C2143: 構文エラー : ';' が '{' の前にありません。
1>c:\documents and settings\administrator\~\inputbox.rc(34): error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
ダイアログを作るのが初めてなので基本部分にも間違いがあるかもしれないです。