0

我有一个放置组合框的 Delphi 应用程序。最近在迁移到 Win 7 后,组合框下拉的通知行为很有趣。它在 XP 中可以正常工作,其中状态栏矩形的组合框下拉菜单。但在 Windows 7 中,组合框下拉区域显示在顶部屏幕上并闪烁。必须按住鼠标按钮才能保持显示状态,但这不允许选择任何项目。

不知道有没有其他人有同样的经历?请告知在 Win 7 中需要进行哪些特殊处理才能使组合框下拉菜单在放置在状态栏内时完美工作。

PS:放置在窗体上的组合框在 Win7 中表现正常。仅当组合框放置在状态栏内时,才会显示上述行为。

感谢您的意见和/或建议。

谢谢。

演示代码:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    StatusBar1: TStatusBar;
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
      const Rect: TRect);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  Style, idx: Integer;
begin
    StatusBar1.Panels[0].Style := psOwnerDraw;
    ComboBox1.Parent := StatusBar1;
    Style := GetWindowLong(ComboBox1.Handle, GWL_EXSTYLE);
    Style := Style - WS_EX_STATICEDGE;
    SetWindowLong(ComboBox1.Handle, GWL_EXSTYLE, Style);
    for idx := 1 to 20 do
       ComboBox1.Items.Add(Format('Test Item %d',[idx]));
end;

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
  const Rect: TRect);
begin
  if Panel = StatusBar1.Panels[0] then
    with ComboBox1 do
    begin
      Top := Rect.Top;
      Left := Rect.Left;
      Width := Rect.Right - Rect.Left - 5;
      Height := Rect.Bottom - Rect.Top - 10;
    end
end;

end.
4

1 回答 1

0

我认为您需要的是一个停止器,以便事件处理程序知道何时停止绘制到画布或不执行。

或者你可以试试这个,它对我有用(Windows 8 上的 delphi XE,将组合框放在状态栏中,并将其行为更改为“下拉”项目列表)。

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect);
begin
  if Panel = StatusBar1.Panels[0] then
    with ComboBox1 do
    begin
      if Top = Rect.Top then Exit; //add this 
      Top := Rect.Top;
      Left := Rect.Left;
      Width := Rect.Right - Rect.Left - 5;
      Height := Rect.Bottom - Rect.Top - 10;
    end
end;
于 2014-07-07T08:07:15.593 回答