ページ 11

windowsアプリケーションで文字入力BOX的なものを表示させたい

Posted: 2011年2月11日(金) 21:07
by MoNoQLoREATOR
windowsアプリケーションで文字入力BOX的なものを表示させたいのですが、どうすればよいのか全くわかりません。
検索方法すらわかりません。
それ以前に、可能なのでしょうか?
ご教授よろしくお願いいたしますm(_ _)m

Re: windowsアプリケーションで文字入力BOX的なものを表示させたい

Posted: 2011年2月11日(金) 21:19
by Ciel
可能です。

ダイアログボックス作って、エディットコントロールを作成して、
GetWindowTextなどで入力内容を取得して下さい。

Re: windowsアプリケーションで文字入力BOX的なものを表示させたい

Posted: 2011年2月11日(金) 23:34
by MoNo96REATOR
ダイアログボックスを用いずに、画面にそのまま文字入力BOXを表示させることはできないのでしょうか?

また、できないのであれば、CreatoWindow関数の次の部分がわからないのですが。

CreateWindow("EDIT","",
WS_CHILD|WS_VISIBLE,
10,10,300,20,
ココ,
ココ,
ココ,
NULL);

親ウインドウのハンドルを得るにはどうすればよいのでしょう?
子ウインドウIDは、適当に付けても良いのでしょうか?この場合NULLでかまわないのでしょうか?
ココ=hInstanceここには一体何を書けばよいのでしょうか?

それとも、CreateWindow関数以外のものを使ってもっと簡単にする方法があるのでしょうか。
ユーザーに日本語入力をしてもらってその情報を得たいだけなのですが・・・。

よろしくお願いいたしますm(_ _)m

Re: windowsアプリケーションで文字入力BOX的なものを表示させたい

Posted: 2011年2月12日(土) 00:20
by taketoshi
すいません、半分ネタなんですが

