粗略看了一下,delphi的代码编辑框是个TeditControl,而出现的提示框是个叫TCodecompleteListView的东东,现在有点思路了,就是解决怎么能在listview生成后TeditControl不接受上下和回车esc,而listview只接受这四个键

解决方案 »

  1.   

    哈哈,楼主说话算话unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        ListView1: TListView;
        procedure ListView1MouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure ListView1CustomDrawItem(Sender: TCustomListView;
          Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
        procedure Memo1KeyPress(Sender: TObject; var Key: Char);
        procedure Memo1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure SendKey(H: Hwnd; Key: char);
    var
      vKey, ScanCode: Word;
      lParam, ConvKey: Longint;
    begin
      ConvKey := OemKeyScan(Ord(Key));
      ScanCode := ConvKey and $000000FF or $FF00;
      vKey := Ord(Key);
      lParam := LongInt(ScanCode) shl 16 or 1;
      SendMessage(H, WM_KEYDOWN, vKey, lParam);
      SendMessage(H, WM_CHAR, vKey, lParam);
      lParam := lParam or $C0000000;
      SendMessage(H, WM_KEYUP, vKey, lParam);
    end;
    procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      memo1.SetFocus;
    end;procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    begin
     // if item.Index:=sel then
     if item.Selected then
     begin
       Sender.Canvas.Brush.Color :=clnavy;
       Sender.Canvas.Font.Color:=clwhite;
     end;
    end;procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
    var p:Tpoint;
    begin
     if key='.' then
     begin
     GetCaretPos(p);
     listview1.Left:=p.X+font.Size;
     listview1.Top:=p.Y+font.Size;
     listview1.Items[0].Selected:=true;
     listview1.Show;
     end;
     if key=#13 then key:=#0;
     if key=#27 then listview1.Visible:=false;
    end;procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var s,t:string;
        i,j:integer;
    begin
    // showmessage(inttostr(key)) ;
     if ord(key)=vk_up then begin
       if listview1.Showing then
       begin
        key:=0;
        if listview1.Selected.Index>0 then
          listview1.Items[listview1.Selected.Index-1].Selected:=true;
       end;
     end;
     if ord(key)=vk_down then begin
       if listview1.Showing then
       begin
        key:=0;
        if listview1.Selected.Index<listview1.Items.Count-1 then
          listview1.Items[listview1.Selected.Index+1].Selected:=true;
       end;
     end;
     if ord(key)=13 then begin
       if listview1.Showing then
       begin
          memo1.SetFocus;
          listview1.Visible:=false;
          s:=listview1.Selected.Caption;
          t:=memo1.Text;
          for i:=1 to length(s) do
          begin
            sendkey(memo1.Handle,s[i]);
          end;
       end;
     end;
    end;end.建立一个form,
    一个memo align 为alclient,
    一个listview viewstye为vslist把代码里的相应事件关联,注意viewstyle的CustomDrawItem不要漏掉
    你要demo的话我给你发
      

  2.   

    处理WM_MOUSEACTIVATE消息
    消息返回值为MA_NOACTIVATE就是不获得焦点。
    但是该消息不能处理标题栏点击。
    好的办法是:
    创建无边框窗体,窗体所用控件全部从TGraphicControl继承