ピクチャーボックスの再描画

解決


マコー  2007-03-21 23:49:29  No: 64737  IP: 192.*.*.*

ダイアログベースのピクチャーボックスにトグルボタンで選択した線、円を描いた絵を最小化及び、画面に隠れても再描画したいのですがどうしてもうまく描画することができません。 
void CProtterDlg::OnPaint() 



if (IsIconic()) 

CPaintDC dc(this); // 描画用のデバイス コンテキスト 

SendMessage(WM_ICONERASEBKGND, (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 myRECT; 
CWnd* myPICT=GetDlgItem(IDC_PICT); 
CClientDC myDC1(myPICT); 
myPICT->GetClientRect(myRECT); 
myDC1.FillSolidRect( myRECT, RGB(255, 255, 255)); //ピクチャーボックス表示を白にする 
myPICT->InvalidateRect(myRECT,FALSE);//再描画のつもりです。????? 
CDialog::OnPaint(); 

}

編集 削除
マコー  2007-03-21 23:57:48  No: 64738  IP: 192.*.*.*

すいません管理人さん間違って二十投稿してしまいました。同じ者なので一つ消してください。

編集 削除
Blue  2007-03-22 01:11:45  No: 64739  IP: 192.*.*.*

OnPaintから、
>InvalidateRect
って呼んでもいいのかなぁ?

>線、円を描いた絵
とはどこで描画しているのでしょうか?
OnPaint以外で描画している場合、メモリデバイスコンテキスト等を用いて
描画したものを覚えておくようなつくりにはなっているのでしょうか?

編集 削除
マコー  2007-03-22 02:00:33  No: 64740  IP: 192.*.*.*

描画は、トグルボタン選択、
ボタンをクリックしたところからドラッグでボタンがクリックしていない状態で線、円を描いてます。
覚えておく作りですか、してません。
考え方が間違っているのかもしれません。
ちょっと試行錯誤してみます。

void CProtterDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
  
  int d_x_pos;
  int d_y_pos;
  int old_x_pos;
  int old_y_pos;
  
  int x1;
  int x2;
  int y1;
  int y2;
    CRect point_p;
  
  //ダイアログでのポイント位置
  MouseON = FALSE;
  d_x_pos = point.x;
  d_y_pos = point.y;
    old_x_pos = oldpoint.x;
  old_y_pos = oldpoint.y;
   
   
      
  m_pict.GetWindowRect(&point_p);
  ScreenToClient( &point_p );
  x1 = point_p.left;
  x2 = point_p.right;
    y1 = point_p.top;
  y2 = point_p.bottom;

  
  if(MouseON==FALSE)
  {
       
     
     CClientDC myDC(this);
         CPen myPEN,*oldPEN;
     myPEN.CreatePen(PS_SOLID,2,RGB(0,0,0));
       oldPEN = myDC.SelectObject(&myPEN);

    if((x1 < old_x_pos && old_x_pos < x2)  &&  (y1 < old_y_pos && old_y_pos < y2)){
      if((x1 < d_x_pos && d_x_pos < x2)  &&  (y1 < d_y_pos && d_y_pos < y2)){
        switch(Button_Sw){
          
            case 1:
            if(m_check1.GetCheck()){
              myDC.MoveTo(oldpoint); 
              myDC.LineTo(point);  
              
              oldpoint=point;
            }
                        break;
          case 2:
            if(m_check2.GetCheck()){
                myDC.Ellipse(oldpoint.x,oldpoint.y,
                            point.x,point.y);
            }
            break;

        }
      }
    }
      myDC.SelectObject(oldPEN);
  }
    
  ReleaseCapture();
      
  CDialog::OnLButtonUp(nFlags, point);
}

編集 削除
マコー  2007-03-23 21:49:50  No: 64741  IP: 192.*.*.*

すいません。再描画についてもう少し教えていただきたのですが
ボタンをクリックしたこところからドラッグしてボタンをクリックしてないところまで、POINTの座標を覚えないといけないのですか??
線や円ごとに一個一個覚えるのでしょうか??
何か考え方が違うような感じもします。

編集 削除
Blue  2007-03-24 02:35:44  No: 64742  IP: 192.*.*.*

>メモリデバイスコンテキスト等を用いて
がキーワードです。

http://www.geocities.jp/chiakifujimon/makesoft2/proc3.html
を参考にしてみてください。

編集 削除
マコー  2007-05-12 21:13:48  No: 64743  IP: 192.*.*.*

ありがとうございました。再描画ですが問題は、解決ました。後ですが円と、線ですが線の後に円を描いて重ねると線が消えるのは、円をやはり円弧で描きなおさないといけないんですよね。

編集 削除