承载MENUITEM和COBOBOX的下拉筐的是窗体吗?这样的窗体应该用什么风格创建?
一般的窗体在显示的时候,主窗体总是会失去焦点。看了COMBOBOX的代码,还是没弄懂。谁给说说。。疑惑着呢

解决方案 »

  1.   

    Menuitem的下拉筐不是窗体
    Combobox的下拉矿應該是窗体.
      

  2.   

    popupmenu呢?要显示的话,总得有东西当载体啊。不是窗体是什么?COMBOBOX的是什么风格的窗体呢?它的CREATEPARAMS方法如何重载啊?STYLE如何设定?
      

  3.   

    popupmenu可以用其他的空间作为他的载体显示。只要配置属性就可以了!
      

  4.   

    Windows的菜单本来就不是窗体啊,除非你刻意要去模拟一个,例如IE的收藏夹等.
      

  5.   

    菜单本来就是windows里有的一个元素,就如同窗体一样。
      

  6.   

    unit
      PopupWnd;{$DEFINE WIN32}interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TCloseUpEvent = procedure (Sender:TObject;Accept:Boolean) of object;  TPopupWindow = class(TCustomControl)
      private
        FEditor: TWinControl;
        FCloseUp: TCloseUpEvent;
        procedure WMMouseActivate(var Message: TMessage); message WM_MOUSEACTIVATE;
      protected
        procedure CreateParams(var Params: TCreateParams); override;
    {$IFDEF WIN32}
        function Getvalue: Variant; virtual; abstract;
        procedure Setvalue(const value: Variant); virtual; abstract;
    {$ELSE}
        procedure CreateWnd; override;
        function Getvalue: string; virtual; abstract;
        procedure Setvalue(const value: string); virtual; abstract;
    {$ENDIF}
        procedure InvalidateEditor;
        procedure PopupMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure CloseUp(Accept: Boolean); virtual;
      public
        constructor Create(AOwner: TComponent); override;
        function GetPopupText: string; virtual;
        procedure Hide;
        procedure Show(Origin: TPoint);
        property OnCloseUp: TCloseUpEvent read FCloseUp write FCloseUp;
      end;implementation{ TPopupWindow }constructor TPopupWindow.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FEditor := TWinControl(AOwner);
    {$IFDEF WIN32}
      ControlStyle := ControlStyle + [csNoDesignVisible, csReplicatable,
        csAcceptsControls];
    {$ELSE}
      ControlStyle := ControlStyle + [csAcceptsControls];
    {$ENDIF}
      Ctl3D := False;
      ParentCtl3D := False;
      Visible := False;
      Parent := FEditor;
      onMouseUp := PopupMouseUp;
    end;procedure TPopupWindow.CreateParams(var Params: TCreateParams);
    begin
      inherited CreateParams(Params);
      with Params do begin
        Style := WS_POPUP or WS_BORDER or WS_CLIPCHILDREN;
    {$IFDEF WIN32}
        ExStyle := WS_EX_TOOLWINDOW;
    {$ENDIF}
        WindowClass.Style := WindowClass.Style or CS_SAVEBITS;
      end;
    end;{$IFNDEF WIN32}
    procedure TPopupWindow.CreateWnd;
    begin
      inherited CreateWnd;
      if (csDesigning in ComponentState) then SetParent(nil);
    end;
    {$ENDIF}procedure TPopupWindow.WMMouseActivate(var Message: TMessage);
    begin
      Message.Result := MA_NOACTIVATE;
    end;function TPopupWindow.GetPopupText: string;
    begin
      Result := '';
    end;procedure TPopupWindow.InvalidateEditor;
    var
      R: TRect;
    begin
      //if (FEditor is TCustomComboEdit) then begin
      //  with TCustomComboEdit(FEditor) do
      //    SetRect(R, 0, 0, ClientWidth - FBtnControl.Width - 2, ClientHeight + 1);
      //end
      //else
      R := FEditor.ClientRect;
      InvalidateRect(FEditor.Handle, @R, False);
      UpdateWindow(FEditor.Handle);
    end;procedure TPopupWindow.PopupMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button = mbLeft then CloseUp(PtInRect(Self.ClientRect, Point(X, Y)));
    end;procedure TPopupWindow.CloseUp(Accept: Boolean);
    begin
      if Assigned(FCloseUp) then FCloseUp(Self, Accept);
    end;procedure TPopupWindow.Hide;
    begin
      SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_NOZORDER or
        SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_HIDEWINDOW);
      Visible := False;
    end;procedure TPopupWindow.Show(Origin: TPoint);
    begin
      SetWindowPos(Handle, HWND_TOP, Origin.X, Origin.Y, 0, 0,
        SWP_NOACTIVATE or SWP_SHOWWINDOW or SWP_NOSIZE);
      Visible := True;
    end;end.
      

  7.   

    谢谢楼上的代码.我先派分了..回去再看..我担心的是这个POPUPWND SHOW出来以后,主FORM会不会失去焦点变灰,要是不会的话,就OK了.