из memory DC в memory DC

Тема в разделе "WASM.WIN32", создана пользователем cresta, 13 июл 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Можно ли перегружать из одного DC, созданного CreateCompatibleDC, в другой такой же? Что-то вроде промежуточного DC.

    Если можно, то почему такая штука не работает?


    Код (Text):
    1. ShowBitmap proc hDC:DWORD
    2.     LOCAL bi                        :BITMAP
    3.     LOCAL Rct                       :RECT
    4.     LOCAL memDC                     :DWORD
    5.     LOCAL tmpDC                     :DWORD
    6.     LOCAL tmpBmp                    :DWORD
    7.     LOCAL screenDC                  :DWORD
    8.     LOCAL xSrc,ySrc                 :DWORD
    9.     LOCAL xDest,yDest,wDest,hDest   :DWORD
    10.    
    11.     invoke  GetObject,hCurrBmp,sizeof BITMAP,ADDR bi
    12.     .if     (!hDC)
    13.         mov     screenDC,FUNC(GetDC,hScreen)
    14.     .else
    15.         m2m     screenDC,hDC
    16.     .endif
    17.     mov     memDC,FUNC(CreateCompatibleDC,screenDC)
    18.     mov     tmpDC,FUNC(CreateCompatibleDC,memDC)
    19.     mov     tmpBmp,FUNC(CreateCompatibleBitmap,tmpDC,screen_w,screen_h)
    20.     invoke  SelectObject,tmpDC,tmpBmp
    21.     invoke  SelectObject,memDC,hCurrBmp
    22.  
    23.     mov     eax,screen_w
    24.     .if     eax < bi.bmWidth
    25.         mov xDest,0
    26.         m2m wDest,screen_w
    27.     .else
    28.         m2m wDest,bi.bmWidth
    29.         sub eax,bi.bmWidth
    30.         shr eax,1
    31.         mov xDest,eax
    32.     .endif
    33.     mov     eax,screen_h
    34.     .if     eax < bi.bmHeight
    35.         mov yDest,0
    36.         m2m hDest,screen_h
    37.     .else
    38.         m2m hDest,bi.bmHeight
    39.         sub eax,bi.bmHeight
    40.         shr eax,1
    41.         mov yDest,eax
    42.     .endif
    43.     invoke  BitBlt,tmpDC,xDest,yDest,wDest,hDest,memDC,0,0,SRCCOPY
    44.     invoke  BitBlt,screenDC,0,0,screen_w,screen_h,tmpDC,0,0,SRCCOPY
    45.     invoke  DeleteDC,memDC
    46.     invoke  DeleteDC,tmpDC
    47.     invoke  DeleteObject,tmpBmp
    48.     .if     (!hDC)
    49.         invoke  ReleaseDC,hScreen,screenDC
    50.     .endif




    P.S.

    Если использовать один memDC, и с него сразу на screenDC рисовать, то битмап выводится.
     
  2. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    mov tmpDC,FUNC(CreateCompatibleDC,memDC)

    Логичнее так:

    mov tmpDC,FUNC(CreateCompatibleDC,screenDC)



    mov tmpBmp,FUNC(CreateCompatibleBitmap,tmpDC,screen_w,screen_h)

    Вместо tmpDC надо подставлять screenDC! Иначе картинка будет чёрно-белой.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Quantum





    Данке! Вот сейчас работает :)









    Работают оба варианта.



    Спасибо.