Из-за проблемы, возникшей после того, как я использовал WX_EX_COMPOSITED, я был вынужден отключить его, так как он не был совместим с просмотром списка с установленным типом отчета.
Отключение композиции рабочего стола приводит к мерцанию в элементе управления вкладками
Теперь всякий раз, когда я изменяю размер элемента управления TAB вместе с изменением размера основного диалогового окна в ответ на любое из сообщений Сообщения WM_SIZE,WM_SIZING,WM_WINDOWPOSCHANGED
invoke GetClientRect,hWnd,addr CLRECT
LEA EAX, CLRECT
invoke MoveWindow,MainTabHandle,NULL,NULL,[EAX].RECT.right,[EAX].RECT.bottom,TRUE
Элемент управления TAB часто мерцает.
Я уже отключил сообщение WM_ERASEBKGND, вернув true оконной процедуре по умолчанию.
.elseif uMsg == WM_ERASEBKGND
MOV EAX,1
RET
и самостоятельно обрабатывать сообщение WM_PRINT, используя эту статью, которую я прочитал в Microsoft.
https://msdn.microsoft.com/en-us/library/ms969905.aspx
Обработчик сообщений WM_PRINT
invoke BeginPaint,hWnd,addr PS
invoke Paint,hWnd,addr PS
invoke EndPaint,hWnd,addr PS ;PS is just a LOCAL PAINTSTRUCT structure used for painting
Процедура рисования после того, как я перенес ее с C++ на MASM
Paint Proc hWnd:DWORD, pPAINTSTRUCT:PPAINTSTRUCT
LOCAL rc:RECT ;
LOCAL hdcMem:HDC ;
LOCAL hBITMAP:HANDLE
LOCAL hbmMem:HANDLE
LOCAL hbmOld:HANDLE
LOCAL hbrBkGnd:HBRUSH ;
LOCAL hfntOld:HFONT ;
invoke GetClientRect,hWnd,addr rc
MOV EAX,pPAINTSTRUCT
invoke CreateCompatibleDC,[EAX].PAINTSTRUCT.hdc
MOV hdcMem ,EAX
MOV EAX,pPAINTSTRUCT
invoke CreateCompatibleBitmap,[EAX].PAINTSTRUCT.hdc,rc.right,rc.bottom
MOV hbmMem,EAX
invoke SelectObject,hdcMem,hbmMem
MOV hbmOld,EAX
invoke GetSysColor,COLOR_WINDOW
invoke CreateSolidBrush,EAX
MOV hbrBkGnd,EAX
invoke FillRect,hdcMem,addr rc,hbrBkGnd
invoke DeleteObject,hbrBkGnd
.if hfnt
invoke SelectObject,hdcMem,hfnt
MOV hfntOld,EAX
.endif
invoke SetBkMode,hdcMem,TRANSPARENT
invoke GetSysColor,COLOR_WINDOWTEXT
invoke SetTextColor,hdcMem,EAX
invoke DrawText,hdcMem,addr szCaption,-1,addr rc,DT_CENTER
invoke SelectObject,hdcMem,hfntOld
MOV EAX,pPAINTSTRUCT
LEA EBX,rc
MOV EDX,[EBX].RECT.right
SUB EDX,[EBX].RECT.left
MOV ECX,[EBX].RECT.bottom
SUB ECX,[EBX].RECT.top
invoke BitBlt,[EAX].PAINTSTRUCT.hdc,rc.left,rc.top,EDX,ECX,hdcMem,0, 0,SRCCOPY
invoke SelectObject,hdcMem, hbmOld
invoke DeleteObject,hbmMem;
invoke DeleteDC,hdcMem;
Функция Paint, похоже, работает нормально, поскольку, если я пропущу ее вызов, возникнет проблема с рисованием при изменении размера для увеличения ширины основного диалогового окна, новая область будет просто черной. Но если я вызову краску, то новая область после изменения размера будет отрисована правильно. Но есть огромное количество мерцания.
У меня есть 3 диалоговых окна, одно из которых является основным диалоговым окном, вызываемым через DialogBoxParam API.
А остальные 2 являются просто немодальными диалоговыми окнами (без заголовка, и для его стиля установлено значение DS_SYSMODAL). Эти диалоговые окна будут прикреплены к элементу управления TAB с помощью API-вызова CreateDialogParam каждый у одного есть собственный уникальный DlgProc.
Теперь, что я должен сделать, чтобы избежать мерцания при изменении размера элемента управления? Должен ли я делать подклассы для элемента управления, размер которого я хочу изменить? и отключить WM_ERASEBKGND для каждого элемента управления в отдельности?
Нужно ли отключать сообщение WM_ERASEBKGND только в основном диалоговом окне или также для всех немодальных диалоговых окон?
Кто-нибудь может помочь в этом вопросе?