ページ 1 / 1
ウインドウ無しでbmpのみを表示できますか?
Posted: 2006年12月31日(日) 10:20
by arrems
1週間前からAB始めましたarremsと申します。
プログラム知識は無いに等しいので色々とお世話になります。
今回の質問は、ウインドウの表示を消してbmpだけを表示したいと言う事です。
ゲームの開始時にウインドウ無しでゲームロゴみたいなものが出てくるものがあります。そんな事ってできるのでしょうか?もし出来るのならサンプルコードを教えてください。
Re: ウインドウ無しでbmpのみを表示できますか?
Posted: 2006年12月31日(日) 13:36
by 7
> 今回の質問は、ウインドウの表示を消してbmpだけを表示したいと言う事です。
> ゲームの開始時にウインドウ無しでゲームロゴみたいなものが出てくるものがあります。そんな事ってできるのでしょうか?
出来ました。ビットマップを表示するというか、ディスプレイに描写するっていう感じなんですけど。
ビットマップを消すときのチラつきが気にはなりますけどね~...。他のアプリケーションがどうやって解決しているのか気になりますね。
> もし出切るのならサンプルコードを教えてください。
http://www.activebasic.com/help_center/ ... index.html
ここのコードを参考にしていくといつか出来ます。それなりの知識と応用力が必要ですけど...。
勉強しようという姿勢をあまり感じないので、とりあえず
Step9をやっつけてみてはどうでしょう。
そして分からないことがあったらまた質問してください。
Re: ウインドウ無しでbmpのみを表示できますか?
Posted: 2006年12月31日(日) 13:51
by MML
> ビットマップを消すときのチラつきが気にはなりますけどね~...。他のアプリケーションがどうやって解決しているのか気になりますね。
枠なしのウィンドウにBMPをのっける。という方法を僕は前とっていました。
しかし、最近はロゴまで作る暇がないのでやってはいませんが(^^;
手順は以下です。
1.枠なしのウィンドウを作る。
2.BMPを枠なしのウィンドウに描画
3.何秒か表示(というかプログラムを実行させるための準備)
4.枠なしのウィンドウを削除
こんな感じですかね。
しかし、ActiveBasicではやったことがないので...
コードは今すぐにはかけません。
完成したら載せようと思います。
Posted: 2006年12月31日(日) 18:05
by konisi
僕の場合は、GetCapture関数+GetDC関数で何とか表示しますが。(ためしに作ってみたら割とうまくいったので。)
だいたいこんなイメージ
コード: 全て選択
#include "test.idx"
'NoWindow Base
Function draw(X As Long,Y As Long,CX As Long,CY As Long)
Dim hdc As HDC
hdc=GetDC(GetCapture())
Dim memdc As HDC
memdc=CreateCompatibleDC(hdc)
Dim hBmp As VoidPtr
hBmp=LoadImage(GetModuleHandle(0),IDB_BITMAP1 As *Byte,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE)
SelectObject(memdc,hBmp)
Dim hBrush As VoidPtr, hOldBrush As VoidPtr
hBrush=GetStockObject(LTGRAY_BRUSH)
hOldBrush=SelectObject(hdc,hBrush)
BitBlt(hdc,X,Y,CX,CY,memdc,0,0,SRCCOPY)
SelectObject(hdc,hOldBrush)
DeleteDC(memdc)
DeleteObject(hBmp)
End Function
draw(0,0,320,320)
Sleep(10000)
ExitProcess(0)
追記 2006/12/31 20時頃
bmpを表示するとかそういう割と応用的な事よりも、1週間目のビギナーさんなら基礎基本をしっかり固める方が先だと思います。
むむむ...。
Posted: 2006年12月31日(日) 19:01
by 7
今日はなにやら皆さん気前がいいですね...。
じゃあ僕も... [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
' 第一引数はビットマップイメージを示すリソースID、または識別文字列を指定します。
' 第二引数は表示する時間を秒単位で指定します。
Sub ShowTitleBitmap(ByVal lpBitmapName As LPSTR,ByVal dwSeconds As DWord)
Dim hDC As HDC, hMemDC As HDC
Dim hBmp As HBITMAP, Bmp As BITMAP, hOldBmp As HBITMAP
Dim rc As RECT
hDC=GetDC(0)
hMemDC=CreateCompatibleDC(hDC)
hBmp=LoadBitmap(GetModuleHandle(0),lpBitmapName)
hOldBmp=SelectObject(hMemDC,hBmp)
GetObject(hBmp,SizeOf(BITMAP),Bmp)
GetWindowRect(GetDesktopWindow(),rc)
BitBlt(hDC,
(rc.right/2)-(Bmp.bmWidth/2),(rc.bottom/2)-(Bmp.bmHeight/2),
Bmp.bmWidth,Bmp.bmHeight,
hMemDC,0,0,SRCCOPY)
Sleep(dwSeconds*1000)
InvalidateRect(0,ByVal NULL,FALSE)
SelectObject(hMemDC,hOldBmp)
DeleteObject(hBmp)
DeleteDC(hMemDC)
ReleaseDC(0,hDC)
End Sub
' ウィンドウ作成時のイベント
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
ShowTitleBitmap(IDB_BITMAP1,1)
End Sub
追記。
サンプルがウィンドウ作成時になってますけど、ShowTitleBitmap関数はウィンドウと関係ありません。ビットマップを表示したいタイミングで関数をコールしてください。
Posted: 2007年1月01日(月) 11:21
by arrems
皆さんご親切にして頂いてありがとうございます。
>勉強しようという姿勢をあまり感じないので
7様、御もっともでございます・・・。ちょっと楽しようとしすぎでした・・・。とりあえず講座を全てクリアしてから出直します。大変失礼しました。
その他のサンプル頂いた方、とても参考になります。先ずは初心者講座をクリアしてから取り組んでみたいと思いますので、その時つまづいたらまたご教授お願いします。
やっぱり昔のBASICしかやった事の無い人間にはもう一度1からやり直す事が大事みたいですね^^;
Posted: 2007年1月01日(月) 12:01
by konisi
楽する事はとても大切な事だと思います。
電卓を使わずに手計算で平方根を求める事はできますが、電卓にその機能があるならそれを使った方がずっと速い。それと同じ理屈で。
自分の失敗を元に助言しておくと、アイデアは出るうちに紙に書いておけって事ですかね。
あれも出来る、これも出来るってなってくると何を作っていいか分からなくなってしまうので。
Posted: 2007年1月01日(月) 18:41
by ゲスト
>楽する事はとても大切な事だと思います。
>電卓を使わずに手計算で平方根を求める事はできますが、電卓にその機能があるならそれを使った方がずっと速い。それと同じ理屈で。
それとはまた違う。例えば、√6 の近似値の求め方を知らずに電卓を使っていると、
電卓なしでは近似値は求められなくなってしまう。
98765432*87654321 の計算の仕方を分かっていて、手間を省くために電卓を使うのは良い。
あるプログラムを組むときに、どういった関数を使っていくかを理解した上でサンプルなどをコピーするのは良いが、
「よくわからないけど、とりあえずコピーしておけばいいか」という考えでは上達できない。
Posted: 2007年1月01日(月) 18:54
by arrems
> あるプログラムを組むときに、どういった関数を使っていくかを理解した上でサンプルなどをコピーするのは良いが、
> 「よくわからないけど、とりあえずコピーしておけばいいか」という考えでは上達できない。
ごもっともで。
そもそも、誰かの「サンプル」であってもそれは「知的財産」だと僕は考えていますから、それをそのまま使うような事はしませんし、上達したいと思っているのでそのソースをしっかり理解したいと思っています。
大変貴重なご意見をありがとうございました。
Posted: 2007年1月10日(水) 00:17
by Tatsuro
かなり乱暴ですが
コード: 全て選択
Dim hDC As HDC
hDC=GetDC(0)'デスクトップのHDCを取得
'ここから描画するための文を書く
TextOut(hDC,100,100,"変なところに落書きしてみるテスト",32)'(ただの例です)
'ここまで
ReleaseDC(0,hDC)'デスクトップのHDCを開放
これで描けてしまうような気がします。
これは、本当にwindowを作っていないので、その部分を使っているプログラムが再描画を行うと消えるし、プログラムが終了しても放置されます。
従って、プログラムがwindowを作成するときにそこに表示してやれば勝手に消えます。
Posted: 2007年1月10日(水) 21:34
by arrems
なるほど。
出来てしまいそうですがちょっと実用性に欠けてしまいますね^^;
とりあえずこの質問は初心者の僕には早すぎるようなので、もっと勉強してから出直します。
貴重なサンプルを皆さんに頂いているのでシッカリ勉強して使いこなせるよう頑張ります!
ありがとうございました。