S_Alex Если убрать обслуживание WM_PAINT, то картинку нельзя сдвинуть с места Посмотри мой вариант, там создание региона без GetPixel, достаточно быстрое
Mikl__ Здорово соображаешь! Я даже завидую, в хорошем смысле этого слова. Когда нибудь я тоже так буду уметь. Чтобы не по подсказкам, а самому. Спасибо за советы!
Наверное, не все: число открытых hGDI - аж за 200. В наличии CreateRectRgn, CreatePatternBrush,.. - а где же DeleteObject ? --- И как это может с WS_POPUP - не получиться ? Да в вашем коде WS_OVERLAPPEDWINDOW вообще не обязателен, просто в SetWindowLong замените ebx (dwNewLong) на WS_POPUP - и все. Что-то последнее время то и дело приходится вступаться за WS_POPUP --- Однако тут есть еще один интересный момент (о котором опять-таки недавно довелось упоминать ) Если в коде lesson45-4 заменить Код (Text): push WS_OVERLAPPEDWINDOW ... call CreateWindowExA на Код (Text): push WS_POPUP ... call CreateWindowExA + вообще выкинуть Код (Text): push ebx ;dwNewLong push GWL_STYLE ; nIndex push eax;hWnd call SetWindowLongA а потом скомпилить и запустить, - то ой, окна не видим. Но не потому, что не получилось, а потому, что его рект = (0,0,0,0). А знаете, почему он такой ? Да потому, что у MS "переменная константа" CW_USEDEFAULT предназначена для работы именно с WS_OVERLAPPED(WINDOW) окнами (правда, это всего лишь мое имхо). Итак, заменяем Код (Text): mov ecx,CW_USEDEFAULT на подходящую конкретику, например - Код (Text): mov ecx,300 - и радуемся за WS_POPUP
Кто-нибудь пробовал переделать BmpButton из m32 Lib?. Эта функция создает окно, извлекает из ресурса битмап и вешает его на окно - подгоняя размеры окна по размеру битмапа , ну и и код обработки сообщений от мыши. Я её взял - упростил до предела - мне нужно было .что-бы картинку можно было быстро вставить в определенное место, а потом и убрать, если нужно - фон должен остаться ... и т.д. Кто хочет может посмотреть прогу - исходника нет () , 36 кило: http://www.eddyeditor.narod.ru - EBCreator. Можно ли изменить стиль окна, которое создает функция, что-бы оно было с закругленными углами, например ? И будет ли битмап обрезаться по границам окна? Щас просто по дебильному сделал - с регионами не смог разобраться...
Исправил ошибки-2 (в аттаче сорц и exe) стиль WS_POPUP+WS_VISIBLE убрал ShowWindow, UpdateWindow, InvalidateRect, SetWindowLong добавил DeleteObject (чтоб не было 200 открытых hGDI) 2kero Насчет "200 открытых hGDI", как вы их обнаружили, через Ice?
Нет, с помощью самопальной недоделки PrintLayered, а она - через GetGuiResources (для win>=2k-pro): GetWindowThreadProcessId (hWnd,addr ProcessId) hProcess = OpenProcess (PROCESS_QUERY_INFORMATION,FALSE,ProcessId) GetGuiResources (hProcess,GR_GDIOBJECTS) CloseHandle (hProcess) А зря: теперь заметно промаргивание красного фона при создании окна. Не критично, конечно, но не аккуратно как-то Кстати, при протаскивании окна все-таки прозрачная части окна "проявляется"... А еще таскбарная кнопка что-то не того... Т.е. надо бы добавить либо WS_SYSMENU, либо WS_EX_TOOLWINDOW.
Veter Работа с регионами Windows GDI. Создание непрямоугольных окон Создание окна в виде эллипса (WinAPI и MFC) Создание прямоугольного окна с закругленными краями (WinAPI и MFC) Демонстрация CombineRgn (WinAPI и MFC) Создание окна в виде забора (WinAPI и MFC) Трансформации регионов (WinAPI и MFC) http://www.rsdn.ru/article/gdi/regions.xml
Исправил ошибки-3 (в аттаче сорц и exe) стиль WS_POPUP вернул ShowWindow (при создании окна красный фон не моргает) добавил WS_EX_TOOLWINDOW
А никто не пробовал делать анимированный регион? Я вот чего-то второй день сижу и туплю. Недавно создавал тему, про анимацию из БМП. А теперь мне чего-то пришло в голову совместить эти два знания. Но почему-то они не совмещаются. Получается либо регион, либо анимация, а вместе никак.
Sturgeon Делал, хоть и не на асм. То было давно и то было vb6. Суть такова: создаешь все кадры - по одному региону на кадр и по одной картинке. После создания начинаешь отображать их по очереди. Без кэширования при загрузке формы может не получиться, т.к. регионы отрисовываются не моментально. Если картинка маленькая и обрабатывается моментально, то сможешь справиться сходу SetLayeredWindow с LMA_COLORKEY, рисованием на форме в обработчике WM_PAINT. Понадобятся также SetTimer, WM_TIMER и InvalidateRect. Мерцания будут или нет, не знаю..
Mikl__ - спасибо. Вчера не смог не смог открыть ссылку - что-то не в порядке у нас в стране с инетом последние 2 года...Попробую еще ... Где-то сдесь скачал исходник - DoublSnapFromPoint_mask. Работает странно на моей железяке, но работает . Очень интересный и полезный (для начинающих самое главное, что исходник - из одного файла - намного проще разобраться,мне кажется). Спасибо тому.кто повесил и кто написал...
А как насчет защиты от стильных надругательств ? Т.е. по WM_STYLECHANGING - восстанавливать родные WS_/WS_EX_
Спасибо за ссылку. Как раз то, что нужно. Правда, немного сложнее чем я думал, но, в принципе, разобраться смогу. Если что, вернусь P.S. Сразу же и вернулся. Вопрос такой. Во всех сорцах лежит файл Bitmap.asm. Как я понимаю это картинка переведенная в бинарник? А можно ли сделать то же самое, но чтобы картинка бралась из ресурсов? Это я спрашиваю не потому, что я лодырь. Я обязательно попробую это сделать сам. Но просто хочу заранее спросить можно ли такое сделать вообще. Вот.
Sturgeon В файле XXX.rc Код (Text): #define IDB_MAIN 1 IDB_MAIN BITMAP "tweety78.bmp" В файле XXX.asm Код (Text): .const IDB_MAIN equ 1 ... WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL rect:RECT LOCAL ps:PAINTSTRUCT ... @@WM_CREATE: push IDB_MAIN push hInstance call _imp__LoadBitmapA@8 mov hBitmap,eax ... @@WM_PAINT: push esp;ps в локальных переменных ;загружен последним и на него указывает esp push hWnd call _imp__BeginPaint@8 mov hdc,eax push eax call _imp__CreateCompatibleDC@4 mov hMemDC,eax; push hBitmap push eax call _imp__SelectObject@8 lea edi,rect assume edi:ptr RECT push edi push hWnd call _imp__GetClientRect@8 push SRCCOPY push 0 push 0 push hMemDC push [edi].bottom push [edi].right push 0 push 0 push hdc call _imp__BitBlt@36 push hMemDC call _imp__DeleteDC@4 push esp;&ps для EndPaint push hWnd call _imp__EndPaint@8 ret
Mikl__ Спасибо за код! Я как раз сейчас сижу и пытаюсь переложить один из примеров на МАСМ. Я в принципе знал, что ТАСМ и МАСМ различаются, но таких заморочек я не предпологал. Хотя, может это с непривычки и от нехватки опыта. Как переведу на МАСМ, выложу здесь. Или если совсем запутаюсь, тоже приду плакаться.
Sturgeon Я пишу на MASM, но не использую invoke, все что вам требуется, это заменить Код (Text): push edi push hWnd call _imp__GetClientRect@8 -> invoke GetClientRect, hWnd, edi