はじめまして、質問させてください。
VC++ 2005 MFC で開発しております。
Picture Control(DDX CStasic型)に
イメージ(外部ファイル JPG)を静的に描画させたいのですが
方法がわかりません。
お詳しい方がおられましたら、ご教授お願いいたします。
ちなみに
CImageを使用して描画はできるのですが
その場合、OnPaintをオーバーライドして
描画更新処理を書かないと一度だけ描画されて終わって
しまうと思います。
CStaic変数にロードしたら
再度ロードされるまで
ずっと描画させていたいです。
以上になります。
宜しくお願いいたします。
No.7ベストアンサー
- 回答日時:
SelectObjectで選択するとその時まで選択されていたデバイスハンドルを返してきます
そのハンドルを一時変数に保存しておいて描画後に戻してやるのです
CBitmap* pOld = m_dcMem.SelectObject( &m_bmpMem );
といった具合で記憶して描画処理を行います
使用後に
m_dcMem.SelectObject( pOld );
といった具合にして m_bmpMemをDCからはずします
この後
m_ctlImage.SetBitmap( m_bmpMem );
といった具合に選択してやればできると思います
CStaticのTypeはビットマップで無いとSetBitmapでイメージを表示しません
No.6
- 回答日時:
出力先のDCを指定せずに描画するのは不可能でしょう
CImage::StretchBltではどのタイプも 第一引数でHDCを必要とします
SetBitmapではビットマップハンドルを指定するだけですから
その描画は windows任せです
Windowsはビットマップハンドルにしたがって取得できるBitmap構造体の情報で描画するのですから 拡大縮小はできないと思います
メモリー上にDCなどを作成して StretchBltを使う方向で考えたほうがよさそうですよ
GetDC()でコントロールなどから取得して
CreateCompatibleDC()でコンパチDCを作成
これに描画範囲をカバーできるBITMAP(CBitmap)をSelectObjectで選択しておいて
StretchBltで描画
SelectObjectでコンパチDCからビットマップを外して
ビットマップハンドルをコントロールのSetBitmapで設定
といった具合でしょう
または CImageの内部で使われている GDI+のGraphicsオブジェクト経由でやるとか ・・・
redfox63 様
何度もご回答ありがとうございます。
教えていただいた方法で実装してみましたが
うまくいきませんでした。
以下実装内容
--------
メンバ
CDC m_dcMem;
CBitmap m_bmpMem;
CImage m_imgThumbnail;
CStatic m_pictThumbnail;
--------
CDC *pDC = m_pictThumbnail.GetDC();
m_dcMem.DeleteDC();
m_dcMem.CreateCompatibleDC( pDC );
m_bmpMem.DeleteObject();
m_bmpMem.CreateCompatibleBitmap( pDC, 100, 100 );//m_sizeImage.cx, m_sizeImage.cy );
m_dcMem.SelectObject( &m_bmpMem );
m_imgThumbnail.Load( _T("jpgフルパス") );
m_dcMem.SetStretchBltMode( COLORONCOLOR );
m_imgThumbnail.StretchBlt( m_dcMem.GetSafeHdc(), 0, 0,
100, 100, 0, 0, m_imgThumbnail.GetWidth(), m_imgThumbnail.GetHeight(), SRCCOPY );
//m_pictThumbnail.SetBitmap( &m_bmpMem );
ReleaseDC( pDC );
--------
>SelectObjectでコンパチDCからビットマップを外して
という箇所がよくわかりません。
この方法の場合、
CStaticのプロパティタイプは「フレーム」でもよろしいのでしょうか?
お手数おかけいたしますが、
宜しくお願いいたします。
No.5
- 回答日時:
まさかとは思いますが コントロールのタイプが『フレーム』のままではないですよね
Typeプロパティを『ビットマップ』に変更してますよね ・・・
redfox63 様
恥ずかしながら『フレーム』のままでした。
描画できました。
ありがとうございます。
最後にもうひとつ教えていただきたいのですが、
CImageのStretchBltを使用して縮尺描画できると思うのですが、
OnPaint()等、CDC(デバイスコンテキスト)を取得して
コピー先のDCを指定せずにSetBitmap()で縮尺or拡大は可能でしょうか?
検討違いでしたら申し訳ありませんが、
宜しくお願いいたします。
No.4
- 回答日時:
どうも 頭がぼけているようです … (いまだに正月ボケ)
リファレンスで確認したところ
以前のイメージの破棄はDestroyで良いようです ・・・ 内部で ::DeleteObjectを呼んでいました
当方の環境では
m_ImageTemp.Destroy();
m_ImageTemp.Load("ファイルパス");
m_ctlImage.SetBitmap( m_ImageTemp ); // ...(1)
といった具合でうまく表示されます
(1)にブレークポインタを設定して ステップ実行した際に
CImageの operator HBITMAPで m_hBitmapを返され
初回ならCStaticの SetBitmapで NULLハンドルが返されます
2回目以降は 前回のイメージハンドルが返されます
Loadで失敗するなら 例外がスローされるだろうし ・・・
No.3
- 回答日時:
すみません DeleteObjectはCBitmapなどの CGDIObjectからの継承時です
CImageの場合 Detachでハンドルを開放です
// ハンドルが有効なら
if ( m_Imagetemp.m_hBitmap )
m_ImageTemp.Detach();
m_ImageTemp.Load("ファイルパス");
m_ctlImage.SetBitmap( m_ImageTemp );
といった具合です
スタティックコントロールのIDは IDC_STATIC以外のものですよね
IDC_STATICではコントロールの判別不能になると思います
redfox63 様
m_hBitmapはprivateメンバだと思うのですが...
Detach()してもしなくても描画されません。
スタティックコントロールIDは IDC_STATICではありません。
DDX変数自体作れませんから。
教えていただいたサンプルソースで実際にイメージを
描画できているのでしょうか?
以上になります。
宜しくお願いいたします。
No.2
- 回答日時:
> m_ImageTemp.Destroy();
Destroyで破壊してしまってはいけません
m_ImageTemp.DeleteObject();
で 以前読み込んだイメージを破棄するだけです
その後
m_ImageTemp.Loadでファイルから読み込みます
これをスタティックコントロールの コントロール変数を介して SetBitmapメソッドを使って イメージハンドルを設定します
redfox63 様
ご回答ありがとうございます。
DeleteObjectはCImageのメソッドではないですよね?
CImageをメンバで保持し、
CStaticコントロールのDDX変数もメンバで保持して
実装しています。
その上で描画されませんでした。
ちなみに
現在読み込んでいるイメージは破棄せずに(初回1イメージのみ)
でも描画できませんでした。
以上になります。
宜しくお願いいたします。
No.1
- 回答日時:
CImageクラスの変数をその描画したいクラスに用意して CStaticのコントロールのSetBitmapを実行すれば良いでしょう
クラスに
CImage m_ImageTemp;
といった具合に宣言しておきます
画像を指示する関数で
// 以前読み込んだイメージを除去
m_ImageTemp.deleteObject();
m_ImageTemp.Load( ファイルパス );
m_ctlStatic.SetBitmap( m_ImageTemp );
といった具合です
イメージを保持する変数をローカルにしてしまうと再描画の情報などが失われてしまうので気おつけましょう
redfox63 様
ご回答ありがとうございます。
教えていただいたとおり実装してみましたが
描画できませんでした。
ちなみに
m_ImageTemp.deleteObject();
m_ImageTemp.Destroy();
ですよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 美術・アート 画家について。 2 2022/06/16 18:46
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- フリーソフト GIMPの使い方 1 2022/07/11 13:52
- 美術・アート ペンタブとオフィス系ソフト 1 2022/10/08 19:27
- 画像編集・動画編集・音楽編集 medibang paint を使っているのですが、 [画像をレイヤーとして開く]で写真をトレースし 2 2023/03/18 04:36
- 美術・アート 美術で空想画を描くのですが、全く思いつきません。 あるものを覗いてみたら、的な感じです。 画用紙に丸 2 2022/04/25 19:30
- ホラー・ミステリー おすすめのホラー映画を教えてください 8 2022/08/11 04:17
- 美術・アート ご観覧ありがとうございます。 漫画家志望なのですが、 ミニネームを作り、それを参考に、 別な紙に下書 1 2023/02/19 05:50
- Windows 8 Route Generator の使い方 1 2023/05/03 00:36
- 美術・アート 顔の各部位を画像のような簡単なパーツから作っていきたいのですが、 鼻以外の、耳、顎、頬、目、おでこ、 4 2023/05/03 07:54
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
MFCで画像を表示させているのですが、透過表示する方法がわかりません。
C言語・C++・C#
-
ビットマップに描画をしてピクチャーコントロールに貼り付けるためには?
C言語・C++・C#
-
-
4
VC++プログラムをつかったBMP画像の拡大縮小について
C言語・C++・C#
-
5
MFCでbitmapを背景にしてstaticテキストを透過させる方法
C言語・C++・C#
-
6
MFC - ダイアログボックスのPictureControlへの画像表示
C言語・C++・C#
-
7
RGBのバイナリデータをCImageにコピー
C言語・C++・C#
-
8
ラベル(スタティックテキスト)内での改行。
C言語・C++・C#
-
9
リソースエディタでスタティックテキストの文字サイズの変更
C言語・C++・C#
-
10
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
11
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
12
CEdit の内容が変わった時にメッセージを表示させたい
C言語・C++・C#
-
13
StretchBlt関数について
C言語・C++・C#
-
14
VC;;6.0のMFCで線を簡単に引けますか?
C言語・C++・C#
-
15
リストコントロール(MFC or API)の最後尾にアイテムを追加するには?
C言語・C++・C#
-
16
charからLPTSTRへの変換方法
C言語・C++・C#
-
17
WaitForSingleObjectの使い方について
C言語・C++・C#
-
18
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
19
ダイアログボックスのタスクバーアイコンを表示するには
C言語・C++・C#
-
20
LoadImage関数について(VC++)
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PCで「使用可能な場合はグラフ...
-
NVIDIAのシェーダーキャッシュ
-
最前面に無理やりフォームを持...
-
MFCのタイマーのつかい方を教え...
-
C#のタブコントロールについて...
-
ClistBoxでオーナードローがよ...
-
MFCでOnPaintのタイミング
-
VC++プログラムをつかったBMP画...
-
VB6,リストボックスの特定行の...
-
ドローソフトのダブルバッファ...
-
InvalidateRectの使い方について
-
GetGlyphOutline() ご利用経験...
-
当たり判定
-
陰関数のグラフを表示させるには
-
Pythonによる物理の斜方投射の...
-
CS_HREDRAW|CS_VREDRAWについて
-
扇形などを描く方法
-
OpenGLでの描画のタイミング
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
TextBoxに文字を書いても表示さ...
-
word
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
InvalidateRectの使い方について
-
OneNote 2010 文字と描画がずれる
-
StretchBlt関数について
-
C# ラバーバンドの描画を快適に...
-
エクセルでガンチャートを作成...
-
C++にて、塗りつぶされた円を描...
-
VBAにGDI+を参照させる方法
-
GDI+で高速な描画
-
MFC DrawText 背景色とフォント
-
FlexGridの一部のみ表示を更新...
-
MFCのタイマーのつかい方を教え...
-
Labelの文字をスクロールする際...
おすすめ情報