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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0424
e-nikuクリップボードに転送10解決


e-niku

リンク

2010/4/24(Sat) 12:18:11|NO.32233

クリップボードにクライアント領域でなく、ウィンドウの初期化サイズ
またはbufferから正しく画像を転送するにはどうすればよいでしょうか。
ご教授お願いします。



この記事に返信する


skyblue

リンク

2010/4/24(Sat) 19:50:02|NO.32236

clipsetg命令はどうですか?
>現在選択されている画面をビットマップデータとして、クリップボードに送ります。
HSPヘルプからの引用(hspext)です。



e-niku

リンク

2010/4/25(Sun) 00:26:53|NO.32238

プラグインはできれば使いたくないです。
ファイルからでも読み込めればいいのですが。



u

リンク

2010/4/25(Sun) 02:35:42|NO.32239

win32APIではSetClipboardDataを使います。

ビットマップオブジェクトの勉強が必要になるかも知れません。
http://yokohama.cool.ne.jp/chokuto/urawaza/bitmapobject.html



あり

リンク

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なのでどちらも同じ事だとも言えますけどね。
プログラム次第ではプラグインを目立たない位置で使う方法もありますよ。
>ファイルからでも読み込めればいいのですが。
可能だとは思いますよ、その分必要な知識も増えますが。



skyblue

リンク

2010/4/25(Sun) 12:00:14|NO.32244

>ファイルからでも読み込めればいいのですが。
画像ファイルの読み込みなら拡張子が限られるけどpicloadだと思います。
対応する拡張子は、bmp,gif,jpg,icoです。



e-niku

リンク

2010/4/25(Sun) 19:14:51|NO.32252

>uさん
そのページを読んで何度か自分なりにやってみましたがだめでした。

>ありさん
スプリクトありがとうございます。
しかし、私が思っていたものは違います。
説明が的確でなくすみません。
wait 50の前にwidth 100,100を入れても
640,480のサイズでクリップボードに転送できるようにしたいので、
GetDCやGetWindowDCは使えないようです。



ANTARES

リンク

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



e-niku

リンク

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



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