0

診断出力を表示するために使用される CEdit コントロールがあります。
時々、データが画面サイズからオーバーフローするので、当然、Vertical Scroll プロパティを true に設定します (MFC ダイアログ エディター)。

しかし、以前にウィンドウにあったテキストをスクロールしようとすると、クリアされず、新しいテキストが上書きされます。

その結果、私が過去にスクロールしたものすべてがめちゃくちゃになります。

(新しいデータを再描画する前に) スクロール中にウィンドウ内のすべてを消去する描画背景プロパティまたは同様のものを探しました。

助言がありますか?

4

3 に答える 3

2

Auto VScrollMultilineを trueに設定し、 Auto HScroll を falseに設定することをお勧めします。

于 2009-10-06T17:11:36.863 に答える
1

同様の問題がありました。WM_VSCROLL を取得したときに親ウィンドウを更新するには、その領域を無効にする必要がありました。ユーザーdemorgeがここで言うように、私はやろうとしました:

SetBkMode(hdc, TRANSPARENT) が機能しない

しかし、コードはハンドルを使用せず、実際にはクラス CWnd を使用するため、代わりに WindowProc でこれを行うことになりました。

switch(message)
{
...
case WM_VSCROLL:
case WM_HSCROLL:
  LRESULT answer;
  PAINTSTRUCT ps;
  CDC* pdc;
  CWnd* MyParentHWnd;

  // We want the scroll to work the same way it has always worked for our
  // ancestor class.  Let them handle the scrolling and save off their
  // return.
  answer = AncestorClass::WindowProc(message, wParam, lParam);

  pdc = BeginPaint(&ps);
  // DO NOT change the assignement operator in the conditional below to an
  // equality operator.  We are actually trying to get the parent window and
  // and storing locally, and then verifying that we didn't get back null.
  // This is a purposeful design decision.
  if (MyParentHWnd = GetParent()){
     RECT MyRect;
     GetClientRect(&MyRect);
     ClientToScreen(&MyRect);
     MyParentHWnd->ScreenToClient(&MyRect);
     MyParentHWnd->InvalidateRect(&MyRect);
  }

  EndPaint(&ps);

  return answer;
  break;
...
}

もちろん、私はそれを少し一般化する必要がありました。はい、あなたの問題を見ている他の人がいて、それを修正する方法を見つけました.

于 2015-04-03T21:42:29.793 に答える
0

MFC 8.0 に同梱されている VS2005 でこれをテストしました。問題を再現できませんでした。

ダイアログ ベースのアプリに 1 つの CEdit と 1 つの CRichEditCtrl を追加しました。プロパティ Multiline、Auto VSCroll、および Vertical Scroll を true に変更しました。SetWindowText メソッドを使用して、長いテキスト文字列を両方に配置しました。アプリを起動すると、テキストがうまくスクロールされました。

違うことをしたのは何ですか?

念のために。SetCaretPos メソッドを使用していませんか? MSDNページにそれに関するメモがありました。ナレッジ ベースの記事は次のとおりです。

于 2009-10-09T06:14:15.767 に答える