|
|
2016/11/16(Wed) 10:48:47|NO.77331
デスクトップへ直接図形を描画したいのですが、いろいろと壁にぶつかってます。
以下のスクリプトを作成しましたが、これだと背景はデスクトップのままにして
図形だけを描画することができません。まずは、図形だけをデスクトップに描画
するにはどのようにしたらいいのでしょうか?
よろしくい願いします。
//desktop_draw
#uselib "user32.dll"
#cfunc GetDC "GetDC" int
#uselib "gdi32.dll"
#func BitBlt "BitBlt" int, int, int, int, int, int, int, int, int
#define SRCCOPY 0x00cc0020
disp = ginfo(20), ginfo(21)
buffer 0,400,300
hmdc = hdc
sImg = ginfo(12), ginfo(13)
color 0,0,0 : boxf 0,0,sImg.0,sImg.1
//main------------------------------------------------
a=1.13 ;係数
N=6 ;周回数
R=10 ;動径
lpnum=N*100 ;繰り返し回数
c=2
d=116
drift=M_PI*c/d ;1ステップの偏角
cx=320.0:cy=240.0
color 50,200,100
t=lpnum
R=powf(a,drift*t)
x1=R*cos(drift*t)
y1=R*sin(drift*t)
line x1+cx,y1+cy,x1+cx,y1+cy
gosub *to_desktop
repeat lpnum,1
t=lpnum-cnt
R=powf(a,drift*t)
x1=R*cos(drift*t)
y1=R*sin(drift*t)
line x1+cx,y1+cy
gosub *to_desktop
wait 1
loop
end
*to_desktop
BitBlt GetDC(null), disp.0-sImg.0, disp.1-sImg.1, sImg.0, sImg.1, hmdc, 0, 0, SRCCOPY
return
|
|
2016/11/16(Wed) 12:21:03|NO.77332
一旦背景を取得して、
取得した背景に図形を合成して、
合成した背景を新しい背景とすればいいのでは?
|
|
2016/11/16(Wed) 13:46:46|NO.77333
有難うございます。> kanamaru 様
アドバイス通り改変したところ、一応うまくいきました。(下スクリプト)
ただし、このままだとデスクトップへの描画が保持されず、デスクトップの更新とともに
消えてしまいます。描画を保持するにはどのようにしたらよいか、アドバイスをいただけ
たら有り難いです。
//desktop_draw
#uselib "user32.dll"
#cfunc GetDC "GetDC" int
#uselib "gdi32.dll"
#func BitBlt "BitBlt" int, int, int, int, int, int, int, int, int
#define SRCCOPY 0x00cc0020
disp = ginfo(20), ginfo(21)
buffer 0,400,300
hmdc = hdc
sImg = ginfo(12), ginfo(13)
color 0,0,0 : boxf 0,0,sImg.0,sImg.1
//main ---------------------------------------------
a=1.13 ;係数
N=6 ;周回数
R=10 ;動径
lpnum=N*100 ;繰り返し回数
c=2
d=116
drift=M_PI*c/d ;1ステップの偏角
cx=320.0:cy=240.0
color 50,200,100
t=lpnum
R=powf(a,drift*t)
x1=R*cos(drift*t)
y1=R*sin(drift*t)
gosub *from_desktop //追加
line x1+cx,y1+cy,x1+cx,y1+cy
gosub *to_desktop
repeat lpnum,1
t=lpnum-cnt
R=powf(a,drift*t)
x1=R*cos(drift*t)
y1=R*sin(drift*t)
gosub *from_desktop //追加
line x1+cx,y1+cy
gosub *to_desktop
wait 0
loop
end
//デスクトップ取得
*from_desktop
BitBlt hmdc, 0, 0, sImg.0, sImg.1, GetDC(null),disp.0-sImg.0, disp.1-sImg.1, SRCCOPY
return
//デスクトップへ書き込み
*to_desktop
BitBlt GetDC(null), disp.0-sImg.0, disp.1-sImg.1, sImg.0, sImg.1, hmdc, 0, 0, SRCCOPY
return

