ImageList_DragMove почему-то прозрачная

Тема в разделе "WASM.BEGINNERS", создана пользователем Consto, 23 июл 2006.

  1. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    Двигаю картинку на WM_MOUSEMOVE
    делаю ImageList_DragMove, но почему-то рисуется наполовину прозрачная
    и слишком много жрёт ЦП(видел в одной проге, там 3%ЦП, а у меня -70%ЦП (правда может там и не ImageList_))
     
  2. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    А вообще я сделал курсором, но прочитал пугающую вещь: максимальный размер курсора зависит от видеокарты. может быть кто-нибудь знает какой он у слабенькой видюхи
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Размер стандартного курсора - 32х32.

    Так и должно быть.
     
  4. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    и что придётся самому: сохранять фон, рисовать, восстанавливать фон,сохранять фон, рисовать, восстанавливать фон,сохранять фон, рисовать, восстанавливать фон,сохранять фон, рисовать, восстанавливать фон,сохранять фон, рисовать, восстанавливать фон,сохранять фон, рисовать, восстанавливать фон,......ужас. Да?
     
  5. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    почему ImageList_Draw может нормальнорисовать, а ImageList_DragMove нет
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Consto
    Так Draw просто рисует картинку согласно требованиям юзера, хоть прозрачную, хоть полупрозрачную, хоть слоёную, хоть обычную... А DragMove предназначена для рисования стандартной drag-n-drop иконки, которая обычно имеет прозрачность.

    Если картинка маленькая и не многоцветная, то можно динамически превращать её в курсор (API CreateCursor) и назначать текущим курсором (API SetCursor). Ничего стирать/перерисовывать не нужно будет. А если картинка большая, то Вы уже сами знаете что делать :) Кстати, есть ещё 3й вариант: делаем дочернее окно размером с картинку и с возможностью таскания по всей клиентской области родительского окна.
     
  7. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    75x75 сойдет для маленькой?
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Consto
    Возможно, будет работать на современных машинах, но по стандарту должно быть исключительно 32х32.
     
  9. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    Quantum
    1)если картинка не прямоугольная можно ли как нибудь сделать это дочернее окно прозрачным кроме рисунка на нём(сейчас мучился с WS_EX_TRANSPARENT чё-то не то)?
     
  10. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    2)на главном окне ещё одна картинка(рисуется на WM_PAINT) не охото её каждый раз перерисовывать(большая) да и мелькает, поставил CS_SAVEBITS но почуму-то WM_Paint всё равно приходит
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    В ответ на WM_ERASEBKGND ничего не делать и возвращать не ноль.

    Кому поставил этот стиль? Дочернему окну нужно.
     
  12. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    Quantum
    Quantum
    при перемещении дочернего окна на нём остаётся старая картинка, а должно появится то, что под ним. Но это ладно, буду рисовать часть картинки с главного окна

    Quantum
    туда и поставил:
    mov wc.lpszClassName, offset curso
    mov wc.lpfnWndProc,offset cursproc
    mov wc.hCursor, 0
    mov wc.hIconSm, 0
    mov wc.hbrBackground,0
    mov wc.style,CS_SAVEBITS
    invoke RegisterClassEx, ADDR wc
    INVOKE CreateWindowEx, 0, addr curso, ADDR szDisplayName, WS_VISIBLE or WS_CHILD or WS_SIZEBOX or WS_CAPTION,100, 100, 200, 200, hWnd, 0, hInst, NULL
     
  13. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    бросил меня Quantum....эх-хе-хэх...
    значит буду делать как в посте №4
     
  14. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    В таком случае единственный плюс от использования дочернего окна - перетаскивание осуществляет система. Самостоятельно обрабатывать сообщения мыши (использовать SetCapture) не так сложно... Возможно, имеет смысл бросить идею с окном. Я бы сделал так:

    1. Как только приходит WM_LBUTTONDOWN и координаты соответствуют картинке (Можно быстро проверить через PtInRect), вызываем SetCapture, чтоб все мышиные сообщения далее приходили к нам.

    Нужно срочно отойти :dntknw: Позже допишу.
     
  15. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    я уже сделал :))
    по сути не так уж и трудно ручками делать,
    при размере 41х41 жрёт 3-8%ЦП на celeron 1200, по-моему нормально

    если кому интересно:
    Код (Text):
    1. на WM_LBUTTONDOWN скопировал гл.окно в g1
    2.  
    3. WM_MOUSEMOVE
    4. обновляю нужные области копированием g1
    5. ....
    6. invoke BitBlt,dcBuf1,0,0,siz,siz,g1,x,y,SRCCOPY
    7. invoke CreatePatternBrush,dc1bmp
    8. invoke SelectObject,dcBuf1,eax
    9. invoke DeleteObject,eax
    10. invoke StretchBlt,dcBuf1,0,0,siz,siz,dcWithRisunok,0,0,50,47,SRCCOPY
    11. invoke ExtFloodFill,dcBuf1,1,1,8388736,FLOODFILLSURFACE
    12. invoke BitBlt,DC,x,y,siz,siz,dcBuf1,0,0,SRCCOPY
    dc1bmp это bitmap dcBuf1'а

    рационально, нет?
     
  16. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Получается, что удаляем дефолтовую кисть, которую удалять вообще нельзя, а новая кисть потом остаётся висеть в ресурсах GDI.
     
  17. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    Quantum
    60х60х4=15Kb не жалко

    почему?
     
  18. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Consto
    Это за один раз, а сколько раз вызывается эта процедура при перетаскивании? 10? 100? ...

    "An application should always replace a new object with the original, default object after it has finished drawing with the new object."
     
  19. Consto

    Consto New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    79
    Quantum
    invoke SelectObject,dcBuf1,eax
    <<<<<<<<<<<<<<<invoke DeleteObject,eax>>>>>>>>>>>>>>>>>
    так работает же... пока не тестировал на 98, если что доработаю
     
  20. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Делай как Microsoft говорит. :)
    Сказали в мануалах не удалять дефолтную кисть, значит не удалять. Хз, какие будут нововведения в последующих версиях системы, и как это потом отразится на программе...

    Это ведь не так сложно сделать ;) :

    HBRUSH hOldBrush = SelectObject(dc, NewBrush);
    // рисуем
    DeleteObject(SelectObject(dc, hOldBrush));