• ベストアンサー

Active Basicで、バツボタンを押したときの処理

Active Basicでプログラムを書いていて、『×』ボタンを押すと、終了の確認のメッセージを出して、『はい』なら終了、『いいえ』ならプログラムの継続といったものを作りたいのですが、出来ません。 Sub MainWnd_QueryClose(ByRef cancel As Integer) If MessageBox(hMainWnd,"終了しますか?","確認",MB_YESNO or MB_ICONINFORMATION) = IDNO Then Exit Sub End If End Sub 今回使ったコードです。 すみませんが、何処を修正すれば良いかご存知の方、ご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

ActiveBasic付属のヘルプで QueryCloseの項目を確認してみましょう ウィンドウを閉じたくない場合はイベントの引数cancelをTRUEに設定してプロシージャを抜けないといけませんよ

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#208124
noname#208124
回答No.1

Q&Aにありますぜ

参考URL:
http://dev.activebasic.com/nana/?cat=6&paged=2
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ActiveBasic 再描写処理が読み出されても、描写していた物を削除しない方法

    ActiveBasic4.23.00を使ってプログラムを書いています。 例えば、次のようなコードがあったとします。 'グローバル Dim DragFlag As Long Dim hDC As HDC '此処まで Sub MainWnd_Destroy() ReleaseDC(hMainWnd,hDC) test_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) hDC = GetDC(hMainWnd) End Sub Sub MainWnd_LButtonDown(flags As Long, x As Integer, y As Integer) DragFlag = 1 MoveToEx(hDC,x,y,ByVal NULL) End Sub Sub MainWnd_MouseMove(flags As Long, x As Integer, y As Integer) If DragFlag = 0 Then Exit Sub LineTo(hDC,x,y) End Sub Sub MainWnd_LButtonUp(flags As Long, x As Integer, y As Integer) DragFlag = 0 End Sub (ABWiki様を参考にさせていただきました。) これで、簡単なお絵かきが出来ますが、再描写(例えば、ウインドウの大きさを変えるなど)をするとすべて消えてしまいます。 これを、描いた線を消さずに再描写することは出来ないのでしょうか。 すみませんがご教授ください。

  • Active Basic 再描写処理

    最近デバイスコンテキストを何とか理解してきたので、実験的に『上から物体が振ってくるのを避ける』というゲームを作ってみようと思い作り始めました。 『←』が押されれば、棒人間を左に、『→』が押されれば、棒人間を右に移動させる処理と、ランダムで●が上から落ちてくるという処理をタイマーを使ってやってみました。(スレッドとかはまだ勉強していないので) 一応完成はしたのですが、棒人間を動かすと、どうしても●がちらつきます。 この場合は、どういう風に処理をすればいいのでしょうか? プログラムはこう書きました。 グローバル変数 Dim hBmp01 As HWND Dim hBmp02 As HWND Dim hBmp03 As HWND Dim hBmp04 As HWND Dim hMemDC As HDC Dim BmpInfo As Long Dim hBomDC As HWND Dim Bomxy As RECT Dim x As Long Dim y As Long Dim bx As Long Dim by As Long Dim n As Long '---------------------------------------------------- 省略 '----------------------------------------------------- Sub MainWnd_Destroy() DeleteObject(hBmp01) DeleteObject(hBmp02) DeleteObject(hBmp03) DeleteObject(hBmp04) YokeGame_DestroyObjects() PostQuitMessage(0) End Sub Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT) SetWindowText(hMainWnd,"画像描写テスト ~爆弾的なものを避けるゲーム~") hBmp01 = LoadImage(0,".\画像\人\普通.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp02 = LoadImage(0,".\画像\人\右.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp03 = LoadImage(0,".\画像\人\左.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp04 = LoadImage(0,".\画像\爆弾\ボム.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) GetWindowRect(hBmp04,Bomxy) If hBmp01=0 or hBmp02=0 or hBmp03=0 or hBmp04=0 Then MessageBox(hMainWnd,Ex"画像の読み込みに失敗しました\r\n強制終了します。","Error",MB_OK or MB_ICONHAND) DeleteObject(hBmp01) DeleteObject(hBmp02) DeleteObject(hBmp03) DeleteObject(hBmp04) SendMessage(hMainWnd,WM_CLOSE,0,0) End If x=290 y=275 BmpInfo=1 bx = 320 by = 0 SetTimer(hMainWnd,0,300,0) End Sub Sub Kettei() Dim ok As Long by=0 Do Randomize bx = Fix(Rnd()*100) If bx>0 and 630>bx Then ok=TRUE End If Loop Until ok=TRUE End Sub Sub MainWnd_Paint(hDC As HDC) hMemDC = CreateCompatibleDC(hDC) hBomDC = CreateCompatibleDC(hDC) If BmpInfo = 1 Then SelectObject(hMemDC,hBmp01) Else If BmpInfo = 2 Then SelectObject(hMemDC,hBmp02) Else If BmpInfo = 3 Then SelectObject(hMemDC,hBmp03) End If BitBlt(hDC,x,y,40,50,hMemDC,0,0,SRCCOPY) Sleep(30) SelectObject(hMemDC,hBmp01) BitBlt(hDC,x,y,40,50,hMemDC,0,0,SRCCOPY) Sleep(30) SelectObject(hBomDC,hBmp04) BitBlt(hDC,bx,by,9,9,hBomDC,0,0,SRCCOPY) DeleteDC(hMemDC) DeleteDC(hBomDC) BmpInfo = 1 End Sub Sub MainWnd_KeyDown(KeyCode As Long, flags As Long) If KeyCode = 37 Then If x<=0 Then x=0 Exit Sub End If x = x - 10 BmpInfo=3 End If If KeyCode = 39 Then If x>=600 Then x = 600 Exit Sub End If x = x + 10 BmpInfo=2 End If InvalidateRect(hMainWnd,ByVal 0,TRUE) End Sub Sub MainWnd_Timer(TimerID As DWord) If TimerID = 0 Then by = by + 10 InvalidateRect(hMainWnd,Byval 0,TRUE) If by >=360 Then Kettei() End If End If End Sub っと、このようになりました。(一応動きます) strictには、チェックを入れていません。 バージョンは、4.23.00を使っています。 それと、InvalidateRect関数なのですが、 InvalidateRect(hMainWnd,Byval 0,TRUE) の、二つ目のパラメータ(?)部分に、全体を再描写させるときに何故『Byval 0』と表記するのでしょうか? ヘルプには、NULL を指定すると、クライアント領域全体が更新領域に設定されますと書かれていますが、NULLを指定すると無効な識別となります。 すみませんが、分かる方がいらっしゃいましたら、ご教授をお願いします。

  • Active Basic 他のアプリケーションを終了させる

    Active Basic4.23.00を使用しています。 指定したほかのプロセスを終了させようと思っているのですが、 なかなか上手くいきません。 Dim hWnd As HWND Dim err As Long Dim code As DWord hWnd=FindWindow("notepad",NULL) If hWnd=NULL Then MessageBox(hMainWnd,"FindWindowでエラーが発生!","Error",MB_OK or MB_ICONHAND) Exit Sub End If GetExitCodeProcess(hWnd,code) If code=STILL_ACTIVE Then MessageBox(hMainWnd,"GetExitCodeProcessでSTILL_ACTIVEが返った!","Error",MB_OK or MB_ICONHAND) Exit Sub End If err=TerminateProcess(hWnd,code) If err=0 Then MessageBox(hMainWnd,"TerminateProcessでエラーが発生!","Error",MB_OK or MB_ICONHAND) MessageBox(0,Str$(code),"GetExitCodeProcessで取得したコード",MB_OK or MB_ICONINFORMATION) Exit Sub End If このようなコードを書きました。 すみませんが、間違いの指摘のほうをお願いします。 それと、『FindWindow』関数についてです。 ヘルプに、 >lpClassName >検索するクラス名を指定します。必要のないときは、NULL を指定することができます。 とありますが、クラス名≒プロセス名と考えてもいいのでしょうか。 また、lpClassNameを指定し、lpWindowNameにNULLを指定(今回のコードのような場合)では、ハンドルを取得できないのでしょうか。 すみませんが、ご教授をお願いします。

  • ActiveBasic 音楽のループ再生

    Active Basic4.23.00でプログラムを書いています。 音楽再生ソフトを作ってみようと思い、作り始めたのですが、なかなかループ再生が出来ません。 チェックボックス1がチェックされていると、ループさせようと思っています。 ↓問題のコード Sub MainWnd_MciNotify(flags As Long, DevID As DWord) If SendMessage(GetDlgItem(hMainWnd,CheckBox1),BM_GETCHECK,0,0)=BST_CHECKED Then Dim bErr As Long Dim mpp As MCI_PLAY_PARMS mpp.dwCallback=hMainWnd mpp.dwFrom=0 bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY or MCI_FROM,mpp) If bErr Then MessageBox(hMainWnd,"デバイス再生エラー","Error",MB_OK or MB_ICONHAND) Exit Sub End If Else mpp.dwCallback=hMainWnd mpp.dwFrom=0 End If End Sub 一見、(少なくとも自分は)成功しているように見えるのですが、 2回ループした後、フリーズしてしまいます。 すみませんが、何故そうなるかが分かる方がいらっしゃいましたら、すみませんが、ご教授ください。 お願いします。

  • ボタンが押されたときの反応 Basic

    Active Basicでゲームプログラムを書いています。 ボタンを押したときの反応で、上下左右に画像を動かしたいのですが、 ボタンを押すと、いったん静止してから、連打処理(?)のように動きます。 やりたいことは、ボタンを押すとすぐに上下左右に一定間隔で画像を動かすことです。 Sub MainWnd_KeyDown(KeyCode As Long, flags As Long) If KeyCode=37 Then If x<=3 Then Exit Sub End If MyBmpInfo=2 x=x-5 Else If KeyCode=38 Then If y<=0 Then Exit Sub End If MyBmpInfo=1 y=y-5 Else If KeyCode=39 Then If x>=600 Then Exit Sub End If MyBmpInfo=3 x=x+5 Else If KeyCode=40 Then If y>=400 Then Exit Sub End If y=y+5 End If InvalidateRect(hMainWnd,ByVal 0,TRUE) End Sub と書きました。 すみませんが、どなたかご存知の方がいらっしゃいましたら、ご教授ください。 お願いします。

  • BASIC言語でmciSendCommand関数を扱う時

    Active Basicでゲームを作っています。 BGMを流すときに、PlaySound関数で音を鳴らそうと思ったのですが、 これはwav形式しか鳴らせないと知り、mciSendCommand関数を勉強することにしました。 mciSendCommand関数で、BGM(今回はmid)を読み出そうと思ったのですが、 『リピート再生』が出来ません。 いろいろ探してみたのですが、理解できませんでした。 そこで、いろいろ実験したのですが、どうも思うように動いてくれません。 MainWndとMenuの二つのウインドウがあります。 グローバル変数に Dim bErr As Long Dim mop As MCI_OPEN_PARMS を定義してあります。 ↓書いたコード(Menuウインドウ) mop.lpstrElementName=".\BGM\bgm01.mid" bErr=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,mop) If bErr Then MessageBox(hMainWnd,"BGMの読み込みに失敗しましたので、強制終了します。","Error",MB_OK or MB_ICONHAND) SendMessage(hMainWnd,WM_CLOSE,0,0) End If '再生 Dim mpp As MCI_PLAY_PARMS mpp.dwCallback=hMainWnd bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp) If bErr Then MessageBox(hMainWnd,"BGMの再生に失敗したので、強制終了します。","ERROR",MB_OK or MB_ICONHAND) SendMessage(hMainWnd,WM_CLOSE,0,0) End If SetWindowPos(hMainWnd,HWND_TOP,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW) SetTimer(hMainWnd,2,213000,0) ここで、1回目の再生処理を入れて、SetTimer関数で、曲の長さ分のタイマーをセットして、曲が終了したらもう一度再生しなおすという方法でしました。 (探したサイトには、『リピート機能は無い』と書いてあったので) ↓タイムアウト時の処理(MainWnd) If TimerID=2 Then Dim mpp As MCI_PLAY_PARMS mpp.dwCallback=hMainWnd mpp.dwFrom=0 bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp) If bErr Then MessageBox(hMainWnd,"BGMの再生に失敗したので、強制終了します。","ERROR",MB_OK or MB_ICONHAND) SendMessage(hMainWnd,WM_CLOSE,0,0) End If End If 初めて扱う部分なので、まだ良く分かっていません。 どなたか良いやり方をご存知の方がいらっしゃいましたらご教授下さい。 お願いします。

  • Active Basic 枠無しウインドウをマウスで移動させる

    枠なしのウインドウ(スタイル:ポップアップ/枠無し)を、 ドラッグで任意の場所に移動させたいのですが、知識が足りません。 一応抵抗はしてみたのですが、あっけなく弾き飛ばされました。 'グローバル Dim LClickFlag As Long Sub MainWnd_LButtonDown(flags As Long, x As Integer, y As Integer) LClickFlag=TRUE End Sub Sub MainWnd_LButtonUp(flags As Long, x As Integer, y As Integer) LClickFlag=FALSE End Sub Sub MainWnd_MouseMove(flags As Long, x As Integer, y As Integer) If LClickFlag=TRUE Then SetWindowPos(hMainWnd,NULL,x,y,0,0,SWP_NOSIZE) End If End Sub 動きはしますが、ちょこちょこちょこちょこ動いて、移動させたい場所に移動できません。 すみませんが、どのようにやれば良いかのご教授をお願いします。 それと、ずっと参考にしていた、Active Basicの非公式WIKI様(http://www.2chab.net/pukiwiki/index.php?ActiveBasic%20Wiki-TopPage)は、もう復活しないのでしょうか。 こちらも知っていらっしゃる方がいらっしゃいましたら、ご教授をお願いします。

  • 自分の書いたプログラムに疑問があります

    よろしくお願いします。 メモ帳を作っています、作成したウィンドウに 『メニュバー』  『ツールバー』 『ポップアップメニュー』 を作り、そこにエディタを貼り付けました。 『右クリック』をすると、windows既成のポップアップメニューが表示されるため、新しいプロシージャで自分用のポップアップメニューを作ったのですが、 メモ帳に何も書かずに終了した時、終了できなかったのでこのプログラムを先頭に加えました。 if(SendMessage(hWnd, EM_GETMODIFY, 0, 0) == FALSE){ id = MessageBox(hWnd, TEXT("終了してもいいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hWnd); PostQuitMessage(0); } } 疑問点  この記述は、『文書保存の確認』の所でも使っていますが、 これをつけないと終了できません。 重複しているため、すっきりしないのですが、 今は、これしか思い浮かばないのですが、もっとすっきりしたプログラムにしたいのです。 間違っている所、直したほうがいい所がありましたらアドバイスをお願いします。 //マイプロシージャの終了メッセージ処理 case WM_COMMAND: switch (LOWORD(wp)){ case IDM_END:   if(SendMessage(hWnd, EM_GETMODIFY, 0, 0) == FALSE){ id = MessageBox(hWnd, TEXT("終了してもいいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hWnd); PostQuitMessage(0); } //重複するが、ここを付けないと、何も書いていないメモ帳が閉じない } //ここから文書保存のプログラム if(SendMessage(hWnd, EM_GETMODIFY, 0, 0) == TRUE){ id = MessageBox(hWnd, TEXT("文書が更新されています、\n変更を保存しますか?"), TEXT("メモ帳"), MB_YESNOCANCEL | MB_ICONEXCLAMATION); if(id == IDYES){ MySaveAs(hWnd); }else if (id == IDCANCEL){ return IDCANCEL; } /*else if (id ==IDNO){ ここを記述すると  文書保存でキャンセルした時に、『終了しない』     また、何も書いてないと 『終了しない』  id = MessageBox(hWnd, TEXT("終了してもいいですか"), TEXT("確認"), MB_YESNO | MB_ICONQUESTION); if(id == IDYES){ DestroyWindow(hWnd); PostQuitMessage(0); //}//ここもコメントアウト } } } break;   default: return CallWindowProc(OldProc, hWnd, msg, wp, lp); } }  

  • ActiveBasic リソースの追加/読み込み

    ActiveBasic 4.23.00 を使用しています。 今回、ファイルの暗号化ソフトを作成しようと思い、手段を考えていたところ、ON ERROR RESUME NEXT様のリソースの追加/読み込みの項目を見つけ、 これでやってみようと作成を始めました。 Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (pFileName As BytePtr,bDeleteExistingResources As Long) As Long Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (hUpdate As Long,lpType As BytePtr,lpName As BytePtr,wLanguage As Long,lpData As VoidPtr,cbData As Long) As Long Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (hUpdate As Long,fDiscard As Long) As Long '定数 Const RT_MANIFESTID=1 Const RT_MANIFEST="BINTYPE" Sub MainWnd_CommandButton1_Click() Dim IsUpdate As Long Dim Update As Long Dim temp As String 'EditBoxをチェック Dim Ed1 As Long Dim Ed2 As Long Dim buf1 As BytePtr Dim buf2 As BytePtr Ed1=GetWindowTextLength(GetDlgItem(hMainWnd,EditBox1)) Ed2=GetWindowTextLength(GetDlgItem(hMainWnd,EditBox2)) If Ed1=0 Then MessageBox(hMainWnd,"埋め込み用物質が選択されていません","Error 1",MB_OK or MB_ICONHAND) Exit Sub End If If Ed2=0 Then MessageBox(hMainWnd,"埋め込み先物質が選択されていません","Error 2",MB_OK or MB_ICONHAND) Exit Sub End If buf1=malloc(Ed1+1) buf2=malloc(Ed2+1) GetDlgItemText(hMainWnd,EditBox1,buf1,Ed1) GetDlgItemText(hMainWnd,EditBox2,buf2,Ed2) temp=MakeStr(buf2) IsUpdate=BeginUpdateResource(buf1,TRUE)'FileName はターゲットファイルのフルパス。Ex:"C:\test.exe" にリソースを埋め込む場合、FileName="C:\test.exe" If IsUpdate=0 Then'エラー free(buf1) free(buf2) MessageBox(hMainWnd,"リソースの埋め込み先に異常あり","Error 3",MB_OK or MB_ICONHAND) Exit Sub EndIf Update=UpdateResource(IsUpdate,RT_MANIFEST,RT_MANIFESTID,MAKELANGID(LANG_JAPANESE,SUBLANG_SYS_DEFAULT),temp,Len(temp)) If Update=0 Then'エラー EndUpdateResource(IsUpdate,TRUE) free(buf1) free(buf2) MessageBox(hMainWnd,"リソースの埋め込み時に異常事態発生","Error 4",MB_OK or MB_ICONHAND) Exit Sub End If EndUpdateResource(IsUpdate,FALSE) free(buf1) free(buf2) MessageBox(hMainWnd,"たぶんエラーなく書き込みを完了しました。","Success!!",MB_OK or MB_ICONINFORMATION) End Sub このように書いてみたのですが、IsUpdate=0でいつもエラーが返ってきます。 何故かが分かりません。 すみませんが、ご存知の方がいらっしゃいましたら、ご教授の方をお願いします。

  • MessageBoxでの処理の仕方が分かりません。

    MessageBox(NULL, "曲ができました。", "評価", MB_YESNO); というプログラムを書きました。"はい"を押したときに、次の動作にいくようなプログラムを書きたいのですがどのように記述したらよいですか?分かる方がいましたらよろしくお願いします。