CompatibleDC

Тема в разделе "WASM.BEGINNERS", создана пользователем driver, 9 окт 2008.

  1. driver

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    Привет, если кто-то знает, как его создать, рисовать и печатать на нём текст и потом результат перетащить в окно... просьба проконсультировать... желательно на масме, если нетрудно.

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

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

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    CreateCompatibleDC :)
     
  3. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Надо просто привязать к нему битмап. И будет всё прекрасно рисоваться ;) Без него всё рисование на абстрактном DC будет возвращать ерроры.
     
  4. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    И, желательно, за границы этого битмапа не заходить.
     
  5. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Сопстно, пример. Не тестировал, однако должно работать

    Код (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 Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    DEEP
    CreateCompatibleBitmap - конечно хорошо, но для больших картинок (порядка 3000х2000 и больше) она у меня ошибку выдавала. Для них лучше использовать CreateDIBSection.
     
  7. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    ну дык этож для простейшего случая. а пример с CreateDIBSection я уже на форум где-то выкладывал.. правда там с первого раза не всем понятно)

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

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    пробовал печатать и переносить в контекст с помощью TransparentBlt - не получается ( хотелось бы чтобы текст был на текстуре, как-бы ) - в контесте окна это работает...
     
  9. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    driver
    Может перед тем как текст выводить вызвать
    invoke SetBkMode, hDC, TRANSPARENT
    ?
     
  10. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    А если BitBlt по маске?

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

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

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    DEEP
    пытался разобраться с этими операциями, пока туго.. попробую ещё

    slavanap

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

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Собственно, вот:
    Код (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 Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    driver
    Что значит "рисования"? Для всех выводов текста ф-циями DrawTextEx, TextOut и т. п. работает, проверял.
     
  14. driver

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    slavanap - спасибо, много очень кода , я бы столько не смог написать... :dntknw:(
     
  15. slavanap

    slavanap Вячеслав

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

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    с картами проблемы, денег хотят заних , к тому же меньше 100.000 секретные...

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