• ベストアンサー

VC++6.0 MFCダイヤログベースでの画像処理

初心者です。 VC++6.0 MFCダイヤログベースのアプリケーションで、ビットマップ画像を生成表示するにはどうしたらよいでしょうか。 MFC-SDIでは経験があります。 例題と扱っているサイトありましたら、紹介願います。

質問者が選んだベストアンサー

  • ベストアンサー
noname#2009
noname#2009
回答No.3

ダイアログに置いたコントロール上に描画するとのことだと 一時的な描画で良ければコントロールのDCに対して CDC* pdc = GetDlgItem(IDC_STATICXX)->GetDC(); もしくはメンバ変数設定していた場合、 CDC* pdc = m_sta1.GetDC(); ~ ・・・ん、この際片っ端から全部書くと、メンバ変数の設定は [ClassWizerd]-[メンバ変数タブ]-(コントロール選択)- [変数の追加]-[カテゴリ]=コントロール で設定。 この場合は描画後にはコントロールに対してReleaseDC を 入れて下さい。 例:m_sta1.ReleaseDC(pdc); OnPaint(OnDraw) を利用した恒久描画の場合は、 ClassWizerd]-[クラスの追加ボタン]-(新規)  に クラス名=(適当な名前、例:CMyStatic) 基本クラス=CStatic でOKすると新規拡張クラスが追加されるので、そのまま 右リストで WM_PAINT を選択しOnPaint を追加してください。 そしてメインダイアログのヘッダで、 #include"MyStatic.h"    を追加 CStatic m_sta1;  → CMyStatic m_sta1; に変更 でCMyStatic::OnPaint() を利用して下さい。 また参考URLの後半部分も適当にどうぞ(前半部は気にせずに) 最後にSDIにボタンを置く方法ですが、・・・続きは次へ

参考URL:
http://www.geocities.co.jp/Milkyway/8856/ShadeSDKHelp/SampleBzPlugin1.html
saikoro
質問者

お礼

やりたかったことが、うまくできました。 親切にありがとうございました。

その他の回答 (3)

noname#2009
noname#2009
回答No.4

