Изменение размера ListView вместе с размером окна

Тема в разделе "WASM.WIN32", создана пользователем vg, 6 янв 2010.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Не могу понять почему при работе следующего кода, вместо пропорционального изменения размера ListView, контрол расширяется за пределы основного окна по ширине и высоте.
    Код (Text):
    1.     .elseif uMsg == WM_SIZE
    2.        
    3.         .if wParam != SIZE_MINIMIZED
    4.            
    5.             invoke GetWindowRect,hlv1,addr rect
    6.             invoke ScreenToClient,hwin,addr rect
    7.            
    8.             mov eax,lParam
    9.             mov iHeight,eax
    10.             and eax,0FFFFh
    11.             mov iWidth,eax
    12.             shr iHeight,16
    13.            
    14.             mov eax,rect.right
    15.             sub eax,rect.left
    16.             add iWidth,eax
    17.             mov eax,rect.bottom
    18.             sub eax,rect.top
    19.             add iHeight,eax
    20.            
    21.             mov eax,iWidth
    22.             sub eax,m_x
    23.             mov iWidth,eax
    24.             mov eax,iHeight
    25.             sub eax,m_y
    26.             mov iHeight,eax
    27.            
    28.             invoke MoveWindow,hlv1,rect.left,rect.top,iWidth,iHeight,TRUE
    29.            
    30.             mov eax,lParam
    31.             mov m_y,eax
    32.             and eax,0FFFFh
    33.             mov m_x,eax
    34.             shr m_y,16
    35.            
    36.         .endif
    Код переделывается из исходников на C++ (MFC), где всё отлично работает.
    Код (Text):
    1. void CDlgMain::OnSize(UINT nType, int cx, int cy)
    2. {
    3.     CDialog::OnSize(nType, cx, cy);
    4.  
    5.     if ( nType != SIZE_MINIMIZED )
    6.     {
    7.         if ( MainListView.GetSafeHwnd() != NULL )
    8.         {
    9.             CRect rect;
    10.             MainListView.GetWindowRect(rect);
    11.             ScreenToClient(&rect);
    12.             MainListView.MoveWindow(rect.left, rect.top,
    13.                                     rect.Width() + cx - m_x,
    14.                                     rect.Height() + cy - m_y);
    15.         }
    16.         m_x = cx;
    17.         m_y = cy;
    18.     }
    19. }
     
  2. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    попробуй так:
    Код (Text):
    1.          .wmsize:
    2.               mov     eax,[lparam]
    3.               mov     edx,eax
    4.               and     eax,0FFFFh
    5.               shr     edx,16
    6.               push    TRUE
    7.               push    edx
    8.               push    eax
    9.               push    ebx
    10.               push    ebx
    11.               push    [h_listview]
    12.               call    [MoveWindow]
    13.               jmp     .done
     
  3. Dukales

    Dukales New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2009
    Сообщения:
    199
    по WM_SIZE лучше делать
    Код (Text):
    1. RECT ClientRect;
    2. GetClientRect(hwndBox, &ClientRect);
    3. SetWindowPos(hwndListView, NULL, 0, 0, ClientRect.right, ClientRect.bottom, SWP_NOACTIVATE | SWP_NOZORDER);
    не надо MoveWindow. ведь можно вообще не беспокоиться об абсолютных координатах дочернего окна.
     
  4. Dukales

    Dukales New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2009
    Сообщения:
    199
    к
    Код (Text):
    1. ClientRect.right, ClientRect.bottom,
    можно добавить математику, ну вы поняли.
     
  5. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    Какой смысл в лишней структуре и вызове функций, когда все, что необходимо уже имеется в lparam при WM_SIZE?
     
  6. Dukales

    Dukales New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2009
    Сообщения:
    199
    KiNDeR
    Считайте, что оставил ему поле для деятельности.