HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
1116
UNGAデスクトップへ直接図形を描画したい12解決


UNGA

リンク

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



この記事に返信する


kanamaru

リンク

2016/11/16(Wed) 12:21:03|NO.77332

一旦背景を取得して、
取得した背景に図形を合成して、
合成した背景を新しい背景とすればいいのでは?



UNGA

リンク

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



KA

リンク

2016/11/16(Wed) 20:56:03|NO.77334

壁紙に直接書き込み更新。



くちくん

リンク

2016/11/18(Fri) 17:37:35|NO.77342

デスクトップの上(壁紙の上)かつ全画面の下なら
デスクトップの子ウィンドウにすればよかったような・・・



InoueSoftware

リンク

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



UNGA

リンク

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



UNGA

リンク

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って何と思ったら未定義変数か…。



UNGA

リンク

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



InoueSoftware

リンク

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



UNGA

リンク

2016/11/24(Thu) 09:06:37|NO.77379

どうも、自分が、InoueSoftware様のスクリプトをしっかり理解していなかった
部分があったようです。ご教授のおかげで、何とかやりたいことが出来そうです。
丁寧なご回答ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.