Рисование линий в прозрачном окне

Тема в разделе "WASM.WIN32", создана пользователем Adrax, 21 ноя 2006.

  1. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Уважаемые программисты! Помогите в решении проблемы: создаю прозрачное окно и пытаюсь прорисовать в нём линию. Окно создаётся, линия - нет, или если есть, то невидимая. В общем, вопрос таков: как нарисовать видимую линию в прозрачном окне?
    Мой код такой:
    Код (Text):
    1. ...
    2. invoke  CreateWindowEx,WS_EX_LAYERED,klass,tityl,WS_POPUP+WS_VISIBLE,128,128,300,300,NULL,NULL,[wc.hInstance],NULL
    3.         mov [hwnd],eax
    4.         invoke SetLayeredWindowAttributes,hwnd,0ffh,00h,LWA_ALPHA
    5.         invoke UpdateWindow,[hwnd]
    6.  
    7. ;цикл обработки сообщений
    8.   msg_loop:
    9.         invoke  GetMessage,msg,NULL,0,0
    10.         or      eax,eax
    11.         jz      end_loop
    12.         invoke  TranslateMessage,msg
    13.         invoke  DispatchMessage,msg
    14.         jmp     msg_loop
    15.   end_loop:
    16.         invoke  ExitProcess,[msg.wParam]
    17.  
    18.  
    19.  
    20. proc Procedura hwnd,wmsg,wparam,lparam
    21.         push ebx
    22.         push esi
    23.         push edi
    24.         cmp     [wmsg],WM_DESTROY
    25.         je      Destroy
    26.         cmp [wmsg],WM_PAINT
    27.         je Paint
    28.  
    29.  
    30.         invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    31.         jmp     finish
    32.   Destroy:
    33.         invoke  PostQuitMessage,0
    34.         xor     eax,eax
    35.  
    36.   Paint:
    37.        invoke GetDC,[hwnd]
    38.         mov [hdc],eax
    39.         invoke GetClientRect,[hwnd],rc
    40.         invoke CreatePen,PS_SOLID,3,00ff00h
    41.         mov [hp],eax
    42.         invoke SelectObject,[hdc],[hp]
    43.         push eax
    44.         invoke MoveToEx,[hdc],[rc.left],[rc.top],NULL
    45.         invoke LineTo,[hdc],[rc.right],[rc.bottom]
    46.         pop eax
    47.         invoke DeleteObject,[hp]
    48.         invoke ReleaseDC,[hwnd],[hdc]
    49. ...
    Где я ошибся?
     
  2. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Adrax
    Если Вы принципиально против использования BeginPaint/EndPaint, то хотябы ValidateRect вызывайте в конце обработчика WM_PAINT. Иначе это сообщение зациклится.

    Также не ясен смысл push eax / pop eax.

    Удалять pen, который находится в DC, нельзя! Нужно сначала восстановить оригинальный pen.
     
  3. Arvensis

    Arvensis New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2004
    Сообщения:
    72
    Адрес:
    Russia
    Adrax
    Я так понимаю, вместо pop eax предполагалось invoke SelectObject, [hdc] ?
     
  4. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    1. GetDC/ReleaseDC заменить на BeginPaint/EndPaint
    2. Все-таки заменить pop eax на invoke SelectObject, [hdc] (хотя в принципе все будет работать и так)
    3. Ошибся ты в параметрах SetLayeredWindowAttributes
    нужно или
    invoke SetLayeredWindowAttributes,hwnd,0ffffffh,00h,LWA_COLORKEY
    или
    invoke SetLayeredWindowAttributes,hwnd,0h,<уровень прозрачности, например 0D0h>,LWA_ALPHA
     
  5. kero

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

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Nouzui

    >3. Ошибся ты в параметрах SetLayeredWindowAttributes
    >нужно или
    >invoke SetLayeredWindowAttributes,hwnd,0ffffffh,00h,LWA_COLORKEY
    >или
    >invoke SetLayeredWindowAttributes,hwnd,0h,<уровень прозрачности, например 0D0h>,LWA_ALPHA

    Не стоило этого говорить, ерунда ведь.
     
  6. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    Большое спасибо за советы, но - не помогло!
    Что нужно использовать не LWA_ALPHA, а LWA_COLORKEY, я понял. Возник другой вопрос: какой цвет "прозрачнить"?
    При создании окна я использовал COLOR_BTNFACE+1 - оно? Если да, то всё равно не помогает: окно непрозрачно, и линия в нём есть.
    Но как мне сделать прозрачное невидимое окно с нарисованной видимой линией??
     
  7. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Adrax
    Нет. Задайте окну монотонный фон (белый, к примеру) и "запрозрачните" этот самый цвет.
     
  8. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 Quantum
    Огромное спасибо!!!
     
  9. orbb

    orbb New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    16
    почему не ползуш регионов или DC Desktop ?
     
  10. Adrax

    Adrax Алексей

    Публикаций:
    0
    Регистрация:
    14 окт 2006
    Сообщения:
    135
    Адрес:
    г. Курск
    2 orbb
    Объясни, пожалуйста, как рисовать на DC Desktop?
     
  11. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Adrax,
    GetDC(0) - в EAX будет контекст десктопа