首页
社区
课程
招聘
如何编程实现透明窗体显示文字
发表于: 2006-3-31 11:07 6189

如何编程实现透明窗体显示文字

2006-3-31 11:07
6189
我是用SetLayeredWindowAttributes函数实现窗体透明的,但是窗体透明后,窗体上的文字也看不到了,请问,如何才能实现在透明窗体上显示文字,最好是能显示滚动的文字,效果就像千千静听中的歌词秀,能透明显示滚动的歌词,恳请高手指教!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不懂,帮顶~~~~~~

看了你的帖子,让我想起来了金山词霸,借楼主帖子,问个类似的问题,怎么在屏幕上画一个矩形,然后在上面输出解释的?而且还能把那个矩形设置成半透明的?
2006-3-31 13:34
0
雪    币: 211
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
期待 我也想知道怎么这么做  千千的歌词秀做得不错
2006-3-31 14:28
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
4
如果没有别的方法

唯有建立一个大型的 message hook,拦截所有 wm_paint,再把你的字画到需要的地方
2006-3-31 14:31
0
雪    币: 248
活跃值: (1121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我不能加附件,只能如此了。
;====================================
.586
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
include \masm32\include\pnglib.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\pnglib.lib

include \masm32\macros\macros.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Constants & struct missing from Windows.inc
        WS_EX_LAYERED        equ 80000h
        ULW_COLORKEY        equ 1h
        ULW_ALPHA        equ 2h
        ULW_OPAQUE        equ 4h
        AC_SRC_OVER        equ 0h
        AC_SRC_ALPHA        equ 1h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
BLENDFUNCTION STRUCT
        BlendOp                BYTE ?
        BlendFlags        BYTE ?
        SourceConstantAlpha BYTE ?
        AlphaFormat        BYTE ?
BLENDFUNCTION ends
;------------------------------------
sSIZE STRUCT
        dWidth DWORD ?
        dHeight DWORD ?
sSIZE ends
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
        ClassName        db "MainWinClass",0
        AppName                db "Main Window",0
        ptZero                POINT <0,0>
        blender                BLENDFUNCTION <AC_SRC_OVER,0,255,AC_SRC_ALPHA>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
        hTimer                dd ?
        hInstance        HINSTANCE ?
        hWin                dd ?
        CommandLine        LPSTR ?
        pUlw                dd ?
        hScreenDC        dd ?
        hBitmap                dd ?
        hBitmap2        dd ?
        hMemDC                dd ?
        hMemDC2                dd ?
        hOldBmp                dd ?
        hOldBmp2        dd ?
        pngSize                sSIZE <>
        winSize                sSIZE <>
        winY                dd ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CenterScreen PROC USES esi edi _hWnd:DWORD
        LOCAL   wRect:RECT
         
        xor     eax, eax
        push    eax
        lea     eax, DWORD PTR [ebp-16]
        push    eax
        mov     eax, _hWnd
        push    eax
        call    GetWindowRect               ;MROM Penalty
        mov     esi, wRect.bottom
        sub     esi, wRect.top
        push    esi
        shr     esi, 1
        mov     edi, wRect.right
        sub     edi, wRect.left
        push    edi
        shr     edi, 1
        mov     eax, SM_CYSCREEN
        push    eax
        call    GetSystemMetrics            ;MROM Penalty
        shr     eax, 1
        sub     eax, esi
        push    eax
        mov     eax, SM_CXSCREEN
        push    eax
        call    GetSystemMetrics            ;MROM Penalty
        shr     eax, 1
        sub     eax, edi
        push    eax
        mov     eax, _hWnd
        push    eax
        call    MoveWindow                  ;MROM Penalty
        ret

CenterScreen ENDP
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; This code is largely ripped from loadfromresource example in PngLib
LoadPng proc ID:dword,pSize:dword

; In:         ID:         Resource ID of PNG file to load
; Out:        pSize:        Struct that this points to is filled with width & height of PNG
;                eax                Contains the handle to the new DIB
       
        LOCAL pngInfo:PNGINFO

        ; --- Initialize structure ---
        invoke        PNG_Init, addr pngInfo
       
        ; --- Load PNG resource ---
        invoke        PNG_LoadResource, addr pngInfo, hInstance, ID
        .IF        !eax
                xor        eax, eax
                jmp        @cleanup
        .ENDIF
       
        ; --- Decode PNG data ---
        invoke        PNG_Decode, addr pngInfo
        .IF        !eax
                xor        eax, eax
                jmp        @cleanup
        .ENDIF
       
        ; --- Create bitmap from PNG ---
        invoke        PNG_CreateBitmap, addr pngInfo, hWin, PNG_OUTF_AUTO, FALSE
        .IF        !eax
                xor        eax, eax
                jmp        @cleanup
        .ENDIF
       
        mov edi,pSize
        .if edi!=0
                lea esi,pngInfo
                movsd
                movsd
        .endif
       
@cleanup:
        push        eax       
       
        ; --- Cleanup ---
        invoke        PNG_Cleanup, addr pngInfo
       
        pop        eax
        ret                                ; Returns 0 if something went wrong, else bitmap handle

LoadPng endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FadeBitmap proc hBmp:dword

        LOCAL bminfo:BITMAP

        invoke GetObject,hBmp,sizeof bminfo,addr bminfo
        cmp bminfo.bmBitsPixel,32
        jne Abort
        mov esi,bminfo.bmBits
yloop:
        mov ecx,bminfo.bmWidth
        ; Set up the alpha for this scanline (in bl). Will be blended 50% with image alpha.
        mov ebx,bminfo.bmHeight
        shl bl,1
        jnc xloop
        not ebx
xloop:
        mov eax,[esi]
        rol eax,8
        mov edx,eax
        and eax,0FFh
        mul bl
        xchg eax,edx
        rol eax,8
        mul dh        ; B * A
        rol eax,8
        mul dh        ; G * A
        rol eax,8
        mul dh        ; R * A
        mov al,dh
        ror eax,8
        mov [esi],eax
        add esi,4
        dec ecx
        jnz xloop
        dec bminfo.bmHeight
        jnz yloop
Abort:
        ret

FadeBitmap endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; This snippet from Eoin's GUIBackBufferShell2 example
CreateCanvas Proc hDC:dword,biWidth:dword,biHeight:dword
        LOCAL bih:BITMAPINFOHEADER
        LOCAL pBb:dword
       
        lea edx, bih
        mov (BITMAPINFOHEADER ptr [edx]).biSize, sizeof(BITMAPINFOHEADER)
        mov eax, biWidth
        mov (BITMAPINFOHEADER ptr [edx]).biWidth, eax
        mov eax, biHeight
        mov (BITMAPINFOHEADER ptr [edx]).biHeight, eax
        mov (BITMAPINFOHEADER ptr [edx]).biPlanes, 1
        mov (BITMAPINFOHEADER ptr [edx]).biBitCount, 32
        mov (BITMAPINFOHEADER ptr [edx]).biCompression, BI_RGB
        mov (BITMAPINFOHEADER ptr [edx]).biSizeImage, 0
        mov (BITMAPINFOHEADER ptr [edx]).biXPelsPerMeter, 0
        mov (BITMAPINFOHEADER ptr [edx]).biYPelsPerMeter, 0
        mov (BITMAPINFOHEADER ptr [edx]).biClrUsed, 0
        mov (BITMAPINFOHEADER ptr [edx]).biClrImportant, 0

        invoke CreateDIBSection, hDC, edx, DIB_RGB_COLORS, addr pBb, 0, 0
        ret
       
CreateCanvas EndP
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
       
        .IF uMsg==WM_DESTROY
                invoke PostQuitMessage,NULL
        .ELSEIF uMsg==WM_CREATE
                ; Load the Png file from the resource
                invoke LoadPng,1,addr pngSize
                mov hBitmap,eax
                push pngSize.dWidth
                pop winSize.dWidth
                mov winSize.dHeight,255
                ; Get a screen DC, since UpdateLayeredWindow wants one.
                invoke GetDC,0
                mov hScreenDC,eax
                ; Create a new DC to select our bitmap into, since UpdateLayeredWindow doesn't accept
                ; bare bitmaps.
                invoke CreateCompatibleDC,hScreenDC
                mov hMemDC,eax
                invoke SelectObject,eax,hBitmap
                mov hOldBmp,eax
                invoke CreateCompatibleDC,hScreenDC
                mov hMemDC2,eax
                invoke CreateCanvas,hMemDC2,pngSize.dWidth,255
                mov hBitmap2,eax
                invoke SelectObject,hMemDC2,hBitmap2
                mov hOldBmp2,eax
                               
                invoke GetModuleHandle,SADD("User32")
                invoke GetProcAddress,eax,SADD("UpdateLayeredWindow")
                .if eax==NULL
                        invoke MessageBox,hWnd,SADD("Couldn't find UpdateLayeredWindow API. You need Windows XP or 2000 to run this program."),0,MB_OK
                        invoke SendMessage,hWnd,WM_CLOSE,0,0
                .endif
                mov pUlw,eax
               
                mov winY,0
                invoke SetTimer,hWnd,1,30,0
                mov hTimer,eax
                invoke CenterScreen,hWnd

        .elseif uMsg==WM_TIMER
                invoke BitBlt,hMemDC2,0,0,pngSize.dWidth,255,hMemDC,0,winY,SRCCOPY
                inc winY
                mov eax,pngSize.dHeight
                sub eax,255
                .if winY>eax
                        add eax,255
                        .if winY==eax
                                mov winY,0
                        .else
                                sub eax,winY
                                invoke BitBlt,hMemDC2,0,eax,pngSize.dWidth,255,hMemDC,0,0,SRCCOPY
                        .endif
                .endif

                invoke FadeBitmap,hBitmap2
               
                push ULW_ALPHA
                push offset blender
                push 0
                push offset ptZero
                push hMemDC2
                push offset winSize
                push NULL
                push hScreenDC
                push hWnd
                mov eax,pUlw
                call eax

        .ELSEIF uMsg==WM_DESTROY
                invoke KillTimer,hWnd,hTimer
                ; Free window image buffer
                invoke SelectObject,hMemDC2,hOldBmp2
                invoke DeleteObject,hBitmap2
                invoke DeleteDC,hMemDC2
                ; Free PNG image buffer
                invoke SelectObject,hMemDC,hOldBmp
                invoke DeleteObject,hBitmap
                invoke DeleteDC,hMemDC
                ; Release our handle to the screen DC
                invoke ReleaseDC,hWnd,hScreenDC
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam
        .ELSEIF uMsg==WM_LBUTTONDOWN
                ; Move the window when holding down left mouse button
                invoke  SendMessage,hWnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam
        .ELSEIF uMsg==WM_RBUTTONUP
                    ; Close the window when clicking right mouse button
                   invoke PostMessage,hWnd,WM_CLOSE,0,0
           .ELSE
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam               
                ret
        .ENDIF
       
        xor eax,eax
        ret
WndProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Standard WinMain, except for WS_EX_LAYERED and WS_POPUP in the CreateWindowEx line.
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
        LOCAL wc:WNDCLASSEX
        LOCAL msg:MSG
       
        mov   wc.cbSize,SIZEOF WNDCLASSEX
        mov   wc.style, CS_HREDRAW or CS_VREDRAW
        mov   wc.lpfnWndProc, OFFSET WndProc
        mov   wc.cbClsExtra,NULL
        mov   wc.cbWndExtra,NULL
        push  hInstance
        pop   wc.hInstance
        mov   wc.hbrBackground,COLOR_BTNFACE+1
        mov   wc.lpszMenuName,NULL
        mov   wc.lpszClassName,OFFSET ClassName
       
        invoke LoadIcon,NULL,IDI_APPLICATION
        mov   wc.hIcon,eax
        mov   wc.hIconSm,eax
       
        invoke LoadCursor,NULL,IDC_ARROW
        mov   wc.hCursor,eax
       
        invoke RegisterClassEx, addr wc
        INVOKE CreateWindowEx,WS_EX_LAYERED,ADDR ClassName,ADDR AppName,\
                        WS_POPUP,CW_USEDEFAULT,\
                        CW_USEDEFAULT,100,100,NULL,NULL,\
                        hInst,NULL
        mov   hWin,eax
       
        invoke ShowWindow, hWin,SW_SHOWNORMAL
        invoke UpdateWindow, hWin
       
        .WHILE TRUE
                invoke GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                invoke TranslateMessage, ADDR msg
                invoke DispatchMessage, ADDR msg
        .ENDW
       
        mov     eax,msg.wParam
        ret
WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        invoke GetModuleHandle, NULL
        mov    hInstance,eax
       
        invoke GetCommandLine
        mov    CommandLine,eax
       
        invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
        invoke ExitProcess,eax
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

end start

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
rc:
1 RCDATA DISCARDABLE  "ScrollText.png"
2006-3-31 15:35
0
雪    币: 184
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
能告诉我上面这段代码是干嘛的吗,
如果能加写注解就好了,
我感觉这个是实现透明图片,而不是透明窗体显示文字
2006-3-31 16:38
0
雪    币: 248
活跃值: (1121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
图上写上文字,再卷图。
2006-3-31 18:45
0
雪    币: 184
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
能否把你的编译的程序传送一份给我
还有附件
我的qq:372517387
邮箱:xh3222851@126.com
在此,现表示对sixL大侠的感谢!!!!!!!
2006-4-2 16:16
0
雪    币: 248
活跃值: (1121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
看your email
2006-4-2 16:48
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
10
最初由 xushu 发布
我是用SetLayeredWindowAttributes函数实现窗体透明的,但是窗体透明后,窗体上的文字也看不到了,请问,如何才能实现在透明窗体上显示文字,最好是能显示滚动的文字,效果就像千千静听中的歌词秀,能透明显示滚动的歌词,恳请高手指教!


窗体透明后,在需要显示文字的地方重新画就可以。
上次我做的截屏软件,就是先把对话框设置成透明,
然后根据鼠标选择区域在透明对话框上画线
显示文字也是同理
至于文字的移动只需要改变显示文字的起点坐标就行了,
歌词的话,移动的速度还和具体的时间有关
2006-4-3 00:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
用TextOut就行吧
2006-4-26 18:16
0
游客
登录 | 注册 方可回帖
返回
//