|
|
2010/4/24(Sat) 12:18:11|NO.32233
クリップボードにクライアント領域でなく、ウィンドウの初期化サイズ
またはbufferから正しく画像を転送するにはどうすればよいでしょうか。
ご教授お願いします。
|
|
2010/4/24(Sat) 19:50:02|NO.32236
clipsetg命令はどうですか?
>現在選択されている画面をビットマップデータとして、クリップボードに送ります。
HSPヘルプからの引用(hspext)です。
|
|
2010/4/25(Sun) 00:26:53|NO.32238
プラグインはできれば使いたくないです。
ファイルからでも読み込めればいいのですが。
|
|
2010/4/25(Sun) 10:41:37|NO.32242
>ウィンドウの初期化サイズ
とあったので
『猫でもわかるプログラミング』さん http://www.kumei.ne.jp/c_lang/
の『Windows SDK編 第1部 94章〜98章』にある解説を参考に
APIを使ってHSPのウィンドウ全体をキャプチャしてクリップボードにコピーし
クリップボードからHSPウィンドウへの貼り付けをするスクリプトを作ってみました。
(クライアント領域やバッファからのコピーには非対応)
・・・求められていた物であるかの確証はありませんが・・・(汗)
#include "user32.as"
#include "gdi32.as"
#define CF_BITMAP $00000002
#define SRCCOPY $00CC0020
wx = ginfo_sizex ;HSPウィンドウ全体の幅
wy = ginfo_sizey ;HSPウィンドウ全体の高さ
gsel 0, 1 :title "コピー元"
color 255 : boxf 100, 100, 540, 380
wait 50 ;上手くコピーできない場合があるので少し待つ
src_HWND = hwnd ;ウィンドウハンドル
GetWindowDC Src_HWND : Window_DC = stat ;ウィンドウ全体のDC
CreateCompatibleDC Window_DC : src_DC = stat
CreateCompatibleBitmap Window_DC, wx, wy : src_Bitmap = stat ;このビットマップは削除してはいけない
SelectObject src_DC, src_Bitmap
BitBlt src_DC, 0, 0, wx, wy, Window_DC, 0, 0, SRCCOPY
; クリップボードに画像をセット
OpenClipboard hwnd
EmptyClipboard
SetClipboardData CF_BITMAP, src_Bitmap
DeleteDC src_DC
ReleaseDC src_HWND, Window_DC
CloseClipboard
; クリップボードから画像を取得
OpenClipboard hwnd
GetClipboardData CF_BITMAP : src_Bitmap2 = stat
CreateCompatibleDC hdc : dest_DC = stat
SelectObject dest_DC, src_Bitmap2
GetObject src_Bitmap2, 0, 0 : bsize = stat ;必要なバッファサイズを取得
sdim BITMAP, bsize
GetObject src_Bitmap2, bsize, varptr(BITMAP) ;BITMAP構造体には幅、高さ、カラー形式の情報だけが返る
BMsizex = wpeek(BITMAP, 4) ;BITMAP構造体から画像の幅を取得
BMsizey = wpeek(BITMAP, 8) ;BITMAP構造体から画像の高さを取得
screen 2, BMsizex, BMsizey :title "横幅= "+BMsizex+" 高さ= "+BMsizey
BitBlt hdc, 0, 0, BMsizex, BMsizey, dest_DC, 0, 0, SRCCOPY
DeleteDC dest_DC
redraw
CloseClipboard
>プラグインはできれば使いたくないです。
APIもDLLなのでどちらも同じ事だとも言えますけどね。
プログラム次第ではプラグインを目立たない位置で使う方法もありますよ。
>ファイルからでも読み込めればいいのですが。
可能だとは思いますよ、その分必要な知識も増えますが。

| |
|
2010/4/25(Sun) 12:00:14|NO.32244
>ファイルからでも読み込めればいいのですが。
画像ファイルの読み込みなら拡張子が限られるけどpicloadだと思います。
対応する拡張子は、bmp,gif,jpg,icoです。
|
|
2010/4/25(Sun) 19:14:51|NO.32252
>uさん
そのページを読んで何度か自分なりにやってみましたがだめでした。
>ありさん
スプリクトありがとうございます。
しかし、私が思っていたものは違います。
説明が的確でなくすみません。
wait 50の前にwidth 100,100を入れても
640,480のサイズでクリップボードに転送できるようにしたいので、
GetDCやGetWindowDCは使えないようです。
|
|
2010/4/25(Sun) 23:10:46|NO.32256
>wait 50の前にwidth 100,100を入れても
>640,480のサイズでクリップボードに転送できるようにしたいので、
bufferにコピーすればいいのでは?
|
|
2010/4/26(Mon) 23:56:10|NO.32279
HSPの画面からならウィンドウサイズやバッファの種類に関係なく
画像サイズのコピーが可能なようです。
下のスクリプトはドラッグでウィンドウのサイズを変更しても
表示部分だけでなく初期化したサイズでコピーされます。
#include "user32.as"
#include "gdi32.as"
#define CF_BITMAP $00000002
#define SRCCOPY $00CC0020
#define win_x 640 ;元画像のXサイズ
#define win_y 480 ;元画像のYサイズ
screen 0, ginfo_dispx, ginfo_dispy, 2 ;ディスプレイサイズまで表示可
screen 1, win_x, win_y, 0, , , 320, 240 : title "ドラッグで画面サイズを変更できます"
wx = ginfo_sx ;初期化した幅
wy = ginfo_sy ;初期化した高さ
color 255 : boxf 100, 100, wx-100, wy-100
wait 50 ;念の為少し待つ
button "COPY", *ClipBoard_Copy
stop
*ClipBoard_Copy
; コピー準備
CreateCompatibleDC hdc : src_DC = stat
CreateCompatibleBitmap hdc, wx, wy : src_Bitmap = stat ;このビットマップは削除してはいけない
SelectObject src_DC, src_Bitmap : old_Bitmap = stat
BitBlt src_DC, 0, 0, wx, wy, hdc, 0, 0, SRCCOPY
SelectObject src_DC, old_Bitmap
; クリップボードに画像をセット
OpenClipboard hwnd
EmptyClipboard
SetClipboardData CF_BITMAP, src_Bitmap
DeleteDC src_DC
CloseClipboard
; クリップボードから画像を取得&ペースト
gsel 0
OpenClipboard hwnd
GetClipboardData CF_BITMAP : src_Bitmap2 = stat
CreateCompatibleDC hdc : dest_DC = stat
SelectObject dest_DC, src_Bitmap2 : old_Bitmap2 = stat
GetObject src_Bitmap2, 0, 0 : bufsize = stat ;必要なバッファサイズを取得
sdim BITMAP, bufsize ;画像情報を取得する為のBITMAP構造体
GetObject src_Bitmap2, bufsize, varptr(BITMAP) ;構造体には幅、高さ、カラー形式の情報だけが返る
BMsizex = wpeek(BITMAP, 4) ;BITMAP構造体から画像の幅を取得
BMsizey = wpeek(BITMAP, 8) ;BITMAP構造体から画像の高さを取得
buffer 2, BMsizex, BMsizey ;screen,buffer,bgscrのどれにでもコピー可
BitBlt hdc, 0, 0, BMsizex, BMsizey, dest_DC, 0, 0, SRCCOPY
SelectObject src_DC, old_Bitmap2
DeleteDC dest_DC
CloseClipboard
gsel 0 : title "コピーした幅= "+BMsizex+" コピーした高さ= "+BMsizey
width BMsizex, BMsizey ;コピーした画像のサイズにウィンドウサイズを変更
gsel 0, 1
gmode 1, BMsizex, BMsizey
gcopy 2
redraw

