dialogboxでinputboxを作る

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
L'z

dialogboxでinputboxを作る

#1

投稿記事 by L'z » 13年前

文字を入力するMessageBoxを作りたくて調べるとInputBoxというのをみつけたのですがVBのものでC,C++にはないものでした。
ダイアログボックスを使ってInputBoxと同様のものを作ることができるのを知って、次のような書き方で使いまわせるInputBoxを作ろうと思います。

コード:

std::string str;
str = inputbox(NULL,"文字を入力");
char cstr[100];
inputbox(NULL,"文字を入力",cstr);
引数は 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
}
main

コード:

#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

コード:

// 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: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)

ダイアログを作るのが初めてなので基本部分にも間違いがあるかもしれないです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: dialogboxでinputboxを作る

#2

投稿記事 by softya(ソフト屋) » 13年前

.rcはインクルードせずプロジェクトのソリューションに追加するだけで良いです。
resource.hはリソースを参照するソース側でインクルードする必要があるのとプロジェクトのソリューションに追加して下さい。

とりあえず、これだけやってコンパイルしてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

L'z

Re: dialogboxでinputboxを作る

#3

投稿記事 by L'z » 13年前

ありがとうございます。
コンパイルは無事成功しました。

しかし、実行するとダイアログは出ずに数字が表示されてしまいます。
数字は、入力ができていないので初期化していないときのような値です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: dialogboxでinputboxを作る

#4

投稿記事 by softya(ソフト屋) » 13年前

動かしてみたいのでresource.hも載せて頂けますか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

L'z

Re: dialogboxでinputboxを作る

#5

投稿記事 by L'z » 13年前

resource.h

コード:

#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define INPUTBOX00                              101
#define INPUTBOX01                              103
#define IDC_EDIT1                               1002
です。

L'z

Re: dialogboxでinputboxを作る

#6

投稿記事 by L'z » 13年前

inputbox.cppでダイアログに表示する文字列が反映されていなかったので修正しました。
すると別のエラーが出てウィンドウ表示ができなくなりました。
コンパイルはできて起動すると発生するエラーです。

原因の部分はわかるのですが理由がわからないです。
場所はコメントで「ココ」と書いているところです。
この行をすべてコメント化すればウィンドウは出ます。

コード:

// inputbox

#include <Windows.h>
#include <iostream>
#include "resource.h"
 
using namespace std;
 
HINSTANCE hinst;
static char dispmsg[100];
static char dbretstr[100];
 
BOOL CALLBACK DlgProc(HWND , UINT , WPARAM , LPARAM);
 
 
int inputbox(HWND hw, char* text, char str[]){
    
    strcpy_s( dispmsg , strlen(text) , text ); // ココ
    DialogBox( hinst, "INPUTBOX00", hw, DlgProc );
    
    strcpy_s( str , strlen(dbretstr) , dbretstr );
    
    return 0;
}
 
 
 
