resize диалогового окна

Тема в разделе "LANGS.C", создана пользователем _qwe8013, 13 дек 2016.

  1. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    В общем сделал я окно в ресурсах, и захотелось мне сделать так, чтобы при ресайзе некоторые контролы "прилипли" к одному краю, а некоторые - к другому. Для этого при инициализации диалога я запомнил расположение всех контролов, а при ресайзе главного окна я двигаю контролы в нужное место. Но проблема в том, что "нужное" место - совсем не нужное, контролы не на своём месте! Отсюда 2 вопроса:
    1)Что я делаю не так?
    2)Возможно то, что мне нужно делается гораздо проще.
    Описание диалога в ресурсах:
    Код (C):
    1. MAINDIAL DIALOGEX 0, 0, 392, 247, 0
    2. STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CONTEXTHELP | WS_VISIBLE | WS_DLGFRAME | WS_MINIMIZEBOX | WS_OVERLAPPEDWINDOW
    3. EXSTYLE WS_EX_CONTEXTHELP
    4. CAPTION "Window"
    5. LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
    6. FONT 8, "MS Shell Dlg"
    7. {
    8.     CONTROL          "TreeView", 0, "SysTreeView32", 0x00000007, 2, 2, 388, 164, WS_EX_CLIENTEDGE
    9.     CONTROL          "ProgressBar", 1, "msctls_progress32", 2, 168, 388, 16, WS_EX_CLIENTEDGE
    10.     LTEXT            "Label1", 2, 2, 186, 32, 8, NOT WS_GROUP
    11.     PUSHBUTTON       "Button1", 3, 290, 232, 100, 12
    12.     PUSHBUTTON       "Button2", 4, 352, 216, 38, 12
    13.     PUSHBUTTON       "Button3", 5, 352, 200, 38, 12
    14.     PUSHBUTTON       "Button4", 6, 2, 232, 38, 12
    15.     GROUPBOX         "Button5", 7, 124, 192, 162, 52
    16.     EDITTEXT         8, 128, 228, 60, 12, NOT WS_BORDER, WS_EX_CLIENTEDGE
    17.     LTEXT            "Label2", 9, 128, 218, 56, 8, NOT WS_GROUP
    18.     EDITTEXT         10, 220, 228, 60, 12, NOT WS_BORDER, WS_EX_CLIENTEDGE
    19.     LTEXT            "Label3", 11, 220, 218, 54, 8, NOT WS_GROUP
    20.     PUSHBUTTON       "Button6", 12, 352, 186, 38, 12
    21.     PUSHBUTTON       "Button7", 13, 46, 232, 38, 12, WS_DISABLED
    22. }
    23.  
    Код программы:
    Код (C):
    1. #define NUM_OF_CONTROLS 14
    2.  
    3. RECT ControlsRects[NUM_OF_CONTROLS];
    4. const bool Left[NUM_OF_CONTROLS]={true,true,true,false,false,false,true,false,false,false,false,false,false,true};
    5. const bool Top[NUM_OF_CONTROLS]={true,true,true,false,false,false,false,false,false,false,false,false,false,false};
    6. const bool Right[NUM_OF_CONTROLS]={true,true,false,true,true,true,false,true,true,true,true,true,true,false};
    7. const bool Bottom[NUM_OF_CONTROLS]={false,false,false,true,true,true,true,true,true,true,true,true,true,true};
    8.  
    9. //Реакция на сообщение WM_INITDIALOG
    10. BOOL OnCreate(HWND hDial)
    11. {
    12.     RECT StartDlgRect;
    13.     GetWindowRect(hDial,&StartDlgRect);
    14.     unsigned int Width=StartDlgRect.right-StartDlgRect.left;
    15.     unsigned int Height=StartDlgRect.bottom-StartDlgRect.top;
    16.  
    17.     for(unsigned int i=0;i<NUM_OF_CONTROLS-1;i++)
    18.     {
    19.         HWND h=GetDlgItem(hDial,i);
    20.         RECT r;
    21.         GetWindowRect(h,&r);
    22.         ControlsRects[i].left=r.left;
    23.         ControlsRects[i].top=r.top;
    24.         ControlsRects[i].right=Width-r.right;
    25.         ControlsRects[i].bottom=Height-r.bottom;
    26.     }
    27.     return TRUE;
    28. }
    29.  
    30. //Реакция на сообщение WM_SIZE
    31. BOOL OnResize(HWND hDial)
    32. {
    33.     RECT StartDlgRect;
    34.     GetWindowRect(hDial,&StartDlgRect);
    35.     unsigned int Width=StartDlgRect.right-StartDlgRect.left;
    36.     unsigned int Height=StartDlgRect.bottom-StartDlgRect.top;
    37.  
    38.     for(unsigned int i=0;i<NUM_OF_CONTROLS-1;i++)
    39.     {
    40.         HWND h=GetDlgItem(hDial,i);
    41.         RECT r;
    42.         GetWindowRect(h,&r);
    43.         if(Left[i])
    44.         {
    45.             r.left=ControlsRects[i].left;
    46.         }
    47.         if(Top[i])
    48.         {
    49.             r.top=ControlsRects[i].top;
    50.         }
    51.         if(Right[i])
    52.         {
    53.             r.right=Width-ControlsRects[i].right;
    54.         }
    55.         if(Left[i])
    56.         {
    57.             r.bottom=Height-ControlsRects[i].bottom;
    58.         }
    59.         SetWindowPos(h,0,r.left,r.top,r.right-r.left,r.bottom-r.top,0);
    60.     }
    61.  
    62.     return TRUE;
    63. }
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Bottom[ i ] вместо Left[ i ] в последнем if'е надо. Кому-то пора уже научиться внимательней читать свои сорцы :)
     
  3. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    Да, но это не помогает.
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    А, ну йопта, GetWindowRect() возвращает координаты относительно рабочего стола. ScreenToClient() юзай для каждой пары rect.left+rect.top, rect.right+rect.bottom.
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Код (C):
    1.  
    2. void GetChildWindowRect (HWND hwndParent, HWND hwndChild, RECT* rect)
    3. {
    4.     POINT pt;
    5.  
    6.     GetWindowRect (hwndChild, rect);
    7.  
    8.     pt.x = rect->left;
    9.     pt.y = rect->top;
    10.     ScreenToClient (hwndParent, &pt);
    11.     rect->left = pt.x;
    12.     rect->top = pt.y;
    13.  
    14.     pt.x = rect->right;
    15.     pt.y = rect->bottom;
    16.     ScreenToClient (hwndParent, &pt);
    17.     rect->right = pt.x;
    18.     rect->bottom = pt.y;
    19. }
    20.  
     
    Mikl___ нравится это.
  6. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    Спасибо, всё заработало. Правда тут ProgressBar съезжает куда-то вниз за окно.
     
  7. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    Выяснил, почему съезжает. Это бажный Resource tuner 2 выдал такую строку:
    я её изменил так:
     
    Mikl___ нравится это.
  8. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Для rect вместо пары ScreenToClient - можно MapWindowPoints(..., addr rect, 2)