CompatibleDC

Discussion in 'WASM.BEGINNERS' started by driver, Oct 9, 2008.

  1. driver

    driver New Member

    Blog Posts:
    0
    Joined:
    Jun 18, 2008
    Messages:
    302
    Привет, если кто-то знает, как его создать, рисовать и печатать на нём текст и потом результат перетащить в окно... просьба проконсультировать... желательно на масме, если нетрудно.

    Можно ли с помощью этой штуковины редактировать и форматировать текст до вывода его в окно редактора...?

    Читал мсдн, читал ... не работает что-то...
     
  2. censored

    censored New Member

    Blog Posts:
    0
    Joined:
    Jul 5, 2005
    Messages:
    1,615
    Location:
    деревня "Анонимные Прокси"
    CreateCompatibleDC :)
     
  3. DEEP

    DEEP Андрей

    Blog Posts:
    0
    Joined:
    Apr 27, 2008
    Messages:
    491
    Location:
    г. Владимир
    Надо просто привязать к нему битмап. И будет всё прекрасно рисоваться ;) Без него всё рисование на абстрактном DC будет возвращать ерроры.
     
  4. slavanap

    slavanap Вячеслав

    Blog Posts:
    0
    Joined:
    Sep 10, 2008
    Messages:
    300
    Location:
    Смоленск, Россия
    И, желательно, за границы этого битмапа не заходить.
     
  5. DEEP

    DEEP Андрей

    Blog Posts:
    0
    Joined:
    Apr 27, 2008
    Messages:
    491
    Location:
    г. Владимир
    Сопстно, пример. Не тестировал, однако должно работать

    Code (Text):
    1. ; <-- [Input]  Dim = LoWord - width, HiWord - height
    2. ; <-- [Output] EAX = Valid memory DC capable of drawing onto
    3. BuildAbstractDC proc Dim:DWORD;
    4.   invoke CreateCompatibleDC, 0;
    5.   PUSH EAX;
    6.   ADD ESP, -8;
    7.   MOV DWORD PTR [ESP], EAX;
    8.   MOVZX EDX, WORD PTR [Dim+2];
    9.   PUSH EDX;
    10.   MOVZX EDX, WORD PTR [Dim];
    11.   PUSH EDX;
    12.   PUSH EAX;
    13.   CALL CreateCompatibleBitmap;
    14.   MOV DWORD PTR [ESP+4], EAX;
    15.   CALL SelectObject;
    16.   POP EAX;
    17.   RET;
    18. BuildAbstractDC endp;
    19.  
    20.  
    21.  
    22. ; <-- [Input]  DC = Memory context to be freed
    23. FreeAbstractDC proc DC:HDC;
    24.   invoke GetCurrentObject, DC, OBJ_BITMAP;
    25.   PUSH EAX;
    26.   invoke DeleteDC, DC;
    27.   CALL DeleteObject;
    28.   RET;
    29. FreeAbstractDC endp;
     
  6. slavanap

    slavanap Вячеслав

    Blog Posts:
    0
    Joined:
    Sep 10, 2008
    Messages:
    300
    Location:
    Смоленск, Россия
    DEEP
    CreateCompatibleBitmap - конечно хорошо, но для больших картинок (порядка 3000х2000 и больше) она у меня ошибку выдавала. Для них лучше использовать CreateDIBSection.
     
  7. DEEP

    DEEP Андрей

    Blog Posts:
    0
    Joined:
    Apr 27, 2008
    Messages:
    491
    Location:
    г. Владимир
    ну дык этож для простейшего случая. а пример с CreateDIBSection я уже на форум где-то выкладывал.. правда там с первого раза не всем понятно)

    зы.
    ну конечно можно. CreateAbstractDC + DrawTextEx + BitBLT в руки и рысью-марш ;)
     
  8. driver

    driver New Member

    Blog Posts:
    0
    Joined:
    Jun 18, 2008
    Messages:
    302
    пробовал печатать и переносить в контекст с помощью TransparentBlt - не получается ( хотелось бы чтобы текст был на текстуре, как-бы ) - в контесте окна это работает...
     
  9. slavanap

    slavanap Вячеслав

    Blog Posts:
    0
    Joined:
    Sep 10, 2008
    Messages:
    300
    Location:
    Смоленск, Россия
    driver
    Может перед тем как текст выводить вызвать
    invoke SetBkMode, hDC, TRANSPARENT
    ?
     
  10. DEEP

    DEEP Андрей

    Blog Posts:
    0
    Joined:
    Apr 27, 2008
    Messages:
    491
    Location:
    г. Владимир
    А если BitBlt по маске?

    шаг 1. Пишем на одном DC текст (задник белый, текст чёрный), выводим его на "целевой" DC с параметром SRCAND.
    шаг 2. Копируем картинку текстуры на DC текста с параметром SRCERASE.
    шаг 3. Копируем получившееся на "целевой" через SRCPAINT.

    Ненамного медленнее, зато совместимо со всеми виндами и работает для всех типов DC.
     
  11. driver

    driver New Member

    Blog Posts:
    0
    Joined:
    Jun 18, 2008
    Messages:
    302
    DEEP
    пытался разобраться с этими операциями, пока туго.. попробую ещё

    slavanap

    SetBkMode работает для эдита, а вот для рисования текста будет работать?
    Загорелось написать свой текстовый редактор... утереть нос мелкософту.... займусь им плотно, немного только аклимаюсь от написания своей оси...
     
  12. slavanap

    slavanap Вячеслав

    Blog Posts:
    0
    Joined:
    Sep 10, 2008
    Messages:
    300
    Location:
    Смоленск, Россия
    Собственно, вот:
    Code (Text):
    1. TransparentBlt proc DstDC:DWORD, DstX:DWORD, DstY:DWORD, DstW:DWORD, DstH:DWORD,
    2.     SrcDC:DWORD, SrcX:DWORD, SrcY:DWORD, MaskDC:DWORD, MaskX:DWORD, MaskY:DWORD
    3.   ROP_DSTCOPY = 00AA0029h
    4.   LOCAL MemDC   : DWORD
    5.   LOCAL MemBmp  : DWORD
    6.   LOCAL Save    : DWORD
    7.   LOCAL crText  : DWORD
    8.   LOCAL crBack  : DWORD
    9.       INVOKE CreateCompatibleDC, 0
    10.       OR   EAX, EAX
    11.       JE   @Error
    12.       MOV  MemDC, EAX
    13.       INVOKE CreateCompatibleBitmap, SrcDC, DstW, DstH
    14.       OR   EAX, EAX
    15.       JE   @Error
    16.       MOV  MemBmp, EAX
    17.       INVOKE SelectObject, MemDC, MemBmp
    18.       MOV  Save, EAX
    19.       INVOKE BitBlt, MemDC, 0, 0, DstW, DstH, MaskDC, MaskX, MaskY, SRCCOPY
    20.       INVOKE BitBlt, MemDC, 0, 0, DstW, DstH, SrcDC, SrcX, SrcY, SRCERASE
    21.       INVOKE SetTextColor, DstDC, 0
    22.       MOV  crText, EAX
    23.       INVOKE SetBkColor, DstDC, 0FFFFFFh
    24.       MOV  crBack, EAX
    25.       INVOKE BitBlt, DstDC, DstX, DstY, DstW, DstH, MaskDC, MaskX, MaskY, SRCAND
    26.       INVOKE BitBlt, DstDC, DstX, DstY, DstW, DstH, MemDC, 0, 0, SRCINVERT
    27.       INVOKE SetTextColor, DstDC, crText
    28.       INVOKE SetBkColor, DstDC, crBack
    29.       .IF Save != 0
    30.             INVOKE SelectObject, MemDC, Save
    31.       .ENDIF
    32.       INVOKE DeleteObject, MemBmp
    33.       INVOKE DeleteDC, MemDC
    34.       MOV  EAX, 1
    35.       JMP  @Exit
    36.   @Error:
    37.       XOR  EAX, EAX
    38.   @Exit:
    39.       RET
    40. TransparentBlt Endp
     
  13. slavanap

    slavanap Вячеслав

    Blog Posts:
    0
    Joined:
    Sep 10, 2008
    Messages:
    300
    Location:
    Смоленск, Россия
    driver
    Что значит "рисования"? Для всех выводов текста ф-циями DrawTextEx, TextOut и т. п. работает, проверял.
     
  14. driver

    driver New Member

    Blog Posts:
    0
    Joined:
    Jun 18, 2008
    Messages:
    302
    slavanap - спасибо, много очень кода , я бы столько не смог написать... :dntknw:(
     
  15. slavanap

    slavanap Вячеслав

    Blog Posts:
    0
    Joined:
    Sep 10, 2008
    Messages:
    300
    Location:
    Смоленск, Россия
    driver
    //offtop
    давно это было... тогда я еще движок для своей карты области писал. Только так и не дописал: не смог найти данные. Кстати, не знаешь где векторное изображение карты Смоленской области найти?
     
  16. driver

    driver New Member

    Blog Posts:
    0
    Joined:
    Jun 18, 2008
    Messages:
    302
    с картами проблемы, денег хотят заних , к тому же меньше 100.000 секретные...

    видел вроде выкладывали на nnm.ru , поиск там работает но файлы хранятся не очень долго - на рапиде и депозите...