MFC VC++ 6.0 使用 class patchmodel の実行にエラーが発生する

このQ&Aのポイント
  • MFC VC++ 6.0 使用の class patchmodel において、GetDC関数とReleaseDC関数の呼び出しにエラーが発生しています。
  • CModel::OnDraw関数を避けて、簡単な例としてGetDC関数を試して見ましたが、うまくいきません。
  • GetDC関数の使い方に誤りがあるのでしょうか?ご教示いただけないでしょうか?
回答を見る
  • ベストアンサー

MFC VC++ 6.0 使用 

class patchmodel{ double a; double b; private: void Draw(); } void patchmodel::Draw(){ CDC DC; CDC* dc = GetDC(); dc->TextOut((int)a,(int)b,"HELLO"); ReleaseDC( dc ); } と 実行してみたところ エラーがでます。 error C2660: 'GetDC' : 関数が不正な 0 個の実引数をともなって呼び出されました。 error C2660: 'ReleaseDC' : 関数が不正な 1 個の実引数をともなって呼び出されました。 CModel::OnDraw(CDC* pDC) を あえて使わずに 実行したいので このように 簡単なもので 試して見たのですが、うまくいきません。 GetDC の使い方を まちがえているのでしょうか? お返事ください。

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

  • ベストアンサー
  • 405
  • ベストアンサー率50% (17/34)
回答No.2

>GetDC の使い方を まちがえているのでしょうか? 記載のソースでは間違えていると言えます。 CWnd::GetDC()を呼び出す事を期待して組まれているようですが、 patchmodelはCWndの派生クラスでは無いので、いわゆるプラットフォームSDKのHDC GetDC(HWND hWnd);が呼び出されます。 CWnd::GetDC()とプラットフォームSDKのGetDCでは、用法がまったく違うので、patchmodelでCWnd::GetDC()を利用するには結構な工夫が必要になります。 CModel内に関数を作って、そこで描画するのでは解決しませんか?

akagenoanfan
質問者

お礼

はい。 そうしてみます。初歩的質問におこたえいただき ありがとうございます。

その他の回答 (1)

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

まず質問。 GetDC関数はどのクラスのメンバ関数だかわかっていますか? 分かっているのなら、なぜ何の派生も無いクラスpatchmodelで使っているのでしょうか? 上記の質問がわからないようなら、C++言語の勉強をオススメします。

