Не могу понять почему при работе следующего кода, вместо пропорционального изменения размера ListView, контрол расширяется за пределы основного окна по ширине и высоте. Код (Text): .elseif uMsg == WM_SIZE .if wParam != SIZE_MINIMIZED invoke GetWindowRect,hlv1,addr rect invoke ScreenToClient,hwin,addr rect mov eax,lParam mov iHeight,eax and eax,0FFFFh mov iWidth,eax shr iHeight,16 mov eax,rect.right sub eax,rect.left add iWidth,eax mov eax,rect.bottom sub eax,rect.top add iHeight,eax mov eax,iWidth sub eax,m_x mov iWidth,eax mov eax,iHeight sub eax,m_y mov iHeight,eax invoke MoveWindow,hlv1,rect.left,rect.top,iWidth,iHeight,TRUE mov eax,lParam mov m_y,eax and eax,0FFFFh mov m_x,eax shr m_y,16 .endif Код переделывается из исходников на C++ (MFC), где всё отлично работает. Код (Text): void CDlgMain::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if ( nType != SIZE_MINIMIZED ) { if ( MainListView.GetSafeHwnd() != NULL ) { CRect rect; MainListView.GetWindowRect(rect); ScreenToClient(&rect); MainListView.MoveWindow(rect.left, rect.top, rect.Width() + cx - m_x, rect.Height() + cy - m_y); } m_x = cx; m_y = cy; } }
попробуй так: Код (Text): .wmsize: mov eax,[lparam] mov edx,eax and eax,0FFFFh shr edx,16 push TRUE push edx push eax push ebx push ebx push [h_listview] call [MoveWindow] jmp .done
по WM_SIZE лучше делать Код (Text): RECT ClientRect; GetClientRect(hwndBox, &ClientRect); SetWindowPos(hwndListView, NULL, 0, 0, ClientRect.right, ClientRect.bottom, SWP_NOACTIVATE | SWP_NOZORDER); не надо MoveWindow. ведь можно вообще не беспокоиться об абсолютных координатах дочернего окна.
Какой смысл в лишней структуре и вызове функций, когда все, что необходимо уже имеется в lparam при WM_SIZE?