简单的方法用LABLE,
其他的可以用BITBLE函数。。

解决方案 »

  1.   

    我想对Edit控件实现,您能详细点儿吗,谢谢。
      

  2.   

    我用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
      

  3.   

    xie yi ge zu jian bu jiu xing le 
      

  4.   

    GaoYang(高阳):你的程序好像只能在2000下用呀。
    没办法,我自己再UP一下吧……
      

  5.   

    首先,新建一个工程,将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;
    就行了,给分吧?
      

  6.   

    用 SetLayeredWindowAttributes 这个API,DELPHI6直接就支持了,具体可以看MSDN
      

  7.   

    这个API只能在2000下用,我要98也行
      

  8.   

    我自己写了一个组件,但是一方面闪烁严重,一方面还有些错误。大家看看吧。这儿有些重复的代码,请自己注意
    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.
      

  9.   

    如果只为看mm,可以把mm的图画插到edit的背景中
    用GetDC得到句柄,然后用BitBlt画过去
      

  10.   

    to Tomhankscn:
    如果像你那样,一旦输入字符,MM就变得乱七八糟了
      

  11.   

    如果从tcustomEdit直接继承,然后把client重画部分关掉,不知道行不行?