- 締切済み
C++ デスクトップアプリケーションで作る電子印鑑
C#で透過画像を扱おうとしたら、全然うまくいかなかったので、C++で作ることにしました。(↓この質問でいただいた提案でC++で作っております) https://okwave.jp/qa/q10234511.html やりたいこと: ボタンクリックで画像をコピー 透過画像を扱いたくベクター形式で図形描画 ビットマップ:ラスター変換後、白背景 メタファイル:透過背景 ラジオボタンで選択式。 VS2022でプロジェクトを作成し、Win デスクトップアプリケーションを選んで生成されたコードをそのまま使用しています。 で、今、基本的な図形描画(ベクター形式)とボタンでのクリップボードにコピーまでやりました。 しかし、C#で起きた問題と似たことが起こっています。 問題:透過画像をメタファイルでクリップボードにコピーして、Adobe PDFに貼り付けができない。 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { ※これの中に入っています。Copilotのコード内容カスタムしているだけなので、デフォルトのコードを全部理解できているわけではありません。「動けばいいや」くらいです。 Copilot(ChatGPTもGeminiも凝りました)の力を借りて、↓ここまでできましたが、肝心の貼り付けができません。ラジオボタンのif文の中ですので、抜粋しています。DrawContentはただの円の枠(DrawEllipseで描画)です。 // 描画内容をメタファイルに保存 HDC hdc = GetDC(hWnd); RECT rect; GetClientRect(hWnd, &rect); Metafile metafile(hdc); Graphics graphics(&metafile); // 描画内容を関数で行う DrawContent(graphics); // メタファイルのハンドルを取得 HENHMETAFILE hEmf = metafile.GetHENHMETAFILE(); // メタファイルをクリップボードにコピー OpenClipboard(hWnd); EmptyClipboard(); SetClipboardData(CF_ENHMETAFILE, hEmf); CloseClipboard(); // リソースを解放 ReleaseDC(hWnd, hdc); クリップボードの画像を解析すると、 EnhancedMetafile MetafilePict 2種類あり、クリップボードへのコピー自体はできているようですが、Office系にも貼り付けができません。 ビットマップにすると問題なく動いております。 正直なところ、WPFで作りたいところ(ベクター画像がキレイ)なんですが… 知見をお持ちの方、よろしくお願いいたします…
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- AIエージェント あい(@OKWAVE-AI)
- ベストアンサー率89% (2715/3019)
あなたが遭遇している状況は少し厄介なようですね。透過画像の扱いに関する問題は、多くのプラットフォームで発生する可能性があります。実際に、透過画像をクリップボードにコピーしてAdobe PDFやOffice系ソフトに貼り付けることができない問題は一般的です。貼り付けが正常に機能しないのは、これらのアプリケーションがクリップボード内のデータをどのように解釈し処理するかによって異なるためです。 C++で書かれたコードを見る限り、基本的には正しい手順でメタファイルをクリップボードにコピーしているように見えます。しかし、クリップボードに保存されているデータが予期したとおりに他のアプリケーションで認識されない場合、問題はそのアプリケーションがクリップボードデータの形式をどのようにサポートしているかにあります。 Adobe PDFやMicrosoft OfficeはENHMETAFILE形式を認識するかもしれませんが、それをそのまま透過画像として扱うかや、いかなる変換を行うかは、それらのアプリケーションの内部的な実装に依存します。これに対する解決策は、以下のようなものになります。 1. 異なるフォーマットを試す: アルファチャンネルを持つビットマップのような他のフォーマットでクリップボードにデータをコピーしてみてください。一部のアプリケーションはPNG形式など、特定のフォーマットを好む可能性があります。 2. ソフトウェアの設定を確認する: Adobe AcrobatやOfficeソフトウェアの設定を見直し、クリップボードデータの処理方法に関連する設定があるかどうかを確認してください。 3. アプリケーションのドキュメントを確認する: AdobeやMicrosoftのサポート資料やフォーラムを調べ、クリップボードデータの取り扱いに関する公式の情報やヒントを探してください。 4. WPFへの移行を検討: C#とWPFでアプリケーションを構築すれば、ベクター画像の扱いが改善される可能性があります。また、これによってエンドユーザーの体験も向上するかもしれません。 問題の解決にはアプリケーションの動作を細かく理解し、場合によっては特定のアプリケーション向けに最適化する必要があるかもしれません。単純な解決策が見つからない場合、専門のフォーラムやコミュニティでサポートを求めるのも一つの方法です。 ------ こちらの回答はAIエージェント「あい」による自動投稿です。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/