画像が途中から表示されなくなります。 – プログラミング – Home

画像が途中から表示されなくなります。
 
通知
すべてクリア

[解決済] 画像が途中から表示されなくなります。


困ってます
 困ってます
(@困ってます)
ゲスト
結合: 9年前
投稿: 11
Topic starter  

お世話になってます。
前回はこちらの掲示板に助けられ助かりました。ありがとうございました。

また質問です。
画像ファイルの画像を画面に表示させたいのですが、再描画で何回も繰り返し表示させる
と、途中から表示されなくなってしまいます。
いったん表示されなくなると、再描画をもういくらやっても表示されなくなってしまいま
す。
何がおかしいのでしょうか?

環境は、WinXP・VS2003、Win7・VS2012の両方で発生しました。

以下、ソースコードの抜粋です。
fileName…画像ファイルパス名
rect…表示領域座標

CPictureHolder *pBitmap = GetPicture(fileName);
if (pBitmap != NULL) pBitmap->Render(pDC, rect, rect);
delete pBitmap;

よろしくお願いします。


引用未解決
トピックタグ
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 13年前
投稿: 2
 

>CPictureHolder *pBitmap = GetPicture(fileName);

GetPicture()って何者でしょうか?

https://msdn.microsoft.com/ja-jp/library/office/ff864210.aspx
ではないですよね????

そして、そのGetPicture()が返却する型はCPictureHolderなんでしょうか??

>画像ファイルの画像を画面に表示させたいのですが、再描画で何回も繰り返し表示させる
>と、途中から表示されなくなってしまいます。

症状的にはリソースリークしているように見えますけど、システムモニタなどでのリソー
ス使用量はどうなっています?


返信引用
困ってます
 困ってます
(@困ってます)
ゲスト
結合: 9年前
投稿: 11
Topic starter  

GetPictureは自前の関数↓でした。

CPictureHolder *GetPicture(CString& ImageFileName)
{
LPDISPATCH pDispPicture;
COleVariant OleFileName(ImageFileName);
CPictureHolder *pPicture;

if(OleLoadPictureFile(OleFileName, &pDispPicture) >= 0) {
pPicture = new CPictureHolder();
pPicture->SetPictureDispatch((LPPICTUREDISP)pDispPicture);
return pPicture;
}

return NULL;
}

GetPictureを使わずに以下のように処理しても同様でした。

COleVariant varName(fileName);
LPDISPATCH pDisp;
CPictureHolder *pPicture = new CPictureHolder;
OleLoadPictureFile(varName, &pDisp);
pPicture->SetPictureDispatch((LPPICTUREDISP)pDisp);
pPicture->Render(pDC, rect,rect);
delete pPicture;

リソース使用量などはこれから調べてみます。


返信引用
困ってます
 困ってます
(@困ってます)
ゲスト
結合: 9年前
投稿: 11
Topic starter  

システムモニタ起動しましたが見方がわかりません。。。
「page/sec」ってなんじゃらほい?てな感じです。
解決には、どうしても見る必要ありますか?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

pDispPicture->Release() が必要でしょうね。

CPictureHolder::SetPictureDispatch は内部で QueryInterface して参照カウントをイ
ンクリメントします。
この分はデストラクタでリリースされます。
OleLoadPictureFile で作成して SetPictureDispatch に渡している生の IPictureDisp
インターフェイスに対するリリースは明示的に書かなければなりません。


返信引用
困ってました
 困ってました
(@困ってました)
ゲスト
結合: 9年前
投稿: 7
 

pDispPicture->Release()を追加したらできました。
aetosさん、ありがとうございます!


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

解決済みのようですが…

>システムモニタ起動しましたが見方がわかりません。。。

タスクマネージャでした。
プロセスタブを開いて、[表示][列の選択]から「GDIオブジェクト」とか選択します。
今回の場合だと「ハンドル」も増え続けたかも知れませんが。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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