画像の切り替え

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

画像の切り替え

#1

投稿記事 by ぱろm » 1年前

エンターキーを押すと画像が切り替わるプログラムが組みたいんですけど、どういった感じで組めばいいかわからないのでご教授お願いいたします

アバター
幸尚
記事: 47
登録日時: 1年前
連絡を取る:

Re: 画像の切り替え

#2

投稿記事 by 幸尚 » 1年前

まず、環境を書いてください。

CUIなのかGUIなのか?
Windowsなのか?
Linuxなのか?
コンパイラは何か?
など
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

アバター
幸尚
記事: 47
登録日時: 1年前
連絡を取る:

Re: 画像の切り替え

#3

投稿記事 by 幸尚 » 1年前

Windowsプログラム(Win32API)ということを前提で勧めたいと思います。

コード:

#include <Windows.h>

LRESULT CALLBACK WndProc(
	HWND hWnd,
	UINT msg,
	WPARAM wParam,
	LPARAM lParam
);

/*-------------------------------------------
   メインウィンドウ作成
-------------------------------------------*/
static HWND CreateMainWindow(HINSTANCE hInstance)
{
	return CreateWindowEx(
		0,
		L"CLASS_NAME",
		L"サンプルプログラム",
		WS_OVERLAPPEDWINDOW,
		0,
		0,
		640,
		480,
		NULL,
		NULL,
		hInstance,
		NULL); 
}

/*-------------------------------------------
   ウィンドウクラス設定
-------------------------------------------*/
static BOOL SetRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;
	wcex.cbSize			= sizeof(WNDCLASSEX);
	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= NULL;
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	wcex.lpszMenuName	= NULL;
	wcex.lpszClassName = L"CLASS_NAME";
	wcex.hIconSm		= NULL;

	return RegisterClassEx(&wcex);
}


/*-------------------------------------------
   メイン用ウィンドウプロシージャ
-------------------------------------------*/
LRESULT CALLBACK WndProc(
	HWND hWnd,
	UINT msg,
	WPARAM wParam,
	LPARAM lParam
)
{
	switch (msg)
	{
	case WM_CHAR:
		if (wParam == VK_RETURN)
		{
			MessageBox(hWnd, L"エンターキー押されたよ", NULL, MB_OK);
		}
		break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
	}
	return (DefWindowProc(hWnd, msg, wParam, lParam));
}

/*-------------------------------------------
	メイン関数
-------------------------------------------*/
INT APIENTRY WinMain(
	_In_		HINSTANCE	hInstance, 
	_In_opt_	HINSTANCE	hPreInst,
	_In_		LPWSTR		lpszCmdLine,
	_In_		INT			nCmdShow
)
{
	HWND hWnd;
	MSG msg;

	if (!SetRegisterClass(hInstance))
		return FALSE;

	// ウィンドウを画面中央に表示
	hWnd = CreateMainWindow(hInstance);
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return (int)msg.wParam;
}
上記プログラムでエンターキーを押すとメッセージボックスが表示するプログラムです。

コード:

	case WM_CHAR:
		if (wParam == VK_RETURN)
		{
			MessageBox(hWnd, L"エンターキー押されたよ", NULL, MB_OK);
		}
		break;
上記部分に画像切替するロジックを組み込めば良いかと思います。

また、Visual studio 2022でエラーが出る場合は
「リンカー」-「システム」-「サブシステム」を
Windows (/SUBSYSTEM:WINDOWS)にするとコンパイルが通ります。
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

アバター
usao
記事: 1887
登録日時: 10年前

Re: 画像の切り替え

#4

投稿記事 by usao » 1年前

> エンターキーを押すと画像が切り替わるプログラムが組みたい

という話が出ているということは,現時点で
単純に画像を表示することは できる/できている のだと推測する.

そしたら,

・画像データを2個にする
・画像を表示している個所を,【「何らかの仕組みによって」前記2個の画像データのうちのいずれかを表示する】という形にする
・エンターキーが押されたときに,前記の「何らかの仕組み」に適切に作用する処理を実施する

みたいな話にすれば良かろう.
具体的にどのように実現するのかについては底なしに自由であろうが,

例えば,「何らかの仕組み」のところを
「ある bool 型変数の値が true なのか false なのか? というのが,どっちの画像を表示するのか を示す」のだということにしたならば,
表示の箇所はこの bool 型変数の現在値を参照して適切な側の画像を表示するだけの話だし,
エンターキー押下時にはその bool 型変数の値を変更すればいいよね.

アバター
usao
記事: 1887
登録日時: 10年前

Re: 画像の切り替え

#5

投稿記事 by usao » 1年前

複数の画像を順繰りに切り替えたい,とかなら,例えばこんなのが簡単か.

コード:

//
//なんかこんなデータがあって…
//

//N個の画像データ
constexpr int N = 5;
ImageType Imgs[N] = { ... };  //画像データの型も初期化方法も不明だが
//今現在表示すべき画像を示す変数
int CurrImgIndex = 0;  //今現在表示すべきは Imgs[CurrImgIndex] である.

コード:

//
//そしたら表示部分はこんな話だろう
//

//Ims[CurrImgIndex] を表示する
ShowImage( Ims[CurrImgIndex] );  //表示処理の具体的記述も不明だが

コード:

//
//エンターキー押下時の処理
//

if( エンターキーが押された )
{
  //表示画像を次に進める
  ++CurrImgIndex;
  if( CurrImgIndex >= N )CurrImgIndex = 0;  //このあたり,どうするのかは仕様次第だ

  //必要なら再描画を要求とか
}

dic
記事: 655
登録日時: 13年前
住所: 宮崎県
連絡を取る:

Re: 画像の切り替え

#6

投稿記事 by dic » 1年前

だから無責任な匿名はやめとけとあれほど

返信

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