Здравствуйте! Никак не могу разобраться с одной проблемкой, суть её приблизительно такая. Нужно было создать окно(WS_POPUPWINDOW), которое должно включать списки, в которые нужно нужно помещать имя пути к файлу и имя файла, находящегося по этому пути, и который нужно выбрать в стандартной панели выбора шрифтов, я создал окно, создал listbpox-ы и решил добавить scrollbar для прокрутки области окна, думаю, что такое вполне может понадобиться, но корректно покрутить окно с элементами управления не получаться, listbox-ы портятся. Всё что я читал по этой теме выполняется стандартно с использованием функции ScrollWindowEx, но в данном случает как-то не получается, может нужно как-то иначе прокручивать окно, чтобы элементы управления прокручивались корректно. Код (C++): case WM_VSCROLL: { int currPos = yPos; switch (LOWORD(wParam)) { case SB_LINEDOWN: { yPos += hList; //hList - это размер listbox break; } case SB_LINEUP: { yPos -= hList; break; } case SB_THUMBPOSITION: case SB_THUMBTRACK: { yPos = HIWORD(wParam); break; } default: break; } if (yPos < yMin) { yPos = yMin; } if (yPos > yMax) yPos = yMax; SetScrollPos(hwnd, SB_VERT, yPos, TRUE); if (currPos != yPos) { //rcScroll, rcClip - , это размер окна минус заголовок окна //заголовок окна, это объект static. ScrollWindowEx(hwnd, 0, (currPos - yPos), &rcScroll, &rcClip, NULL, NULL, SW_ERASE); UpdateWindow(hwnd); } return 0; } case WM_SIZE: { int cx = LOWORD(lParam); int cy = HIWORD(lParam); int wName = (cx >> 2); //Ширина для listbox, который отображает //имя файла int hStatic = 3 * cyChar / 2; //высота для заголовков static int wPath = cx - wName; //Ширина для listbox, который отображает //имя пути к файлу int cxBorder = GetSystemMetrics(SM_CXBORDER); SetRect(&rcScroll, rcScroll.left = 0, rcScroll.top = hList, rcScroll.right = cx, rcScroll.bottom = cy); SetRect(&rcClip, rcClip.left = 0, rcClip.top = hList, rcClip.right = cx, rcClip.bottom = cy); //int numberOflistboxs = cy / hList; for (int i = 0, y = hStatic; i < MAXLISTBOX - 1; i += 2) { MoveWindow(aLists[i], cxBorder, y, wPath, hList, TRUE); MoveWindow(aLists[i + 1], wPath, y, wName - cxBorder, hList, TRUE); y += hStatic; } return 0; }
Попробуйте использовать вместо UpdateWindow функцию InvalidateRect(hwnd, nil, true); Но она может давать мерцания, если не отключить WM_ERASEBKGND (можно вместо подавления этого сообщения установить bErase 3-параметр в false, но тогда она не даст эффекта как и UpdateWindow) или включить двойную буферизацию.
Попробовал, что сказать, ничего не прокручивается просто небольшое мерцание и это все "телодвижения", но артефактов, которые были до этого тоже нет. Если вызвать InvalidateRect(hwnd, NULL, FALSE);, то всё так же, как и прежде. Двойная буферизация, что-то не могу понять, как с ней работать, как добавлять новые объекты, как их инициализировать нужными значениями выбранных файлов...
Как-то так: Код (C++): case WM_PAINT: { HDC hdc = BeginPaint(hwnd, &ps); HDC hMemDC = CreateCompatibleDC(hdc); HBITMAP hBitmap = CreateCompatibleBitmap(hdc, cxClient, cyClient); HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); SelectObject(hMemDC, hOldBitmap); DeleteObject(hBitmap); DeleteDC(hMemDC); EndPaint(hwnd, &ps); return 0; } Если так, то как работать с этим, добавлять строки в listbox, создавать/добавлять listbox, а затем отображать после прокрутки так, чтобы отображалось правильно-корректно...