Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2009, 01:22   #1
Spiritual
 
Регистрация: 05.02.2009
Сообщений: 5
По умолчанию и все равно мерцает!

всех приветствую!

не подскажете как решить проблему с мерцанием перерисовки окна при его перетаскивании?

Код:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
    WNDCLASSEXA wndClassExA;
    HWND hWnd;
    MSG msg;

    memset( &wndClassExA, 0, sizeof(WNDCLASSEXA) );
    wndClassExA.cbSize = sizeof(WNDCLASSEXA);
    wndClassExA.lpfnWndProc = WindowProc;
    wndClassExA.hInstance = GetModuleHandleA( NULL );
    wndClassExA.lpszClassName = "gdi_test";
    RegisterClassExA( &wndClassExA );

    hWnd = CreateWindowExA( 0 , "gdi_test", NULL, 0, 200, 200, 500, 500, NULL, NULL, GetModuleHandle( NULL ), NULL );
    ShowWindow( hWnd, SW_SHOW );

    while( GetMessageA( &msg, NULL, 0, 0 ) != 0 ) { 
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    } 

	return 0;
}

LRESULT CALLBACK WindowProc( HWND hWnd, UINT WM_ID, WPARAM wParam, LPARAM lParam ) {
    HDC hdc, hMemDC;
    PAINTSTRUCT ps;
    HBRUSH hBr;
    HBITMAP hBm, hTBm;
    RECT rc;

    switch( WM_ID ) {
    case WM_ERASEBKGND:
        return 1L;
    case WM_PAINT:

        GetWindowRect( hWnd, &rc );
        rc.bottom -= rc.top;
        rc.right -= rc.left;
        rc.top = rc.left = 0;

        hBr = CreateSolidBrush( RGB(128,128,128) );
        hdc = BeginPaint( hWnd, &ps );
        FillRect( hdc, &rc, hBr );

        hMemDC = CreateCompatibleDC( hdc );
        hBm = CreateCompatibleBitmap( hdc, 500, 500 );
        hTBm = (HBITMAP)SelectObject( hMemDC, hBm );

        FillRect( hMemDC, &rc, hBr );

        BitBlt( hdc, 0, 0, 500, 500, hMemDC, 0, 0, SRCCOPY );

        SelectObject( hMemDC, hTBm );
        DeleteObject( hBm );
        DeleteObject( hBr );

        EndPaint( hWnd, &ps );
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc( hWnd, WM_ID, wParam, lParam );
	}

     return 0;
}
вроде бы простой и понятный код и вроде бы многие утверждают что должно работать, только вот что-то этот пресловутый двойной буфер нифига не работает - при перетаскивании все равно видна перерисовка прямоугольниками.

Последний раз редактировалось rpy3uH; 08.02.2009 в 19:21.
Spiritual вне форума Ответить с цитированием
Старый 06.02.2009, 07:09   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Уже так же обсуждалось, создаете битмап, получите его hdc, рисуите на нем а потом за раз выводите BitBlt на окно мерцания как и не было
BOBAH13 вне форума Ответить с цитированием
Старый 06.02.2009, 13:37   #3
Spiritual
 
Регистрация: 05.02.2009
Сообщений: 5
По умолчанию

да видел я етот пример - он тоже мерцает. я имею ввиду то мерцание, которое получается когда перетаскивается рамка и затем после WM_EXITSIZEMOVE окно перерисовывается на новом месте с "бликами". вот когда включен режим перетаскивания окна с содержимым, тогда да - никакого мерцания (если не считать артефакты по краям) контента. но если этот режим выключен тогда нужно самому это делать...
отсюда вопрос - как узнать какие окна перекрыты моим окном и затем какое сообщение этим перекрытым окнам надо отправить, чтобы они себя перерисовали когда мое окно сдвигается?

кстати у меня в примере делается тоже самое что и в примере к битмапом - только я делаю FillRect. я просто хочу достичь _идеального_ отображения.
Spiritual вне форума Ответить с цитированием
Старый 06.02.2009, 14:30   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

EnumWindows, GetWindowRect, IntersectRect в помошь
BOBAH13 вне форума Ответить с цитированием
Старый 06.02.2009, 20:28   #5
Spiritual
 
Регистрация: 05.02.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
EnumWindows, GetWindowRect, IntersectRect в помошь
ну да, это тоже понятно. а я надеялся что есть такая АПИ которая возвращает hWnd окна, которое "под тобой" получается придется самому мастерить...
Spiritual вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Делимся идеями (простыми, но до которых все-равно нужно додуматься) Jora_Kornev Общие вопросы Delphi 3 11.01.2009 14:18
Сравнение значений в ячейках и вывод соообщения если не равно. Siver Microsoft Office Excel 2 18.12.2008 04:42
в начале все отрицательные, затем все положительные элементы в матрице motaro Паскаль, Turbo Pascal, PascalABC.NET 2 07.03.2008 19:16
значение получившегося выражения должно быть равно заданному целому S Elm0 Паскаль, Turbo Pascal, PascalABC.NET 6 18.01.2008 00:13
в dos мерцает экран, как вылечить? mutanen Свободное общение 3 30.11.2007 19:13