今、vc++のMFCで画像読込のプログラムを作成しています。
ダイアログに「ディスプレイコントロール」「ファイルコントロール」「コモンコント
ロール」があるのですが、
画像をディスプレイコントロールに表示したいです。
ご回答の程よろしくお願いいたします
質問になっていません。
重要な部分が抜けていました、申し訳ございません。
(ファイルコントロールメンバ変数).GetImgHandle処理後、
読み込みたい画像をDIBからimagedataに変更し、それをディスプレイコントロールに描
画したいのです。
その処理を考えているのですが、
例外が発生してしまうので、なにか良い方法はないでしょうか?
よろしくお願いいたします。
ちなみに自分のソースは
void CFileDlg::ClickIkdisp()
{
int judge, ikLoad = 0, ikClear = 0, ikScale = 1, ikStretch = 2,
ikActualSize = 3;
HDIB img, hDIB, *pDIB;
VsiImageData *p;
pDIB = &img;
judge = m_open.LoadFile(ikLoad);
if(judge != 0){
img = (HDIB)m_open.GetImgHandle();
}
//VsiImageData* WINAPI VsiDibToImageData( HDIB pDIB );
//↑ヘッダで宣言
//pDIB = DIBヘッダへのポインタ
//成功:イメージデータ構造体のポインタ、失敗:NULL
//DIBからimagedataに変更する
p = VsiDibToImageData(pDIB);
if(p == NULL){
return;
}
//m_open.GetFileName();
m_hy.Display(ikActualSize);
return;
}
となっています。
おかしな部分など些細なことでも構いませんので、ご指摘いただけたらと思います。
「VC++とMFCで」と書かれていますが、
VC++のバージョンについて全く触れられていないので
MFCのバージョンもわかりません。
あと、「ディスプレイコントロール」「ファイルコントロール」と言った単語が
出てきていますが、これらは一体何なんでしょう?
MFCにこういうコントロールは無いと思うのですけれど。
Microsoft以外のメーカーのライブラリを使っているのであれば、
そちらのメーカーに聞くのが筋かと思いますよ。
少なくとも私は書かれている内容からではさっぱりわかりません。
自作のクラスであれば、そのクラスの中身を説明してもらわないと
掲示板を見ている人間には内容を知りようも有りません。
追加で提示された内容では、最初の書き込みで感じた疑問が
一つも解消されていないです。
もっと、問題を整理してから書き込みをお願いします。
あと、Microsoftが提供しているクラス以外の部分は
きちんとした説明が必要ですよ。
貴方が使っているライブラリを把握しているのは貴方だけですから。
たぶんimagekit6上のコントロールでしょう。
imagekit6のマニュアルを読んでもらうしか
無いかも(vv;)。
> たぶんimagekit6上のコントロールでしょう。
> imagekit6のマニュアルを読んでもらうしか
> 無いかも(vv;)。
はうあっ。
タイトルに書いてあったのね。
て言うか、マニュアル読んでわからなければ、メーカーに聞いてください。
正規ユーザーならテクニカルサポートしてくれると思うので。
思うにこういうライブラリに関しては必ず使うって類の物じゃないから
掲示板で聞くのは無理があるかもなぁ。
使った事がある人が偶々掲示板を見ないとレスつかないだろうし。
メーカーにサポート掲示板があるならそっちで聞くのが吉かと。
質問者の代わりに製品サイト紹介
> http://www.newtone.co.jp/productik600.html
サポート掲示板見当たらないですね。
サポートは殆ど有償ですね。
こうゆうことは、ぜひ質問者が回答すべきこだと思います。
「ぜひ」は余計でしたね。
サポート掲示板、存知の方お願いします。
ImageKit6のDLLはときどき使っているので、コントロールの方はよく知りませんが、簡
単にテストしてみました。
下のソースで例外もなく画像が表示されました。
強いていうなら、debornさんのソースには★印の部分がないかと思われます。
これで、タイトルにあるMFC vc++ ImageKit6 という点では解決できるのではないかと
思いますが、
debornさんのいう「DIBからimagedataに変更」という処理関数 VsiDibToImageData
(pDIB) というのはなんでしょうか?ImageKitにもMFCにもないような気がします。そち
らで例外がでているのかどうかはお確かめください。
void CIkTestDlg::OnClickIkdisp1()
{
BOOL judge;
long img; //イメージハンドル
m_open.SetFileName(C:\\testImage.jpg);
//↑追加しましたが、ファイル名は他で設定されているんですよね?
judge = m_open.LoadFile(0);
// ↑イメージファイルを読み込みます。
//(引数0はファイルタイプ自動認識)
if ( judge )
{
img = m_open.GetImgHandle();
//↑イメージハンドルの読込
m_hy.SetImgHandle(img);//★←この部分がないのでは??
//↑表示コントロールへのイメージハンドルの設定
m_hy.Display(2);
//↑イメージ表示
// 引数:表示モード(0:クリア、1:スケール表示、2:ストレッチ表
示、3:実寸表示)
}
}
追加です。GetImgHandle()をしたメモリハンドルは解放しないといけないので、
m_hy.Display(2);
の下に解放する関数が必要です。
m_ikcomon.SetImgHandle(img);
m_ikcomon.FreeMemory();
このままこのスレ本人に放置される気もしますが、念のため一応・・・。
レスが遅れ申し訳ございません。
たくさんのレスを頂き、学んだこともありました。
ららさんのものを真似てみたところ、無事動きました。
自分のソースからコピペした際にVsiDibToImageData(pDIB)を省くのを忘れていました。
これはこちらでの特別なものなので、お気になさらず…
まず先にもっとcの勉強が必要だなと改めて実感しました。
他の方々も本当にありがとうございました。