• ベストアンサー
  • すぐに回答を!

VC++2010 で線形の描画についてですが・・

VC++2010 で線形の描画についてまた質問なんですが、以下のように記述すると線ができなく、 点だけが動くプログラムになりました。解決方法がわからないのでよろしくお願いします。 今回のプロジェクトの目的はある機器からデータを取ってきて(1msごとに)それを1msごとに 直線として出力するプロジェクトです 電圧                    ↑          ________ ↑         |          |________→→ ーーーーーーーー  →→時間 ↑↑↑ このような線を出力しなければならないです。 以下がソースになっています。 使用環境VC++2010 MFC test10000Dlg.cpp ちなみにm_lineXとm_lineYはメンバー変数です(double型) ボタンがクリックされたときのイベント SetTimer(0, 1, NULL); void Ctest10000Dlg::OnTimer(UINT_PTR nIDEvent) { UpdateData(); after_datay = sam_data; m_xvEditX = m_lineX; m_xvEditSamd = m_lineY; m_xvEditSami = sam_i++; if(sam_i%200==0) { m_lineY -= 5; sam_i = 0; } m_lineX++; UpdateWindow(); Invalidate(FALSE); } void Ctest10000Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 描画のデバイス コンテキスト SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // クライアントの四角形領域内の中央 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // アイコンの描画 dc.DrawIcon(x, y, m_hIcon); } else { //****************************************************************************************************** CRect rect_dlg; GetClientRect(&rect_dlg); CBrush br_black(RGB(0,0,0)); //各色ペン CPen pen_black(PS_SOLID,1,RGB(0,0,0)); CPen pen_gray(PS_DOT,1,RGB(128,128,128)); CPen pen_blue(PS_SOLID,1,RGB(0,0,255)); CPen pen_white(PS_SOLID,1,RGB(255,255,255)); int max_y=1; if(int(m_sin+m_cos+1.0)>max_y) max_y=int(m_sin+m_cos)+1; CDC* pDC=m_pict.GetDC(); //PictureControlの大きさ取得 CRect rect; m_pict.GetClientRect(&rect); //元のブラシをoldbrに保持 CBrush* oldbr=pDC->SelectObject(&br_black); //元のペンをoldpenに保持 CPen* oldpen=pDC->SelectObject(&pen_black); //(1)背景描画(ブラシ白、ペン黒) pDC->Rectangle(&rect); //(2)中心線(黒、実線) pDC->SelectObject(&pen_blue); pDC->MoveTo(10,rect.Height()-10); pDC->LineTo(10,10); pDC->MoveTo(10,rect.Height()-10); pDC->LineTo(rect.Width()-10,rect.Height()-10); pDC->SelectObject(&pen_white); pDC->MoveTo(m_lineX,m_lineY_after); pDC->LineTo(m_lineX+1,m_lineY); pDC->SelectObject(oldbr); pDC->SelectObject(oldpen); m_lineY_after = m_lineY; UpdateData(FALSE); CDialog::OnPaint(); } } ではよろしくお願いします

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数237
  • ありがとう数0

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

  • ベストアンサー
  • 回答No.1
  • zwi
  • ベストアンサー率56% (730/1282)

