2009-10-06 72 views
0

我有一個用於顯示診斷輸出的CEdit控件。
有時數據會溢出屏幕大小,所以自然我將Vertical Scroll屬性設置爲true(MFC對話框編輯器)。如何讓CEdit正確滾動?

但是,當我試圖滾動之前沒有清除窗口中的文本,並將新文本寫在它上面時。

結果是我滾動過去的一切都很糟糕。

我查找了一個繪製背景屬性或類似的東西,它將在滾動時(在重新繪製新數據之前)擦除窗口中的所有內容。

有什麼建議嗎?

回答

2

我想你可能需要設置自動VSCROLL多行爲真,並自動HSCROLL爲false。

+0

除了自動HScroll之外,所有設置都已按照您的建議進行設置,但不起作用。 – CodeFusionMobile 2009-10-06 19:16:24

0

我用MFC 8.0附帶的VS2005測試了這個。我無法複製你的問題。

我添加了一個CEdit和一個CRichEditCtrl到基於對話框的應用程序。更改屬性Multiline,Auto VSCroll和Vertical滾動到true。使用SetWindowText方法將loooooong文本字符串添加到它們兩個中。我開始的應用程序和文字滾動得很好。

你做了什麼不同?

只是爲了確定。你沒有使用SetCaretPos方法,是嗎?在MSDN頁面中有一些關於此的注意事項。這是Knowledge Base article

+0

我似乎記得在代碼中看到SetCaretPos方法,我會檢查什麼時候回去工作。謝謝你的提示。 – CodeFusionMobile 2009-10-13 02:24:00

+0

此外,我與2003年的工作,因爲它是舊的代碼,所以也可能會影響它。 – CodeFusionMobile 2009-10-13 15:27:17

+0

添加了有關SetCaretPos的知識庫文章的直接鏈接。可悲的是,它沒有描述在CEdit中使用SetCaretPos的可能症狀。文章是爲在Visual C++ 4.2中使用的MFC 4.2編寫的,因此可能從那時起它已經被修復。試試吧,讓我們知道。 – Rope 2009-10-14 11:20:58

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; 
... 
} 

當然,我不得不將它泛化一點。我只是想讓你知道,是的,還有其他人看到你的問題,我們找到了解決方法。