string inputbox(HWND hw, char* text){
    
    strcpy_s(dispmsg , strlen(text) , 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, dispmsg);
        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;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: dialogboxでinputboxを作る

#7

投稿記事 by softya(ソフト屋) » 13年前

strcpy_sの引数を間違っています。
第2引数は転送先のサイズです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

L'z

Re: dialogboxでinputboxを作る

#8

投稿記事 by L'z » 13年前

指摘ありがとうございます。
転送先で、文字数でなくサイズなのですね。

転送元の文字数にしているのに容量が足らない理由がわかりました。

inputboxの修正版です。

コード:

// inputbox

#include <Windows.h>
#include <iostream>
#include "resource.h"
 
using namespace std;
 
HINSTANCE hinst;
static char dispmsg[100];
static char dbretstr[100];
 
BOOL CALLBACK DlgProc(HWND , UINT , WPARAM , LPARAM);
 
 
int inputbox(HWND hw, char* text, char str[]){
    
    strcpy_s( dispmsg , sizeof(dispmsg) , text );
    DialogBox( hinst, "INPUTBOX00", hw, DlgProc );
    
    strcpy_s( str , sizeof(str) , dbretstr );
    
    return 0;
}
 
 
 
string inputbox(HWND hw, char* text){
    
    strcpy_s(dispmsg , sizeof(dispmsg) , 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, dispmsg);
        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;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: dialogboxでinputboxを作る

#9

投稿記事 by softya(ソフト屋) » 13年前

あと文字表示されない件ですが、書き換えたい所はIDC_STATICではダメですので、ちゃんと名前をつけて下さいね。
[補足]そういうお約束です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

L'z

Re: dialogboxでinputboxを作る

#10

投稿記事 by L'z » 13年前

OKボタンやテキストボックス同様初期の名前での問題ないと思ってました。
resource.hを見るとIDC_STATICだけ特別にdefineされているので変える必要あるんですね。

修正しましたがダイアログボックスが出ないのは変わりません…
DlgProc関数の最初にMessageBoxを表示するようしてみたのですが表示されません。
DlgProc関数が呼べてないみたいです。

ウィンドウプロシージャやダイアログプロシージャはCALLBACKというのがついてますが呼び出し方や使い方で普通の関数と違い何かがいるのでしょうか?

ダイアログ呼び出しやプロシージャあたりはここをほとんどコピペしたものなのですが
http://www.geocities.jp/ky_webid/win32c/036.html

L'z

Re: dialogboxでinputboxを作る

#11

投稿記事 by L'z » 13年前

resource.hとinputbox.rcの修正版です。

inputbox

コード:

// 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_DISPMSG, 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_DISPMSG, 20, 12, 140, 25, SS_CENTER
}
resource

コード:

#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define INPUTBOX00                              101
#define INPUTBOX01                              103
#define IDC_EDIT1                               1002
#define IDC_DISPMSG                             1003

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: dialogboxでinputboxを作る

#12

投稿記事 by softya(ソフト屋) » 13年前

あっ書き忘れてました。
DialogBoxで"INPUTBOX00"でアクセスする場合は、resource.hにINPUTBOX00の定義があると出来ません。
"INPUTBOX00"の代わりにMAKEINTRESOURCE(INPUTBOX00)と書いてみて下さい。

こういうエラーに備えてDialogBoxの戻り値をチェックすることをお勧めします。

それとIDC_STATICの番号を変えちゃ駄目ですよ。IDC_TEXTとか名前を付けましょう。
直ってましたね。失礼しました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

L'z

Re: dialogboxでinputboxを作る

#13

投稿記事 by L'z » 13年前

ダイアログボックスの表示ができました。
ありがとうございます。

そういえば調べた時にダイアログの名前の前になにかつけてる例もありました。
しかし、先程のURLのページがわかりやすかったのでそのページの通りにしたのですが、URLのページが間違っているんでしょうか?
_T(" ")となっていますが、これはワイド文字おUNICODEどっちでもいけるようにしてるものでMAKEINTRESOURCEとは全く違うものだと思うのですけど。


動いたのですがもう少し質問があるのでお願いします。

○ダイアログ表示時にテキストボックスが選択されているようにする方法
rcファイルを見たところ初期カーソルにあたいするものはなさそうだったのでとりあえず並びを変えたらテキストボックスが選択されているようにできたのですが、テキストエディタで強制的に書き換えたのでソフトを使って編集するたびに元に戻りそうな気がします。一般的な最初に選択されているカーソルの変更とタブキーでの移動の並びを変える方法ってどうするんでしょう?

○フォントとフォントサイズを最近のソフトで使われているもののようにしたいです。今のフォントだと少し古いソフトっぽい感じがします。MessageBoxを使うと目的のフォントとフォントサイズになります。
MessageBoxに使われているフォントとフォントサイズってわかりますか?
また、フォントがひとつしか設定できないみたいなので、Windows7を使ってもXPと同じフォントになってしまうのでしょうか?7は7標準のメイリオにしたいです。

○DlgProcへの新しい引数の渡し方がわからなかったので表示する文字やテキストボックスから読み取った文字を静的グローバル変数にしましたが、DlgProcに引数を渡す方法はないのですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: dialogboxでinputboxを作る

#14

投稿記事 by softya(ソフト屋) » 13年前

L'z さんが書きました:そういえば調べた時にダイアログの名前の前になにかつけてる例もありました。
しかし、先程のURLのページがわかりやすかったのでそのページの通りにしたのですが、URLのページが間違っているんでしょうか?
_T(" ")となっていますが、これはワイド文字おUNICODEどっちでもいけるようにしてるものでMAKEINTRESOURCEとは全く違うものだと思うのですけど。
ResEditがINPUTBOX00をresource.hに定義していしまっているので置き換えが起こります。
そのため"INPUTBOX00"の名前が番号とすり変わってしまいます。
"101"とかにすれば表示されます。
resource.hからINPUTBOX00を削除すれば"INPUTBOX00"でうまく表示できます。
L'z さんが書きました:○ダイアログ表示時にテキストボックスが選択されているようにする方法
rcファイルを見たところ初期カーソルにあたいするものはなさそうだったのでとりあえず並びを変えたらテキストボックスが選択されているようにできたのですが、テキストエディタで強制的に書き換えたのでソフトを使って編集するたびに元に戻りそうな気がします。一般的な最初に選択されているカーソルの変更とタブキーでの移動の並びを変える方法ってどうするんでしょう?
ResEditに並び順を調整する機能はありませんか?必要だからあると思うのですが。
VisualStudioの有料版にも並び替え機能は付いています。
L'z さんが書きました: ○フォントとフォントサイズを最近のソフトで使われているもののようにしたいです。今のフォントだと少し古いソフトっぽい感じがします。MessageBoxを使うと目的のフォントとフォントサイズになります。
MessageBoxに使われているフォントとフォントサイズってわかりますか?
また、フォントがひとつしか設定できないみたいなので、Windows7を使ってもXPと同じフォントになってしまうのでしょうか?7は7標準のメイリオにしたいです。
MessageBoxだと「ウィンドウの色とデザイン」で設定されているフォントになるのでWin7の場合メイリオの9だと思います。
FONT 8, "Ms Shell Dlg"がリソースに書かれていますのでMSDNに
「Windows の以前のバージョンをターゲットとする場合は、8 ポイント MS Shell Dlg 擬似フォントを使用します。このフォントは、Windows 2000 および Windows XP では Tahoma」
http://msdn.microsoft.com/ja-jp/library/aa511282.aspx

詳しくない分野なのですが"MS Shell Dlg 2"あたりを試してみてください。
自前でフォントを変える方法もあります。リソースをメモリ上に作る方法もあります(情報として知っているだけでやった事が無いです)
「ダイアログ: メモリ上にテンプレートを作成」
http://pf-j.sakura.ne.jp/program/tips/dlgmem.htm

[追記]この場合は、DialogBoxIndirectを使います。

L'z さんが書きました: ○DlgProcへの新しい引数の渡し方がわからなかったので表示する文字やテキストボックスから読み取った文字を静的グローバル変数にしましたが、DlgProcに引数を渡す方法はないのですか?
DialogBoxParamだとLPARAMを渡すことができます。
「DialogBoxParam 関数」
http://msdn.microsoft.com/ja-jp/library/cc410761.aspx
ポインタが渡せるので色々と手はあると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

L'z

Re: dialogboxでinputboxを作る

#15

投稿記事 by L'z » 13年前

softya(ソフト屋) さんが書きました: ResEditがINPUTBOX00をresource.hに定義していしまっているので置き換えが起こります。
そのため"INPUTBOX00"の名前が番号とすり変わってしまいます。
"101"とかにすれば表示されます。
resource.hからINPUTBOX00を削除すれば"INPUTBOX00"でうまく表示できます。
resource.hのincludeをはずせばと思ったのですがIDC_DISPMSGなどがあるのでそういうわけにはいかないですね。resource.hはそのままでMAKEINTRESOURCEつけるのでいきます。

softya(ソフト屋) さんが書きました: ResEditに並び順を調整する機能はありませんか?必要だからあると思うのですが。
VisualStudioの有料版にも並び替え機能は付いています。
無料のExpress使っているのでリソースの編集は無理です。
C++/CLIとC#の.NET FRAMEWORKでのウィンドウを作ったときは各ボタンごとのプロパティにタブの順番を設定できました。ResEditも似たような操作なのでプロパティを探したのですが順番の項目は見当たりませんでした。
とりあえずrcファイル書き換えで対処することにします。
softya(ソフト屋) さんが書きました: MessageBoxだと「ウィンドウの色とデザイン」で設定されているフォントになるのでWin7の場合メイリオの9だと思います。
FONT 8, "Ms Shell Dlg"がリソースに書かれていますのでMSDNに
「Windows の以前のバージョンをターゲットとする場合は、8 ポイント MS Shell Dlg 擬似フォントを使用します。このフォントは、Windows 2000 および Windows XP では Tahoma」
http://msdn.microsoft.com/ja-jp/library/aa511282.aspx

詳しくない分野なのですが"MS Shell Dlg 2"あたりを試してみてください。
自前でフォントを変える方法もあります。リソースをメモリ上に作る方法もあります(情報として知っているだけでやった事が無いです)
「ダイアログ: メモリ上にテンプレートを作成」
http://pf-j.sakura.ne.jp/program/tips/dlgmem.htm

[追記]この場合は、DialogBoxIndirectを使います。
よく見る基本的なダイアログと同じにするだけなので楽かと思ったのですがなかなかめんどくさそうですね。MS Shell Dlg 2をためしてみるとダイアログのウィンドウサイズが大きくなりました。なぜ?・・・・
他の部分にずれが出るのも嫌なのでフォントは諦めます。

同じくデザインに関することですがボタンがリソースエディタで表示されているものと違っています。
画像が貼れないので説明がしづらいですがリソースエディタで表示されているものはたいていのソフトと同じでボタンは白っぽい色、四隅は丸い、デフォルトに設定されているものは縁のあたりが水色っぽいです。
XP標準のメモ帳の名前をつけて保存でもこのようになっています。
これに対し、今回作ったダイアログでは灰色っぽく、四隅も尖ってます。98や2000仕様?
これをリソースエディタで表示されてるのに合わせたいのですが可能ですか?


softya(ソフト屋) さんが書きました: DialogBoxParamだとLPARAMを渡すことができます。
「DialogBoxParam 関数」
http://msdn.microsoft.com/ja-jp/library/cc410761.aspx
ポインタが渡せるので色々と手はあると思います。
DlgProcの4つ目の引数はここでつかえるんですね。
ありがとうございます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: dialogboxでinputboxを作る

#16

投稿記事 by softya(ソフト屋) » 13年前

L'z さんが書きました:同じくデザインに関することですがボタンがリソースエディタで表示されているものと違っています。
画像が貼れないので説明がしづらいですがリソースエディタで表示されているものはたいていのソフトと同じでボタンは白っぽい色、四隅は丸い、デフォルトに設定されているものは縁のあたりが水色っぽいです。
XP標準のメモ帳の名前をつけて保存でもこのようになっています。
これに対し、今回作ったダイアログでは灰色っぽく、四隅も尖ってます。98や2000仕様?
これをリソースエディタで表示されてるのに合わせたいのですが可能ですか?
XPスタイルをマニュフェストで指定すれば変わるのはずですが試してみて下さい。
「VC++編 - Windows XPスタイルの外観にする」
http://www.g-ishihara.com/vc_wi_01.htm
L'z さんが書きました:DlgProcの4つ目の引数はここでつかえるんですね。
ありがとうございます。
念のために書いておきますが、lParam で値が渡るのは次の条件の条件の時だけです。
リンク先より引用「WM_INITDIALOG メッセージの lParam パラメータに格納してダイアログボックスへ渡す値を指定します。」
WM_INITDIALOG メッセージの時のlParam をstaticに保存しておく必要があります。
基本的にウィンドウメッセージ毎にlParam の値は変わりますので注意して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: dialogboxでinputboxを作る

#17

投稿記事 by ISLe » 13年前

  • ResEditでリソースに文字列の識別子を設定する方法
    1. リソースツリーのダイアログ項目で右クリック
    2. メニューの『名前の変更』を選択して名前変更ダイアログを開く
    3. 『Name identifier』に(切り替えて)文字列を入力してOKボタンを押す
      ※Name identifierに入力しても数値表現可能な文字列だと数値とみなされてしまうので注意
  • ResEditで最初にフォーカスの当たるコントロールを指定する方法
    その1
    1. コントロールの上で右クリック
    2. メニューの『Order』→『背面へ移動』を選択
    その2
    1. ダイアログの編集画面が開いているときに、メインメニューの『Dialog』から『Tab order wizard』を選択してタブオーダーウィザードダイアログを開く
    2. リストボックス内で最初にフォーカスを当てたいコントロールをいちばん上に移動してOKボタンを押す

L'z

Re: dialogboxでinputboxを作る

#18

投稿記事 by L'z » 13年前

softya(ソフト屋) さんが書きました: XPスタイルをマニュフェストで指定すれば変わるのはずですが試してみて下さい。
「VC++編 - Windows XPスタイルの外観にする」
http://www.g-ishihara.com/vc_wi_01.htm
マニフェストを追加することでXPスタイルに変更出来ました。
ありがとうございます。
ところでこれもマニフェストでXPを選んでいるのだからXP以降のOSで実行した場合もXPになってしまい、7のスタイルにはできないのですか?
softya(ソフト屋) さんが書きました: 念のために書いておきますが、lParam で値が渡るのは次の条件の条件の時だけです。
リンク先より引用「WM_INITDIALOG メッセージの lParam パラメータに格納してダイアログボックスへ渡す値を指定します。」
WM_INITDIALOG メッセージの時のlParam をstaticに保存しておく必要があります。
基本的にウィンドウメッセージ毎にlParam の値は変わりますので注意して下さい。
丁寧にありがとうございます。
ISLe さんが書きました:
  • ResEditでリソースに文字列の識別子を設定する方法
    1. リソースツリーのダイアログ項目で右クリック
    2. メニューの『名前の変更』を選択して名前変更ダイアログを開く
    3. 『Name identifier』に(切り替えて)文字列を入力してOKボタンを押す
      ※Name identifierに入力しても数値表現可能な文字列だと数値とみなされてしまうので注意
  • ResEditで最初にフォーカスの当たるコントロールを指定する方法
    その1
    1. コントロールの上で右クリック
    2. メニューの『Order』→『背面へ移動』を選択
    その2
    1. ダイアログの編集画面が開いているときに、メインメニューの『Dialog』から『Tab order wizard』を選択してタブオーダーウィザードダイアログを開く
    2. リストボックス内で最初にフォーカスを当てたいコントロールをいちばん上に移動してOKボタンを押す
ありがとうございます。
とても助かりました。
Orderが最初に選択するものを指定するものだったのですね。
背面へというのからコントロールが重なったときどっちを上に表示するかの事だと思ってました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: dialogboxでinputboxを作る

#19

投稿記事 by softya(ソフト屋) » 13年前

L'z さんが書きました:マニフェストを追加することでXPスタイルに変更出来ました。
ありがとうございます。
ところでこれもマニフェストでXPを選んでいるのだからXP以降のOSで実行した場合もXPになってしまい、7のスタイルにはできないのですか?
自動的に7のスタイルになるはずですが。なっていませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

L'z

Re: dialogboxでinputboxを作る

#20

投稿記事 by L'z » 13年前

softya(ソフト屋) さんが書きました: 自動的に7のスタイルになるはずですが。なっていませんか?
今はXPを使っているため確認ができません。
しかし、最初の質問に書いたように以後inputboxを使いたい時はこのコードで使いまわす予定のため7でのことも聞いておきたかったのです。
自動で7のスタイルになるのでしたら大丈夫です。

最後まで回答していただきありがとうございました。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: dialogboxでinputboxを作る

#21

投稿記事 by ISLe » 13年前

L'z さんが書きました:Orderが最初に選択するものを指定するものだったのですね。
背面へというのからコントロールが重なったときどっちを上に表示するかの事だと思ってました。
「重なったときどっちを上に表示するか」がそのまま「(TABキーを押す毎に)フォーカスが当たる順番」なのです。

L'z

Re: dialogboxでinputboxを作る

#22

投稿記事 by L'z » 13年前

ISLe さんが書きました: 「重なったときどっちを上に表示するか」がそのまま「(TABキーを押す毎に)フォーカスが当たる順番」なのです。
そうなんですね。勉強になりました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る