В догонку про AnimateWindow

Тема в разделе "WASM.BEGINNERS", создана пользователем Quantum, 30 ноя 2005.

  1. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    WM_PRINT обрабатывается в точности как WM_PAINT, за исключением того, что BeginPaint/EndPaint вызывать не надо, т.к. HDC уже имеется в wParam. Я обычно делаю так (C для наглядности):
    Код (Text):
    1.       case WM_PAINT:
    2.          if(GetUpdateRect(hWnd,0,0)){
    3.             Paint(BeginPaint(hWnd,&paintstruct));
    4.             EndPaint(hWnd,&paintstruct);
    5.          }
    6.          break;
    7.       case WM_PRINTCLIENT:
    8.          Paint((HDC)wParam);
    9.          break;


    Процедура Paint отрисовывает содержимое окна (через BitBlt, к примеру)



    Для использования стиля AW_BLEND надо учесть, что в коде AnimateWindow в Win 2000 есть баг. Кто-то из разработчиков не дружит с логическими операциями и перепутал OR и XOR :) Баг исправляется обёрткой:
    Код (Text):
    1. void __stdcall AnimateWnd(HWND hWnd,int param1,int param2){
    2.    SetWindowLong(hWnd,GWL_EXSTYLE,original_style | 0x80000);
    3.    AnimateWindow(hWnd,param1,param2);
    4.    SetWindowLong(hWnd,GWL_EXSTYLE,original_style);
    5.    return;
    6. }


    Выставить флаг 0x80000 глобально не решает проблемы, т.к. AnimateWindow на 2к имеет вредную привычку иногда его сбрасывать :)
     
  2. Mad Butcher

    Mad Butcher New Member

    Публикаций:
    0
    Регистрация:
    21 апр 2005
    Сообщения:
    27
    Спасибо!!!



    Про 2000 не знал...