コード:

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)
{
	hInstance = hInst;	//グローバル変数にコピー
	
	BOOL bRet;
	MSG msg;

	//デスクトップのウインドウハンドルを取得
	hDesktop = GetDesktopWindow();

	//デスクトップに直接エディットを描写
	hEdit = CreateWindow("EDIT",
		"test",
		WS_CHILD|WS_VISIBLE|WS_BORDER|ES_WANTRETURN|ES_MULTILINE,
		100,100,100,100,hDesktop,NULL,hInst,NULL);

	while((bRet = GetMessage(&msg,NULL,0,0)) != 0)
	{
		if (bRet == -1)
		{
			break;
		}
		else
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return (int)msg.wParam;
}
上記のコードでデスクトップにエディットボックスが直接出現します。
フォーカスも合わせにくく、タスクマネージャでないと終了できないネタプログラムなんですけど・・・。


親ウインドウのハンドルを得るにはGetParent()関数が使えます。
子ウインドウのHWNDを指定すると親ウインドウのHWNDが返ります。

IDは他と被らないように、適当で構いません、またNULLでも描写は可能です。
hInstanceはインスタンスを指定してください、WinMain関数の第一引数です。

またGetWindowLong関数でも取得可能だったと思います。

Re: windowsアプリケーションで文字入力BOX的なものを表示させたい

Posted: 2011年2月12日(土) 09:08
by Ciel
MoNo96REATOR さんが書きました:ダイアログボックスを用いずに、画面にそのまま文字入力BOXを表示させることはできないのでしょうか?

また、できないのであれば、CreatoWindow関数の次の部分がわからないのですが。

CreateWindow("EDIT","",
WS_CHILD|WS_VISIBLE,
10,10,300,20,
ココ,
ココ,
ココ,
NULL);

親ウインドウのハンドルを得るにはどうすればよいのでしょう?
子ウインドウIDは、適当に付けても良いのでしょうか?この場合NULLでかまわないのでしょうか?
ココ=hInstanceここには一体何を書けばよいのでしょうか?

それとも、CreateWindow関数以外のものを使ってもっと簡単にする方法があるのでしょうか。
ユーザーに日本語入力をしてもらってその情報を得たいだけなのですが・・・。

よろしくお願いいたしますm(_ _)m
私はダイアログボックスを使った方法以外の方法は知りません。

親ウィンドウのハンドルは得るのは、どこでダイアログボックスを作るかによりますが、
WinMain関数内で作るのであれば、
hwnd=CreateWindow(親ウィンドウ);

のhwndをそのまま渡せばいいだけです。

ウィンドウプロシージャ内のWM_CREATEメッセージを受け取ったところで作るのであれば、
ウィンドウプロシージャの第一引数のhwndを渡せばいいです。

子ウィンドウIDには他の子ウィンドウと被らないのであれば基本的には大丈夫だと思いますが、
ダイアログボックスとなると、ウィンドウを閉じたりしたときの戻り値が1とか0とかであり、被る可能性があったと思いますので
100番以降を使っていれば問題ないのではないでしょうか。

hinstanceにはインスタンスハンドルを渡せばいいです。
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
のhinstanceのことです。

ダイアログボックスについては、
http://www.geocities.jp/ky_webid/win32c/037.html
この辺などで調べてやってみてください。
わからなければまた書き込んでいただければ、サポートできる範囲でサポートいたします。

Re: windowsアプリケーションで文字入力BOX的なものを表示させたい

Posted: 2011年2月12日(土) 15:51
by MoNoQLoREATOR
CreateWindow関数の引数である
HWND hWndParent
に指定するためのウインドウハンドルはどうやったら知る事ができますか?
つまり、自分自身のウインドウハンドルが知りたいのですが・・・。

Re: windowsアプリケーションで文字入力BOX的なものを表示させたい

Posted: 2011年2月12日(土) 16:23
by Ciel
色んな方法がありますが、親ウィンドウを作成したときにそのハンドルを変数にでも入れとけばいいのでは?
もしくは、ウィンドウプロシージャ内の引数から取得するとか。

他にも関数で色々取得できるのでこちらのページを見てみてください。
http://www.geocities.jp/ky_webid/win32c/062.html

Re: windowsアプリケーションで文字入力BOX的なものを表示させたい

Posted: 2011年2月12日(土) 20:04
by MoNoQLoREATOR
つかぬ事をお伺いしますが、下のように書けば文字入力ウインドウを表示できるのですか?

コード:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC){

	
CreateWindow("EDIT","test",
                 WS_CHILD|WS_VISIBLE,
                 10,10,300,20,
                 [color=#FF0000]ここで詰んでいる[/color],
                 NULL,
                 hI,
                 NULL);
		 
	WaitKey();


	return(0);
}

http://www.geocities.jp/ky_webid/win32c/062.html
にはFindWindow()について
>>第1引数にウィンドウクラス名かクラスアトムを指定します。
>>ウィンドウクラス名は、ウィンドウを作成するとき、W N D C L A S S E X 構造体のlpszClassNameメンバに指定したも
>>の です。

とありますが、W N D C L A S S E X 構造体などどいうものは聞いたことがありませんし、もちろん使った事もございません。


何と言えばいいのかわからないのですが、なんとなく私の意図が伝わっていない気がします。

Re: windowsアプリケーションで文字入力BOX的なものを表示させたい

Posted: 2011年2月12日(土) 20:07
by MoNoQLoREATOR
追記:上記の構造体をそのままかくと投稿禁止用語(S●X)とみなされるので、半角スペースを入れました。

Re: windowsアプリケーションで文字入力BOX的なものを表示させたい

Posted: 2011年2月12日(土) 21:12
by taketoshi
Windowsアプリケーションは「基となる基本的なウインドウ」の作成が必要です。このウインドウが親となります。
基本的なウインドウとはダイアログベースであったり、右上に×ボタンや最大化最小化ボタンが付いたよく見かけるウインドウのことです。
Windowsプログラムはこれらのウインドウを親として、子ウインドウをペタペタ貼り付けていきます。(ウインドウを複数生成する場合もあります)

そして、エディットボックスは親とは成り得ません。
エディットボックスはwindowsのコントロールであり、CreateWindow関数で作成するのですが、
Editコントロールだけでは一般的にプログラムとして成り立たないのです。
前述したとおり、エディットボックスをデスクトップに直接出現させるようなプログラムでは
プログラムの終了もできない、ウインドウの移動も出来ないで、全く使えないプログラムの完成です。

私が何時も使っている雛形プログラムを以下に記載します。
掲載禁止用語が入っているので、適時改変しています

コード:

#include<windows.h>
//グローバル変数
HINSTANCE hInstance;
//メインウインドウハンドル
HWND hWnd;
HWND hEdit;

//クラスネーム
char *szClassName = "ClassName";
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)
{
	WNDCLASS●X wc;
	hInstance = hInst;	//グローバル変数にコピー
	
	wc.cbCls●xtra = 0;
	wc.cbSize = sizeof(WNDCLASS●X);
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+6);
	wc.hCursor = LoadCursor(hInst,IDC_ARROW);
	wc.hIcon = NULL;
	wc.hIconSm = NULL;
	wc.hInstance = hInst;
	wc.lpfnWndProc = WndProc;
	wc.lpszClassName = szClassName;
	wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
	wc.style = CS_HREDRAW | CS_VREDRAW;

	RegisterClass●x(&wc);

             //登録したszClassNameより親となるオーバーラップウインドウの作成
	hWnd = CreateWindow(szClassName,
		"windowsテンプレート",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL);

	ShowWindow(hWnd,nShowCmd);
	UpdateWindow(hWnd);

            //親ウインドウの上にエディットボックスを作成
	hEdit = CreateWindow("EDIT","",WS_CHILD|WS_VISIBLE,
		0,0,100,50,hWnd,(HMENU)100,hInstance,NULL);


	BOOL bRet;
	MSG msg;

	while((bRet = GetMessage(&msg,NULL,0,0)) != 0)
	{
		if (bRet == -1)
		{
			break;
		}
		else
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return (int)msg.wParam;
}
これはWNDCLASS構造体を定義して親ウインドウの情報を登録した後に
その情報を基に親ウインドウを生成し、その上にエディットボックスを作っています。
WNDCLASSをきちんと登録しないでいきなりCreateWindowすると基礎情報が何もないので
画面に表示されないが、プロセスにはきっちり登録される、ゾンビプログラムが出来上がります。

Re: windowsアプリケーションで文字入力BOX的なものを表示させたい

Posted: 2011年2月12日(土) 21:45
by ISLe
WaitKey関数が出てくるということはDXライブラリを使ってということですか?
KeyInputString関数が使えるのでは?
BOX的なものは自前で描かなければいけませんが。

DXライブラリ 関数リファレンスページ
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html

Re: windowsアプリケーションで文字入力BOX的なものを表示させたい

Posted: 2011年2月12日(土) 22:37
by MoNoQLoREATOR
やはりそうでしたか。

おそらく自分は重要な何かを知らないな、という予想はついていたのですが、それが何なのかを知る術がありませんでした。

なにはともあれ、これで実現できそうです。ありがとうございました。


追記:
ISLe さんが書きました:>>WaitKey関数が出てくるということはDXライブラリを使ってということですか?
>>KeyInputString関数が使えるのでは?
>>BOX的なものは自前で描かなければいけませんが。
はい、たしかにKeyInputString関数を使えばできなくはないですが、日本語入力のときに右下に「全角ひらがな」と表示されるのが気に食わなかったので。