| |
|
2010/4/27(Tue) 20:33:34|NO.32297
>ANTARESさん
bufferだと正しく転送されないようです。
>ありさん
ペイントに張り付けたところ、エラーが発生しました。
ビットマップと識別されていないみたいです。
再び検索したところ、LoadImageを使ってbmpファイルから
クリップボードに転送することができました。
http://www2.pf-x.net/~shink/api_clip2.html
皆さん、ありがとうございました。
|
|
2010/4/28(Wed) 10:40:48|NO.32305
>ペイントに張り付けたところ、エラーが発生しました。
>ビットマップと識別されていないみたいです。
どうもXP以降のOSだとGetDCで取得したDCを使わないと
ビットマップと認識してくれないようです。
(WinMeではエラーにならなかったので気づきませんでした)
もう解決されてしまわれたようですが
一応WinXP SP3での動作を確認したスクリプトを置いておきます。
#include "user32.as"
#include "gdi32.as"
#define CF_BITMAP $00000002
#define SRCCOPY $00CC0020
#define win_x 640 ;元画像のXサイズ
#define win_y 480 ;元画像のYサイズ
screen 0, ginfo_dispx, ginfo_dispy, 2 ;ディスプレイサイズまで表示可
screen 1, win_x, win_y, 0, , , 320, 240 : title "ドラッグで画面サイズを変更できます"
wx = ginfo_sx ;初期化した幅
wy = ginfo_sy ;初期化した高さ
color 255 : boxf 100, 100, wx-100, wy-100
wait 50 ;念の為少し待つ
button "COPY", *ClipBoard_Copy
stop
*ClipBoard_Copy
; コピー準備
GetDC hwnd : Window_DC = stat
CreateCompatibleDC Window_DC : src_DC = stat
CreateCompatibleBitmap Window_DC, wx, wy : src_Bitmap = stat ;このビットマップは削除してはいけない
SelectObject src_DC, src_Bitmap : old_Bitmap = stat
BitBlt src_DC, 0, 0, wx, wy, hdc, 0, 0, SRCCOPY
SelectObject src_DC, old_Bitmap
; クリップボードに画像をセット
OpenClipboard hwnd
EmptyClipboard
SetClipboardData CF_BITMAP, src_Bitmap
ReleaseDC hwnd, Window_DC
DeleteDC src_DC
CloseClipboard
; クリップボードから画像を取得&ペースト
gsel 0
OpenClipboard hwnd
GetClipboardData CF_BITMAP : src_Bitmap2 = stat
CreateCompatibleDC hdc : dest_DC = stat
SelectObject dest_DC, src_Bitmap2 : old_Bitmap2 = stat
GetObject src_Bitmap2, 0, 0 : bufsize = stat ;必要なバッファサイズを取得
sdim BITMAP, bufsize ;画像情報を取得する為のBITMAP構造体
GetObject src_Bitmap2, bufsize, varptr(BITMAP) ;構造体には幅、高さ、カラー形式の情報だけが返る
BMsizex = wpeek(BITMAP, 4) ;BITMAP構造体から画像の幅を取得
BMsizey = wpeek(BITMAP, 8) ;BITMAP構造体から画像の高さを取得
buffer 2, BMsizex, BMsizey ;screen,buffer,bgscrのどれにでもコピー可
BitBlt hdc, 0, 0, BMsizex, BMsizey, dest_DC, 0, 0, SRCCOPY
SelectObject src_DC, old_Bitmap2
DeleteDC dest_DC
CloseClipboard
gsel 0 : title "コピーした幅= "+BMsizex+" コピーした高さ= "+BMsizey
width BMsizex, BMsizey ;コピーした画像のサイズにウィンドウサイズを変更
gsel 0, 1
gmode 1, BMsizex, BMsizey
gcopy 2
redraw

| |
|