そもそも画面が1/60秒=16.666ms周期でしか更新されないので1ms周期で画面を更新する必要がないでしょう。 あと1ms周期にデータを取得したくてもWindowsOS自体の仕様がそれを保証してくれません。たとえtimeBeginPeriod()を使ってシステムクロック割り込み周期を増やしてもデータの取得周期までは保証してくれませんよ。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 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); } 計測終了はボタンを押して終了します. どうが具体的な解決策を教えてください.

  • MFCでボタンを押して図形を操作するには

    Visual studio 2008のMFCで、とあるプログラムを作っております。 ボタンをクリックすると円が出てきて、さらにクリックするとその下に円が表示されるというプログラムまで作りました。 void C***Dlg::OnBnClickedButton1(){ CDC* pDC=m_pict.GetDC(); CRect rect; m_pict.GetClientRect(&rect); pDC->Rectangle(&rect); CPen pen_red(PS_SOLID,1,RGB(255,0,0)); CBrush br_yellow(RGB(255,255,0)); CPen* oldpen=pDC->SelectObject(&pen_red); CBrush* oldbr=pDC->SelectObject(&br_yellow); pDC->Ellipse(-252,i-43,-212,i-3); i=i+48; UpdateWindow(); pDC->SelectObject(oldpen); pDC->SelectObject(oldbr); // TODO: ここにコントロール通知ハンドラ コードを追加します。 } とりあえずOnBnClickedButton1関数はこんな感じです。 ここから、 (1)クリックすると円が自動で動き、途中で止まり、しばし経ってから動き出してやがて上へ消えてゆく。 (2)2つ目の円も同じように動くが、1つ目の円が止まっていて重なりそうになったらその手前で止まる。 (3)1つ目の円が上に消えたら、2つ目の円が動き出し、以降は(1)と同じ動きをする。 このようなプログラムを作りたいのですが、初心者のためどのようなツールをどのように使えば良いのかわかりません。 どなたがヒントだけでもご教授頂けませんでしょうか?

  • ビットマップに描画をしてピクチャーコントロールに貼り付けるためには?

    ビットマップに描画をしてピクチャーコントロールに貼り付けるためには どうすればよいでしょうか? ネットで検索しましたそして、 下のようなコードを書きましたがうまくゆきません。 void CXXXView::OnButton() { CStatic m_ctlImage; // ピクチャーボックスに関連付けした変数 CBitmap m_bmpImage; // ピクチャーボックスに貼り付けるイメージ CDC m_dcImage; // Bitmap描画用のDC CDC* pDC = m_ctlImage.GetDC(); m_dcImage.CreateCompatibleDC(pDC); CRect Cltsz; picture1.GetClientRect(&Cltsz); m_bmpImage.CreateCompatibleBitmap(pDC,Cltsz.Width(),Cltsz.Height()); CBitmap* pOld=m_dcImage.SelectObject(&m_bmpImage); CPen myPEN(PS_SOLID,5,RGB(0,0,255)); CPen* oldPEN=m_dcImage.SelectObject(&myPEN); m_dcImage.MoveTo(10,10); m_dcImage.LineTo(100,100); m_dcImage.SelectObject(oldPEN); m_dcImage.SelectObject(pOld); m_ctlImage.SetBitmap(m_bmpImage); } この様にしましたが、ピクチャーコントロールには 何も描画されません、 何故でしょうか? VS2005で、ボタンをクリックした イベントで描画する場合です、 直線とかは、問題なく描画できました。 ビットマップに描画して貼り付けたいのです、 よろしくお願いします

  • 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++や画像生成に関しては経験がありません。

  • 描画バッファーのオーバーフローの管理について

    環境:プログラムの開発環境はWindows XP SP2でVC++6.0です。 現象: Pen,Brush描画処理を下記の単位で行っています。 //myPen,mybush set myPen.CreatePen(PS_SOLID, 1, mycolor); pOldPen=pDC->SelectObject(&myPen); mybrush.CreateSolidBrush(mycolor); pOldbrush=pDC->SelectObject(&mybrush); // //myPen,mybush draw // //myPen,mybush delete pDC->SelectObject(pOldPen); myPen.DeleteObject(); pDC->SelectObject(pOldbrush); mybrush.DeleteObject();  上記単位で色々なタイルを作り図を描いています。 マウスドラッグに追随させこの図を回転や移動させるため再描画 させると、システムのバッファオーバーフローが起き、プログラムが 異常終了してしまいます。タイマーにより再描画速度を遅らせると 異常終了は起きません。 質問:何かPen,Brushによるシステムバッファの使用状況を管理する    関数または方法はありませんでしょうか?

  • CDC(LineTo)で描画した線を透過したい

    タイトルのままで恐縮です。 ソースは、以下のような感じです。 描画の所で線を描いているのですが、例えば、SetBkModeなどで、背景を透過(TRANSPARENT)等は、やった事があるのですが、文字そのものの透過がわかりません。透過率は適当で構いません。ご存知の方、ご教授願います。 宜しくお願い致します。 (中略) // 描画した線自体を透過させたいです。 CDC* dc; // 実際は、関数のパラメータです // ペンの作成 CPen Pen; CPen* pOldPen = NULL; if ( Pen.CreatePen( PS_SOLID, 2, color ) == FALSE ) { return false; } pOldPen = dc->SelectObject( &Pen ); // 描画(線を描く) // widht, height は関数パラメータ dc->MoveTo( x, y ); // この線を透過したい dc->LineTo( x + width, x + height ) ); dc->MoveTo( x + width, y ); // この線を透過したい dc->LineTo( x, y + height ); // ペンを元に戻す dc->SelectObject( pOldPen );

  • 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); }

  • VCでの問題・・・

    マッピングモードでつまづいてます。 SetMapMode(MM_LOENGLISH); CRect rect; GetClientRect(&rect); pDC->Ellipse(0,0,rect.right,-rect.bottom); とした場合、クライアント領域全体に楕円が表示されると思っていたのですが、右と下に余白があいてしまいます。 MM_TEXTだと思ったように表示されるのですが、MM_LOENGLISHだとGetClientRectでしっかりと領域を取得できていないようです。どうすればMM_LOENGLISHでしっかりとクライアント領域を取得できますか? まだ、VCはじめたばかりで分からないことだらけです。 どうかよろしくお願いします。

  • Visual C++のStretchBltについて

    こんにちは VC++で壁紙チェンジャーのプログラムを作成していたのですが、壁紙画像をStretchBltをつかってプログラムの中に表示させたいのですが、pDCをつかって呼び出すさいpDC->StretchBlt();の括弧ないは何を記述すればよいのですか?わかるかたいたらご指導ください。参考までに前後の文 OnPaint 省略 else { CRect ClientRect; GetClientRect(ClientRect); BITMAP BMP; HBITMAP h_BMP=(HBITMAP)LoadImage(AfxGetApp()->m_hInstance,_T(m_filename), IMAGE_BITMAP,0,0,LR_LOADFROMFILE); CDC* pDC=this->GetDC(); CDC MemDC; MemDC.CreateCompatibleDC(pDC); HBITMAP h_OLD_BMP=(HBITMAP)::SelectObject(MemDC.m_hDC,h_BMP); ::GetObject(h_BMP,sizeof(BITMAP),&BMP); //////////////////////////////        ここ→pDC->StretchBlt(); ////////////////////////////// ::SelectObject(MemDC.m_hDC,h_OLD_BMP); MemDC.DeleteDC();

  • VC++ ドラッグしながらの図の描画に関して

    描画に関して質問があります。 アクセサリのペイントツールのようにマウスドラッグしながら長方形を描画させたいのですが、 ドラッグの際に既に描画してあった長方形を消去する方法が理解できません。 具体的には以下のような方法です。 // ドラッグ中の描画処理 SetROP2( hDC, R2_NOT ); // 前景モードを変更 hPen = CreatePen( PS_DOT, 1, RGB(0, 55, 0) ); // 黒い点線のペンを作成 hBrush = (HBRUSH)GetStockObject( NULL_BRUSH ); // 空のブラシを取得 SelectObject( hDC, hPen ); // 作成したペンを使用するように設定 SelectObject( hDC, hBrush ); // 取得したブラシを使用するように設定 Rectangle( hDC, start.x, start.y, old_end.x, old_end.y ); // 四角形を描画 SetROP2とブラシは共に塗りつぶしを指定するものですが、これらを併用することによって何故既存の図形を消去していくことができるのかわかりません。 疑問になったのでブラシに関する記述を消去し実行してみると長方形内部の色が反転されましたが、これは理解できます。 しかし、これにブラシに関する記述を復元させることにより、なぜ内部が真っ白になるのかがわかりません。 また、塗りつぶしはSetROP2とブラシのどちらが先に行うのでしょうか?お手数ですが回答よろしくお願いします。