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
)
Có, cửa sổ nhấp nháy win32. Điều này mang lại những kỷ niệm ... –
Tôi tự hỏi nếu đôi đệm sẽ giúp bằng cách nào đó ... –