ページ 11

透明なウィンドウ

Posted: 2005年10月18日(火) 20:20
by BingoMan
Win98でも動くような透明なウィンドウを作りたいのですがどうすればよいのでしょうか。どなたかアドバイスお願いします。

Re: 透明なウィンドウ

Posted: 2005年10月18日(火) 20:46
by Mario2
> Win98でも動くような透明なウィンドウを作りたいのですがどうすればよいのでしょうか。どなたかアドバイスお願いします。

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

こんな答え方ですいません。

Posted: 2005年10月19日(水) 07:49
by イグトランス
実はそういうことをするためのライブラリがあるんですね。C++用ですが。
http://www.ksky.ne.jp/~seahorse/libgw/
しかしこれはウィンドウを半透明にするためのライブラリです。
BingoManさんは透明にしたいと言っていますが、完全な透過で良ければリージョンを使う方法もあります。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_126.htm

Re: 透明なウィンドウ

Posted: 2005年10月19日(水) 13:27
by NoWest
> Win98でも動くような透明なウィンドウを作りたいのですがどうすればよいのでしょうか。どなたかアドバイスお願いします。

Crimson Forest

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

手順は

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

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

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

4.ウィンドウに元のウィンドウ画像をアルファブレンドで貼り付け。

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

Posted: 2005年10月19日(水) 18:44
by konisi
透明なウインドウっていうのは全く見えないのですか?
それでしたら、ウインドウ作成系のディレクティブを書かなければいいと思うのですが。
#promptとか#consoleとか。

Posted: 2005年10月19日(水) 23:00
by BingoMan
ご返事どうもありがとうございます。

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

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

言葉不足ですみませんでした。

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

Posted: 2005年10月20日(木) 02:23
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
とりあえずコンパイルは通りました。やってみてください。

透明ウィンドウ

Posted: 2005年10月29日(土) 19:59
by BingoMan
返事が遅くなりましてすみません。

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

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

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

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

Posted: 2005年10月29日(土) 20:52
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