DXライブラリ別画面入力

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

DXライブラリ別画面入力

#1

投稿記事 by 長岡 » 11年前

下記のようなプログラムを使ってコマンドプロンプトから入力されたデータをdxライブラリで作った画面に表示させています。
またdxライブラリの方の画面はどこをクリックしても移動できるようになっています。

改善したい点はコマンドプロンプトからの入力じゃなくてテキスト入力フォームを作って反映ボタンを押すとdxライブラリの画面に表示される情報が変わるようにしたいです。一言でいうとGUIにしたいということです。

どのようにすればいいでしょうか。

コード:

#include "DxLib.h"
#include <stdio.h>
#include <math.h>
#include <process.h>

static WNDPROC pPrevWndProc;
int i;

static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg) {
	case WM_NCHITTEST:
		// ウインドウの枠の上にカーソルがあることにする
		return HTCAPTION;
	}
	return CallWindowProc(pPrevWndProc, hWnd, uMsg, wParam, lParam);
}

unsigned __stdcall sure1(void *p)
{
	//デバッグ用にコンソールを呼び出す
	AllocConsole();
	freopen("CONOUT$", "w", stdout);
	freopen("CONIN$", "r", stdin);

	while (1){
		scanf("%d", &i);
	}

	//コンソール解放
	FreeConsole();
	_endthreadex(0);
	return 0;//コンパイラの警告を殺す
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

	HANDLE handoru;

	handoru = (HANDLE)_beginthreadex(NULL, 0, sure1, "sure1です。", 0, NULL);

	//ログを出力しない
	SetOutApplicationLogValidFlag(FALSE);

	// ウインドウモードで起動
	ChangeWindowMode(TRUE);
	SetWindowStyleMode(4);

	// DXライブラリの初期化
	if (DxLib_Init() < 0) return -1;

	// ウィンドウのサブクラス化(ウィンドウプロシージャのフック)
	pPrevWndProc = (WNDPROC)GetWindowLongPtr(GetMainWindowHandle(), GWLP_WNDPROC);
	SetWindowLongPtr(GetMainWindowHandle(), GWLP_WNDPROC, (LONG_PTR)WndProc);

	// 描画先を裏画面にする
	SetDrawScreen(DX_SCREEN_BACK);


	SetAlwaysRunFlag(TRUE);
	/*--------------------------------
	メインループ
	-----------------------------------*/

	while (!ProcessMessage())
	{
		// 画面のクリア
		ClearDrawScreen();
		DrawFormatString(0, 0, -1, "%d\n", i);

		// 裏画面の内容を表画面に反映
		ScreenFlip();

	}

	//終了処理
	WaitForSingleObject(handoru, INFINITE); /* スレッドが終了するまで待つ。 */
	CloseHandle(handoru); /* ハンドルを閉じる */
	DxLib_End();

	// ソフトの終了
	return 0;
}


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: DXライブラリ別画面入力

#2

投稿記事 by みけCAT » 11年前

「ダイアログボックス」を作るのが楽かもしれません。
[search=google]Windows ダイアログ 猫でもわかる[/search]
書籍『猫でもわかるWindowsプログラミング 第3版』の第7章~第8章などに参考になる情報があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

長岡

Re: DXライブラリ別画面入力

#3

投稿記事 by 長岡 » 11年前

やってみましたがデータが更新されずに終わってしまいます。
何度も入力してこうしたいです

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: DXライブラリ別画面入力

#4

投稿記事 by みけCAT » 11年前

長岡 さんが書きました:やってみましたがデータが更新されずに終わってしまいます。
何度も入力してこうしたいです
そのソースコードを貼っていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

長岡

Re: DXライブラリ別画面入力

#5

投稿記事 by 長岡 » 11年前

下記がコードです。

dialog01.rc

コード:

#include <windows.h>
#include "dialog01.h"

