VCはじめて一週間の素人です。
仕事の空き時間に勉強のためVC++(MFC-ダイアログベース)で
携帯の簡単なシミュレータを作成しているのですが行き詰まって
しまった個所があり書き込みました。
環境はWin2000 VC6.0SP4です。
1.レイアウトについてですがダイアログベースにエディットボックスとボタンを
いくつもぺたぺた貼り付けているのですが、エディットボックスが重なりあって
しまったところ(メイン画面の上にサブメニューの表示など)が思ったように表示できません。
画面の更新は下記のように行っています。
((CEdit*)GetDlgItem(IDC_MAINDSP))->SetWindowText((char*)&MAIN_STR_MENU[0]);
((CEdit*)GetDlgItem(IDC_SUBMENUDSP))->SetWindowText((char*)&SBMN_STR_MAIN1[0]);
IDC_MAINDSPの上にIDC_SUBMENUDSPを表示させるようにしたいのですが・・・
2.ある文字列(例:「発信中」)を表示→消去→表示→・・・のように点滅させたいのですが
どのようにすればよいでしょうか?
タイマーの使い方がわからずネット上で調べたのですがさっぱりです。
私のような猿でもわかるようなページ等あれば教えていただけないでしょうか。
(あとダイアログベースにエディットボックスとボタンをひたすら貼るのは邪道ですか?)
1. ダイアログエディタを開いて、メニューの「レイアウト」-「タブオーダー」を
選ぶと、表示順を変更できます。
2. SetTimer()でタイマーをセットし、
OnTimer()でタイマーを処理します。
好みのページはこれらをキーワードにして探してください。
> (あとダイアログベースにエディットボックスとボタンをひたすら貼るのは邪道ですか?)
そのユーザインターフェースが、
アプリケーションの動作目的に適っており、
利用者が最も操作しやすいように最善を尽くしてデザインされたものであれば、
邪道ではないと考えます。
>1. ダイアログエディタを開いて、メニューの「レイアウト」-「タブオーダー」を
これです~ずっと探してました。なんでタブストップにチェックの入っていないものまで
番号振られてるのかずっと不思議に思っていたのですがこのためですね。
>2.
MSDNで調べたのですが以下の処理順がいまいちわかりません。
void CMainFrame::OnStartTimer()
{
m_nTimer = SetTimer(1, 2000, 0);
}
void CMainFrame::OnStopTimer()
{
KillTimer(m_nTimer);
}
void CMainFrame::OnTimer(UINT nIDEvent)
{
MessageBeep(0xFFFFFFFF); // Beep
// Call base class handler.
CMDIFrameWnd::OnTimer(nIDEvent);
}
わかってることは
「OnStartTimerでセットした時間が経過したらOnTimerのビープ音を鳴らすのかな?」
ってぐらいです。(でもOnTimerでもCMDIFrameWnd::OnTimer呼んでるし・・・)
疑問1.OnStopTimerは自分で呼ぶのでしょうか?
疑問2.UINT nIDEventとは?
申し訳ありませんがもう少しおつきあいください
OnTimerとは指定したタイミングで呼ばれるメッセージジハンドラです。
上の例だと2秒ごとに呼ばれるわけですね。(2000ミリ秒なので)
ひとつのウィンドウに複数のタイマーをセットできるので識別するのにIDが必要で
す。これがSetTimer()の第1引数です。
StopTimer(KillTimer)は指定IDのOnTimerを無効にします。(nIDEvent == 1かな?)
つまり上の例は、
StartTimer()関数を実行すると2秒ごとにビープが鳴ります。
ただしStopTimer()を実行するとビープは鳴らなくなります。
> 疑問1.OnStopTimerは自分で呼ぶのでしょうか?
そうです。止めたい時に自分で呼んでください。
> 疑問2.UINT nIDEventとは?
SetTimerの第一引数に指定した番号が渡されます。
複数のタイマーを起動した場合、これで区別します。
>SetTimerの第一引数に指定した番号が渡されます。
なるほど~だいぶわかりました。
タイマーはまだ試していないのですが今度実装してみます。
これで一歩前進しました☆みなさまありがとうございます(^-^)