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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0916
catsHDCとGetDC5解決


cats

リンク

2013/9/16(Mon) 10:25:49|NO.57173

HSPのシステム変数のhdcと、user32のGetDCで取得できるデバイスコンテキストのハンドルとは
何が違うのでしょうか。
システム変数HDCとGetDCでは値が違います。

#uselib "user32.dll" #cfunc GetDC "GetDC" int mes GetDC(hwnd) mes hdc stop
HSPのHDCでTextOutとDrawTextではredrawが必要です。

#uselib "user32.dll" #cfunc GetDC "GetDC" int #func DrawText "DrawTextW" int,str,int,int,int #uselib "gdi32.dll" #func TextOut "TextOutA" int,int,int,str,int sdim buf,256 buf="Hello!" ;文字列 len=strlen(buf) ;長さ mes "HSPのHDC:"+hdc mes "TextOut:\nDrawtext:" TextOut hdc,70,20,buf,len rect=80,35,640,480 DrawText hdc,buf,len,varptr(rect),$0 ;/* redraw ;*/ stop
GetDCではredrawを入れると文字が消えます。

#uselib "user32.dll" #cfunc GetDC "GetDC" int #func DrawText "DrawTextW" int,str,int,int,int #uselib "gdi32.dll" #func TextOut "TextOutA" int,int,int,str,int sdim buf,256 buf="Hello!" ;文字列 len=strlen(buf) ;長さ hdc_=GetDC(hwnd) ;デバイスコンテキスト取得 mes "GetDCで取得:"+hdc_ mes "TextOut:\nDrawtext:" TextOut hdc_,70,20,buf,len rect=80,35,640,480 DrawText hdc_,buf,len,varptr(rect),$0 ;/* redraw ;*/ stop
何か勘違いしている気がするので教えて下さい。



この記事に返信する


(’’

リンク

2013/9/16(Mon) 10:51:58|NO.57174

GetDCとは、新しくデバイスコンテキストを作成するような命令です(たぶん)
作って描画すれば反映はされますが、HSPのVRAMにはいかないのでredrawすると消えます
HSPのhdcはVRAMに反映されるやつなんだと思います。



fortunehill

リンク

2013/9/16(Mon) 12:44:17|NO.57180

/*ご参考(ttp://chokuto.ifdef.jp/advanced/capturescreen.html)の[システム変数 hdc]*/



あり

リンク

2013/9/16(Mon) 13:00:28|NO.57182

一歩出遅れましたが、せっかく書いたので・・・


まず、hspsdkフォルダ内のhspdll.txtに説明があるように
hdcで得られるDCとGetDCで得られるDCは違う物です。
hdcはメモリ上(便宜上裏画面とします)のビットマップのDCで
GetDCとhwndで取得するのはHSPウィンドウ(表画面)のDCです。

そして、redrawは画面の再描画を行う命令ではなく
ウィンドウの再描画のタイミングを変更する命令だという事です。

この再描画というのはプログラムとは別にシステムが自動で行ってくれていて
通常(redraw 1)は描画命令と同時に裏画面(hdc)の描画部分(画面全体ではない)
の情報が表画面に反映されますが、redraw 0を指定すると描画命令では表画面に
反映されず、特定(redraw 1等)のタイミングにまとめて行われるようになります。
ちなみにredraw 0を指定してもウィンドウの表示に変更があった部分
(他のウィンドウの影に隠れたり最小化してから元に戻す等)
の再描画は行われます。

つまり、簡単に言えばHSP上で実際に描画が行われているのは裏画面で
再描画の際に裏画面の情報が表画面に反映されるという事です。

なので、TextOutでhdc(裏画面)へ描画した場合はredrawで文字が表示され
GetDCで取得したDC(表画面)に描画した場合はredraw(再描画)の際に裏画面にない
文字は消されてしまう、という訳です。


おまけ

#uselib "user32.dll" #cfunc GetDC "GetDC" int #func DrawText "DrawTextW" int,str,int,int,int #uselib "gdi32.dll" #func TextOut "TextOutA" int,int,int,str,int sdim buf,256 buf="Hello!" ;文字列 len=strlen(buf) ;長さ mes "HSPのHDC:"+hdc mes "TextOut:\nDrawtext:" TextOut hdc,70,20,buf,len rect=80,35,640,480 DrawText hdc,buf,len,varptr(rect),$0 ;/* ; 円の描画部分だけTextOutの文字が表示されます circle 0, 0, 100, 100, 0 ;redraw ;*/ stop



cats

リンク

2013/9/16(Mon) 14:39:00|NO.57184

解答して下さった皆さん、ありがとうございます。
2つの違いがよくわかりました。
メモリとウィンドウだったのですか。
場面に応じて使い分けられるようになりました。
解決です。



fortunehill

リンク

2013/9/17(Tue) 02:56:35|NO.57194

/*蛇足*/

#uselib "user32.dll" #func global GetDC "GetDC" sptr #uselib "gdi32.dll" #func global BitBlt "BitBlt" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr ss = "-----------------------" mesbox ss,200,200 await GetDC hwnd BitBlt hdc,0,240,640,240,stat,0,0,$CC0020 pos 240,300 redraw



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