Invalidateを定義するには?

解決


ペンネーム  2009-06-30 03:02:13  No: 70470

お世話になっております。
実は、Invalidateについてなのですが、
Invalidateは、OnDraw()関数を呼び出すものだそうですが、
Invalidate()だけでは、呼び出されません。
ほかに何か、定義する必要があるのでしょうか?


ペンネーム  2009-06-30 03:14:18  No: 70471

以下のURLが今取り組んでいる箇所です。
http://next1.cc.it-hiroshima.ac.jp/C++/introvcdia/node73.html
上記のURLのとおりにやってみたのですが、うまくいきません。
足りないところがあるのでしょうか?


みい  2009-06-30 04:56:20  No: 70472

OnDraw()イベントの定義はどのように記述してますか?
ちゃんとイベントから追加しました?それとも手書き?


ペンネーム  2009-06-30 18:16:43  No: 70473

OnDraw()イベントの定義は、ちゃんとイベントから追加しました。
手書きではありません。


s  2009-06-30 19:22:55  No: 70474

>足りないところがあるのでしょうか?
比べる物がないので何が足りないか分かりませんので
提示のHPより必要な物を抜き出してみました。
結論を言うとうまく動きましたよ。

新規でプロジェクトを作成して試してみてください。
●の部分の追加のみでうまくいくはずです。

新規プロジェクト名 Line
LineDoc.h

// アトリビュート
public:
●int counter;
●int m_lineIndex;
●CPoint m_points[100][2];
を追加

LineDoc.cpp

CLineDoc::CLineDoc()
{
  // TODO: この位置に1度だけ呼ばれる構築用のコードを追加してください。
●counter = 0;
●m_lineIndex = 0;
}
を追加

LineView.cpp
void CLineView::OnLButtonDown(UINT nFlags, CPoint point) 
{
  // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
●  CLineDoc* pDoc = GetDocument();
●  ASSERT_VALID(pDoc);
●  if(pDoc->m_lineIndex == 100) return;
●  pDoc->m_points[pDoc->m_lineIndex][pDoc->counter] = point;
●  pDoc->counter++;
●  if(pDoc->counter == 2){
●    pDoc->m_lineIndex++;
●    pDoc->counter = 0;
●    pDoc->SetModifiedFlag();
●    Invalidate();
●  }
  CView::OnLButtonDown(nFlags, point);
}

void CLineView::OnDraw(CDC* pDC)
{
  CLineDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  // TODO: この場所にネイティブ データ用の描画コードを追加します。
●  CPen p(PS_SOLID, 1, RGB(0, 0, 255));
●  CPen* oldp=pDC->SelectObject(&p);
●  int lineIndex = pDoc->m_lineIndex;
●  int i;
●  int x,y;
●  for(i = 0; i<lineIndex; i++){
●  x = pDoc->m_points[i][0].x;
●  y = pDoc->m_points[i][0].y;
●  pDC->MoveTo(x,y);
●  x = pDoc->m_points[i][1].x;
●  y = pDoc->m_points[i][1].y;
●  pDC->LineTo(x,y);
●  }
●  pDC->SelectObject(oldp);
}

を追加


ペンネーム  2009-06-30 20:00:56  No: 70475

みいさん、sさんどうもありがとうございました。

実は、sさんが書いてくれたコードをを一行ずつ
チェックしたところ、ちょっとしたバグがありました。
書かない理由が判明しました。
以下のとおりでした。
LineView.cpp
void CLineView::OnLButtonDown(UINT nFlags, CPoint point) 
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
● CLineDoc* pDoc = GetDocument();
● ASSERT_VALID(pDoc);
● if(pDoc->m_lineIndex == 100) return;
● pDoc->m_points[pDoc->m_lineIndex][pDoc->counter] = point;
● pDoc->counter++;
● if(pDoc->counter == 2){
● pDoc->m_lineIndex++;
● pDoc->counter = 0;
● pDoc->SetModifiedFlag();
● Invalidate();
● }
のところで、
if(pDoc->counter == 2)のところを
if(pDoc->counter == -2)としていました。

単純ミスでした。
すみませんでした。
本当にお忙しい中、ありがとうございました。


s  2009-07-01 08:50:28  No: 70476

問題解決何よりです。
提示されたページは学校関係のようですし、あえて
x = pDoc-$ >$m_points[i][0].x;
のような書き方をしているように思われます。

勉学の邪魔をするのは悪いと思うので
以降このリンクがあるときの質問には私は回答しない
かもしれません。

勉強頑張って下さい。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加