Scrollbar, прокрутка окна содержащего элементы управления windows.

Тема в разделе "WASM.LANGS", создана пользователем Andrey_59, 23 июн 2023.

  1. Andrey_59

    Andrey_59 Member

    Публикаций:
    0
    Регистрация:
    20 фев 2021
    Сообщения:
    81
    Здравствуйте! Никак не могу разобраться с одной проблемкой, суть её приблизительно такая.
    Нужно было создать окно(WS_POPUPWINDOW), которое должно включать списки,
    в которые нужно нужно помещать имя пути к файлу и имя файла, находящегося по этому пути, и который нужно выбрать в стандартной панели выбора шрифтов, я создал окно, создал listbpox-ы и решил добавить scrollbar для прокрутки области окна, думаю, что такое вполне может понадобиться, но корректно покрутить окно с элементами управления не получаться,
    listbox-ы портятся.
    Всё что я читал по этой теме выполняется стандартно с использованием функции ScrollWindowEx, но в данном случает как-то не получается, может нужно как-то иначе прокручивать окно, чтобы элементы управления прокручивались корректно.

    Код (C++):
    1. case WM_VSCROLL:
    2.     {
    3.         int currPos = yPos;
    4.         switch (LOWORD(wParam))
    5.         {
    6.         case SB_LINEDOWN:
    7.         {
    8.             yPos += hList; //hList - это размер listbox
    9.             break;
    10.         }
    11.         case SB_LINEUP:
    12.         {
    13.             yPos -= hList;
    14.             break;
    15.         }
    16.         case SB_THUMBPOSITION:
    17.         case SB_THUMBTRACK:
    18.         {
    19.             yPos = HIWORD(wParam);
    20.             break;
    21.         }
    22.         default:
    23.             break;
    24.         }
    25.         if (yPos < yMin)
    26.         {
    27.             yPos = yMin;
    28.         }
    29.         if (yPos > yMax)
    30.             yPos = yMax;
    31.         SetScrollPos(hwnd, SB_VERT, yPos, TRUE);
    32.         if (currPos != yPos)
    33.         {
    34.             //rcScroll, rcClip - , это размер окна минус заголовок окна
    35.             //заголовок окна, это объект static.
    36.             ScrollWindowEx(hwnd, 0, (currPos - yPos), &rcScroll,
    37.                            &rcClip, NULL, NULL, SW_ERASE);
    38.             UpdateWindow(hwnd);
    39.         }
    40.  
    41.         return 0;
    42.     }
    43.     case WM_SIZE:
    44.     {
    45.         int cx = LOWORD(lParam);
    46.         int cy = HIWORD(lParam);
    47.  
    48.         int wName = (cx >> 2); //Ширина для listbox, который отображает
    49.                                //имя файла
    50.         int hStatic = 3 * cyChar / 2; //высота для заголовков static
    51.         int wPath = cx - wName; //Ширина для listbox, который отображает
    52.                                 //имя пути к файлу
    53.         int cxBorder = GetSystemMetrics(SM_CXBORDER);
    54.        
    55.         SetRect(&rcScroll, rcScroll.left = 0,
    56.             rcScroll.top = hList,
    57.             rcScroll.right = cx,
    58.             rcScroll.bottom = cy);
    59.         SetRect(&rcClip, rcClip.left = 0,
    60.             rcClip.top = hList,
    61.             rcClip.right = cx,
    62.             rcClip.bottom = cy);
    63.  
    64.         //int numberOflistboxs = cy / hList;
    65.  
    66.         for (int i = 0, y = hStatic; i < MAXLISTBOX - 1; i += 2)
    67.         {
    68.             MoveWindow(aLists[i], cxBorder, y,
    69.                 wPath, hList, TRUE);
    70.             MoveWindow(aLists[i + 1], wPath, y,
    71.                 wName - cxBorder, hList, TRUE);
    72.             y += hStatic;
    73.         }
    74.         return 0;
    75.     }
     

    Вложения:

    • DemoWindow1.rar
      Размер файла:
      1,1 МБ
      Просмотров:
      93
  2. MaKsIm

    MaKsIm Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    68
    Попробуйте использовать вместо UpdateWindow функцию InvalidateRect(hwnd, nil, true);
    Но она может давать мерцания, если не отключить WM_ERASEBKGND (можно вместо подавления этого сообщения установить bErase 3-параметр в false, но тогда она не даст эффекта как и UpdateWindow) или включить двойную буферизацию.
     
  3. Andrey_59

    Andrey_59 Member

    Публикаций:
    0
    Регистрация:
    20 фев 2021
    Сообщения:
    81
    Попробовал, что сказать, ничего не прокручивается просто небольшое мерцание и это все "телодвижения", но артефактов, которые были до этого тоже нет. Если вызвать InvalidateRect(hwnd, NULL, FALSE);, то всё так же, как и прежде. Двойная буферизация, что-то не могу понять, как с ней работать, как добавлять новые объекты, как их инициализировать нужными значениями выбранных файлов...
     

    Вложения:

    • Pictures.rar
      Размер файла:
      2,5 МБ
      Просмотров:
      97
  4. Andrey_59

    Andrey_59 Member

    Публикаций:
    0
    Регистрация:
    20 фев 2021
    Сообщения:
    81
    Как-то так:
    Код (C++):
    1. case WM_PAINT:
    2. {
    3.     HDC hdc = BeginPaint(hwnd, &ps);
    4.  
    5.     HDC hMemDC = CreateCompatibleDC(hdc);
    6.     HBITMAP hBitmap = CreateCompatibleBitmap(hdc, cxClient, cyClient);
    7.     HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
    8.  
    9.  
    10.     SelectObject(hMemDC, hOldBitmap);
    11.     DeleteObject(hBitmap);
    12.     DeleteDC(hMemDC);
    13.  
    14.     EndPaint(hwnd, &ps);
    15.     return 0;
    16. }
    Если так, то как работать с этим, добавлять строки в listbox, создавать/добавлять listbox, а затем отображать после прокрутки так, чтобы отображалось правильно-корректно...