Проблема рисования диалогового окна в windows XP
У меня есть странная проблема с диалоговым окном в Windows XP оно не рисуется правильно,
Listview не перерисовывается, если я не делаю что-то, что заставляет перекрашиваться, например, щелкая по бордерам размера, а затем по показу listview. Но если я перемещаю приложение куда-то на экран, оно снова скрывается.
Эта картина иллюстрирует проблему
https://i.imgur.com/JPgBG8x.png
Чтобы избежать мерцания, я установил WS_CLIPCHILDREN в главном диалоговом окне. Элемент управления tab является дочерним элементом в главном диалоговом окне, который вызывается через DialogBoxParam. А элемент управления Listview находится в другом диалоговом окне, которое является дочерним и прикреплено к основному диалоговому окну во время выполнения с помощью CreateDialogParam API с основным диалоговым окном в качестве родительского окна. В Windows 7 у меня нет никаких проблем с рисунком, за исключением того, что если я выключу композицию windows, то получу некоторое мерцание при изменении размера. Но на windows XP рисунок очень вялый. И Listview не обновляется должным образом, как будто он смешивается с управлением вкладками, некоторые его части показывают, если я удерживаю левый клик и перетаскиваю.
Любой орган имеет хоть какое-то представление о том, почему это происходит только на XP? У меня есть флаг WS_EX_COMPOSITED, установленный только на элементе управления Tab. Но я удалил его, и это не исправляет проблему. Сообщение WM_ERASEBKGND отключено, чтобы уменьшить мерцание.
Это картинка описывающая что происходит когда listview рисуется неправильно и я пытаюсь удерживать левую кнопку мыши и перетаскивать ее начинает показывать
https://i.imgur.com/uqcbTMF.png
Вот мой код
.code MainTabProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM LOCAL PS:PAINTSTRUCT .if uMsg==WM_INITDIALOG invoke GetDlgItem,hWnd,ConnectionsLVID MOV ConnectionsLVHandle,EAX invoke SendMessage,ConnectionsLVHandle,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT OR LVS_EX_GRIDLINES,LVS_EX_FULLROWSELECT OR LVS_EX_GRIDLINES mov lvc.imask,LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM mov lvc.pszText,chr$("1") mov lvc.lx, 40 mov lvc.iSubItem, 0 invoke SendMessage, ConnectionsLVHandle, LVM_INSERTCOLUMN, 0,addr lvc mov lvc.imask,LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM mov lvc.pszText,chr$("2") mov lvc.lx, 90 mov lvc.iSubItem, 1 invoke SendMessage, ConnectionsLVHandle, LVM_INSERTCOLUMN, 1,addr lvc mov lvc.imask,LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM mov lvc.pszText,chr$("3") mov lvc.lx, 90 mov lvc.iSubItem, 2 invoke SendMessage, ConnectionsLVHandle, LVM_INSERTCOLUMN, 2,addr lvc mov lvc.imask,LVCF_TEXT or LVCF_WIDTH or LVCF_SUBITEM mov lvc.pszText,chr$("4") mov lvc.lx, 130 mov lvc.iSubItem, 3 invoke SendMessage, ConnectionsLVHandle, LVM_INSERTCOLUMN, 3,addr lvc invoke SendMessage, ConnectionsLVHandle, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_DOUBLEBUFFER, LVS_EX_DOUBLEBUFFER .elseif uMsg == WM_CTLCOLORDLG .elseif uMsg == WM_ERASEBKGND MOV EAX,1 RET .elseif uMsg == WM_PAINT .elseif uMsg == WM_SIZE .else .endif XOR EAX,EAX ret MainTabProc endp SettingsTabProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .if uMsg==WM_INITDIALOG .elseif uMsg == WM_CTLCOLORDLG .elseif uMsg == WM_ERASEBKGND MOV EAX,1 RET .else .endif XOR EAX,EAX ret SettingsTabProc endp DialogProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD LOCAL ts:TCITEM LOCAL COLOR: COLORREF LOCAL CLRECT:RECT LOCAL PS:PAINTSTRUCT LOCAL hrgnUpdate: HRGN LOCAL MAXINFO:MINMAXINFO LOCAL pp: INITCOMMONCONTROLSEX .if uMsg == WM_INITDIALOG ;Create the tabs mov ts.imask,TCIF_TEXT OR TCIF_IMAGE mov ts.lpReserved1,0 mov ts.lpReserved2,0 mov ts.iImage,0 mov ts.lParam,0 mov ts.pszText,offset TabConnections mov ts.cchTextMax,sizeof TabConnections MOV pp.dwSize,sizeof pp mov pp.dwICC,ICC_TAB_CLASSES invoke InitCommonControlsEx,addr pp invoke ImageList_Create,20,20,ILC_COLOR32 OR ILC_MASK ,3,10 ;Create ImageList MOV ImageListHandle,EAX MOV EDI,EAX invoke LoadBitmap,hInstance,1 invoke ImageList_AddMasked,EDI,EAX,0 ;Add bitmap masked invoke SendDlgItemMessage,hWnd,MainTabID,TCM_SETIMAGELIST,0,EDI ;Assosiate ImageList with Tabs invoke LoadBitmap,hInstance,2 ;Load Bitmap invoke ImageList_AddMasked,EDI,EAX,0 ;Add Bitmap to imagelist invoke SendDlgItemMessage,hWnd,MainTabID,TCM_SETIMAGELIST,0,EDI ;Set image on tab invoke SendDlgItemMessage,hWnd,MainTabID,TCM_INSERTITEM,0,addr ts ;Insesrt tab mov ts.iImage,1 mov ts.pszText,offset TabSettings mov ts.cchTextMax,sizeof TabSettings invoke SendDlgItemMessage,hWnd,MainTabID,TCM_INSERTITEM,1,addr ts ;Set image on tab invoke GetDlgItem,hWnd,MainTabID ;BUG mov [MainTabHandle],eax invoke SendDlgItemMessage,hWnd,MainTabID,TCM_SETITEMSIZE,NULL,110 ;Extend tab width + height ; invoke CreateDialogParam,hInstance,MainContentDlgID,hWnd,addr MainTabProc,0 mov MainTabContentDialogHandle,eax invoke CreateDialogParam,hInstance,SettingsDlgID,hWnd,addr SettingsTabProc,0 mov SettingsTabDialogHandle,eax invoke ShowWindow, SettingsTabDialogHandle,SW_HIDE invoke EnableThemeDialogTexture,hWnd,6 invoke GetDlgItem,hWnd,1011 invoke ResizeWindow,hWnd,uMsg,lParam invoke ShowWindow, MainTabContentDialogHandle,SW_SHOWDEFAULT MOV Tabchoosen,0 MOV EAX,hWnd MOV [DlgHandle],EAX invoke LoadIcon,[hInstance],1 invoke SendMessage,hWnd,WM_SETICON,1,EAX .elseif uMsg == WM_GETMINMAXINFO MOV EAX,lParam MOV [EAX].MINMAXINFO.ptMinTrackSize.x,874 MOV [EAX].MINMAXINFO.ptMinTrackSize.y,466 .elseif uMsg == WM_SETFONT MOV EAX,wParam MOV hfnt,EAX .elseif uMsg == WM_SIZE .elseif uMsg == WM_MOUSEMOVE .elseif uMsg == WM_SIZING .elseif uMsg == WM_WINDOWPOSCHANGED invoke ResizeWindow,hWnd,uMsg,lParam .elseif uMsg == WM_CTLCOLORSTATIC .elseif uMsg == WM_SYSCOMMAND MOV EAX,wParam .if EAX == SC_MAXIMIZE invoke RedrawWindow,hWnd,NULL,NULL,RDW_INVALIDATE OR RDW_ALLCHILDREN .endif .elseif uMsg == WM_PAINT invoke RedrawWindow,hWnd,NULL,NULL,RDW_INVALIDATE OR RDW_ALLCHILDREN invoke BeginPaint,hWnd,addr PS invoke Paint,hWnd,addr PS,hfnt invoke EndPaint,hWnd,addr PS .elseif uMsg == WM_SYNCPAINT invoke RedrawWindow,hWnd,NULL,NULL,RDW_INVALIDATE OR RDW_ALLCHILDREN .elseif uMsg == WM_ACTIVATE invoke RedrawWindow,hWnd,NULL,NULL,RDW_INVALIDATE OR RDW_ALLCHILDREN .elseif uMsg == WM_ENTERSIZEMOVE invoke RedrawWindow,hWnd,NULL,NULL,RDW_INVALIDATE OR RDW_ALLCHILDREN .elseif uMsg == WM_EXITSIZEMOVE .elseif uMsg == WM_ERASEBKGND MOV EAX,1 RET .elseif uMsg == WM_NOTIFY mov edx, wParam .if edx == MainTabID mov eax, lParam mov eax, (NMHDR ptr [eax]).code .if eax == TCN_SELCHANGE invoke RedrawWindow,hWnd,NULL,NULL,RDW_INVALIDATE OR RDW_ALLCHILDREN mov ebx, Tabchoosen mov eax, [TabHandles + ebx * 4] invoke ShowWindow, eax, SW_HIDE invoke SendMessage, MainTabHandle, TCM_GETCURSEL, 0, 0 mov Tabchoosen, eax mov ebx, [TabHandles + eax * 4] invoke ShowWindow, ebx, SW_SHOWDEFAULT .endif .endif .elseif uMsg == WM_COMMAND NOP .elseif uMsg == WM_CLOSE invoke CloseHandle,[CompletionPort] invoke closesocket,[Listen] invoke EndDialog,hWnd,NULL .else .endif XOR EAX,EAX ret DialogProc endp align 4 Main proc invoke GetModuleHandle,NULL MOV [hInstance],EAX invoke HeapCreate, NULL,4,NULL MOV [HeapH],EAX invoke DialogBoxParam,[hInstance],DialogBox,NULL,addr DialogProc, NULL ret Main endp Paint Proc hWnd:DWORD, pPAINTSTRUCT:PPAINTSTRUCT,FNT:HFONT LOCAL rc:RECT ; LOCAL hdcMem:HDC ; LOCAL hBITMAP:HANDLE LOCAL hbmMem:HANDLE LOCAL hbmOld:HANDLE LOCAL hbrBkGnd:HBRUSH ; LOCAL hfntOld:HFONT ; invoke GetUpdateRgn,hWnd,addr rc,FALSE .if EAX == NULL ret .endif 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 FNT invoke SelectObject,hdcMem,FNT MOV hfntOld,EAX .endif invoke SetBkMode,hdcMem,TRANSPARENT invoke GetSysColor,COLOR_WINDOWTEXT invoke SetTextColor,hdcMem,EAX 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,0,0,hdcMem,0, 0,SRCCOPY invoke SelectObject,hdcMem, hbmOld invoke DeleteObject,hbmMem; invoke DeleteDC,hdcMem; ret Paint endp ResizeWindow Proc hWnd:HWND,uMsg:DWORD,lParam:DWORD LOCAL CLRECT:RECT MOV EAX,uMsg .if uMsg == WM_WINDOWPOSCHANGED MOV EAX,lParam MOV EDX,offset ORGRECT MOV ECX,[EAX].WINDOWPOS.lx MOV EBX,[EAX].WINDOWPOS.cy .if [EDX].WINDOWPOS.lx == NULL MOV [EDX].WINDOWPOS.lx ,ECX MOV [EDX].WINDOWPOS.cy ,EBX .elseif [EDX].WINDOWPOS.lx == ECX && [EDX].WINDOWPOS.cy == EBX ret .else MOV [EDX].WINDOWPOS.lx ,ECX MOV [EDX].WINDOWPOS.cy ,EBX .endif .endif invoke GetClientRect,hWnd,addr CLRECT LEA EAX, CLRECT SUB [EAX].RECT.bottom,23 invoke MoveWindow,MainTabHandle,NULL,NULL,[EAX].RECT.right,[EAX].RECT.bottom,FALSE invoke GetClientRect,hWnd,addr CLRECT LEA EAX, CLRECT SUB [EAX].RECT.bottom,30 invoke MoveWindow,MainTabContentDialogHandle,NULL,NULL,[EAX].RECT.right,[EAX].RECT.bottom,FALSE invoke GetClientRect,MainTabHandle,addr CLRECT LEA EAX, CLRECT SUB [EAX].RECT.bottom,38 LEA EBX, CLRECT ADD [EBX].RECT.top,30 LEA ECX, CLRECT SUB [ECX].RECT.right,10 LEA EDX, CLRECT ADD [EDX].RECT.left,5 invoke MoveWindow,ConnectionsLVHandle,[ECX].RECT.left,[EBX].RECT.top,[ECX].RECT.right,[EAX].RECT.bottom,FALSE invoke GetDlgItem,hWnd,1011 MOV EDI,EAX invoke GetClientRect,MainTabHandle,addr CLRECT LEA EAX, CLRECT invoke MoveWindow,EDI,0,0,[EAX].RECT.right,[EAX].RECT.bottom,FALSE ret ResizeWindow endp
Что я уже пробовал:
Я попытался вызвать UpdateWindow,mainDlgHandle Listview handle. Все так же. все еще не нарисовано правильно.
Я попытался использовать RedrawWindow с RDW_ALLCHILDREN, но это тоже не помогло.
снова включенный WM_ERASEBKGND тоже не помогает.