初めての投稿です。ActiveBasic初心者のトモカズと申します。
以下の線中は読み飛ばしていただいて構いません。
-------------------------------------------------------------------------------
私が高校生の時(20数年前!)に作成したプログラムソース(対戦オセロソフト)が押入れの奥から出てきました。
懐かしさのあまり、どうしても実行してみたくなったのですが、残念ながら当時のマシンはありません。
そこでActive Basicの存在を知り、どうにか N88BASICモードにて移植が出来ました。
さほど手を入れる事が無く移植が出来ましたが、どうせWindows版ならば、それらしくしたいと考えるようになりました。
しかし、私自身プログラムを組むのも20年ぶりですし、最近の言語による作り方は何と様変わりしたのだろうと感じております。
こちらのフォーラムの記事を見ても(頭が固いのか)良く理解出来ず、四苦八苦しております。
------------------------------------------------------------------------------
さて、ここから本題です。
現在のN88BASICモードで作成したソースをノーマルウィンドゥモードに変更したいと思います。
そこで、マウス位置のキャプチャー及びマウスボタンの判定、ビットマップ表示、テキスト文字の表示をするそれぞれのサブルーチン(・・とは最近言わないのでしょうか?)を、どの様に組み込んだら良いのかをご教授いただきたいのです。
どうぞ、よろしくお願いいたします。
なお、N88モードで作成したものが以下のファイルです。石をビットマップにして見栄えを良くし、マウス操作による動作にしたいと思っております。
http://homepage3.nifty.com/ae85fcmxs/re ... ab-21a.lzh
N88モードで作成したものをノーマルウィンドゥにしたい
マウス位置の取得にはGetCursorPosとScreenToClientが使えます。
判定にはイベントを使ってください。
判定にはイベントを使ってください。
Bitmapを表示するソース [ここをクリックすると内容が表示されます]
テキストの表示にはTextOutやDrawTextがあります。GetDCについても調べてください。各関数名をよく調べれば理解できるようになると思います。
実行ファイルと同じディレクトリに1.bmpと言う名前のビットマップを置いておいてください。
実行ファイルと同じディレクトリに1.bmpと言う名前のビットマップを置いておいてください。
コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Dim hMemDC As HDC
Dim hBitmap As HBITMAP
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
DeleteDC(hMemDC)
DeleteObject(hBitmap)
testbmp_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_CommandButton1_Click()
Dim hBmp1 As HBITMAP,memdc As HDC,hDC As HDC
'下準備
hDC=GetDC(hMainWnd)
hBmp1=LoadImage(GetWindowLong(hMainWnd,GWL_HINSTANCE) As HINSTANCE,"1.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE)
memdc=CreateCompatibleDC(hDC)
SelectObject(memdc,hBmp1)
'描画
BitBlt(hMemDC,0,0,100,100,memdc,0,0,SRCAND)
BitBlt(hDC,0,0,100,100,memdc,0,0,SRCAND)
'開放
DeleteObject(memdc)
ReleaseDC(hMainWnd,hDC)
DeleteObject(hBmp1)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim hDC As HDC,rc As RECT
Dim hOldBrush As HBRUSH
hDC=GetDC(hMainWnd)
GetClientRect(hMainWnd,rc)
hBitmap=CreateCompatibleBitmap(hDC,rc.right,rc.bottom)
hMemDC=CreateCompatibleDC(hDC)
SelectObject(hMemDC,hBitmap)
hOldBrush=SelectObject(hMemDC,GetStockObject(BLACK_BRUSH))
PatBlt(hMemDC,0,0,rc.right,rc.bottom,PATCOPY)
SelectObject(hMemDC,hOldBrush)
ReleaseDC(hMainWnd,hDC)
End Sub
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
いいえ、その領域に書いてもあまり意味がありません。
もしコンピュータ側がオセロのコマを置く場所を考えるプログラムが
一瞬で終わるなら、MainWndのLButtonUpイベント内に全部記述してもいいと思います。
もし一瞬で終わらないなら(3秒程度からそれ以上かかるなら)、CreateThread関数を使用するなど、フリーズさせないための仕掛けが必要です。
メインルーチンからサブルーチンを呼び出す方法は、FunctionやSubを使ったプログラムで練習してください。
最近のABでは、関数内部でgosubを使えるかどうかが怪しいので。
もしコンピュータ側がオセロのコマを置く場所を考えるプログラムが
一瞬で終わるなら、MainWndのLButtonUpイベント内に全部記述してもいいと思います。
もし一瞬で終わらないなら(3秒程度からそれ以上かかるなら)、CreateThread関数を使用するなど、フリーズさせないための仕掛けが必要です。
コード: 全て選択
Sub MainWnd_MouseMove(flags As Long, x As Integer, y As Integer)
'マウスが動いた時に呼び出される。
'オセロのコマの再描画が必要なら行う。
End Sub
Sub MainWnd_LButtonUp(flags As Long, x As Integer, y As Integer)
/*
マウスが左クリックされた瞬間に呼び出される。
引数のxとyにクライアント座標が入ってる。
その座標を元に石が置けるかどうかをチェックして
置けるなら置いて
置けないならExit Sub
SendMessageで自分宛にWM_PAINTを送りつけて、再描画要求をする。
コンピュータが置ける場所を考えて置く
SendMessageで自分宛にWM_PAINTを送りつけて、再描画要求をする。
*/
End Sub
Sub MainWnd_Paint(hDC As HDC)
'再描画が必要な時に呼び出される
'コマを書き直す処理を行う。
End Sub
最近のABでは、関数内部でgosubを使えるかどうかが怪しいので。
コード: 全て選択
#N88BASIC
Sub1()
Sub2()
Sleep(-1)
Sub Sub1()
Print "呼び出されるサブルーチン1"
End Sub
Sub Sub2()
Print "呼び出されるサブルーチン2"
End Sub
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。