ページ 1 / 1
Windowsアプリケーション
Posted: 2007年10月25日(木) 00:23
by niki
OSはWindowsXP、コンパイラはBorland C++を利用し、C言語を使ってWindowsプログラミングを作成中です。ポインタやファイル入出力、構造体等の基本的なことは学習したので、レベル7くらいだと思います。
添付したソースで作成したボタンを押したとき、ボタンが押されたままになるように、再度押すと押されていない状態になるようにしたいのですが、ソースをどのように変えたら良いのでしょうか?
Re:Windowsアプリケーション
Posted: 2007年10月25日(木) 22:13
by ibis
チェックボックスを使うべきかと。
この場合はCreateWindowの第3引数にBS_AUTOCHECKBOXを加えることで実現できます。
さらにBS_PUSHLIKEを加えるとプッシュボタンのような外観のチェックボックスになります。
チェックボックスの状態を取得するにはBM_CHECKEDメッセージを送信します。
その際の第3、第4引数は共にNULLです。
この戻り値がBST_CHECKEDならチェック状態、BST_UNCHECKEDなら非チェック状態となります。
Re:Windowsアプリケーション
Posted: 2007年10月28日(日) 23:36
by niki
ご回答ありがとうございました。
確認、返信するのが遅れてすみません。
アドバイスを参考に試してみようと思います。<!--1
タスク処理を使ったらエラーが・・
Posted: 2007年11月10日(土) 03:39
by りょうちん
以前にここでタスク処理について教えていただき、やっとの思いで完成したのですが、
しばらく実行していると
卒研家用.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;
}
Re:タスク処理を使ったらエラーが・・
Posted: 2007年11月10日(土) 11:40
by Justy
>というエラーメッセージがでて中断されてしまうようになってしまいました。
>申し訳ないのですがどなたか原因を教えてください。お願いします(ノω・、)
再現できるだけのコードがないので、正確にはわかりませんが、
多分、確保されていないメモリ(未初期化のポインタとか配列の要素以上に読み書きしたとか)に
アクセスしたのでしょう。
デバッガを使っているなら、その中断されたソースの場所がわかると思います。
そこから調べてみて下さい。
Re:タスク処理を使ったらエラーが・・
Posted: 2007年11月10日(土) 15:54
by りょうちん
ありがとうございました。デバッガの使い方がよくわからないので、
覚えてそこから調べてみます。