CListCtrl 報表模式下,列寬總和超過可視區寬度,但**水平滾動條不顯示**;屬性 No Scroll = False;手動拖動列寬後滾動條才出現。
滾動條屬於**非客戶區 (Non-client Area)**,由系統繪製。動態插入列/調整列寬後,控件未通知非客戶區重繪,導致滾動條狀態不同步。
// 插入列/設置列寬後,強制非客戶區重繪
m_listCtrl.SetRedraw(FALSE);
// ... 批量 InsertColumn / SetColumnWidth ...
m_listCtrl.SetRedraw(TRUE);
m_listCtrl.RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW);
// 或更簡單:
m_listCtrl.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
| API | 作用 |
|---|---|
RedrawWindow(..., RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW) | 立即重繪非客戶區 (含滾動條、邊框) |
SetWindowPos(..., SWP_FRAMECHANGED) | 通知系統幀變化,觸發 NC_PAINT |
SetScrollInfo(SB_HORZ, ...) | 手動設置滾動條範圍/頁面大小 (底層控制) |