他アプリケーションのメモリDCに描画するには?

解決


ジャンコード  2006-12-05 08:42:11  No: 97350

タイトルの内容が実際の仕様に必要な内容と異なっていたらすみません。
実現したい動作を「ペイント」で説明させて頂きます。
実際の作業を行うアプリケーションはペイントではなく、
クリップボードを利用した「貼り付け」や、
画像ファイルを開く機能のないアプリケーションが対象になりますので、
タイトルのように「メモリDCに描画したい」と表現致しました。

現状
(1)ペイントの描画領域のDCを取得し、そこにBitBltで適当な画像を描画
(2)ペイントをアクティブにするとペイントがWM_Paintメッセージを発行してしまう
(3)(2)により(1)で描画した内容が消えてしまう

やりたい事
(1)ペイントの描画領域に適当な画像を描画
(2)描画した内容の上からペイントのブラシなどで描画
このように(1)の描画内容を継ぎ、ペイントの描画を加えて行っていきたいと思っています。

(1)を実現するためにメモリDCに描画したら良いのかと思ったのですが、
メモリDCを作成する方法しか見つからず取得する方法が見当たりませんでした。
DCは画面上の表示、メモリDCはDCに表示する内容を保持している物と考え、
メモリDCに描画したら良いのではないかと考えたのですが、根本的に間違っているのでしょうか。
「やりたい事」を実現するための方法がお分かりになる方がいらっしゃいましたらご教示頂けますと幸いです。


K.J.K.  2006-12-05 20:30:53  No: 97351

別プロセスに属するGDIハンドルは、一般的には無意味な値に過ぎません。


ジャンコード  2006-12-06 09:38:14  No: 97352

ご返信ありがとうございます。

>別プロセスに属するGDIハンドルは、一般的には無意味な値に過ぎません。
これはつまり「やりたい事」の実現は不可能なのでしょうか?


K.J.K.  2006-12-06 18:59:34  No: 97353

単純に、画像を[編集]-[貼り付け]で渡すのが無難なのでは。
座標などを指定したいのであれば、それを(外から)指定できる
機能を持った画像編集ソフトを探して使うとか。


オショウ  2006-12-06 21:48:34  No: 97354

他のアプリが所有するメモリDCは、そのハンドルを他のプロセスが
知ることはできないので無理でしょう。
また、ダブルバッファリングでクライアント領域に描画しているよう
なドロー系ソフト(だと思う)も無理でしょう。

ただし、PhotoShopに書いてみましたが、できました。

参考には・・・
http://homepage1.nifty.com/rucio/main/tyukyu/tyukyu5.htm

描画ウィンドウのhWndを取り、GetWindowDCでhDCを取得できれば、
他のプロセスからも書き込みは可能です。

そのアプリで保持されるかについては、上記のダブルバッファ等の
機能による当然無理な場合があります。

※  他プロセスからウィンドウハンドルを探して取得する方法は、
    解っていますよネ?
    手作業で知るには・・・VC6++とかについているツールで
    SPY++使って、ウィンドウハンドル調べます。
    APIなら・・・FindWindowで、アプリのトップウィンドウを
    探してハンドルを取得し、そのウィンドウが所有する子ウィン
    ドウを探して・・・最後にデバイスコンテキストハンドルを取
    得して・・・と言う動作になります。

以上。


ジャンコード  2006-12-07 07:36:23  No: 97355

K.J.K.さん
ご返信有難う御座います。
その通りなのですが、どうしても実現したい対象がそのような機能のないものでして・・

オショウさん
ご丁寧に手順まで解説して頂きありがとうございます。
ご説明頂きました工程は現状(1)に記載致しました通り、
BitBltによる描画までは成功しているのですが、
WM_Paintメッセージのような再描画の処理が掛かるとアウトです。

ご返信有難う御座いました。
不可能と言うことで解決とさせて頂きます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加