MYDLG DIALOGEX 0, 0, 186, 70
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "登録"
FONT 10, "MS ゴシック"
BEGIN
LTEXT           "住所", IDC_STATIC, 18, 12, 17, 8
LTEXT           "氏名", IDC_STATIC, 17, 30, 17, 8
EDITTEXT        IDC_EDIT1, 52, 7, 127, 15, ES_AUTOHSCROLL
EDITTEXT        IDC_EDIT2, 52, 28, 127, 15, ES_AUTOHSCROLL
DEFPUSHBUTTON   "OK", IDOK, 7, 49, 50, 14
PUSHBUTTON      "終了", IDCANCEL, 129, 49, 50, 14
END
dialog01.h

コード:

#define IDC_EDIT1 1001
#define IDC_EDIT2 1002
#define IDC_STATIC 1003
main.cpp

コード:

#include "DxLib.h"
#include <stdio.h>
#include <math.h>
#include <process.h>
#include "dialog01.h"

static WNDPROC pPrevWndProc;
int i;

static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	char szBuf[128], szBuf1[64], szBuf2[64];
	switch (uMsg) {
	case WM_NCHITTEST:
		// ウインドウの枠の上にカーソルがあることにする
		return HTCAPTION;
	}
	return CallWindowProc(pPrevWndProc, hWnd, uMsg, wParam, lParam);
}

BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
	char szBuf[128], szBuf1[64], szBuf2[64];

	switch (msg) {
	case WM_COMMAND:
		switch (LOWORD(wp)) {
		case IDCANCEL:
			EndDialog(hDlg, IDCANCEL);
			return TRUE;
		case IDOK:
			GetDlgItemText(hDlg, IDC_EDIT1, szBuf1, (int)sizeof(szBuf1));
			GetDlgItemText(hDlg, IDC_EDIT2, szBuf2, (int)sizeof(szBuf2));
			wsprintf(szBuf, "あなたの住所は%sで、氏名は%sです", szBuf1, szBuf2);
			MessageBox(hDlg, szBuf, "猫でもわかるダイアログボックス", MB_OK);
			return TRUE;
		}
		return FALSE;
	}
	return FALSE;
}

unsigned __stdcall sure1(void *p)
{
	//デバッグ用にコンソールを呼び出す
	AllocConsole();
	freopen("CONOUT$", "w", stdout);
	freopen("CONIN$", "r", stdin);

	//printf関数を利用
	while (1){
		scanf("%d", &i);
	}

	//コンソール解放
	FreeConsole();
	_endthreadex(0);
	return 0;//コンパイラの警告を殺す
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

	HANDLE handoru;

	//handoru = (HANDLE)_beginthreadex(NULL, 0, sure1, "sure1です。", 0, NULL);


	DialogBox(hInstance, "MYDLG", NULL, (DLGPROC)MyDlgProc);

	//ログを出力しない
	SetOutApplicationLogValidFlag(FALSE);

	// ウインドウモードで起動
	ChangeWindowMode(TRUE);
	SetWindowStyleMode(4);

	// DXライブラリの初期化
	if (DxLib_Init() < 0) return -1;

	// ウィンドウのサブクラス化(ウィンドウプロシージャのフック)
	pPrevWndProc = (WNDPROC)GetWindowLongPtr(GetMainWindowHandle(), GWLP_WNDPROC);
	SetWindowLongPtr(GetMainWindowHandle(), GWLP_WNDPROC, (LONG_PTR)WndProc);

	// 描画先を裏画面にする
	SetDrawScreen(DX_SCREEN_BACK);


	SetAlwaysRunFlag(TRUE);
	/*--------------------------------
	メインループ
	-----------------------------------*/

	while (!ProcessMessage())
	{
		// 画面のクリア
		ClearDrawScreen();
		DrawFormatString(0, 0, -1, "%d\n", i);

		// 裏画面の内容を表画面に反映
		ScreenFlip();

	}

	//終了処理
	WaitForSingleObject(handoru, INFINITE); /* スレッドが終了するまで待つ。 */
	CloseHandle(handoru); /* ハンドルを閉じる */
	DxLib_End();

	// ソフトの終了
	return 0;
}


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: DXライブラリ別画面入力

#6

投稿記事 by みけCAT » 11年前

とりあえず、動くようにしてみました。
dialog01.rc

コード:

#include <windows.h>
#include "dialog01.h"

