はじめまして、質問させてください。
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も見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
プリン+醤油=ウニみたいな組み合わせメニューを教えて!
プリンと醤油を一緒に食べると「ウニ」の味がする! というような意外な組み合わせから、新しい味になる食べ物って色々ありますよね。 あなたがこれまでに試した「組み合わせメニュー」を教えてください。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
MFCでOnPaintのタイミング
C言語・C++・C#
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
static 文字が上に張り付いて・・・
C言語・C++・C#
-
-
4
画面を強制的に再描画させる方法
C言語・C++・C#
-
5
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
6
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
7
リソースエディタでスタティックテキストの文字サイズの変更
C言語・C++・C#
-
8
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
9
CString から LPCTSTRの型に変換
C言語・C++・C#
-
10
VC++にてボタン等のサイズ取得
C言語・C++・C#
-
11
MFC ダイアログ上のID取得について
C言語・C++・C#
-
12
MFCで画像を表示させているのですが、透過表示する方法がわかりません。
C言語・C++・C#
-
13
MFC - ダイアログボックスのPictureControlへの画像表示
C言語・C++・C#
-
14
メッセージハンドラ
C言語・C++・C#
-
15
エディットコントロールでEnter押した時の動作
C言語・C++・C#
-
16
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
17
ビットマップを表示させる(MFC)
C言語・C++・C#
-
18
CString型の文字列連結について
C言語・C++・C#
-
19
WM_SIZEを発生させる方法
C言語・C++・C#
-
20
MFCのタイマーのつかい方を教えてください
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
PCで「使用可能な場合はグラフ...
-
OneNote 2010 文字と描画がずれる
-
TextBoxに文字を書いても表示さ...
-
MFCでOnPaintのタイミング
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
VBAにGDI+を参照させる方法
-
ビットマップを表示させる(MFC)
-
UpdateData( FALSE); による文...
-
フォームにビットマップを表示
-
エクセルでガンチャートを作成...
-
C#のタブコントロールについて...
-
コンボボックスの高さを変えたい
-
c++ ダブルバッファリング、以...
-
CDC(LineTo)で描画した線を透過...
-
MFC FormViewの背景色
-
(C# .Net) ToolStripのボタンの...
-
MFCタブコントロールのグラデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
MFCでOnPaintのタイミング
-
NVIDIAのシェーダーキャッシュ
-
C++にて、塗りつぶされた円を描...
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
MFCのタイマーのつかい方を教え...
-
CStaticコントロールの静的イメ...
-
画面全体を再描画させたい
-
OneNote 2010 文字と描画がずれる
-
VBAにGDI+を参照させる方法
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
テクスチャに半透明ポリゴンを...
-
Windowのちらつき防止
おすすめ情報