フォームにButtonを1つとメッセージボックスが1つあります。
現在は、
①ボタンを押すと6秒おきにOKと新しいフォームがたちあがりメッセージがながれ
てタイマーが動いているここが確認できます。
②6秒後にメッセージボックスに動いてるよと表示されます。
改善したいところは、
①ボタンを押すとタイマーも動くのは当たり前なんですが、
②すぐにメッセージボックスに動いてるよと表示してほしいのです。
(6秒おきにOKというのが立ち上がるのはかわりません)
お分かりになる方は、申し訳ございませんがご連絡いただけたら幸いです。
void CxxDlg::OnButton()
{
AfxMessageBox(動いているよ);
SetTimer(TIMER_ID, 6000, NULL);
}
UINT MyMessageBox(LPVOID pParam)
{
AfxMessageBox(動いているよ);
return 0 ;
}
void CxxDlg::OnButton()
{
::AfxBeginThread(MyMessageBox,0) ;
SetTimer(TIMER_ID, 6000, NULL);
}
先程のではモーダルになってしまいますね。
モードレスにする場合
UINT MyMessageBox(LPVOID pParam)
{
::MessageBox(0,動いているよ,キャプション,MB_OK);
return 0 ;
}
void CxxDlg::OnButton()
{
::AfxBeginThread(MyMessageBox,0) ;
SetTimer(TIMER_ID, 6000, NULL);
}
void CTestDlg::OnButton1()
{
int i;
CEdit * pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
while(1){
i = Dll_T(); //6秒たったら1を返す
if(i){
AfxMessageBox(OK);
}
else{
pEdit->SetWindowText(動いているよ);
}
}
}
このようになっているのですが、”動いているよ”と表示されません。
VBのDoEventsみたいなのを使わないといけないのでしょうか?
表示させるだけなら
pEdit->SetWindowText(動いているよ);
pEdit->UpdateWindow();
で出来ると思います。
ただ、whileでぐるぐる回しっぱなしにしているようなので
ちらつきそうですが。
いっそのことOnTimer側に処理を書いてしまったほうが
すっきりするのではないでしょうか。
DoEventsのようなものを実装したいときは
過去ログでPeekMessageを検索してみてください。(DoEventsでも可)
dairygoods様、Tonny様、とおりがかり様アドバイスありがとうございます。
とおりがかり様の教えていただいたもので動作の確認はできました。やはり、チラつきま
したね。次は、ちらつかないようにするためにはどうするか?を勉強してみます。
私の質問に貴重なお時間をいただきましてありがとうございました。
動いている最中ずっと「動いているよ」と表示していればよいのなら、
...
pEdit->SetWindowText(動いているよ);
pEdit->UpdateWindow();
while(1){
i = Dll_T(); //6秒たったら1を返す
if(i){
AfxMessageBox(OK);
}
}
でよいのでは?