MYDLG DIALOGEX 0, 0, 186, 50
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "登録"
FONT 10, "MS ゴシック"
BEGIN
LTEXT           "数値", IDC_STATIC, 18, 12, 17, 8
EDITTEXT        IDC_EDIT1, 52, 7, 127, 15, ES_AUTOHSCROLL
DEFPUSHBUTTON   "更新", IDOK, 7, 29, 50, 14
END
dialog01.h

コード:

#define IDC_EDIT1 1001
#define IDC_STATIC 1003
main.cpp

コード:

#include "DxLib.h"
#include <stdio.h>
#include <math.h>
#include <process.h>
#include "dialog01.h"

static WNDPROC pPrevWndProc;
int i;
int endFlag;
HWND hDialogWnd;

static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	char szBuf[128], szBuf1[64], szBuf2[64];
	switch (uMsg) {
	case WM_NCHITTEST:
		// ウインドウの枠の上にカーソルがあることにする
		return HTCAPTION;
	}
	return CallWindowProc(pPrevWndProc, hWnd, uMsg, wParam, lParam);
}

BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
	char szBuf[128];

	switch (msg) {
	case WM_INITDIALOG:
		hDialogWnd = hDlg;
		break;
	case WM_CLOSE:
		EndDialog(hDlg, IDCANCEL);
		break;
	case WM_COMMAND:
		switch (LOWORD(wp)) {
		case IDOK:
			GetDlgItemText(hDlg, IDC_EDIT1, szBuf, (int)sizeof(szBuf));
			sscanf(szBuf,"%d",&i);
			return TRUE;
		}
		return FALSE;
	}
	return FALSE;
}

unsigned __stdcall sure1(void *p)
{
	//デバッグ用にコンソールを呼び出す
	//AllocConsole();
	//freopen("CONOUT$", "w", stdout);
	//freopen("CONIN$", "r", stdin);

	//printf関数を利用
	while (endFlag == 0){
		DialogBox(GetModuleHandle(NULL), "MYDLG", NULL, (DLGPROC)MyDlgProc);

		//scanf("%d", &i);
	}

	//コンソール解放
	//FreeConsole();
	_endthreadex(0);
	return 0;//コンパイラの警告を殺す
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

	HANDLE handoru;

	endFlag = 0;
	//handoru = (HANDLE)_beginthreadex(NULL, 0, sure1, "sure1です。", 0, NULL);
	handoru = (HANDLE)_beginthreadex(NULL, 0, sure1, NULL, 0, NULL);

	//DialogBox(hInstance, "MYDLG", NULL, (DLGPROC)MyDlgProc);


	//ログを出力しない
	SetOutApplicationLogValidFlag(FALSE);

	// ウインドウモードで起動
	ChangeWindowMode(TRUE);
	SetWindowStyleMode(4);

	// DXライブラリの初期化
	if (DxLib_Init() < 0) return -1;

	// ウィンドウのサブクラス化(ウィンドウプロシージャのフック)
	pPrevWndProc = (WNDPROC)GetWindowLongPtr(GetMainWindowHandle(), GWLP_WNDPROC);
	SetWindowLongPtr(GetMainWindowHandle(), GWLP_WNDPROC, (LONG_PTR)WndProc);

	// 描画先を裏画面にする
	SetDrawScreen(DX_SCREEN_BACK);


	SetAlwaysRunFlag(TRUE);
	/*--------------------------------
	メインループ
	-----------------------------------*/

	while (!ProcessMessage())
	{
		// 画面のクリア
		ClearDrawScreen();
		DrawFormatString(0, 0, -1, "%d\n", i);

		// 裏画面の内容を表画面に反映
		ScreenFlip();

	}

	//終了処理
	endFlag = 1; /* ダイアログのスレッドに終了指示を出す */
	SendMessage(hDialogWnd, WM_CLOSE, 0, 0); /* ダイアログに終了指示を出す */
	WaitForSingleObject(handoru, INFINITE); /* スレッドが終了するまで待つ。 */
	CloseHandle(handoru); /* ハンドルを閉じる */
	DxLib_End();

	// ソフトの終了
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

長岡

Re: DXライブラリ別画面入力

#7

投稿記事 by 長岡 » 11年前

ありがとうございました。

閉鎖

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