| |
|
2016/11/16(Wed) 20:56:03|NO.77334
壁紙に直接書き込み更新。
|
|
2016/11/18(Fri) 17:37:35|NO.77342
デスクトップの上(壁紙の上)かつ全画面の下なら
デスクトップの子ウィンドウにすればよかったような・・・
|
|
2016/11/19(Sat) 11:39:52|NO.77344
最前面の透過色付きウィンドウに描画すれば、描画内容は保持されます。
#include "user32.as"
screen 1
mes "閉じるボタンを押すと終了。"
bgscr 0,ginfo(20),ginfo(21),0,0,0
//背景透過処理
SetWindowLong hwnd,-20,0x00080000|0x00000080|0x00000020
SetLayeredWindowAttributes hwnd,0x010101,255,3//第二引数に透過する色のCOLORREF値を入れる。
color 1,1,1:boxf//透過色に指定した色で背景を塗りつぶす。
color 0,0,0
color 255,0,0:circle 200,200,400,400
pos 220,280:color 30,30,30:mes "デスクトップ描画"
gsel 0,2
stop
|
|
2016/11/20(Sun) 20:23:37|NO.77351
皆様ありがとうございます。
返事が遅れてすみません。
InoueSoftware様に質問ですが、教えていただいた背景透過処理を行うために
#include "user32.as"を書くと#uselib "user32.dll"と競合するためエラーが起きて
しまいます。かといって#uselib "user32.dll"を消すと次行の#cfunc GetDC "GetDC" int
でエラーとなってしまう・・・。解決方法があれば教えてください。
#uselib "user32.dll"
#include "user32.as"
#cfunc GetDC "GetDC" int
|
|
2016/11/20(Sun) 21:17:33|NO.77352
過去にも同じように競合らしきもので詰まった方が質問してますよ。
1]#include "user32.as"
2]#uselib "user32.dll"
3]#cfunc GetDC "GetDC" int
↓
#HSP script preprocessor ver3.5beta4 / onion software 1997-2016(c)
#Use file [hspdef.as]
#Error:定義済みの識別子は使用できません [getdc] in line 3 [???]
#重大なエラーが検出されています
cfuncをする前にGetDCって名前が(user32.as内で)定義されてるゾってこと。
user32.as内のGetDCの定義書式に合わせてコーディングするか、
cfuncでの定義名を変えるか、なんとでも。undefは使えるかな?
というか、最新版なら#funcで定義したものが#cfuncと同等の呼び出し記法で呼べたような?
単純にuselibとcfunc削って動かないかな?
オマケ:
GetDCを呼ぶなら、対になるReleaseDCを呼びましょう。
https://msdn.microsoft.com/ja-jp/library/cc428664.aspx
|
|
2016/11/22(Tue) 22:42:55|NO.77365
uselibとcfunc削ってみましたがダメでした。
GetDC(null)のところでエラーとなります。
"user32.as"を確認してみたところ
#func global GetDC "GetDC" sptr
と関数定義されていました。
「user32.as内のGetDCの定義書式に合わせてコーディングする」には
GetDC(null)をどのように書き換えればよいのでしょうか?
|
|
2016/11/23(Wed) 00:13:28|NO.77366
なるほど、最新版じゃなさそうね。
>NO.77365さん
#funcは命令宣言で、呼び出し時の返り値(int型)はstatに入ります。
ですので、命令としてGetDCを呼び出し、statの値を使えばいいのです。
nullって何と思ったら未定義変数か…。
|
|
2016/11/23(Wed) 09:22:38|NO.77370
ありがとうございます。以下のように改良して、エラーは回避できました。
しかし、相変わらず描画が保持されず、デスクトップの更新とともに消えてしまいます。
「背景透過処理」の部分、機能していないのでしょうか?
#include "user32.as"
#uselib "gdi32.dll"
#func BitBlt "BitBlt" int, int, int, int, int, int, int, int, int
#define SRCCOPY 0x00cc0020
disp = ginfo(20), ginfo(21)
GetDC 0
deskhd=stat
buffer 0,400,300
hmdc = hdc
sImg = ginfo(12), ginfo(13)
color 0,0,0 : boxf 0,0,sImg.0,sImg.1
//背景透過処理
SetWindowLong hwnd,-20,0x00080000|0x00000080|0x00000020
SetLayeredWindowAttributes hwnd,0x010101,255,3//第二引数に透過する色のCOLORREF値を入れる。
color 1,1,1:boxf//透過色に指定した色で背景を塗りつぶす。
//taisurasen ---------------------------------------------
a=1.18 ;係数
N=5 ;周回数
R=10 ;動径
lpnum=N*100 ;繰り返し回数
c=2
d=116
drift=M_PI*c/d ;1ステップの偏角
cx=320.0:cy=240.0
color 0,255,0
t=lpnum
R=powf(a,drift*t)
x1=R*cos(drift*t)+cx
y1=R*sin(drift*t)+cy
gosub *from_desktop
gosub *to_desktop
repeat lpnum,1
x0=x1 : y0=y1
t=lpnum-cnt
R=powf(a,drift*t)
x1=R*cos(drift*t)+cx
y1=R*sin(drift*t)+cy
gosub *from_desktop
line x0,y0,x1,y1
gosub *to_desktop
wait 0
loop
ReleaseDC 0,deskhd
end
*from_desktop
BitBlt hmdc, 0, 0, sImg.0, sImg.1, deskhd,disp.0-sImg.0, disp.1-sImg.1, SRCCOPY
return
*to_desktop
BitBlt deskhd, disp.0-sImg.0, disp.1-sImg.1, sImg.0, sImg.1, hmdc, 0, 0, SRCCOPY
return

