ページ 1 / 1
N88モードで作成したものをノーマルウィンドゥにしたい
Posted: 2008年5月23日(金) 15:23
by トモカズ
初めての投稿です。ActiveBasic初心者のトモカズと申します。
以下の線中は読み飛ばしていただいて構いません。
-------------------------------------------------------------------------------
私が高校生の時(20数年前!)に作成したプログラムソース(対戦オセロソフト)が押入れの奥から出てきました。
懐かしさのあまり、どうしても実行してみたくなったのですが、残念ながら当時のマシンはありません。
そこでActive Basicの存在を知り、どうにか N88BASICモードにて移植が出来ました。
さほど手を入れる事が無く移植が出来ましたが、どうせWindows版ならば、それらしくしたいと考えるようになりました。
しかし、私自身プログラムを組むのも20年ぶりですし、最近の言語による作り方は何と様変わりしたのだろうと感じております。
こちらのフォーラムの記事を見ても(頭が固いのか)良く理解出来ず、四苦八苦しております。
------------------------------------------------------------------------------
さて、ここから本題です。
現在のN88BASICモードで作成したソースをノーマルウィンドゥモードに変更したいと思います。
そこで、マウス位置のキャプチャー及びマウスボタンの判定、ビットマップ表示、テキスト文字の表示をするそれぞれのサブルーチン(・・とは最近言わないのでしょうか?)を、どの様に組み込んだら良いのかをご教授いただきたいのです。
どうぞ、よろしくお願いいたします。
なお、N88モードで作成したものが以下のファイルです。石をビットマップにして見栄えを良くし、マウス操作による動作にしたいと思っております。
http://homepage3.nifty.com/ae85fcmxs/re ... ab-21a.lzh
Posted: 2008年5月23日(金) 17:42
by konisi
マウス位置の取得にはGetCursorPosとScreenToClientが使えます。
判定にはイベントを使ってください。
Bitmapを表示するソース [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]各関数名をよく調べれば理解できるようになると思います。
実行ファイルと同じディレクトリに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
テキストの表示にはTextOutやDrawTextがあります。GetDCについても調べてください。
Posted: 2008年5月24日(土) 05:28
by トモカズ
早々の返信ありがとうございます。
また、サンプルまで作成いただきまして感謝いたします。
早速、実行してみました。ビットマップの表示に成功しました。
基本的な質問で恐縮ですが、メインルーチン(現在N88モードで作成したコード)は「ここから下は、イベントプロシージャを記述するための領域になります。」と書かれている下に記述すればよろしいのでしょうか?
また、メインルーチンからサブルーチンを呼び出すにはどうしたらよいのでしょうか?
Posted: 2008年5月24日(土) 12:14
by konisi
いいえ、その領域に書いてもあまり意味がありません。
もしコンピュータ側がオセロのコマを置く場所を考えるプログラムが
一瞬で終わるなら、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
メインルーチンからサブルーチンを呼び出す方法は、FunctionやSubを使ったプログラムで練習してください。
最近のABでは、関数内部でgosubを使えるかどうかが怪しいので。
コード: 全て選択
#N88BASIC
Sub1()
Sub2()
Sleep(-1)
Sub Sub1()
Print "呼び出されるサブルーチン1"
End Sub
Sub Sub2()
Print "呼び出されるサブルーチン2"
End Sub
Posted: 2008年5月31日(土) 18:56
by トモカズ
konisiさん、ありがとうございました。
また、返事が遅くなってしまい申しわけありません。
なかなか一筋縄ではいかないですね。やはり一足飛びに実現は難しいものです。
コツコツと勉強し慣れていくしかなさそうです。
まずは、N88BASICモードでbmpファイルの表示(は出来ました),マウスによる操作(出来るのでしょうか?)を作成してみたいと思います。
その後、ノーマルウィンドゥ化に挑戦してみます。