前回答の参考URLの「DPtoLP」やら「ペジエ曲線」 やらの計算部分は無視して下さい。 SDIにボタンを置く方法は、作成したビュークラス名を CXxxView とすると、ClassWizerd から OnInitialUpdate() と OnCommand() を追加して、そっから -----------------CXxxxView.h-------------------- class CXxxxView : public CView { protected: // シリアライズ機能のみから作成します。 CButton m_btn1; // 手で追加 ~~~中略~~~ }; -----------------CXxxxView.cpp------------------ #define MYID_BTN1 101 // 手で追加 void CDsgdgdsgView::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください // 手で追加↓ m_btn1.Create("TestBtn", BS_PUSHBUTTON | WS_VISIBLE, CRect(100,100,200,150), this, MYID_BTN1); } BOOL CDsgdgdsgView::OnCommand(WPARAM wParam, LPARAM lParam) { // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください // 手で追加↓ switch(LOWORD(wParam)) { case MYID_BTN1: // MessageBox("TestBtn Pushed"); break; } // 手で追加↑ return CView::OnCommand(wParam, lParam); } にしたら使えます。ある種これが一番楽かも。 説明が細かすぎて鬱陶しかったら失礼します。 逆に足らなかったらやはり失礼します。的外れだったら さらに失礼します。では

saikoro
質問者

お礼

こういうこともできるんですね。 あとで試してみます。

noname#2009
noname#2009
回答No.2

>(1)if (IsIconic())のIsIconic()は何ですか。 OnPaint() ではアイコン化したときの表示コーディングも なされています。その判定をされているものです。 Wizerdの自動生成ソースですので、SDIコーディングでも その類はたくさんあったと思います。 >(2)ダイヤログ内にベタ書きになるのですが、この方法が >一般的ですか。あるオブジェクトをはめ込んで(ボタンの >ように)、その中に描画する方法はありませんか。 質問に合わせた回答のつもりだったんですが。そんな特殊 でしたか。 ボタンに描画するなら以下(参照URL)で↓ スタティックコントロールの描画のことをおっしゃっているの でしたら、ピクチャーコントロールをリソースエディタで ダイアログに貼り付けて、プロパティを開き、 [一般]タブで [タイプ]=『ビットマップ』、 [イメージ]=ビットマップリソースID(例:IDB_BITMAP1) として下さい。 どちらも、リソースからビットマップを利用しているのが 前提です。 SDI描画のときはファイルから直接行っていたのだったら、、 、ん、また補足にでもテキトーに。

参考URL:
http://www.geocities.co.jp/SiliconValley-PaloAlto/9127/visual/control/control2.html
saikoro
質問者

補足

どうもありがとうございます。IsIconic()な納得しました、 うまく質問を伝えれていないのですが、 例えば、ダイヤログ内にグラフを書く領域を設定し、ダイヤログ内の各種ボタンでインタラクティブにグラフを書く、といったことをやりたいのです。SDI程大げさにしたくないし、SDIではボタン類をはめ込むことができない(する方法もある?)ためにダイヤログを使いたいのです。 たびたび申し訳ありませんが、よろしくお願い致します。

noname#2009
noname#2009
回答No.1

SDIでビットマップの表示部分ができているのなら、 View の OnDraw() 内のコードをダイアログの  OnPaint() に持って来れば、表示はされます。 (OnDraw のパラメータ 『pDC->』部分を『dc.』に 変える ) ・・・・・・ void CXxxDlg::OnPaint() { if (IsIconic()) { ~~~~(略)~~~~ } else { ~~~~(こっから)~~~~ CPaintDC dc(this); // ←追加 // ここに追加 ~~~~(ここまで)~~~~ CDialog::OnPaint(); } } ・・・・・・ 一応参考URLも。

参考URL:
http://www.nara-edu.ac.jp/~asait/visual_cpp/dialog1/dialog1.htm,http://new-mpulip.hoops.ne.jp/kouza/vc/vc14/vc14.htm
saikoro
質問者

補足

遅くなってすいません。ありがとうございました。表示することができました。 まだよくわからないのですが、 (1)if (IsIconic())のIsIconic()は何ですか。 (2)ダイヤログ内にベタ書きになるのですが、この方法が一般的ですか。あるオブジェクトをはめ込んで(ボタンのように)、その中に描画する方法はありませんか。

関連するQ&A

  • 【VC++6.0 MFC】画像表示について

    お世話になっております。C++初心者です。 とある開発でVC++6.0のMFCを利用して画像表示を行う作業をしています。 リソースファイルを使用せず、 外部の画像ファイルを読み込みピクチャーボックスに表示しなければならないのですが、 下記の関数を呼び、BMPファイルを読み込み、 NULLの場合はエラーメッセージを表示するようにしているのですが、 必ずNULLが返ってきてしまいます。 何が問題なのかもわからず苦戦しております。 知識不足で申し訳ないのですが、お願いします。 【疑問点】 ・画像ファイルの指定は絶対パス?相対パス? ***問題の箇所*** HBITMAP hBmp; // ビットマップハンドル // ビットマップのハンドル取得 hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); // ハンドルのチェック if(hBmp == NULL) {   AfxMessageBox("読み込みに失敗しました");   return ; }

  • MFC 6.0 VC++ で、処理が重くなります。

    MFC 6.0 VC++ で、処理が重くなります。 上記の環境でダイアログベースで処理を作成しています。 画面の再描画を繰り返すと、同じ処理をしていても処理が重くなります。 OnPainメッセージを受け取ったあとに、描画処理を行っているのですが、画面に表示に必要な計算も描画時に行っています。 仮想ウィンドウに描画してBitBlt()を実行する方法も試しましたが、ちらつかなくなった代わりに余計に処理が重くなりました。 描画のやり方が問題なのか、内部の処理が問題なのか良く分からないのですが、何か良い方法が無いでしょうか? そもそもダイアログベースで画像処理をしているのが間違いな気もするのですが・・・。

  • ビットマップボタンを押したときの処理についてなんですが

    環境はVC++6.0 MFC ダイアログベースです。 MFC初心者なんですが、 HBITMAP hBitmap; hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), (LPCTSTR)csBMPFile,      IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); を使いビットマップハンドルをし取得しました。 ビットマップの貼り付けは出来たのですが、ボタンを押したときにビットマップの画像を変える処理の仕方がわかりません>< loadbitmapsなら容易に出来るのですが、どうしてもloadimageを使って表示したいのですが、どのようにすれば良いでしょうか? 御教授よろしくお願いします><

  • VC++でダイアログ表示について

    VC++初心者です。 MFCアプリケーションでダイアログベースのアプリケーションを作ったのですが、ボタンクリック時にもう一つダイアログを表示しようと思っています。 以下のコードだと、うまく表示されずに画面がフリーズしてしまいます。どこを直したらいいのでしょうか。ご教授願います。 環境は、xp、Visual Studio.net 2003です。 void CMFCtestDlg::OnBnClickedButton1() {   //   CmyDialog myDL;   myDL.DoModal(); } MFCtestDlg.cpp内、#include "myDialog.h" は記述してあります。 VBの経験はあるのですが、VC++はまったくわかりません。 よろしくお願いします。

  • 「あるダイヤログ」の中でのみマウスのカーソルを動かせるようにしたいです

    Windous2000/MFC/C++6.0/ダイヤログベース でプログラミングしております。 初期のダイヤログ(横幅、縦幅共に全画面の1/2位)の中でのみマウスカーソルを動かせるようにしたいのですが、どのようにすれば良いでしょうか? 初心者なので、わかりやすくお願いいたします(^^)

  • MFCでデータベースを

    はじめまして。 VC++の初心者なのですが、MFCで開発を行おうとしております。そこで、MFCでのデータベースの扱い方をおしえていただきたいのです。 MFCのダイアログベースで開発をしているのですが、そこからデータベースを読みに行ったりは可能なのでしょうか。 よいサイト等あれば教えていただけないでしょうか。よろしくお願いいたします。

  • MFC 6.0 VC++ で、処理が重くなります。

    MFC 6.0 VC++ で、処理が重くなります。 上記の環境でダイアログベースで処理を作成しています。 画面の再描画を繰り返すと、同じ処理をしていても処理が重くなります。 OnPainメッセージを受け取ったあとに、描画処理を行っているのですが、画面に表示に必要な計算も描画時に行っています。 仮想ウィンドウに描画してBitBlt()を実行する方法も試しましたが、ちらつかなくなった代わりに余計に処理が重くなりました。 描画のやり方が問題なのか、内部の処理が問題なのか良く分からないのですが、何か良い方法が無いでしょうか? タスクマネージャーを見るとコミットチャージが増えているようです。 このコミットチャージもどう対処してよいのか良く分からないのですが、これが関係しているでしょうか?

  • ダイヤログを「全画面表示」を行うにはどうすれば良いでしょうか?

    MFCでプログラミングをしています。 あるダイヤログを初期段階で「全画面表示」を行うにはどうすれば良いでしょうか? よろしければ、詳しくお願いします。 初心者のもので・・・・

  • スケルトンの中のどこでウィンドウが生成されているのか?

    VC++、MFCです。 MFC AppWizardでSDIベースのスケルトンを生成した時点で、既にウィンドウが作られるコードがソース内に存在するはずなのですが、単純にCreate関数を探しても見当たりません。 一体どこでウィンドウが作るコードはどこにあるのでしょうか?

  • ウインドウのビューをリストビューにするには?(VC++6.0)

    VC++6.0 MFCにて MFC AppWizardにてプロジェクトを作成します。 SDIを選択し、後はデフォルトのままです。 そうやって作ったベースとなるコードを実行すると、 普通にウインドウが開きます。(当然か) そのウインドウのビューをリストビューにしたいのですが、 どこにどのようなコードを書けば良いのでしょうか?