Всем добрый вечер. Имеется BMP размером 20х42, задача состоим в том что нужно из середины(смещение справа 10х18) этой BMP создать кисть посредством CreatePatternBrush. Напишите пожалуйста по пунктам какие действия я должен реализовать для достижения результата!!! Спасибо за внимание.
Ящетаю, нужно создать в памяти ещё один битмап нужного для кисти размера, и перегнать в него данные (либо через BitBlt, либо вручную, построчно).
в МСДН искать не пробовали? создать пустой битмап нужного размера и глубины цвета (CreateBitmap, CreateCompatibleBitmap, CreateDIBSection) скопировать в него часть БМП от смещения 10х18 и до куда хотите (BitBlt или GetDIBits-SetDIBits) убедиться, что либо у вас 8х8 битмап, либо это не будет использоваться на 95-й ) есть такое упоминание в МСДН передать хендл битмапа в CreatePatternBrush (получив в результате хендл кисти). по-моему, так. Можно извратится: загрузить БМП в память (как набор данных), изменить заголовок (ширина-высота), удалить байты цвета (соответствующие лишним точкам), и передать ссылку на начало заголовка в CreateDIBPatternBrushPt. Это соответствует духу ассемблера, возлагает бОльшую часть работы на программиста, и требует на минимум 2 вызова процедур меньше. Но первый способ проще, практически.
И опять же, насколько помню, не будет работать под Win95 (в силу отсутствия этой функции в либах). Хотя сам метод весьма любопытен! Я до такого в своё время не додумался.
DEEP Загружаем изображение из файла при помощи LoadImage, передаем идентификатор функции CreatePatternBrush, создаем кисть и, с ее помощью, закрашиваем окно. И всё! Не нужно никаких BeginPaint и Endpaint, CreateCompatibleDC и DeleteDC, GetClientRect, BitBlt, SelectObject и DeleteObject... Никакой обработки WM_PAINT, ни каких дескрипторов и контекстов изображения, ни каких device context'ов Вот пример 25 переделанного урока Iczelion'а Код (Text): .586p .model tiny ;for WinXP - 586 bytes include windows.inc .code exebase equ 400000h main: OPTION NOKEYWORD: <invoke> invoke MACRO Fn,args:VARARG LOCAL txt,arg txt TEXTEQU <> IRP arg,<args> txt CATSTR <arg>, <!,>, txt ENDM % IRP arg,<txt> push arg ENDM call Fn+exebase ENDM ;signatures---------------------------- dosHeader dd IMAGE_DOS_SIGNATURE;'MZ' ntHeader dd IMAGE_NT_SIGNATURE;'PE' ;image_header-------------------------- Machine dw IMAGE_FILE_MACHINE_I386; (Intel386) Count_of_section dw 1 TimeStump dd 0 Symbol_table_offset dd 0 Symbol_table_count dd 0 Size_of_optional_header dw section_table-optional_header; Characteristics dw IMAGE_FILE_32BIT_MACHINE or \ IMAGE_FILE_RELOCS_STRIPPED or IMAGE_FILE_EXECUTABLE_IMAGE or \ IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_LOCAL_SYMS_STRIPPED ;------------------------------------- optional_header: Magic_optional_header dw IMAGE_NT_OPTIONAL_HDR32_MAGIC Linker_version_major_and_minor dw 0 Size_of_code dd end_import-start Size_of_init_data dd 0 Size_of_uninit_data dd 0 entry_point dd start base_of_code dd start base_of_data dd 0 image_base dd exebase e_lfanew dd ntHeader-dosHeader;section alignment file_alignment dd 4 OS_version_major_minor dd 4 image_version_major_minor dd 0 subsystem_version_major_minor dd 4 reserved1 dd 0 size_of_image dd end_import size_of_header dd start checksum dd 0 subsystem_and_DLL_flag dd IMAGE_SUBSYSTEM_WINDOWS_GUI Stack_allocation dd 100000h Stack_commit dd 1000h Heap_allocation dd 100000h Heap_commit dd 1000h loader_flag dd 0 number_of_dirs dd (section_table-export_RVA)/8 export_RVA dd 0 export_size dd 0 import_RVA dd import import_size dd end_import-import ;------------------------------------------------ section_table dd 'xet.','t' virtual_size dd 0 virtual_address dd start Physical_size dd end_import-start Physical_offset dd start Relocations dd 0 Linenumbers dd 0 Relocations_and_Linenumbers_count dd 0 Attributes dd 0 ;--------------------------------------------------------- start: xchg ebx,eax mov esi,exebase;400000h mov edi,offset wTitle+exebase ;------------------------------ ; registering the window class ;------------------------------ invoke LoadImage,esi,edi,ebx,ebx,ebx,LR_LOADFROMFILE,ebx,edi invoke CreatePatternBrush,eax invoke RegisterClass,esp,ebx,offset window_procedure+\ exebase,ebx,ebx,esi,ebx,10011h,eax ;--------------------------+ ; creating the main window | ;--------------------------+ push ebx push esi shl esi,9 invoke CreateWindowEx,ebx,edi,edi,WS_CAPTION or WS_SYSMENU or \ WS_MINIMIZEBOX or WS_VISIBLE,esi,esi,286,305,ebx,ebx mov ebp,esp ;---------------------------+ ; entering the message loop | ;---------------------------+ message_loop: invoke GetMessage,ebp,ebx,ebx,ebx invoke DispatchMessage,ebp jmp message_loop ;----------------------+ ; the window procedure | ;----------------------+ window_procedure: cmp dword ptr [esp+08],WM_DESTROY je short wmDESTROY jmp DefWindowProc+exebase wmDESTROY: invoke ExitProcess,ebx ;--------------------------------------------- wTitle db 'Images\tweety78.bmp';name of our window ;------------------------------------------------- import: dd 0,0,0,user32_dll, user32_table dd 0,0,0,gdi32_dll, gdi32_table dd 0,0,0,kernel32_dll,kernel32_table dd 0,0 kernel32_table: ExitProcess dd _ExitProcess,0 user32_table: RegisterClass dd _RegisterClass CreateWindowEx dd _CreateWindowEx GetMessage dd _GetMessage DispatchMessage dd _DispatchMessage LoadImage dd _LoadImage DefWindowProc dd _DefWindowProc,0 gdi32_table: CreatePatternBrush dd _CreatePatternBrush dw 0 _RegisterClass db 0,0,'RegisterClassA' _CreateWindowEx db 0,0,'CreateWindowExA' _GetMessage db 0,0,'GetMessageA' _DispatchMessage db 0,0,'DispatchMessageA' _LoadImage db 0,0,'LoadImageA' _DefWindowProc db 0,0,'DefWindowProcA',0 user32_dll db 'user32' _ExitProcess db 0,0,'ExitProcess',0 kernel32_dll db 'kernel32' _CreatePatternBrush db 0,0,'CreatePatternBrush',0 gdi32_dll db 'gdi32' end_import: end main
Mikl___, Ну, спасибо конечно, только я-то тут при чём? =) И, да — прочитайте, пожалуйста, задачу ТС: Т.е. не из всего битмапа, а лишь из части. Просто SetBrushOrg здесь не поможет, нужно именно что копировать область.
Всем здравствуйте, спасибо за помощь. Вот написал функцию на скорую руку, в общем заливка происходит и правильной формы рисунка но не цвета, он черный. Код (Text): CreatePatternBrushFromBmp proc hDC:DWORD, hBmp22:DWORD LOCAL hOld1 :DWORD LOCAL hOld2 :DWORD LOCAL hCmpDC :DWORD LOCAL hCmpDC2:DWORD LOCAL hCmpBMP:DWORD MOV hCmpDC2,FUNC(CreateCompatibleDC,hDC) MOV hCmpDC ,FUNC(CreateCompatibleDC,EAX) MOV hCmpBMP,FUNC(CreateCompatibleBitmap,EAX,8,42) INVOKE SelectObject,hCmpDC ,EAX MOV hOld1,EAX INVOKE SelectObject,hCmpDC2,hBmp22 MOV hOld2,EAX INVOKE BitBlt,hCmpDC,0,0,8,42,hCmpDC2,0,0,SRCCOPY INVOKE SelectObject,hCmpDC,hOld1 INVOKE SelectObject,hCmpDC2,hOld2 INVOKE CreatePatternBrush,hCmpBMP PUSH EAX INVOKE DeleteObject, hCmpDC INVOKE DeleteObject ,hCmpDC2 INVOKE DeleteObject ,hCmpBMP POP EAX RET CreatePatternBrushFromBmp endp ...... INVOKE LoadBitmap,hInst,1702 MOV gControl.hBmp,EAX INVOKE GetDlgItem,hWnd,IDC_BTNCHT MOV hOldObj,EAX INVOKE GetDC,EAX MOV hDC,EAX INVOKE CreatePatternBrushFromBmp,EAX,gControl.hBmp MOV hBmpBrush2,EAX INVOKE ReleaseDC,hOldObj,hDC ..... Может из за того что LoadBitmap-ом загружаю ? Проверил LoadImage, то же самое( Спасибо за внимание.