ページ 11

ABでのスクリーンセーバー

Posted: 2005年10月10日(月) 19:13
by BingoMan
ActiveBasicでスクリーンセーバーを作ろうと思います。
できればDirectXを使わずに作りたいのですが方法がわかりません。
何かよい方法はございませんでしょうか?

Re: ABでのスクリーンセーバー

Posted: 2005年10月10日(月) 19:40
by hira
RADで作る場合、メインウィンドウの設定を
スタイル: 「枠なし」
背景: 「色指定」より黒を選択

次に、メインウィンドウがMainWnd(ハンドルはhMainWnd)のとき、下のようなコードを記述します。

コード: 全て選択

TypeDef HIMC=HANDLE
Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As VoidPtr,bInitialOwner As Long,lpName As String) As Long
Declare Function ImmAssociateContext Lib "imm32"(hWnd As HWND,hIMC As HIMC) As HIMC
Dim hIMC As HIMC
Dim bMouseMoveFlag=0 As Long

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
	CreateMutex(0,0,"AucMon")
	If GetLastError()=183 Then ExitProcess(0)

	/*ここに前処理を記述*/

	ShowWindow(hMainWnd,SW_SHOWMAXIMIZED)
	ShowCursor(0)
	hIMC=ImmAssociateContext(hMainWnd,0)
End Sub

Sub MainWnd_MouseMove(flags As Long, x As Integer, y As Integer)
	If bMouseMoveFlag Then DestroyWindow(hMainWnd) Else bMouseMoveFlag=1
End Sub

Sub MainWnd_KeyDown(KeyCode As Long, flags As Long)
	DestroyWindow(hMainWnd)
End Sub

Sub MainWnd_Destroy()
	ShowCursor(1)
	ImmAssociateContext(hMainWnd,hIMC)

	/*ここに後処理を記述*/
End Sub
あとはタイマーなどを使って画面に変化を与えればOKです。
※手持ちのVB6の本を見ながらコードを書いただけなので、テストはしていません(^^;

ありがとうございます

Posted: 2005年10月10日(月) 20:38
by BingoMan
hira様、早速のご返事本当にありがとうございます。ひとつだけうまくいかなかったところがありますので、その部分を報告させていただきます。

【問題点】
マウスを動かさなくても起動直後にスクリーンセーバーが終了してしまう

【変更点】
定義部

コード: 全て選択

Dim BeforePos As POINTAPI
起動時の処理

コード: 全て選択

GetCursorPos(BefPos)
マウスが動いたときの処理

コード: 全て選択

Sub MainWnd_MouseMove(flags As Long, x As Integer, y As Integer)
   If BeforePos.x<>x or BeforePos.y<>y Then DestroyWindow(hMainWnd)
End Sub
のようにしました。

これからもよろしくお願いいたします。