Windowsアプリケーション

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

Windowsアプリケーション

#1

投稿記事 by niki » 18年前

OSはWindowsXP、コンパイラはBorland C++を利用し、C言語を使ってWindowsプログラミングを作成中です。ポインタやファイル入出力、構造体等の基本的なことは学習したので、レベル7くらいだと思います。
添付したソースで作成したボタンを押したとき、ボタンが押されたままになるように、再度押すと押されていない状態になるようにしたいのですが、ソースをどのように変えたら良いのでしょうか?

ibis

Re:Windowsアプリケーション

#2

投稿記事 by ibis » 18年前

チェックボックスを使うべきかと。
この場合はCreateWindowの第3引数にBS_AUTOCHECKBOXを加えることで実現できます。
さらにBS_PUSHLIKEを加えるとプッシュボタンのような外観のチェックボックスになります。
チェックボックスの状態を取得するにはBM_CHECKEDメッセージを送信します。
その際の第3、第4引数は共にNULLです。
この戻り値がBST_CHECKEDならチェック状態、BST_UNCHECKEDなら非チェック状態となります。

niki

Re:Windowsアプリケーション

#3

投稿記事 by niki » 18年前

ご回答ありがとうございました。
確認、返信するのが遅れてすみません。
アドバイスを参考に試してみようと思います。<!--1

りょうちん

タスク処理を使ったらエラーが・・

#4

投稿記事 by りょうちん » 18年前

以前にここでタスク処理について教えていただき、やっとの思いで完成したのですが、
しばらく実行していると

卒研家用.exe の 0xbaadf00d でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xbaadf00d を読み込み中にアクセス違反が発生しました。

というエラーメッセージがでて中断されてしまうようになってしまいました。
申し訳ないのですがどなたか原因を教えてください。お願いします(ノω・、)

プレイキャラクターは普通の処理で弾だけタスク処理にしました。
必要なのかもわからないのですがタスク処理のコードかきます。
#define WORK_SIZE 512
#define NUM_TASKS 128
#define PI 3.1415926


// タスクリストの初期化
void InitTaskList() {
	
	// タスク用メモリの確保
	TASK* task=new TASK[NUM_TASKS+2];

	// アクティブタスクリストの初期化
	ActiveTask=&task[0];
	ActiveTask->Prev=ActiveTask->Next=ActiveTask;

	// フリータスクリストの初期化
	FreeTask=&task[1];
	for (int i=1; i<NUM_TASKS+1; i++)
		task.Next=&task[i+1];
	task[NUM_TASKS+1].Next=FreeTask;
}

// タスクの実行
void RunTask() {
	for (TASK *task=ActiveTask->Next, *next; 
		next=task->Next, task!=ActiveTask; task=next)
		(*task->Func)(task);
}

typedef void (*FUNC)(TASK* task);
// タスクの生成

TASK* CreateTask(FUNC func) {	//この関数を呼び出されたときの引数が処理関数

	// フリータスクリストが空ならば生成を中止する
	if (FreeTask->Next==FreeTask) return NULL;

	// フリータスクを1個取り出す
	TASK* task=FreeTask->Next;
	FreeTask->Next=task->Next;
	
	// 処理関数と前後タスクへのポインタを設定する
	task->Func=func;
	task->Prev=ActiveTask->Prev;
	task->Next=ActiveTask;

	// 前後タスクのポインタを変更する
	task->Prev->Next=task;
	task->Next->Prev=task;
	
	// 生成したタスクを返す
	return task;
}

// タスクの削除
void DeleteTask(TASK* task) {
	
	// アクティブタスクリストからタスクを削除する
	task->Prev->Next=task->Next;
	task->Next->Prev=task->Prev;
	
	// 削除したタスクをフリータスクリストに挿入する
	task->Next=FreeTask->Next;
	FreeTask->Next=task;
}

void FuncBullet(TASK* task) {
	
	// assertを使って構造体のサイズをチェックする
	assert(sizeof(Bullet_WORK)<=WORK_SIZE);
	// 弾のワークエリア構造体へのポインタにキャストする
	Bullet_WORK* work=(Bullet_WORK*)task->Work;

	work->T=work->T+1;
	if(work->T == 60)  //1秒間進んだら弾が消える
	 DeleteTask(task);
	
	work->X=work->X+cos(PI*(work->Z*0.001))*6.0;
	work->Y=work->Y+sin(PI*(work->Z*0.001))*6.0;

 DrawRotaGraph((int)work->X,(int)work->Y, 1 ,PI*(work->Z*0.001)+PI/2, img_player_shot[0], TRUE  ) ;
 if(work->Y < 15.0 || work->X < 10.0 || work->X > 409.0 || work->Y > 465.0) 
     DeleteTask(task);
	

}

void CreateBullet(double x, double y, double z) {
	
	TASK* task=CreateTask(FuncBullet);
	if (!task) return;
	
	// ワークエリアへのポインタをキャストする
	assert(sizeof(Bullet_WORK)<=WORK_SIZE);
	Bullet_WORK* work=(Bullet_WORK*)task->Work;

	work->X=x;
	work->Y=y;
	work->Z=z;
	work->V=1.0;
	work->T=1;
}

Justy

Re:タスク処理を使ったらエラーが・・

#5

投稿記事 by Justy » 18年前

というエラーメッセージがでて中断されてしまうようになってしまいました。
申し訳ないのですがどなたか原因を教えてください。お願いします(ノω・、)

 再現できるだけのコードがないので、正確にはわかりませんが、
多分、確保されていないメモリ(未初期化のポインタとか配列の要素以上に読み書きしたとか)に
アクセスしたのでしょう。

 デバッガを使っているなら、その中断されたソースの場所がわかると思います。
 そこから調べてみて下さい。

りょうちん

Re:タスク処理を使ったらエラーが・・

#6

投稿記事 by りょうちん » 18年前

ありがとうございました。デバッガの使い方がよくわからないので、
覚えてそこから調べてみます。

閉鎖

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