お世話になっております。
実は、Invalidateについてなのですが、
Invalidateは、OnDraw()関数を呼び出すものだそうですが、
Invalidate()だけでは、呼び出されません。
ほかに何か、定義する必要があるのでしょうか?
以下のURLが今取り組んでいる箇所です。
http://next1.cc.it-hiroshima.ac.jp/C++/introvcdia/node73.html
上記のURLのとおりにやってみたのですが、うまくいきません。
足りないところがあるのでしょうか?
OnDraw()イベントの定義はどのように記述してますか?
ちゃんとイベントから追加しました?それとも手書き?
OnDraw()イベントの定義は、ちゃんとイベントから追加しました。
手書きではありません。
>足りないところがあるのでしょうか?
比べる物がないので何が足りないか分かりませんので
提示の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);
}
を追加
みいさん、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)としていました。
単純ミスでした。
すみませんでした。
本当にお忙しい中、ありがとうございました。
問題解決何よりです。
提示されたページは学校関係のようですし、あえて
x = pDoc-$ >$m_points[i][0].x;
のような書き方をしているように思われます。
勉学の邪魔をするのは悪いと思うので
以降このリンクがあるときの質問には私は回答しない
かもしれません。
勉強頑張って下さい。
ツイート | ![]() |