関連するQ&A

  • VC++2010(MFC)OnDraw以外での描画

    xxxView.cppファイル内のOnDraw以外の部分で、以下のコードを書きビルドしましたが、「'CWnd::GetDC' : 静的でないメンバー関数の呼び出しが正しくありません」というエラーと「'CWnd::ReleaseDC' : 関数に 0 個の引数を指定できません」というエラーが出てしまい、描画できません。エラーの出ない、正しいコードを教えて下さい。 CPaintDC* pDC; CWnd::GetDC(); pDC->TextOut(10,10,"テスト"); CWnd::ReleaseDC();

  • MFC VC++ 6.0 使用 

    CModel::OnDraw(CDC *pDC) { pDC->TextOut(0,0,"OK"); } というふうに OnDrawの中で pDC->TextOut()と 使って 実行画面に 文字を表示させることは できるのですが、例えば 自分が 追加した 関数 void CModel::On_Distance(){ } などで、実行画面に 文字をだしたいときは どうすればいいのでしょうか?pDC を 手に入れることが できるのであれば そのほうほう 教えてください。

  • MFC VC++ 6.0 使用 

    //自分が作ったクラス class Point{ double a; double b; private; Point(double A,double B){a=A,b=B} double GetA(){return a} double GetB(){return b} } //グローバル宣言 Point point(12.0,4.5); //MFCから 与えられたもの CModel::OnDraw(CDC* pDC){ pDC->TextOut(0,0,"HELLO"); } //自分で追加した関数 クラスウィザード を 作ったときにできた。 CModel::MyMeasure() { double answer = point.GetA-point.GetB; Invalidiate(); } 今やっていること やりたいことを簡略化して かきました。 MyMeasure は 自分が クラスウィザードを作成したときに追加した関数です。この 中で 再描画をしたいのですが "HELLO"が 表示されない ばかりか 自動的に クライアント領域(? 実行画面 最初に "HELLO"が でてくる 画面)が消えてしまいます。 どうしてなのでしょうか? これは あくまで 簡略化したものです。 もしかしたら 初歩的な問題なのかもしれませんが、できるだけ 詳しく説明おねがいします。。初心者のため(--) お願いします。

  • GetDC()→ReleaseDC、で打ったものが消える。

    void CWatawaView::OnCmdHello() { CDC* pDC; pDC = GetDC(); POINT point; int x,y; GetCursorPos(&point); ScreenToClient(&point); pDC->SetPixel(point); ReleaseDC(pDC); >このプログラムだと「ReleaseDC」の後は打ったドットが消えるのですが 消えないままにしておくにはどうすればよいでしょうか?GetDCの後にはReleaseDCを必ずしなくてはならないなら、消えてしまうのでは困るのです。

  • MFCのメモリ開放が必要なメソッド

    現在、MFCを使ってドローツールを作成しています。 今まで、DCの取得にGetDC()を多用していたのですが、 今日初めて、GetDC()とReleaseDC()は必ずセットで使う事を知りました。 恥ずかしい話ですが、まだまだMFCには詳しくありません。 このように、WindowsのC言語開発でメモリ開放がセットになっている関数で 初心者がよく失敗しがちなものが他にもありましたら教えて下さい。 どうぞ宜しくお願い致します。

  • Cwndクラスの派生クラスmCWndクラスのOnDrawについて

    OnDraw関数が呼び出しされていません。 どうすればいいですか? よろしくお願いします。 class mCWnd :public CWnd { public: DECLARE_MESSAGE_MAP() afx_msg void OnLButtonDown(UINT nFlags,CPoint point) { AfxMessageBox("子ウインドウ"); CDC *pDC=GetDC(); pDC->TextOut(0,0,"HELLO"); ReleaseDC(pDC); Invalidate(); } virtual void OnDraw(CDC* pDC) { AfxMessageBox("OnDraw"); pDC->FillSolidRect(CRect(0,0,300,300),RGB(255,255,255)); } }; BEGIN_MESSAGE_MAP(mCWnd, CWnd) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() ------------------------------------------- //***View.cpp (mCWnd cw) void CKoDlg::OnBnClickedButton1() { CRect rect=CRect(50,50,190,250); cw.Create(NULL,"Hello",WS_CHILD|WS_VISIBLE,rect,this,5000,0); // TODO : ここにコントロール通知ハンドラ コードを追加します。 }

  • 実行結果をBMP形式で保存したい。

    なかなか うまくいきません。 C::OnDraw {  略 CDC->Polygon(///  略 } このように MFC のOnDraw でかいた 実行結果を BMP形式 で 保存したいのですが。。 BitBlt CreateCompatibleDC GetDC などの いろいろな 関数がありますが、いったい何をどうつかえばいいのか わかりません。ほんとに 初歩的段階で もうしわけないのですが、、どなたか アドバイスいただけないでしょうか?手取りあしとり指導してくれるから(これが 死ぬほどたすかるのですが・・)、この参考書をみれば やりかたが 乗っている(これも たすかる)と紹介してくれるかた、 等々 どんな ことでも いいので 教えてください。先が遠すぎてこまっています

  • MFCでウィンドウ枠をアニメーションさせたい

    こんにちは、VC++初心者です。 今MFCでデスクトップマスコットを作りたいと思っています。 MFCのSDIアプリでとりあえず作成している最中で、 BMP画像の表示はC***ViewクラスのOnDraw関数で表示させています。 問題はウィンドウ枠です。 スタイル指定をWS_POPUPにして、クライアント領域にのみ表示させていますが、 リージョンを使って、BMP画像を切り取った形のウィンドウにするのにてこずっています。 ちうか、そもそもOnDraw関数内でBMP表示とともに行っている、 SetWindowRgn関数がうまく動いてくれていない状態です(泣)。 ソースの一部をのせておきますで、どうかご判断ください。 宜しくお願いします。 CTestView::CTestView() { //コンストラクタでビットマップの読み込みとリージョンの設定 gazou.LoadBitmap( IDB_GAZOU); //CBitmapのメンバ変数 m_rgn[0].CreateEllipticRgn(0, 0, 48,48); //CRgnのメンバ変数1 m_rgn[1].CreateRectRgn(0, 0, 48,48); //CRgnのメンバ変数1 } void CTestView::OnDraw(CDC* pDC) { //画像表示及びリージョンの切り替え 中略... static int anim = 0; CDC dc; dc.CreateCompatibleDC( pDC); dc.SelectObject( gazou); pDC->BitBlt(0,0,48,48,&dc,0,0,SRCAND); //48*48ドットのBMP HRGN hrgn =(HRGN)m_rgn[anim].Detach(); SetWindowRgn( hrgn, true); dc.DeleteDC(); anim ^= 1; 中略... }

  • VC++のOnDraw()関数で、ボールを動かす

    下記のように、VC++のOnDraw()関数において、ウィンドウ上でボールを上下に 動かせたいのですが、動きません。VC++のバージョンは9.0です。(Visual Studio 2008) どういうふうに書けば動きますか? ------------------------------------------------------------------------- void CControllGameView::OnDraw(CDC* pDC) { Bitmap2.LoadBitmap(IDB_BITMAP2); // ボール pOldBitmap = MemDC.SelectObject(&Bitmap2); // 転送前のビットマップ領域を退避 GetClientRect(&rect); // ウィンドウのサイズをrectに記憶 pDC->BitBlt((rect.right-42)/2, rect.top+50, 42, 41, &MemDC, 0, 0, SRCCOPY); // ビット単位でビットマップ画像を転送 int z = rect.bottom + 50; // ボールのy座標の初期値 while(z < rect.top){ pDC->MoveTo((rect.right-42)/2, z+=1); } MemDC.SelectObject(pOldBitmap); // 元に戻す ReleaseDC(pDC); }

  • MFCで画像を表示させているのですが、透過表示する方法がわかりません。

    VC2005のMFCで画像を表示させているのですが、透過表示する方法がわかりません。 OnDraw(CDC* pDC) で、#include <atlimage.h>として、 CImage img; img.Load( "test.gif" ); CDC* pDCImg = CDC::FromHandle( img.GetDC() ); pDC->BitBlt( 60, 10, img.GetWidth(), img.GetHeight(), pDCImg, 0, 0, SRCCOPY ); img.ReleaseDC(); すればGIF画像が表示されましたが、このGIG画像は透過GIFですが そのまま表示されているので、背景が黒の場合透、明部分の白が見えて 四角い枠の画像となります。 GIF透過ファイルの場合、そのまま透過になる方法や、何か手段を用いて透過をさせたいです。

専門家に質問してみよう