Как сделать, чтобы форма не мелькала при ресайзе?
От: zergtmn  
Дата: 03.12.07 18:29
Оценка:
Как сделать, чтобы элементы управления на форме не мелькали при ресайзинге?

Пример 1: Создаем в Visual Studio проект Win32 Project\Windows Application, в коде прописываем создание кнопки, например так:

HWND hBtn = CreateWindow("BUTTON", _T("Button1"), WS_CHILD | WS_VISIBLE, 50, 50, 80, 24, hWnd, (HMENU)133, hInst, NULL);

Компилируем, запускаем программу, изменяем размер перетаскиванием за границу — кнопка мелькает.

Пример 2: Создаем в Visual Studio проект оконного приложения на любом из языков C#, VB.NET, C++/CLI. Кидаем на форму любые элементы управления. Компилируем, запускаем, ресайзим форму — мелькания нет!

Как добиться такого эффекта, чтобы элементы управления на форме не мелькали?

Пробовал выставлять для формы стиль WS_CLIPCHILDREN, мелькать стало гораздно меньше, но факт мелькания остался. Видимо в .NET сделано как-то по другому. И еще появились такие косяки: на GroupBox'ах и Static'ах остаются следы при перетаскивании над ними границ окна и других компонентов.
Re: Как сделать, чтобы форма не мелькала при ресайзе?
От: CoolCmd Россия  
Дата: 03.12.07 19:40
Оценка:
Здравствуйте, zergtmn, Вы писали:

Z>Как сделать, чтобы элементы управления на форме не мелькали при ресайзинге?

Можно указать WS_EX_COMPOSITED, но это работает только начиная с winxp. Видимо есть и другой способ.
простите, я убил небо
Re: Как сделать, чтобы форма не мелькала при ресайзе?
От: Pavel Dvorkin Россия  
Дата: 04.12.07 07:40
Оценка:
Здравствуйте, zergtmn, Вы писали:

Z>Как добиться такого эффекта, чтобы элементы управления на форме не мелькали?


Если под формой ты имеешь в виду основное окно (не диалог). то, например, так


1. В создании основного окна

   hWnd = CreateWindow(szWindowClass, szTitle, WS_CLIPCHILDREN |WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

2. В оконной функции его

    static HDC hdcMem;
    static HBITMAP hBmpMem, hBmpOld;

....

    case WM_ERASEBKGND :
        return 1;
    case WM_CREATE: {
            HDC hdc = GetDC(hWnd);
            hdcMem = CreateCompatibleDC(hdc);
            int xScreen = GetSystemMetrics(SM_CXSCREEN);
            int yScreen = GetSystemMetrics(SM_CYSCREEN);
            hBmpMem = CreateCompatibleBitmap(hdc, xScreen, yScreen);
            hBmpOld = (HBITMAP) SelectObject(hdcMem, hBmpMem);
            PatBlt(hdcMem, 0, 0, xScreen, yScreen, WHITENESS);
            HWND hBtn = CreateWindow(L"BUTTON", _T("Button1"),  WS_CHILD | WS_VISIBLE, 50, 50, 80, 24, hWnd, (HMENU)133, hInst, NULL);
            ReleaseDC(hWnd, hdc);
        break;
       case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        BitBlt(hdc,ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom, hdcMem, 
            ps.rcPaint.left, ps.rcPaint.top, SRCCOPY);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;


Удаление hdcMem и hBmpMem напиши сам (ухожу на лекцию
With best regards
Pavel Dvorkin
Re: Как сделать, чтобы форма не мелькала при ресайзе?
От: McQwerty Россия  
Дата: 05.12.07 14:52
Оценка:
Здравствуйте, zergtmn, Вы писали:

Z>Как сделать, чтобы элементы управления на форме не мелькали при ресайзинге?


Z>Пример 1: Создаем в Visual Studio проект Win32 Project\Windows Application, в коде прописываем создание кнопки, например так:

Z>HWND hBtn = CreateWindow("BUTTON", _T("Button1"), WS_CHILD | WS_VISIBLE, 50, 50, 80, 24, hWnd, (HMENU)133, hInst, NULL);
Z>Компилируем, запускаем программу, изменяем размер перетаскиванием за границу — кнопка мелькает.

Убрать у оконнного класса родителя стили CS_HREDRAW и CS_VREDRAW.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.