Создание региона

Тема в разделе "WASM.BEGINNERS", создана пользователем Sturgeon, 9 июл 2007.

  1. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    S_Alex
    Если убрать обслуживание WM_PAINT, то картинку нельзя сдвинуть с места:dntknw:
    Посмотри мой вариант, там создание региона без GetPixel, достаточно быстрое
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    S_Alex я был не прав
    Sturgeon,kero
    я сделал это!
    Сорц и ехе в аттаче
     
  3. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Исправил ошибки
     
  4. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Mikl__
    Здорово соображаешь! Я даже завидую, в хорошем смысле этого слова.:)
    Когда нибудь я тоже так буду уметь. Чтобы не по подсказкам, а самому.
    Спасибо за советы!
     
  5. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Наверное, не все: число открытых hGDI - аж за 200.
    В наличии CreateRectRgn, CreatePatternBrush,.. - а где же DeleteObject ?
    ---
    И как это может с WS_POPUP - не получиться ? :)
    Да в вашем коде WS_OVERLAPPEDWINDOW вообще не обязателен,
    просто в SetWindowLong замените ebx (dwNewLong) на WS_POPUP - и все.

    Что-то последнее время то и дело приходится вступаться за WS_POPUP :)
    ---
    Однако тут есть еще один интересный момент (о котором опять-таки недавно довелось упоминать :) )

    Если в коде lesson45-4
    заменить
    Код (Text):
    1.   push WS_OVERLAPPEDWINDOW
    2.   ...
    3.   call CreateWindowExA
    на
    Код (Text):
    1.   push WS_POPUP
    2.   ...
    3.   call CreateWindowExA
    + вообще выкинуть
    Код (Text):
    1.   push ebx  ;dwNewLong
    2.   push GWL_STYLE    ; nIndex
    3.   push eax;hWnd
    4.   call SetWindowLongA
    а потом скомпилить и запустить, - то ой, окна не видим.
    Но не потому, что не получилось, а потому, что его рект = (0,0,0,0).
    А знаете, почему он такой ?
    Да потому, что у MS "переменная константа" CW_USEDEFAULT предназначена для работы именно с WS_OVERLAPPED(WINDOW) окнами (правда, это всего лишь мое имхо).
    Итак, заменяем
    Код (Text):
    1. mov ecx,CW_USEDEFAULT
    на подходящую конкретику, например -
    Код (Text):
    1. mov ecx,300
    - и радуемся за WS_POPUP :)
     
  6. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    Кто-нибудь пробовал переделать BmpButton из m32 Lib?.
    Эта функция создает окно, извлекает из ресурса битмап и вешает его на окно - подгоняя размеры окна по размеру битмапа , ну и и код обработки сообщений от мыши.
    Я её взял - упростил до предела - мне нужно было .что-бы картинку можно было быстро вставить в определенное место, а потом и убрать, если нужно - фон должен остаться ... и т.д.

    Кто хочет может посмотреть прогу - исходника нет (:)) , 36 кило:
    http://www.eddyeditor.narod.ru - EBCreator.

    Можно ли изменить стиль окна, которое создает функция, что-бы оно было с закругленными углами, например ? И будет ли битмап обрезаться по границам окна? Щас просто по дебильному сделал - с регионами не смог разобраться...:dntknw:
     
  7. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Исправил ошибки-2 :) (в аттаче сорц и exe)
    стиль WS_POPUP+WS_VISIBLE
    убрал ShowWindow, UpdateWindow, InvalidateRect, SetWindowLong
    добавил DeleteObject (чтоб не было 200 открытых hGDI)
    2kero
    Насчет "200 открытых hGDI", как вы их обнаружили, через Ice?
     
  8. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Нет, с помощью самопальной недоделки 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.
     
  9. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Veter

    Работа с регионами Windows GDI. Создание непрямоугольных окон
    Создание окна в виде эллипса (WinAPI и MFC)
    Создание прямоугольного окна с закругленными краями (WinAPI и MFC)
    Демонстрация CombineRgn (WinAPI и MFC)
    Создание окна в виде забора (WinAPI и MFC)
    Трансформации регионов (WinAPI и MFC)
    http://www.rsdn.ru/article/gdi/regions.xml
     
  10. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Исправил ошибки-3 :) (в аттаче сорц и exe)
    стиль WS_POPUP
    вернул ShowWindow (при создании окна красный фон не моргает)
    добавил WS_EX_TOOLWINDOW
     
  11. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    А никто не пробовал делать анимированный регион?
    Я вот чего-то второй день сижу и туплю. Недавно создавал тему, про анимацию из БМП. А теперь мне чего-то пришло в голову совместить эти два знания. Но почему-то они не совмещаются. Получается либо регион, либо анимация, а вместе никак.
     
  12. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Sturgeon

    Делал, хоть и не на асм. То было давно и то было vb6. Суть такова: создаешь все кадры - по одному региону на кадр и по одной картинке. После создания начинаешь отображать их по очереди. Без кэширования при загрузке формы может не получиться, т.к. регионы отрисовываются не моментально.

    Если картинка маленькая и обрабатывается моментально, то сможешь справиться сходу SetLayeredWindow с LMA_COLORKEY, рисованием на форме в обработчике WM_PAINT. Понадобятся также SetTimer, WM_TIMER и InvalidateRect. Мерцания будут или нет, не знаю..
     
  13. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
  14. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    Mikl__ - спасибо.
    Вчера не смог не смог открыть ссылку - что-то не в порядке у нас в стране с инетом последние 2 года...Попробую еще ...

    Где-то сдесь скачал исходник - DoublSnapFromPoint_mask.
    Работает странно на моей железяке, но работает . Очень интересный и полезный (для начинающих самое главное, что исходник - из одного файла - намного проще разобраться,мне кажется).
    Спасибо тому.кто повесил и кто написал...:)
     
  15. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    А как насчет защиты от стильных надругательств ? :)
    Т.е. по WM_STYLECHANGING - восстанавливать родные WS_/WS_EX_ :)
     
  16. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Не уточните - что значит "странно работает" ?
     
  17. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Спасибо за ссылку. Как раз то, что нужно.
    Правда, немного сложнее чем я думал, но, в принципе, разобраться смогу. Если что, вернусь;)
    P.S. Сразу же и вернулся. Вопрос такой. Во всех сорцах лежит файл Bitmap.asm. Как я понимаю это картинка переведенная в бинарник? А можно ли сделать то же самое, но чтобы картинка бралась из ресурсов? Это я спрашиваю не потому, что я лодырь. Я обязательно попробую это сделать сам. Но просто хочу заранее спросить можно ли такое сделать вообще. Вот.
     
  18. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Sturgeon
    В файле XXX.rc
    Код (Text):
    1. #define IDB_MAIN 1
    2. IDB_MAIN BITMAP "tweety78.bmp"
    В файле XXX.asm
    Код (Text):
    1. .const
    2. IDB_MAIN   equ 1
    3. ...
    4. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    5.    LOCAL rect:RECT
    6.    LOCAL ps:PAINTSTRUCT
    7. ...
    8. @@WM_CREATE:
    9.     push IDB_MAIN
    10.     push hInstance
    11.     call _imp__LoadBitmapA@8
    12.              mov hBitmap,eax
    13. ...
    14. @@WM_PAINT: push esp;ps в локальных переменных
    15. ;загружен последним и на него указывает esp
    16.     push hWnd
    17.              call _imp__BeginPaint@8
    18.              mov hdc,eax
    19.     push eax
    20.              call _imp__CreateCompatibleDC@4
    21.              mov hMemDC,eax;
    22.     push hBitmap
    23.     push eax
    24.              call _imp__SelectObject@8
    25.     lea edi,rect
    26.     assume edi:ptr RECT
    27.     push edi
    28.     push hWnd
    29.         call _imp__GetClientRect@8
    30.     push SRCCOPY
    31.     push 0
    32.     push 0
    33.     push hMemDC
    34.     push [edi].bottom
    35.     push [edi].right
    36.     push 0
    37.     push 0
    38.     push hdc
    39.              call _imp__BitBlt@36
    40.     push hMemDC
    41.              call _imp__DeleteDC@4
    42.     push esp;&ps для EndPaint
    43.     push hWnd
    44.              call _imp__EndPaint@8
    45.              ret
     
  19. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Mikl__
    Спасибо за код!
    Я как раз сейчас сижу и пытаюсь переложить один из примеров на МАСМ.
    Я в принципе знал, что ТАСМ и МАСМ различаются, но таких заморочек я не предпологал. Хотя, может это с непривычки и от нехватки опыта.
    Как переведу на МАСМ, выложу здесь. Или если совсем запутаюсь, тоже приду плакаться.
     
  20. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Sturgeon
    Я пишу на MASM, но не использую invoke, все что вам требуется, это заменить
    Код (Text):
    1.     push edi
    2.     push hWnd
    3.         call _imp__GetClientRect@8 -> invoke GetClientRect, hWnd, edi