- 2011-02-07 (月) 19:08
- PCメモ
本家とらたま袋の漫画家さんが、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までどうぞ。
リプが無くても泣かない。利用は自己責任。絵を描く人。
上記の条件でのみ配布いたします。(簡単にでよければ改変可能です)
絵を描かない人は……多分スクリプト目的でいらっしゃったと思うので
上記のサイトを熟読して自己解決して下さい。きっとボクよりあなたたちの方が詳しいです。
- Newer: 3D素材 – 高層ホテルのエレベーター
- Older: 現在見ているページをサブウインドウで開くブックマークレット
コメント:13
- ****** 11-07-22 (金) 1:23
- このコメントは管理者の承認待ちです
- ****** 11-08-13 (土) 11:21
- このコメントは管理者の承認待ちです
- ****** 11-11-03 (木) 0:32
- このコメントは管理者の承認待ちです
- ****** 11-11-20 (日) 8:05
- このコメントは管理者の承認待ちです
- ****** 11-11-29 (火) 0:08
- このコメントは管理者の承認待ちです
- ****** 11-12-16 (金) 1:29
- このコメントは管理者の承認待ちです
- ****** 12-01-25 (水) 13:15
- このコメントは管理者の承認待ちです
- ****** 12-02-08 (水) 16:59
- このコメントは管理者の承認待ちです
- ****** 12-02-25 (土) 0:05
- このコメントは管理者の承認待ちです
- ****** 12-02-28 (火) 8:42
- このコメントは管理者の承認待ちです
- ****** 12-05-20 (日) 9:02
- このコメントは管理者の承認待ちです
- ****** 12-06-04 (月) 15:47
- このコメントは管理者の承認待ちです
- ****** 12-06-16 (土) 16:27
- このコメントは管理者の承認待ちです
トラックバック:1
- このエントリーのトラックバックURL
- http://t3.xii.jp/nawo/2011/02/07/169/trackback/
- Listed below are links to weblogs that reference
- cintiqが線画表示に適さないので、一瞬だけメインディスプレイに表示するプログラム from Seasonism Season3
- ****** 19-12-01 (日) 11:16
- このコメントは管理者の承認待ちです