透明なウィンドウ

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

透明なウィンドウ

#1 投稿記事 by BingoMan »

Win98でも動くような透明なウィンドウを作りたいのですがどうすればよいのでしょうか。どなたかアドバイスお願いします。
Mario2
記事: 205
登録日時: 2005年5月31日(火) 13:31
お住まい: 大阪市
連絡する:

Re: 透明なウィンドウ

#2 投稿記事 by Mario2 »

> Win98でも動くような透明なウィンドウを作りたいのですがどうすればよいのでしょうか。どなたかアドバイスお願いします。

透過ウィンドウは確か2000/XPしか対応してなかったと思いますが・・・
実現できたとしても大変な作業になるかと思うのですが・・・

こんな答え方ですいません。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#3 投稿記事 by イグトランス »

実はそういうことをするためのライブラリがあるんですね。C++用ですが。
http://www.ksky.ne.jp/~seahorse/libgw/
しかしこれはウィンドウを半透明にするためのライブラリです。
BingoManさんは透明にしたいと言っていますが、完全な透過で良ければリージョンを使う方法もあります。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_126.htm
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

Re: 透明なウィンドウ

#4 投稿記事 by NoWest »

> Win98でも動くような透明なウィンドウを作りたいのですがどうすればよいのでしょうか。どなたかアドバイスお願いします。

Crimson Forest

こちらにActiveBasicでアルファブレンドを行う関数がありますので
半透明ウィンドウを自作することができると思います。

手順は

1.ウィンドウ全体の画像を取得。

2.デスクトップの画像を取得。

3.ウィンドウにデスクトップの画像を貼り付け。

4.ウィンドウに元のウィンドウ画像をアルファブレンドで貼り付け。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

違う発想でいきますが・・・

#5 投稿記事 by konisi »

透明なウインドウっていうのは全く見えないのですか?
それでしたら、ウインドウ作成系のディレクティブを書かなければいいと思うのですが。
#promptとか#consoleとか。
BingoMan
記事: 36
登録日時: 2005年7月17日(日) 09:36
お住まい: 千葉県松戸市

#6 投稿記事 by BingoMan »

ご返事どうもありがとうございます。

実は、「ウィンドウ自体は透明でも、その透明なウィンドウをクリックしたりすることができるようなもの」を作ろうと思っていました。

半透明ウィンドウもやってみたのですが、この前やったときは「透過ウィンドウ」にチェックを入れていたためうまく動きませんでした(そのウィンドウ自体をクリックできないなど)。
そこで今日改めてやってみたところ正常に動きました(winXPですが)。

言葉不足ですみませんでした。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

次のコードを試してみてください。

#7 投稿記事 by konisi »

コード: 全て選択


Dim VirWindowPos As RECT'仮想ウインドウのグローバル位置
VirWindowPos.top=0
VirWindowPos.bottom=400
VirWindowPos.left=0
VirWindowPos.right=600
Dim VirButton1Pos As RECT'仮想ボタンのローカル位置
VirButton1Pos.top=50
VirButton1Pos.bottom=350
VirButton1Pos.left=50
VirButton1Pos.right=550
Dim CursorPos As POINTAPI'マウス位置

Function isin(ByRef Glo As RECT,ByRef But As RECT,ByRef Cur As POINTAPI) As Long
    Dim GloBut As RECT
    Dim FlagA As Long
    FlagA=0
    GloBut.top=Glo.top+But.top
    GloBut.left=Glo.left+But.left
    GloBut.bottom=Glo.top+But.bottom
    GloBut.right=Glo.left+Glo.right

    If GloBut.top<Cur.y then FlagA=FlagA+1
    If GloBut.bottom>Cur.y then FlagA=FlagA+1
    If GloBut.left<Cur.x then FlagA=FlagA+1
    If GloBut.right>Cur.x then FlagA=FlagA+1

    If FlagA=4 then isin=-1 else isin=0
End Function
*A
GetCursorPos(CursorPos)
If GetAsyncKeyState(1) And &h8000 Then'左クリックをしたら
    If isin(VirWindowPos,VirButton1Pos,CursorPos)=-1 then
        '仮想ボタン1をクリックした時にする反応
        MsgBox GetDesktopWindow(), "Button1_Clicked"
    End If
    '仮想ボタンを追加したらここに追記する
End IF
If GetAsyncKeyState(2) And &h8000 Then End'ミギクリで終了
goto *A
とりあえずコンパイルは通りました。やってみてください。
BingoMan
記事: 36
登録日時: 2005年7月17日(日) 09:36
お住まい: 千葉県松戸市

透明ウィンドウ

#8 投稿記事 by BingoMan »

返事が遅くなりましてすみません。

konisi様のプログラムを早速コンパイル&実行させていただきました。

確かにクリックには反応するのですが、その時に透明なウィンドウの下のウィンドウまでクリックに反応してしまいました。

ウィンドウの特定の領域だけを無効にしたりできないかと調べてみましたが、なかなか見つかりませんでした。

なにかよい方法はありますでしょうか。よろしくお願いいたします。
xsb007

#9 投稿記事 by xsb007 »

WinXPで次のようにしたらできました。Win98でも多分できると思います。
なお、***の部分はプロジェクト名に応じて変更してください。

MainWnd.sbp

コード: 全て選択

'-----------------------------------------------------------------------------
'  イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd

' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。

Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
	' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。

	' イベントプロシージャの呼び出しを行います。
	
	Select Case dwMsg
	Case WM_PAINT, WM_NCPAINT, WM_ERASEBKGND
		
		If dwMsg=WM_PAINT Then
			ValidateRect(hWnd,Byval NULL)
		End If
		
		MainWndProc=0
		Exit Function
	

	End Select

	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)

End Function

'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。

Sub MainWnd_Destroy()
	***_DestroyObjects()
	PostQuitMessage(0)
End Sub
***.wndファイル

コード: 全て選択

WINDOW:MainWnd
    HANDLE    = hMainWnd
    POINT     = -2147483648,-2147483648
    SIZE      = 480,360
    CAPTION   = ""
    STYLE     = &H80000000
    EXSTYLE   = &H00000028
    ID        = 0
    BGCOLOR   = 15
    FONT      = -12,0,0,0,400,0,0,0,128,3,2,1,32,"MS Pゴシック"
    CLASS     = "NORMAL"
    CALLBACK  = MainWndProc
    TYPE      = 0
    FILEPATH  = MainWnd.sbp
END
返信する