Создать кисть из части рисунка(BMP)

Тема в разделе "WASM.BEGINNERS", создана пользователем RDMess, 28 окт 2011.

  1. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Всем добрый вечер.

    Имеется BMP размером 20х42, задача состоим в том что нужно из середины(смещение справа 10х18) этой BMP создать кисть посредством CreatePatternBrush.

    Напишите пожалуйста по пунктам какие действия я должен реализовать для достижения результата!!!

    Спасибо за внимание.
     
  2. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Ящетаю, нужно создать в памяти ещё один битмап нужного для кисти размера, и перегнать в него данные (либо через BitBlt, либо вручную, построчно).
     
  3. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    в МСДН искать не пробовали?

    создать пустой битмап нужного размера и глубины цвета (CreateBitmap, CreateCompatibleBitmap, CreateDIBSection)
    скопировать в него часть БМП от смещения 10х18 и до куда хотите (BitBlt или GetDIBits-SetDIBits)
    убедиться, что либо у вас 8х8 битмап, либо это не будет использоваться на 95-й :)) есть такое упоминание в МСДН
    передать хендл битмапа в CreatePatternBrush (получив в результате хендл кисти).

    по-моему, так. Можно извратится: загрузить БМП в память (как набор данных), изменить заголовок (ширина-высота), удалить байты цвета (соответствующие лишним точкам), и передать ссылку на начало заголовка в CreateDIBPatternBrushPt. Это соответствует духу ассемблера, возлагает бОльшую часть работы на программиста, и требует на минимум 2 вызова процедур меньше. Но первый способ проще, практически.
     
  4. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    И опять же, насколько помню, не будет работать под Win95 (в силу отсутствия этой функции в либах).
    Хотя сам метод весьма любопытен! Я до такого в своё время не додумался.
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.876
    DEEP
    Загружаем изображение из файла при помощи LoadImage, передаем идентификатор функции CreatePatternBrush, создаем кисть и, с ее помощью, закрашиваем окно. И всё! Не нужно никаких BeginPaint и Endpaint, CreateCompatibleDC и DeleteDC, GetClientRect, BitBlt, SelectObject и DeleteObject... Никакой обработки WM_PAINT, ни каких дескрипторов и контекстов изображения, ни каких device context'ов Вот пример 25 переделанного урока Iczelion'а
    Код (Text):
    1. .586p
    2. .model tiny
    3. ;for WinXP - 586 bytes
    4. include windows.inc
    5. .code
    6. exebase         equ 400000h
    7. main:
    8. OPTION NOKEYWORD: <invoke>
    9. invoke MACRO Fn,args:VARARG
    10. LOCAL txt,arg
    11.     txt TEXTEQU <>
    12.     IRP arg,<args>
    13.     txt CATSTR <arg>, <!,>, txt
    14.     ENDM
    15. %   IRP arg,<txt>
    16.     push arg
    17.     ENDM
    18.     call Fn+exebase
    19. ENDM
    20. ;signatures----------------------------
    21. dosHeader       dd IMAGE_DOS_SIGNATURE;'MZ'
    22. ntHeader        dd IMAGE_NT_SIGNATURE;'PE'
    23. ;image_header--------------------------
    24. Machine         dw IMAGE_FILE_MACHINE_I386; (Intel386)
    25. Count_of_section    dw 1
    26. TimeStump       dd 0
    27. Symbol_table_offset dd 0
    28. Symbol_table_count  dd 0
    29. Size_of_optional_header dw section_table-optional_header;
    30. Characteristics     dw IMAGE_FILE_32BIT_MACHINE or \
    31.  IMAGE_FILE_RELOCS_STRIPPED or IMAGE_FILE_EXECUTABLE_IMAGE or \
    32.  IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_LOCAL_SYMS_STRIPPED
    33. ;-------------------------------------
    34. optional_header:
    35. Magic_optional_header   dw IMAGE_NT_OPTIONAL_HDR32_MAGIC
    36. Linker_version_major_and_minor dw 0
    37. Size_of_code        dd end_import-start
    38. Size_of_init_data   dd 0
    39. Size_of_uninit_data dd 0
    40. entry_point     dd start
    41. base_of_code        dd start
    42. base_of_data        dd 0
    43. image_base      dd exebase
    44. e_lfanew        dd ntHeader-dosHeader;section alignment
    45. file_alignment      dd 4
    46. OS_version_major_minor  dd 4
    47. image_version_major_minor dd 0
    48. subsystem_version_major_minor dd 4
    49. reserved1       dd 0
    50. size_of_image       dd end_import
    51. size_of_header      dd start
    52. checksum        dd 0
    53. subsystem_and_DLL_flag  dd IMAGE_SUBSYSTEM_WINDOWS_GUI
    54. Stack_allocation    dd 100000h
    55. Stack_commit        dd 1000h
    56. Heap_allocation     dd 100000h
    57. Heap_commit     dd 1000h
    58. loader_flag     dd 0
    59. number_of_dirs      dd (section_table-export_RVA)/8
    60. export_RVA          dd 0
    61. export_size         dd 0
    62. import_RVA          dd import
    63. import_size         dd end_import-import
    64. ;------------------------------------------------
    65. section_table       dd 'xet.','t'
    66. virtual_size        dd 0
    67. virtual_address     dd start
    68. Physical_size       dd end_import-start
    69. Physical_offset     dd start
    70. Relocations         dd 0
    71. Linenumbers     dd 0
    72. Relocations_and_Linenumbers_count dd 0
    73. Attributes              dd 0
    74. ;---------------------------------------------------------
    75. start:  xchg ebx,eax
    76.     mov esi,exebase;400000h
    77.     mov edi,offset wTitle+exebase
    78. ;------------------------------
    79. ; registering the window class
    80. ;------------------------------
    81.     invoke LoadImage,esi,edi,ebx,ebx,ebx,LR_LOADFROMFILE,ebx,edi
    82.     invoke CreatePatternBrush,eax
    83.     invoke RegisterClass,esp,ebx,offset window_procedure+\
    84.     exebase,ebx,ebx,esi,ebx,10011h,eax
    85. ;--------------------------+
    86. ; creating the main window |
    87. ;--------------------------+
    88.     push ebx
    89.     push esi
    90.     shl esi,9
    91.     invoke CreateWindowEx,ebx,edi,edi,WS_CAPTION or WS_SYSMENU or \
    92.     WS_MINIMIZEBOX or WS_VISIBLE,esi,esi,286,305,ebx,ebx     
    93.     mov ebp,esp
    94. ;---------------------------+
    95. ; entering the message loop |
    96. ;---------------------------+
    97. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    98.     invoke DispatchMessage,ebp
    99.     jmp message_loop
    100. ;----------------------+
    101. ; the window procedure |
    102. ;----------------------+
    103. window_procedure: cmp dword ptr [esp+08],WM_DESTROY
    104.     je short wmDESTROY
    105.     jmp DefWindowProc+exebase
    106. wmDESTROY: invoke ExitProcess,ebx
    107. ;---------------------------------------------                        
    108. wTitle db 'Images\tweety78.bmp';name of our window
    109. ;-------------------------------------------------
    110. import:
    111. dd 0,0,0,user32_dll,  user32_table
    112. dd 0,0,0,gdi32_dll,   gdi32_table
    113. dd 0,0,0,kernel32_dll,kernel32_table
    114. dd 0,0
    115. kernel32_table:
    116. ExitProcess             dd _ExitProcess,0
    117. user32_table:
    118. RegisterClass       dd _RegisterClass
    119. CreateWindowEx          dd _CreateWindowEx
    120. GetMessage              dd _GetMessage
    121. DispatchMessage         dd _DispatchMessage
    122. LoadImage       dd _LoadImage
    123. DefWindowProc           dd _DefWindowProc,0
    124. gdi32_table:
    125. CreatePatternBrush  dd _CreatePatternBrush
    126.                         dw 0
    127. _RegisterClass      db 0,0,'RegisterClassA'      
    128. _CreateWindowEx     db 0,0,'CreateWindowExA'
    129. _GetMessage     db 0,0,'GetMessageA'
    130. _DispatchMessage    db 0,0,'DispatchMessageA'
    131. _LoadImage      db 0,0,'LoadImageA'
    132. _DefWindowProc      db 0,0,'DefWindowProcA',0
    133. user32_dll      db 'user32'
    134. _ExitProcess        db 0,0,'ExitProcess',0
    135. kernel32_dll        db 'kernel32'
    136. _CreatePatternBrush db 0,0,'CreatePatternBrush',0
    137. gdi32_dll       db 'gdi32'
    138. end_import:
    139. end main
     
  6. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Mikl___,
    Ну, спасибо конечно, только я-то тут при чём? =)
    И, да — прочитайте, пожалуйста, задачу ТС:
    Т.е. не из всего битмапа, а лишь из части.
    Просто SetBrushOrg здесь не поможет, нужно именно что копировать область.
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.876
    DEEP
    Да задачу FatMoon уже решил, просто это был ответ на ваш "Хотя сам метод весьма любопытен!"
     
  8. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Всем здравствуйте, спасибо за помощь.

    Вот написал функцию на скорую руку, в общем заливка происходит и правильной формы рисунка но не цвета, он черный.

    Код (Text):
    1. CreatePatternBrushFromBmp proc hDC:DWORD, hBmp22:DWORD
    2.       LOCAL hOld1 :DWORD
    3.       LOCAL hOld2 :DWORD
    4.       LOCAL hCmpDC :DWORD
    5.       LOCAL hCmpDC2:DWORD
    6.       LOCAL hCmpBMP:DWORD
    7.         MOV hCmpDC2,FUNC(CreateCompatibleDC,hDC)
    8.         MOV hCmpDC ,FUNC(CreateCompatibleDC,EAX)
    9.         MOV hCmpBMP,FUNC(CreateCompatibleBitmap,EAX,8,42)
    10.         INVOKE SelectObject,hCmpDC ,EAX
    11.         MOV hOld1,EAX
    12.         INVOKE SelectObject,hCmpDC2,hBmp22
    13.         MOV hOld2,EAX
    14.         INVOKE BitBlt,hCmpDC,0,0,8,42,hCmpDC2,0,0,SRCCOPY
    15.        
    16.        
    17.         INVOKE SelectObject,hCmpDC,hOld1
    18.         INVOKE SelectObject,hCmpDC2,hOld2
    19.         INVOKE CreatePatternBrush,hCmpBMP
    20.         PUSH EAX
    21.         INVOKE DeleteObject, hCmpDC
    22.         INVOKE DeleteObject ,hCmpDC2
    23.        
    24.         INVOKE DeleteObject ,hCmpBMP
    25.         POP  EAX
    26.       RET
    27.     CreatePatternBrushFromBmp endp
    28.  
    29. ......
    30.  
    31.    INVOKE LoadBitmap,hInst,1702
    32.    MOV gControl.hBmp,EAX
    33.    INVOKE GetDlgItem,hWnd,IDC_BTNCHT
    34.    MOV hOldObj,EAX
    35.    INVOKE GetDC,EAX
    36.    MOV hDC,EAX
    37.    INVOKE CreatePatternBrushFromBmp,EAX,gControl.hBmp
    38.    MOV hBmpBrush2,EAX
    39.    INVOKE ReleaseDC,hOldObj,hDC
    40.  
    41.    .....
    Может из за того что LoadBitmap-ом загружаю ?
    Проверил LoadImage, то же самое(

    Спасибо за внимание.
     
  9. RDMess

    RDMess Member

    Публикаций:
    0
    Регистрация:
    28 дек 2009
    Сообщения:
    51
    Простите пожалуйста за мою невнимательность!

    Вопрос пока закрыт, Всем ОГРОМНОЕ спасибо!!!