| |
|
2016/11/23(Wed) 18:38:10|NO.77372
デスクトップにコピーせず、直接ウィンドウに描画してください。
デスクトップに直接描画した場合、画面更新(再描画)時に描画した内容が消えるので、いつまでも
内容を残すことが出来ません。
それを可能にする為に、ウィンドウに描画する方法が挙げられます。
そのままのウィンドウを使用しても透過していないので、SetWindowLong命令(関数)で、
ウィンドウ透過を可能にするウィンドウスタイルを設定し、
SetLayeredWindowAttributesという命令(関数)で指定色を透明にするという機能で設定します。
そして、そのウィンドウに描画することでデスクトップに直接描画された様に見え、さらに、
画面更新時に描画した内容が消えると言う事も無くなります。
NO.77370のコードを見と、一度デスクトップを仮想画面にキャプチャして、
その仮想画面に描画し、仮想画面をデスクトップにコピーするという動作をしていますが、
キャプチャせずに、直接ウィンドウに描画すれば画面更新時にも対応出来ます。
解らない事があればお答えします。
↓修正版
#include "user32.as"
disp = ginfo(20), ginfo(21)
bgscr 0,disp(0),disp(1),0,0,0//このウィンドウに直接描画すると、デスクトップに直接描画された様に見える。←ここ大事
//このウィンドウは画面全体に張り付いていますので、ディスプレイ全体に描画する事が出来ます。
gsel 0,2//最前面にする
//背景透過処理
SetWindowLong hwnd,-20,0x00080000|0x00000080|0x00000020/*WS_EX_LAYERED | WS_EX_TOOLWINDOW | WS_EX_TRANSPARENT*/
//上の命令で、アクティブにならず、操作が出来なくし、透明ウィンドウに設定出来るよう設定した。
SetLayeredWindowAttributes hwnd,0x010101,255,3//第二引数に透過する色のCOLORREF値を入れる。
//上の命令で、ウィンドウを指定した色(この場合、color 1,1,1)のみ透過させるよう設定した。
color 1,1,1:boxf//透過色に指定した色で背景を塗りつぶす。
//注:color 1,1,1 で描画されたものは透明色とみなされます。←ここ大事
//taisurasen ---------------------------------------------
a=1.18 ;係数
N=5 ;周回数
R=10 ;動径
lpnum=N*100 ;繰り返し回数
c=2
d=116
drift=M_PI*c/d ;1ステップの偏角
cx=320.0:cy=240.0
color 0,255,0
t=lpnum
R=powf(a,drift*t)
x1=R*cos(drift*t)+cx
y1=R*sin(drift*t)+cy
repeat lpnum,1
x0=x1 : y0=y1
t=lpnum-cnt
R=powf(a,drift*t)
x1=R*cos(drift*t)+cx
y1=R*sin(drift*t)+cy
line x0,y0,x1,y1
wait 1
loop
end

| |
|
2016/11/24(Thu) 09:06:37|NO.77379
どうも、自分が、InoueSoftware様のスクリプトをしっかり理解していなかった
部分があったようです。ご教授のおかげで、何とかやりたいことが出来そうです。
丁寧なご回答ありがとうございました。
|
|