ホーム > タグ > HSP

HSP

cintiqが線画表示に適さないので、一瞬だけメインディスプレイに表示するプログラム

本家とらたま袋の漫画家さんが、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側に表示してしまうという、逆の動作をします。

今回参考にしたのはこちら

ですので、照らし合わせて数値などを変更していただけば
思い通りの動作になると思います。

プログラミングだかなんだかもうチンプンカンプンだーってんで
実行ファイルだけ欲しい方はtwitter@nawokiまでどうぞ。
利用は自己責任。他力本願。高望みしない。
上記が守れる方のみ配布いたします。(簡単にでよければ希望に合わせて改変可能です)

Home > タグ > HSP

検索
フィード
メタ情報

Return to page top