• ベストアンサー

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を必ずしなくてはならないなら、消えてしまうのでは困るのです。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

GetDCで取得したデバイスコンテキストを使って描画しても一時的なものです Windowsが再描画しようとした際にその描画情報が失われているので再描画されません 1) 打ちたい点の配列などで記憶しておいて Paintイベントで描画する 2) ビットマップファイルを準備して CreateCompatibleDCなどで作成したデバイスコンテキストで描画し、Paintイベントなどでビットマップから実画面へ転送 などの方法を検討してみましょう

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

マウスの座標を記憶しておいて、OnPaint()またはOnDraw()のどちらかふさわしい方で再描画する。 とか、 裏画面に描いておいて、OnPaint()まてはOnDraw()でクライアント領域に転送する。 など…… たいていは後者が利用されます。 「裏画面」とかで検索すればあっさり見つかるかと思います。

関連するQ&A

  • 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 の使い方を まちがえているのでしょうか? お返事ください。

  • SetWindowPosで指定したサイズにしたい

    イメージを描画する際に、イメージのサイズ分とウインドウを構成する要素のサイズを足して、SetWindowPos でサイズを変更していますが、サイズが不足しています。 難しいです。 教えてください。お願いします。 ///////////////////////////////////////////// void CImageRectView::OnLButtonDown(UINT nFlags, CPoint point) { CImage image; image.Load("000.jpg"); CDC *imageDC=CDC::FromHandle(image.GetDC()); CDC *pDC=GetDC(); int mnuh=GetSystemMetrics(SM_CYMENU); int titleh=GetSystemMetrics(SM_CYCAPTION); CRect FrameRect,ClientRect; GetWindowRect(&FrameRect); GetClientRect(&ClientRect); int FrameWidth=(FrameRect.right-FrameRect.left)-(ClientRect.right-ClientRect.left); int FrameHeight=(FrameRect.bottom-FrameRect.top)-(ClientRect.bottom-ClientRect.top); GetParentFrame()->SetWindowPos(&wndTop,rect.left,rect.top,image.GetWidth()+FrameWidth,image.GetHeight()+FrameHeight+mnuh+titleh,SWP_NOMOVE); pDC->BitBlt(0,0,image.GetWidth(),image.GetHeight(),imageDC,0,0,SRCCOPY); ReleaseDC(pDC); ReleaseDC(imageDC); CView::OnLButtonDown(nFlags, point); } /////////////////////////////////////////////

  • メモリーリークの原因

    お世話になっております。 VC2005を使用しております。 現在作成したいプログラムは、 (1)picture controlにて画像を編集する。(Pic1) (2)それをjpgファイルで保存する。 という事なのですが、下記プログラムにて、このルーチンを抜けた後に メモリーリークが発生してしまいます。saveの部分をコメントアウトすると発生しないため、ここが原因だと思いますが、どうして発生するかわかりません。 CImage SaveImage; RECT rect; CDC *pDC = m_Pic1.GetDC(); // ピクチャボックスのDC CDC *SaveImageDC;         //保存用のDC m_Pic1.GetClientRect(&rect); SaveImage.Create(rect.right,rect.bottom,24,0); SaveImageDC=CDC::FromHandle(SaveImage.GetDC()); SaveImageDC->BitBlt(0,0,rect.right,rect.bottom,pDC,0,0,SRCCOPY); SaveImage.Save("PP.jpg"); ReleaseDC(pDC); ReleaseDC(SaveImageDC); 何が悪いのか、どうすればよいか教えていただけないでしょうか? よろしくお願いします。

  • 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 : ここにコントロール通知ハンドラ コードを追加します。 }

  • Visual Studioのタイマ処理を使って描画を行うプログラムを

    Visual Studioのタイマ処理を使って描画を行うプログラムを 作成したのですがうまくいきません. プログラムの開発環境はWindows XP SP2でVC++6.0 外部に接続したセンサからのデータを50Hzで サンプリングして そのデータを元に描画を行う予定なのですが計測時間が100秒を超えると 異常終了してしまいます. 原因がよく分かりません. どうしたらよいのでしょうか? void CMyDlg::OnSamplingStart() { i=0; // サンプリング用タイマ開始 //なぜか12にするとちょうど50Hzでサンプリングする SetTimer(1,12,NULL); // 0.02秒毎タイマ割り込み,50Hz } void CMyDlg::OnTimer(UINT nIDEvent) { /* ここで,センサからのデータをサンプリングし,いろいろな計算をする. */ CDC* pDC=m_pict.GetDC(); CRect myRECT; m_pict.GetClientRect(myRECT); pDC->FillSolidRect(myRECT, RGB(255,255,255)); CPen BlueBoldPen,*OldBlueBoldPen; BlueBoldPen.CreatePen(PS_SOLID,5,RGB(0,0,255)); OldBlueBoldPen=pDC->SelectObject(&BlueBoldPen); pDC->MoveTo((int)(X0/10),(int)(Y0/10)); pDC->LineTo((int)(L3_x[i]/10),(int)(L3_y[i]/10)); pDC->LineTo((int)(C7_x[i]/10),(int)(C7_y[i]/10)); // ペンを元に戻す pDC->SelectObject(OldBlueBoldPen); BlueBoldPen.DeleteObject(); m_time=(double)i/50; UpdateData(FALSE); i=i+1; CDialog::OnTimer(nIDEvent); } 計測終了はボタンを押して終了します. どうが具体的な解決策を教えてください.

  • VC++でのアイコン背景透過について

    VC++2013 MFC環境です。 プログラムで○や×などの記号のアイコンを描画し、PNG,GIF,JPEGの形式でファイルに保存したいです。その時、アイコンの背景を透過したいのですがうまくいきません。 CDCクラスとCImageクラスを使用しアイコンの出力をしています。 背景透過について調べていくつか使えそうな関数があり試したのが、TransparentBltという関数で、デバイスコンテキストを二つ用意して、片方に記号を描画し、透過したい色を指定してもう片方にコピーすると指定した色が透過になる?と解釈しプログラム組みましたが結果は真っ黒の画像でした。 ここで完全に手が止まってしまい、質問させていただきます。 以下ソース CImage Image, image2; Image.Create( 50, 50, 24 ); image2.Create( 50, 50, 24 ); CDC* pDC = CDC::FromHandle( Image.GetDC( ) ); CDC* pdc2 = CDC::FromHandle( image2.GetDC( ) ); CRect rect( 0, 0, 50, 50 ); CPen BlackPen( PS_SOLID, 3, RGB( 0, 0, 0 ) ); CBrush WhitBrush( RGB( 255, 255, 255 ) ); CBrush BlackBrush( RGB( 0, 0, 0 ) ); pDC->FillRect( &rect, &WhitBrush ); pDC->SelectObject( &BlackPen ); pDC->SelectObject( &WhitBrush ); pDC->Ellipse( 5, 5, 45, 45 ); COLORREF col = Image.GetPixel( 0, 0 ); pdc2->TransparentBlt( 0, 0, 50, 50, pDC, 0, 0, 50, 50, col ); Image.SetTransparentColor( col ); image2.Save( L"c:\\icon\\maru.png" ); Image.ReleaseDC( ); image2.ReleaseDC( ); 他にも実装例があれば教えてください。 C++や画像生成に関しては経験がありません。

  • プログラムミス?

    下のプログラムを実行したときにエラーが出るんですけどどこが間違っているかどなたか教えて下さい。 public class Point{ public int x; public int y; public static void scale(int s){ x*= s; y*= s; } public static void scale(Point p,int s){ p.x *= s; p.y *= s; } }

    • ベストアンサー
    • Java
  • メソッド

    public class Point{ public int x; public int y; public void swap(int s){ int x = s * y; y = s * x; this.x = x; } public void swap2(int s){ int x = s * y; y = s * this.x; this.x = x; } public static void main(String[] args){ Point pt = new Point(); pt.x = 3; pt.y = 4; pt.swap(2); System.out.println(pt.x + " " + pt.y); pt.swap2(3); System.out.println(pt.x + " " + pt.y); } } このプログラムでswapメソッドとswap2メソッドってどう違うんですか?

    • ベストアンサー
    • Java
  • オブジェクトの削除について

    環境 WIN98 VC++6.0 MFC にて オブジェクトを使い終わってから削除している場合としていない場合が有るのですが、どうしてなのですか? 作ったオブジェクトはなんでもかんでも削除したほうが無難な気がしますが、本にのっているコードで削除してない場合も良く見かけます。 <削除していない>//著名な本のコード void Cxxx::OnDraw(CDC* pDC) {  CBitmap bmp;  bmp.LoadBitmap(nID);  略  //bmp.DeleteObject(); //■この記述が無い } <削除している>//ネット上でみかけたコード void CMainFrame::_SetBmp(CWnd* pBox,int nID,int  width,int height) // 単品 {  CDC* pDC=pBox->GetDC();  CDC memDC;  CBitmap bmp;  bmp.LoadBitmap(nID);  memDC.CreateCompatibleDC(pDC);  CBitmap* pOldBmp=memDC.SelectObject(&bmp);  pDC->BitBlt(0,0,width,height,&memDC,0,0,SRCCOPY);  memDC.SelectObject(pOldBmp);  bmp.DeleteObject();  memDC.DeleteDC(); }

  • CEditクラスの透過について

    CEditクラスを派生させれば できるのでしょうか? 文字を入力した部分が白い帯になり 派生クラスで CDC *pDC=GetDC(); pDC->SetBkColor(RGB(0,0,255)); pDC->SetBkMode(TRANSPARENT); ReleaseDC(pDC); などとしても TextOut関数に対してなので 違うような気がします。 別に透過でなくても 親ウインドウ画面をコピーしてCEditの派生クラスに貼り付けても(BitBlt)いいんですが、 文字の部分にどう処理させればいいのかわかりません。 CEditクラスの派生クラスの透過は出来るのでしょうか? よろしくお願いします。

専門家に質問してみよう