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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
BingoMan
記事: 36
登録日時: 2005年7月17日(日) 09:36
お住まい: 千葉県松戸市

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

#1 投稿記事 by BingoMan »

ActiveBasicでスクリーンセーバーを作ろうと思います。
できればDirectXを使わずに作りたいのですが方法がわかりません。
何かよい方法はございませんでしょうか?
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

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

#2 投稿記事 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の本を見ながらコードを書いただけなので、テストはしていません(^^;
BingoMan
記事: 36
登録日時: 2005年7月17日(日) 09:36
お住まい: 千葉県松戸市

ありがとうございます

#3 投稿記事 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
のようにしました。

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