2009-10-06 6 views
0

진단 출력을 표시하는 데 사용되는 CEdit 컨트롤이 있습니다.
때로는 데이터가 화면 크기를 오버플로하기 때문에 자연스럽게 Vertical Scroll 속성을 true로 설정합니다 (MFC 대화 상자 편집기).CEdit을 제대로 스크롤하는 방법은 무엇입니까?

하지만 이전에 창에 있던 텍스트를 지우려고했을 때 지워지지 않고 새 텍스트가 그 위에 쓰여졌습니다.

결과는 내가 과거에 스크롤 한 모든 것을 크게 망쳐 놓았습니다.

스크롤하는 동안 (새 데이터를 다시 그리기 전에) 창에있는 모든 것을 지울 수있는 그리기 배경 속성이나 비슷한 것을 찾았습니다.

제안 사항?

답변

2

난 당신이 자동 VScroll여러 줄 true로, 거짓에 자동이 hscroll을 설정할 수 있습니다 생각합니다.

+0

효과가없는 자동 HScroll을 제외하고 모든 것이 이미 제안 된대로 설정되었습니다. – CodeFusionMobile

0

MFC 8.0과 함께 제공되는 VS2005로 테스트했습니다. 나는 당신의 문제를 재현 할 수 없었다.

하나의 CEdit과 하나의 CRichEditCtrl을 대화 상자 기반 앱에 추가했습니다. Multiline, Auto VSCroll 및 Vertical Scroll을 true로 변경했습니다. SetWindowText-method를 사용하여 loooooong 문자열을 양쪽에 넣습니다. 나는 애플 리케이션을 시작하고 텍스트 스크롤 괜찮 았어.

어떻게 다르게 했습니까?

SetCaretPos 메서드를 사용하지 않았습니까? MSDN 페이지에서 이에 대한 메모가있었습니다. 다음은 Knowledge Base article입니다.

+0

코드에서 어딘가에 SetCaretPos 메서드가있는 것을 회상하는 것으로 보입니다. 다시 작업 할 때 확인해 보겠습니다. 팁 고마워. – CodeFusionMobile

+0

또한 이전 코드이기 때문에 2003 년에 작업 중이므로 잘 적용될 수도 있습니다. – CodeFusionMobile

+0

SetCaretPos와 관련된 기술 자료 문서에 직접 링크가 추가되었습니다. 안타깝게도 CEdit에서 SetCaretPos를 사용할 때 발생할 수있는 증상을 설명하지 않습니다. 이 기사는 Visual C++ 4.2에서 사용 된 MFC 4.2 용으로 작성되었으므로 이후로 수정되었을 수 있습니다. 시도해보고 알려주십시오. – Rope

1

우리는 비슷한 문제가있었습니다. 우리는 WM_VSCROLL을 얻었을 때 상위 윈도우의 영역을 무효화시켜 업데이트하도록했습니다. 사용자 demorge 여기에서 말하는 것처럼 내가하려고 노력 :

SetBkMode(hdc, TRANSPARENT) doesn't work

을하지만 핸들을 사용하지 않는 우리의 코드는, 우리가 실제로 클래스하여 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; 
... 
} 

물론 나는 그것을 조금 일반화해야했습니다. 그저 네가 네 문제를보고있는 다른 사람들이 있다는 것을 알기를 바랐다. 문제를 해결하는 방법을 찾았다.

관련 문제