Перерисовка окна

Тема в разделе "WASM.BEGINNERS", создана пользователем mc black, 25 май 2007.

  1. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Создай контекст в памяти. Типа виртуальное окно.

    Код (Text):
    1.     CreateVWin  proc    hWin:DWORD
    2.     LOCAL RectGraf:RECT
    3.     LOCAL hDC:DWORD,hMemDC:DWORD
    4. ;    LOCAL hWinGraf:DWORD
    5.    
    6. ;        invoke GetWindowRect,hWin,ADDR RectGraf
    7.         invoke GetClientRect,hWin,ADDR RectGraf
    8.        
    9.         mov eax,RectGraf.bottom
    10.         sub eax,RectGraf.top
    11.         mov Y_VWin,eax          ;Размер по Y создаваемого виртуального окна
    12.         mov eax,RectGraf.right
    13.         sub eax,RectGraf.left
    14.         mov X_VWin,eax          ;Размер по X создаваемого виртуального окна
    15.  
    16.         invoke GetDC,hWin
    17.         mov hDC,eax
    18.         invoke CreateCompatibleDC,eax
    19.         mov hMemDC,eax
    20.        
    21.         invoke CreateCompatibleBitmap,hDC,X_VWin,Y_VWin
    22.         invoke SelectObject, hMemDC,eax
    23.         invoke GetStockObject, WHITE_BRUSH;
    24.         invoke SelectObject, hMemDC,eax
    25.         invoke PatBlt, hMemDC,0,0,X_VWin,Y_VWin,PATCOPY
    26.         invoke ReleaseDC,hWin,hDC
    27.         mov eax,hMemDC          
    28.         ret
    29.     CreateVWin  endp
    Рисуешь в него и выводишь на нормальное окно.
    Код (Text):
    1. PrintGraf   proc
    2. LOCAL   TMP_Y:DWORD
    3.     inc     CNT_X
    4.     mov     eax,        CNT_X
    5.     .if eax==X_VWin
    6.         mov     CNT_X,  0
    7.         invoke  CLR_Graf
    8.     .endif
    9.    
    10.     mov     eax,        255
    11.     sub     al,ControllerParam.C_CurParam
    12.     invoke MulDiv,Y_VWin,eax,256
    13.     mov     TMP_Y,eax
    14.  
    15.     invoke  SetPixelV,V_WinDC,CNT_X,eax,008952ADh
    16.    
    17.     invoke  GetDC,      hVWin
    18.     push    eax
    19.     invoke  BitBlt,eax,0,0,X_VWin,Y_VWin,V_WinDC,0,0,SRCCOPY
    20.     pop     eax
    21.     invoke  ReleaseDC,hVWin,eax
    22.     ret
    23. PrintGraf endp
    Да и еще в WM_PAINT вставляем повтор вывода на реальное окно, вдруг кто-то затрет что-то.

    Код (Text):
    1.     .elseif eax==WM_PAINT
    2.        
    3.         invoke  BeginPaint,hWnd,ADDR ps
    4.         invoke  EndPaint,hWnd,ADDR ps
    5.        
    6.         invoke  BeginPaint,hVWin,ADDR ps
    7.         invoke  BitBlt,eax,0,0,X_VWin,Y_VWin,V_WinDC,0,0,SRCCOPY
    8.         invoke  EndPaint,hVWin,ADDR ps
    Это просто куски кода с моего проекта, что бы меньше объяснять.
     
  2. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Great

    >Когда окно затирается другим, А потом снова появляется [...] винда [...] посылает WM_PAINT [...]

    На всякий случай: в данном топике окно - WS_EX_LAYERED, т.е. другим оно не затирается никогда, и винда соответствующего WM_PAINT не посылает.
     
  3. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    S_Alex
    А зачем всё это, раз и так всё работает? И куда проще.
     
  4. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    mc black
    А затем, что рисовать в такое окно можно когда угодно и что угодно и выводить когда нужно.

    Ну тогда юзай UpdateLayeredWindow вместо UpdateWindow.
     
  5. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Не-а. У UpdateLayeredWindow назначение совсем другое. Разве что мне захочется измениь параметры прозрачности и colorkey. У себя же мне просто надо было перерисовать календарик на месяц вперед/назад, что я и сделал. То, что в такое окно можно когда угодно и что угодно и выводить когда нужно, учту на будущее ;) Thanks!