2010-01-10 37 views
5

Tôi có một chương trình GUI Win32 với một điều khiển tab, mỗi tab có một điều khiển xem danh sách. Có nhấp nháy lớn bất cứ khi nào cửa sổ được thay đổi kích thước. Tôi đã thử những điều sau:Win32 GUI nhấp nháy khi đổi kích thước

  • Xử lý WM_ERASEBKGND trong chính wndproc và trả về TRUE. Không có hiệu lực.
  • Lọc tất cả thư WM_ERASEBKGND trong vòng lặp sự kiện. Không có hiệu lực.
  • Đặt kiểu WM_CLIPCHILDREN trên cửa sổ chính. Bây giờ khi cửa sổ được thay đổi kích thước, điều khiển xem danh sách chỉ đơn giản là xóa thành nền trắng và không vẽ lại.
  • Sử dụng DefWindowPos thay vì MoveWindow. Không có hiệu lực.
  • Chuyển FALSE cho bRepaint trong MoveWindow. Hiệu ứng tương tự như thiết lập WS_CLIPCHILDREN (xem ở trên).

Dưới đây là đoạn code RegisterClassEx:

memset(&wcex, 0, sizeof(WNDCLASSEX)); 
wcex.cbSize = sizeof(WNDCLASSEX); 
wcex.style = 0; 
wcex.lpfnWndProc = PhMainWndProc; 
wcex.cbClsExtra = 0; 
wcex.cbWndExtra = 0; 
wcex.hInstance = PhInstanceHandle; 
wcex.hIcon = LoadIcon(PhInstanceHandle, MAKEINTRESOURCE(IDI_PROCESSHACKER)); 
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 
//wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MAINWND); 
wcex.lpszClassName = PhWindowClassName; 
wcex.hIconSm = (HICON)LoadImage(PhInstanceHandle, MAKEINTRESOURCE(IDI_PROCESSHACKER), IMAGE_ICON, 16, 16, 0); 

Việc xử lý WM_SIZE:

RECT rect; 

// Resize the tab control. 

GetClientRect(PhMainWndHandle, &rect); 
MoveWindow(TabControlHandle, rect.left, rect.top, 
    rect.right - rect.left, rect.bottom - rect.top, TRUE); 

// Resize the list view. 

TabCtrl_AdjustRect(TabControlHandle, FALSE, &rect); 

MoveWindow(ListViewHandle, rect.left, rect.top, 
    rect.right - rect.left, rect.bottom - rect.top, TRUE); 

Các phong cách như sau:

  • cửa sổ chính: WS_OVERLAPPEDWINDOW
  • Tab kiểm soát: WS_CHILD (và WS_VISIBLE)
  • kiểm soát xem
  • liệt kê: WS_CHILD | WS_BORDER | LVS_REPORT (và WS_VISIBLE)
+4

Có, cửa sổ nhấp nháy win32. Điều này mang lại những kỷ niệm ... –

+0

Tôi tự hỏi nếu đôi đệm sẽ giúp bằng cách nào đó ... –

Trả lời

4

Hóa ra đã xảy ra sự cố với lệnh gọi hàm BringWindowToTop theo thứ tự Z trên chế độ xem danh sách đã giải quyết được sự cố.

+0

Tôi đã gặp sự cố tương tự. Gọi 'BringWindowToTop' cho cửa sổ hiển thị dưới dạng nội dung của tab đã giải quyết được. Tôi đã thực hiện nó trong InitDialog sau khi hiển thị tab ban đầu và mỗi khi tab được chọn thay đổi sau khi hiển thị tab mới –

+2

Tôi cũng có các vấn đề tương tự với các tab nhấp nháy (thay đổi kích thước) tự điều chỉnh. Điều này đã được giải quyết bằng cách thêm kiểu "WS_CLIPCHILDREN' vào hộp thoại phụ huynh" –

+0

@Adam: cảm ơn rất nhiều –

2

Windows hỗ trợ một hoạt động trạm trộn lại kích thước mà có nghĩa là để tránh chập chờn xảy ra khi nhiều cửa sổ con được indepently thay đổi kích cỡ . Xem BeginDeferWindowPos để biết thêm thông tin về điều đó.

Nếu điều đó không hoạt động, hãy thử thông báo WM_SETREDRAW. Có thể dừng vẽ cửa sổ cha mẹ - điều này sẽ ngăn chặn tất cả các điều khiển con, sau đó, khi bố cục xong, hãy bật lại bản vẽ và gọi RedrawWindow để vẽ lại toàn bộ cửa sổ trong một lần truyền. Tôi đã nghĩ rằng đây là những gì Defered cửa sổ định vị sẽ sử dụng trong nội bộ.

+0

Tôi đã cố gắng đó, như tôi đã nêu trong câu hỏi ... – wj32

+0

xin lỗi, bỏ lỡ điều đó. Điểm dừng tiếp theo, WM_SETREDRAW –

0

Khi một ListView được neo đậu, như trong Windows Explorer (và bạn có một số lượng tốt của bài), thay đổi kích thước hình thức chính sẽ khiến tất cả các mặt hàng để nhấp nháy. http://www.codeproject.com/KB/list/listviewxp.aspx

+0

Tôi không sử dụng .NET, vì vậy nó không được "cập nhật". – wj32

+0

Ngay cả khi bài viết nói về .net vấn đề là một rắc rối chung của win32 và tất cả chúng ta đã làm bất cứ điều gì bằng cách sử dụng điều khiển win32api gui có nhiều hay ít nhấn vấn đề flicker listview khi làm bất cứ điều gì không phải là mã đồ chơi. – Jonke

+0

Bạn có thể đề xuất cách bài viết sẽ áp dụng cho trường hợp của tôi không? Tôi đã thử lọc tất cả các tin nhắn nền xóa, vì vậy mà không thể là vấn đề: ( – wj32

1

tôi chưa nêu rõ ràng, nhưng tôi nghĩ double buffering là giải pháp cho Win32 nhấp nháy. Tôi là một nhà phát triển Java và nó đã được một sin trong khi tôi đã viết win32 vì vậy hãy cho tôi biết nếu tôi đang nói vô nghĩa

Đây là cách để các: http://www.gamedev.net/community/forums/topic.asp?topic_id=411559

Dưới đây là một số mã sampe: http://www.codeproject.com/KB/cpp/DoubleBuffering.aspx

Đây là câu hỏi tương đương .NET (?): How to prevent a Windows Forms TextBox from flickering on resize?

+0

Tôi đã đặt kiểu mở rộng LVS_EX_DOUBLEBUFFER trên chế độ xem danh sách. Hay bạn đang nói về một loại đệm đôi khác? FYI Tôi đã thử sử dụng WS_EX_COMPOSITED nhưng với WS_CLIPCHILDREN chế độ xem danh sách không vẽ lại nữa: ( – wj32

Các vấn đề liên quan