ホーム > タグ > HSP
HSP
cintiqが線画表示に適さないので、一瞬だけメインディスプレイに表示するプログラム
- 2011-02-07 (月)
- 移行前サイトの記事
本家とらたま袋の漫画家さんが、cintiqを使ったマルチモニター環境で作業しているのですが
「cintiq上で線画を表示すると鮮明すぎてギザギザが目立つ。
できればメインディスプレイに表示したい」
と、ぼやいていたので、久々にHSPなぞを弄って簡単なプログラムを書きました。
ほんとはコミスタの機能で、ウィンドウのクローンが表示できるんですけど、
マシンスペックの都合だったり、
(cintiqが右側なので) [メニュー] – [ファイル]の位置が左端に移動しちゃうと困ったり、
いろいろ上手い具合に行かないようですね。
さて、問題のプログラムですが、しょうもないコピペプログラミングですので、
実行ファイルではなくサンプルスクリプトとして記載したいと思います。
サブディスプレイの内容をメインに最前面&全画面で20秒間表示
#uselib "gdi32.dll" #cfunc CreateDC "CreateDCA" sptr,sptr,sptr,int #func DeleteDC "DeleteDC" int #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define NULL 0 #define SRCCOPY 0x00CC0020 #define CAPTUREBLT 0x40000000 // モニター情報の取得(擬似モニターを含む) #module #uselib "user32.dll" #cfunc EnumDisplayMonitors "EnumDisplayMonitors" sptr, sptr, sptr, int #func GetMonitorInfo "GetMonitorInfoA" sptr, sptr #define FALSE 0 #define TRUE 1 #define NULL 0 #define MaxMonitors 16 #define MaxRectParameters 4 #define MaxParameters 5 #define Prm_API 0 #define Prm_max 1 #define Prm_cnt 2 #define Prm_idx_primary 3 #define Prm_ptr_rects 4 // 初期化 ret = GMIinit( 最大値 ); // 最大値は数えるディスプレイの最大数。1以上MaxMonitors以下の値。 // 成功ならretは0以外の値、失敗なら0。 #defcfunc GMIinit int max; if ( (max < 1) || (max > MaxMonitors) ) { return FALSE; } dim prm, (MaxParameters + 1); dim rects, ((max + 1) * MaxRectParameters); dim bin, (23 + 1); mref a_stat, 64; bin( 0) = 0x83ec8b55, 0x5653d8c4, 0x145d8b57, 0x28d845c7, 0x8d000000; bin( 5) = 0x8b50d845, 0xff520855, 0x75c08513, 0xebc03304, 0xfc558b2e; bin(10) = 0x7501fa83, 0x084b8b06, 0x8b0c4b89, 0x538b0843, 0x04e0c110; bin(15) = 0x8b104d8b, 0x0004b9f1, 0x3c8d0000, 0x0001b802, 0xa5f30000; bin(20) = 0x5f0843ff, 0xe58b5b5e, 0x0010C25D; prm(Prm_API) = varptr(GetMonitorInfo); prm(Prm_max) = max; prm(Prm_cnt) = 0; prm(Prm_idx_primary) = 0; prm(Prm_ptr_rects) = varptr(rects); ret = EnumDisplayMonitors(NULL, NULL, varptr(bin), varptr(prm)); return ret; // ディスプレイの数を取得しstatに格納。失敗は負数。 #deffunc GMIcnt if (ret == FALSE) { a_stat = -1; } else { a_stat = prm(Prm_cnt); } return; // プライマリー・ディスプレイのインデックスを取得しstatに格納。失敗は負数。 #deffunc GMIprimary if (ret == FALSE) { a_stat = -1; } else { a_stat = prm(Prm_idx_primary); } return; // 指定したディスプレイの、仮想画面内の座標を取得。 // ret = GMIrect(idx, rect); // 成功 : retは0以外。rectに座標を格納。 // rect(0) : 左上X座標, rect(1) : 左上Y座標, // rect(2) : 右下X座標, rect(3) : 右下Y座標 // 失敗 : retは0。 rectは不定。 #defcfunc GMIrect int idx, array rect if ( (ret == FALSE) || (idx < 0) || (idx >= prm(Prm_cnt)) ) { return FALSE; } work = idx * MaxRectParameters; rect(0) = rects(work + 0); rect(1) = rects(work + 1); rect(2) = rects(work + 2); rect(3) = rects(work + 3); return TRUE; // 後始末 #deffunc GMIclear dim prm, 1; dim rects, 1; dim bin, 1; ret = FALSE; return; #global // ======================== 使用例 ========================= ; ウィンドウ非表示 screen 0, 150, 50 : gsel 0, -1; wait 50; dim rc, 4; ret = GMIinit(4); // 最大4画面分の情報を取得する GMIcnt; ret = GMIrect(1, rc); subwx0 = rc(0); subwy0 = rc(1); subwxx = rc(2); subwyy = rc(3); GMIclear; // 使わなくなったら呼び出す ; デスクトップ画面のサイズでバッファ画面を作成 sx = subwxx - subwx0 : sy = subwyy - subwy0 buffer 2, sx, sy ; デスクトップ画面のデバイスコンテキスト取得 hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL) ; デスクトップ画面の画像をコピー BitBlt hdc, 0, 0, sx, sy, hdcScreen, subwx0, subwy0, SRCCOPY | CAPTUREBLT ; デバイスコンテキスト削除 DeleteDC hdcScreen bgscr 1, ginfo_dispx, ginfo_dispy, 0, 0, 0, : gsel 1,2 gcopy 2, 0, 100, ginfo_dispx, ginfo_dispy wait 2000 end
※HSP専用のコード表示がなかったので、表示がHTMLになってますがご了承下さい。
ある程度環境を選びませんが、当然cintiqがメインディスプレイになっていると
cintiq側に表示してしまうという、逆の動作をします。
今回参考にしたのはこちら
- 旧HSP3掲示板の過去ログ – [8126] Re: マルチモニタ使用時の解像度
- http://www.onionsoft.net/hsp/beta/index.cgi
- スクリーンキャプチャ – Advanced HSP
- http://tokyo.cool.ne.jp/chokuto/advanced/capturescreen.html
ですので、照らし合わせて数値などを変更していただけば
思い通りの動作になると思います。
プログラミングだかなんだかもうチンプンカンプンだーってんで
実行ファイルだけ欲しい方はtwitter@nawokiまでどうぞ。
利用は自己責任。他力本願。高望みしない。
上記が守れる方のみ配布いたします。(簡単にでよければ希望に合わせて改変可能です)
Home > タグ > HSP
- 検索
- フィード
- メタ情報