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

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

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

#1

投稿記事 by MoNoQLoREATOR » 9年前

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

アバター
Ciel
記事: 252
登録日時: 9年前

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

#2

投稿記事 by Ciel » 9年前

可能です。

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

MoNo96REATOR

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

#3

投稿記事 by MoNo96REATOR » 9年前

ダイアログボックスを用いずに、画面にそのまま文字入力BOXを表示させることはできないのでしょうか?

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

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

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

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

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

taketoshi
記事: 221
登録日時: 9年前
住所: 日本国

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

#4

投稿記事 by taketoshi » 9年前

すいません、半分ネタなんですが

コード:

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関数でも取得可能だったと思います。

アバター
Ciel
記事: 252
登録日時: 9年前

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

#5

投稿記事 by Ciel » 9年前

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
この辺などで調べてやってみてください。
わからなければまた書き込んでいただければ、サポートできる範囲でサポートいたします。
oui C'est la Vie♪

アバター
MoNoQLoREATOR
記事: 284
登録日時: 9年前
住所: 東京

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

#6

投稿記事 by MoNoQLoREATOR » 9年前

CreateWindow関数の引数である
HWND hWndParent
に指定するためのウインドウハンドルはどうやったら知る事ができますか?
つまり、自分自身のウインドウハンドルが知りたいのですが・・・。

アバター
Ciel
記事: 252
登録日時: 9年前

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

#7

投稿記事 by Ciel » 9年前

色んな方法がありますが、親ウィンドウを作成したときにそのハンドルを変数にでも入れとけばいいのでは?
もしくは、ウィンドウプロシージャ内の引数から取得するとか。

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

アバター
MoNoQLoREATOR
記事: 284
登録日時: 9年前
住所: 東京

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

#8

投稿記事 by MoNoQLoREATOR » 9年前

つかぬ事をお伺いしますが、下のように書けば文字入力ウインドウを表示できるのですか?

コード:

#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 構造体などどいうものは聞いたことがありませんし、もちろん使った事もございません。


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

アバター
MoNoQLoREATOR
記事: 284
登録日時: 9年前
住所: 東京

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

#9

投稿記事 by MoNoQLoREATOR » 9年前

追記:上記の構造体をそのままかくと投稿禁止用語(S●X)とみなされるので、半角スペースを入れました。

taketoshi
記事: 221
登録日時: 9年前
住所: 日本国

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

#10

投稿記事 by taketoshi » 9年前

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すると基礎情報が何もないので
画面に表示されないが、プロセスにはきっちり登録される、ゾンビプログラムが出来上がります。

ISLe
記事: 2646
登録日時: 9年前
連絡を取る:

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

#11

投稿記事 by ISLe » 9年前

WaitKey関数が出てくるということはDXライブラリを使ってということですか?
KeyInputString関数が使えるのでは?
BOX的なものは自前で描かなければいけませんが。

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

アバター
MoNoQLoREATOR
記事: 284
登録日時: 9年前
住所: 東京

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

#12

投稿記事 by MoNoQLoREATOR » 9年前

やはりそうでしたか。

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

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


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

閉鎖

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