Excelのグラフをピクチャーボックスに格納する方法 – プログラミング – Home

Excelのグラフをピクチャーボックス...
 
通知
すべてクリア

[解決済] Excelのグラフをピクチャーボックスに格納する方法


Exe
 Exe
(@Exe)
ゲスト
結合: 19年前
投稿: 6
Topic starter  

はじめまして。
環境はVisualC++6.0、ダイアログベースで作成しています。

オートメーションでExcelを操作し、データからグラフを作成し、その
グラフをダイアログのピクチャボックスに表示させようと思っています。

グラフを作成するところまではできたのですが、そのグラフをどのようにすれば
ピクチャボックスに表示することができるのかわかりません。

どうか教えてください。よろしくお願いします。


引用未解決
トピックタグ
KJ
 KJ
(@KJ)
ゲスト
結合: 21年前
投稿: 52
 

>グラフをダイアログのピクチャボックスに表示
無理だと思いますが・・・

ピクチャボックスには画像しか表示できません。
どうしてもやりたければ、グラフを何らかの方法で画像ファイルとして保存する、
もしくはIPictureに変換し、
ピクチャーボックスに表示するしかないでしょう。


返信引用
Exe
 Exe
(@Exe)
ゲスト
結合: 19年前
投稿: 6
Topic starter  

一度クリップボードにコピー(_Chart.CopyPictureを用いて)して
クリップボードからグラフ画像のハンドル(HBITMAP)を取ることが
出来たのですけど、ハンドルだけでピクチャボックスに表示することが
可能でしょうか?


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

CStatic::SetBitmap() という関数があります。

http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_MFC_CStatic.asp


返信引用
Exe
 Exe
(@Exe)
ゲスト
結合: 19年前
投稿: 6
Topic starter  

SetBitmap()をどのように使ったらピクチャボックスに表示されるんでしょうか?

申し訳ないんですが、できれば例みたいなものをのせてくれたら幸いです。

よろしくおねがいします。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

HBITMAP h = 上にある方法;
((CStatic*)GetDlgItem(IDC_MY_PICTURE))->SetBitmap(h);


返信引用
Exe
 Exe
(@Exe)
ゲスト
結合: 19年前
投稿: 6
Topic starter  

何度も何度もすみません。

((CStatic*)GetDlgItem(IDC_MY_PICTURE))->SetBitmap(h);
の方法でやってみたんですが、うまくいきません。

/////////////////////////////////////////////////////////
_Chart chart;
HBITMAP hBitmap
・・・
EmptyClipboard();            //クリップボードを空にする
chart.CopyPicture((long)1, (long)2);   //グラフをBMPでクリップボードにコピー
OpenClipboard();
hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP); //ハンドルを取得
CloseClipboard();

((CStatic*)GetDlgItem(IDC_PICT))->SetBitmap(hBitmap);
//////////////////////////////////////////////////////////
IDC_PICTはピクチャボックスのID

なにかおかしいところがありましたら教えてください。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

まさかと思いますけれど、
問題のピクチャボックスにビットマップを使用すると言う設定がなされていないとか。


返信引用
Exe
 Exe
(@Exe)
ゲスト
結合: 19年前
投稿: 6
Topic starter  

そうかもしれません。っていうかきっとそうです。

何か設定する必要があるんですか。教えてください。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

リソースエディタで貼り付けたのであれば、
プロパティのところに設定があったと思います。
タイプのところがビットマップ以外になっているようならビットマップにすれば
よろしいかと思います。

ふと思ったんですが、クリップボード上のビットマップってどういうタイミングで
開放されるんですかねぇ。
もしかしてクリップボードを閉じる前に自前の環境にコピーしとかないと
いけないとかありませんかね。
クリップボードから取り出したハンドルをそのまま使って大丈夫かなと思ったんですが。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

リソースエディタでそのピクチャーボックスの
プロパティを開いて探してください。

実はその事が原因でなかった場合、
どんな風に「うまくいかない」のか詳しく書いてください。

デバッガでステップ実行して関数の引数や戻り値を調べるのも重要です。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

MSDNのGetClipboardDataの説明より

GetClipboardData 関数が返すハンドルは、アプリケーションではなくクリップボードが
管理しています。アプリケーションはデータを即座にコピーするべきです。
また、アプリケーションはハンドルを解放することや、ロックし続けることを避けなければ
なりません。さらにアプリケーションは、EmptyClipboard または CloseClipboard を
呼び出した後にハンドルを使うことや、SetClipboardData を呼び出した後にクリップボード
の同じデータ形式を指定することを避けなければなりません。

この辺の関数を使うときはMSDNの説明まできちんと目を通した方が良いです。
特に取得したデータの有効期限とかには気をつけないと駄目です。


返信引用
Exe
 Exe
(@Exe)
ゲスト
結合: 19年前
投稿: 6
Topic starter  

返信遅れてすみません。

なんとか、できました。

PATIOさんのいわれたとおりに、
ピクチャボックスの設定を変更したら表示されました。

ただ、図のサイズがでかいため、ピクチャボックスより大きく表示されたのですが、
ここまでできれば、後は何とかなりそうです。

教えてくださったみなさん、本当にどうもありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました