Уважаемые программисты! Помогите в решении проблемы: создаю прозрачное окно и пытаюсь прорисовать в нём линию. Окно создаётся, линия - нет, или если есть, то невидимая. В общем, вопрос таков: как нарисовать видимую линию в прозрачном окне? Мой код такой: Код (Text): ... invoke CreateWindowEx,WS_EX_LAYERED,klass,tityl,WS_POPUP+WS_VISIBLE,128,128,300,300,NULL,NULL,[wc.hInstance],NULL mov [hwnd],eax invoke SetLayeredWindowAttributes,hwnd,0ffh,00h,LWA_ALPHA invoke UpdateWindow,[hwnd] ;цикл обработки сообщений msg_loop: invoke GetMessage,msg,NULL,0,0 or eax,eax jz end_loop invoke TranslateMessage,msg invoke DispatchMessage,msg jmp msg_loop end_loop: invoke ExitProcess,[msg.wParam] proc Procedura hwnd,wmsg,wparam,lparam push ebx push esi push edi cmp [wmsg],WM_DESTROY je Destroy cmp [wmsg],WM_PAINT je Paint invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam] jmp finish Destroy: invoke PostQuitMessage,0 xor eax,eax Paint: invoke GetDC,[hwnd] mov [hdc],eax invoke GetClientRect,[hwnd],rc invoke CreatePen,PS_SOLID,3,00ff00h mov [hp],eax invoke SelectObject,[hdc],[hp] push eax invoke MoveToEx,[hdc],[rc.left],[rc.top],NULL invoke LineTo,[hdc],[rc.right],[rc.bottom] pop eax invoke DeleteObject,[hp] invoke ReleaseDC,[hwnd],[hdc] ... Где я ошибся?
Adrax Если Вы принципиально против использования BeginPaint/EndPaint, то хотябы ValidateRect вызывайте в конце обработчика WM_PAINT. Иначе это сообщение зациклится. Также не ясен смысл push eax / pop eax. Удалять pen, который находится в DC, нельзя! Нужно сначала восстановить оригинальный pen.
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
Nouzui >3. Ошибся ты в параметрах SetLayeredWindowAttributes >нужно или >invoke SetLayeredWindowAttributes,hwnd,0ffffffh,00h,LWA_COLORKEY >или >invoke SetLayeredWindowAttributes,hwnd,0h,<уровень прозрачности, например 0D0h>,LWA_ALPHA Не стоило этого говорить, ерунда ведь.
Большое спасибо за советы, но - не помогло! Что нужно использовать не LWA_ALPHA, а LWA_COLORKEY, я понял. Возник другой вопрос: какой цвет "прозрачнить"? При создании окна я использовал COLOR_BTNFACE+1 - оно? Если да, то всё равно не помогает: окно непрозрачно, и линия в нём есть. Но как мне сделать прозрачное невидимое окно с нарисованной видимой линией??