Я понимаю, что тема довольно старая, но это может относиться к тем, у кого возникают проблемы с мерцанием.
Очень похоже на Билли, я столкнулся с проблемой, которая появляется при переключении вкладок, когда элементы управления, размещенные на вкладке, мерцают при показе и скрытии. Для справки, я широко использую функцию ShowWindow, чтобы скрыть и показать элементы управления.
Я возился с WS_EX_COMPOSITED в течение нескольких часов, и это дало мне очень странные результаты. Я также ничего не изменяю, диалоговое окно предназначено для работы в полноэкранном режиме и адаптируется к текущему разрешению рабочего стола.
Это макет моего диалога, который я создал вручную, вызывая функцию CreateWindowEx для каждого элемента управления:
Главное окно
- некоторые элементы управления
- вкладка управления
---- еще несколько элементов управления
Отступ представляет собой отношения родитель-ребенок. Элемент управления с вкладками имеет стили WS_CHILD и WS_CLIPCHILDREN, установленные при создании, все элементы управления имеют набор стилей WS_CHILD.
Что в итоге сделал трюк, был следующий
MainProc proc hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
mov eax,uMsg
cmp eax,WM_INITDIALOG
je @WM_INITDIALOG
...
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
@WM_INITDIALOG:
...
invoke GetWindowLong,hWnd,GWL_EXSTYLE
or eax,WS_EX_COMPOSITED
invoke SetWindowLong,hWnd,GWL_EXSTYLE,eax
...
MainProc endp
Этот бит написан на ассемблере (MASM32), но я уверен, что вы поняли его суть. Просто получите EX_STYLE вашего главного окна где-то во время WM_INITDIALOG и добавьте в него WS_EX_COMPOSITED.
В этом единственном случае этот метод работает как на 32-битной Windows XP SP3, так и на 64-битной Windows 7 SP1. Не было необходимости добавлять стиль WS_EX_COMPOSITED ни к одному из дочерних элементов управления вкладки (некоторые статические элементы управления, которые я использую, имеют установленный WS_EX_TRANSPARENT, но это по другим причинам), и в настоящее время нет явной необходимости возвращать ненулевое значение в WM_ERASEBKGND сообщение. Я также не испытываю проблем с производительностью на умеренно мощной машине C2D.
Для справки, это мой главный
Main proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
LOCAL wc:WNDCLASSEX,msg:MSG
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,offset MainProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,DLGWINDOWEXTRA
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszClassName,offset szClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc
invoke CreateDialogParam,hInstance,IDD_MAIN,NULL,addr MainProc,NULL
invoke ShowWindow,hWin,SW_SHOWNORMAL
invoke UpdateWindow,hWin
invoke LoadAccelerators,hInstance,IDD_ACC_TABLE
mov hAcc,eax
jmp @2
@1:
invoke TranslateAccelerator,hWin,hAcc,addr msg
test eax,eax
jne @2
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
@2:
invoke GetMessage,addr msg,NULL,0,0
test eax,eax
jne @1
mov eax,msg.wParam
ret
Main endp
Здесь нет ничего особенного. В качестве цвета фона я устанавливаю «серый элемент управления диалогом» и использую стили CS_ * REDRAW, которые, похоже, не влияют на эту ситуацию.
«Пустой» шаблон диалога, который я использовал для создания главных окон, это
IDD_MAIN DIALOGEX 0,0,318,177
FONT 8,"MS Sans Serif",0,0,0
CLASS "DLGCLASS"
STYLE 0x90800000
EXSTYLE 0x00000008
BEGIN
END
Надеюсь, это может сэкономить время людям, которые ищут ответы. Это немного длинно, но я хотел подробно описать это.
Привет.