我用VB做过,发给你源码,应该差不多。用的是API,你改改就能用。 Module1Option ExplicitPublic Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long Public Declare Function UpdateLayeredWindow Lib "user32" (ByVal hWnd As Long, ByVal hdcDst As Long, pptDst As Any, psize As Any, ByVal hdcSrc As Long, pptSrc As Any, crKey As Long, ByVal pblend As Long, ByVal dwFlags As Long) As LongPublic Const GWL_STYLE = (-16) Public Const GWL_EXSTYLE = (-20) Public Const WS_EX_LAYERED = &H80000 Public Const AC_SRC_OVER = &H0 Public Const AC_SRC_ALPHA = &H1 Public Const AC_SRC_NO_PREMULT_ALPHA = &H1 Public Const AC_SRC_NO_ALPHA = &H2 Public Const AC_DST_NO_PREMULT_ALPHA = &H10 Public Const AC_DST_NO_ALPHA = &H20 Public Const LWA_COLORKEY = &H1 Public Const LWA_ALPHA = &H2 Public Const ULW_COLORKEY = &H1 Public Const ULW_ALPHA = &H2 Public Const ULW_OPAQUE = &H4Public Type POINTAPI x As Long y As Long End TypePublic Type SIZE cx As Long cy As Long End TypePublic Type BLENDFUNCTION BlendOp As Byte BlendFlags As Byte SourceConstantAlpha As Byte AlphaFormat As Byte End Type Public Function IsLayeredWindow(ByVal hWnd As Long) As Boolean Dim l As Long l = GetWindowLong(hWnd, GWL_EXSTYLE) If (l And WS_EX_LAYERED) = WS_EX_LAYERED Then IsLayeredWindow = True Else IsLayeredWindow = False End If End FunctionPublic Sub SetLayeredWindow(ByVal hWnd As Long, _ ByVal bIsLayered As Boolean) Dim l As Long l = GetWindowLong(hWnd, GWL_EXSTYLE) If bIsLayered = True Then l = l Or WS_EX_LAYERED Else l = l And Not WS_EX_LAYERED End If SetWindowLong hWnd, GWL_EXSTYLE, l End SubModule2Option ExplicitPublic Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As LongPublic Function EnumWndProc(ByVal hWnd As Long, ByVal lParam As Long) As Long Dim s2 As String 'Find out what kind of a window this is: s2 = String$(255, 0) GetClassName hWnd, s2, 255 s2 = Left$(s2, InStr(s2, Chr$(0)) - 1) 'Don't waste time on the following window classes, 'we'll only slow the system to a crawl: If StrComp(s2, "tooltips_class32", vbTextCompare) = 0 Or _ StrComp(s2, "Progman", vbTextCompare) = 0 Or _ StrComp(s2, "OleDdeWndClass") = 0 Then EnumWndProc = 1 Exit Function End If 'Make this window a layered window SetLayeredWindow hWnd, lParam 'bAlpha parameter is the level of transparency, 'must be in between 0 and 255 SetLayeredWindowAttributes hWnd, 0, 180, LWA_ALPHA 'Keep going EnumWndProc = 1 'TRUE End Function '--end block--Forms1Option ExplicitPrivate Sub Command1_Click() EnumWndProc Form1.hWnd, 0 End SubPrivate Sub Command2_Click() EnumWndProc Form1.hWnd, 1 End Sub
xie yi ge zu jian bu jiu xing le
GaoYang(高阳):你的程序好像只能在2000下用呀。 没办法,我自己再UP一下吧……
首先,新建一个工程,将Form1的KeyPrview设为True。 然后,加入一个Image,将Align设为alClient,在Picture中加入你的mm的照片。 下来,放置一个Lable,将Pransparent设为True,改变字体到你满意为止。 好了,到最关键的地方了,在Form1的OnKeyDown中,写以下代码: procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case key of $41: label1.Caption := label1.Caption+'a'; ... //以下类推,略 end; 就行了,给分吧?
Module1Option ExplicitPublic Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Public Declare Function UpdateLayeredWindow Lib "user32" (ByVal hWnd As Long, ByVal hdcDst As Long, pptDst As Any, psize As Any, ByVal hdcSrc As Long, pptSrc As Any, crKey As Long, ByVal pblend As Long, ByVal dwFlags As Long) As LongPublic Const GWL_STYLE = (-16)
Public Const GWL_EXSTYLE = (-20)
Public Const WS_EX_LAYERED = &H80000
Public Const AC_SRC_OVER = &H0
Public Const AC_SRC_ALPHA = &H1
Public Const AC_SRC_NO_PREMULT_ALPHA = &H1
Public Const AC_SRC_NO_ALPHA = &H2
Public Const AC_DST_NO_PREMULT_ALPHA = &H10
Public Const AC_DST_NO_ALPHA = &H20
Public Const LWA_COLORKEY = &H1
Public Const LWA_ALPHA = &H2
Public Const ULW_COLORKEY = &H1
Public Const ULW_ALPHA = &H2
Public Const ULW_OPAQUE = &H4Public Type POINTAPI
x As Long
y As Long
End TypePublic Type SIZE
cx As Long
cy As Long
End TypePublic Type BLENDFUNCTION
BlendOp As Byte
BlendFlags As Byte
SourceConstantAlpha As Byte
AlphaFormat As Byte
End Type
Public Function IsLayeredWindow(ByVal hWnd As Long) As Boolean
Dim l As Long l = GetWindowLong(hWnd, GWL_EXSTYLE)
If (l And WS_EX_LAYERED) = WS_EX_LAYERED Then
IsLayeredWindow = True
Else
IsLayeredWindow = False
End If
End FunctionPublic Sub SetLayeredWindow(ByVal hWnd As Long, _
ByVal bIsLayered As Boolean)
Dim l As Long l = GetWindowLong(hWnd, GWL_EXSTYLE) If bIsLayered = True Then
l = l Or WS_EX_LAYERED
Else
l = l And Not WS_EX_LAYERED
End If
SetWindowLong hWnd, GWL_EXSTYLE, l
End SubModule2Option ExplicitPublic Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As LongPublic Function EnumWndProc(ByVal hWnd As Long, ByVal lParam As Long) As Long Dim s2 As String 'Find out what kind of a window this is:
s2 = String$(255, 0)
GetClassName hWnd, s2, 255
s2 = Left$(s2, InStr(s2, Chr$(0)) - 1) 'Don't waste time on the following window classes,
'we'll only slow the system to a crawl:
If StrComp(s2, "tooltips_class32", vbTextCompare) = 0 Or _
StrComp(s2, "Progman", vbTextCompare) = 0 Or _
StrComp(s2, "OleDdeWndClass") = 0 Then
EnumWndProc = 1
Exit Function
End If
'Make this window a layered window
SetLayeredWindow hWnd, lParam
'bAlpha parameter is the level of transparency,
'must be in between 0 and 255
SetLayeredWindowAttributes hWnd, 0, 180, LWA_ALPHA 'Keep going
EnumWndProc = 1 'TRUE
End Function
'--end block--Forms1Option ExplicitPrivate Sub Command1_Click()
EnumWndProc Form1.hWnd, 0
End SubPrivate Sub Command2_Click()
EnumWndProc Form1.hWnd, 1
End Sub
没办法,我自己再UP一下吧……
然后,加入一个Image,将Align设为alClient,在Picture中加入你的mm的照片。
下来,放置一个Lable,将Pransparent设为True,改变字体到你满意为止。
好了,到最关键的地方了,在Form1的OnKeyDown中,写以下代码:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case key of
$41:
label1.Caption := label1.Caption+'a';
... //以下类推,略
end;
就行了,给分吧?
unit ImgMemo;interfaceuses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls,Graphics,
Dialogs;
type
TImgMemo = class(TMemo)
private
{ Private declarations }
FImageFileName:String;
procedure SetImage(Const AImgFileName:string);
protected
{ Protected declarations }
procedure WMCTLCOLOREDIT(var Message: TWMCTLCOLOREDIT); message WM_CTLCOLOREDIT;
procedure WMKEYDOWN(var Message: TWMKEYDOWN); message WM_KEYDOWN;
procedure WMKEYUP(var Message: TWMKEYUP); message WM_KEYUP; public
{ Public declarations }
property ImageFileName:String read FImageFileName write SetImage;
published
{ Published declarations }
end;procedure Register;implementationvar
bmpImage:TBitmap;
blnHaveSetImage:Boolean;procedure Register;
begin
RegisterComponents('My UserIF VCLs', [TImgMemo]);
end;{ TImgMemo }procedure TImgMemo.SetImage(const AImgFileName: string);
var
CanvasMemo:TControlCanvas;
begin
If FImageFileName=AImgFileName then
ShowMessage(AImgFileName+' '+FImageFileName);
try
if not blnHaveSetImage then
begin
bmpImage:=TBitmap.Create;
blnHaveSetImage:=True;
end;
bmpImage.LoadFromFile(AImgFileName); CanvasMemo:=TControlCanvas.Create;
CanvasMemo.Control:=Self;
Bitblt(CanvasMemo.Handle,0,0,Width,Height,bmpImage.Canvas.handle,0,0,SRCAND);
FImageFileName:=AImgFileName;
CanvasMemo.Free;
Except
bmpImage.Free;
blnHaveSetImage:=False;
end;
end;
procedure TImgMemo.WMCTLCOLOREDIT(var Message: TWMCTLCOLOREDIT);
var
CanvasMemo:TControlCanvas;
begin
if blnHaveSetImage=False then
Exit;
try
CanvasMemo:=TControlCanvas.Create;
CanvasMemo.Control:=Self;
Bitblt(CanvasMemo.Handle,0,0,Width,Height,bmpImage.Canvas.handle,0,0,SRCAND);
Finally
CanvasMemo.Free;
end;
end;procedure TImgMemo.WMKEYDOWN(var Message: TWMKEYDOWN);
var
CanvasMemo:TControlCanvas;
begin
if blnHaveSetImage=False then
Exit; try
CanvasMemo:=TControlCanvas.Create;
CanvasMemo.Control:=Self;
Bitblt(CanvasMemo.Handle,0,0,Width,Height,bmpImage.Canvas.handle,0,0,SRCAND);
Finally
CanvasMemo.Free;
end;
end;procedure TImgMemo.WMKEYUP(var Message: TWMKEYUP);
var
CanvasMemo:TControlCanvas;
begin
if blnHaveSetImage=False then
Exit; try
CanvasMemo:=TControlCanvas.Create;
CanvasMemo.Control:=Self;
Bitblt(CanvasMemo.Handle,0,0,Width,Height,bmpImage.Canvas.handle,0,0,SRCAND);
Finally
CanvasMemo.Free;
end;
end;end.
用GetDC得到句柄,然后用BitBlt画过去
如果像你那样,一旦输入字符,MM就变得乱七八糟了