Hallo,
ich habe mit Hilfe des Internets eine Combobox entwickelt, die meine Layer verwaltet. Vor den Layernamen ist eine An-Aus-Symbol und ein Farbsymbol, um hierüber die Layer zu verändern. Mein Problem ist nun, dass ich diese Icons nur im DropDownFeld erwische,
ich möchte das aber auch bei zugeklappter Combobox mit dem Standardeintrag machen.
Hat die Combobox noch nicht den Fosus und ich klicke auf den Standardeintrag, dann wird kein WM_LBUTTONDOWN-Ereignis ausgelöst.
Kann mir da jemand einen Tip geben?
Gruß
BBB
Delphi-Quellcode:
tLayerbox = Class(TTNTComboBox)
Private
fListInstance: Pointer;
fDefListProc: Pointer;
BmpLayerOn: TBitmap;
BmpLayerOff: TBitmap;
BmpLayerGray: TBitmap;
Procedure ListWndProc(Var Message: TMessage);
Function ItemAtPos(Pos: TPoint; Existing: Boolean): Integer;
Function ItemRect(Index: Integer): TRect;
Protected
Procedure CreateWnd; Override;
Procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); Override;
Public
Procedure Refresh;
Constructor Create(AOwner: TComponent); Override;
Destructor Destroy; Override;
End;
Procedure tLayerbox.ListWndProc(Var Message: TMessage);
Const
cCheckWidth = 20;
Var
X, Y, Index : Integer;
ColorClick : Boolean;
AnAusClick : Boolean;
FocusAbgeben : Boolean;
i : Integer;
Begin
ColorClick := false;
AnAusClick := false;
FocusAbgeben := false;
Index := 0;
If (Message.Msg = WM_LBUTTONDOWN) Or (Message.Msg = WM_RBUTTONDOWN) Then
Begin
X := TWMMouse(Message).XPos;
Y := TWMMouse(Message).YPos;
Index := ItemAtPos(Point(X, Y), True);
If Index > -1 Then
Begin
If X - ItemRect(Index).Left < cCheckWidth Then
Begin
tLayer(Self.Items.Objects[index]).Visible := (Not tLayer(Self.Items.Objects[index]).Visible);
AnAusClick := true;
FocusAbgeben := (Message.Msg = WM_LBUTTONDOWN);
End
Else If X - ItemRect(Index).Left < 2 * cCheckWidth Then
Begin
tLayer(Self.Items.Objects[index]).ChangeColor;
ColorClick := True;
FocusAbgeben := true;
End;
End
Else // Wenn nicht ins DropDownFeld geklickt wird
FocusAbgeben := true;
Self.repaint;
End;
Message.Result := CallWindowProc(FDefListProc, ListHandle, Message.Msg, Message.WParam, Message.LParam);
If FocusAbgeben Then
Form4.FocusControl(Nil)
Else If AnAusClick Then
DroppedDown := True;
If AnAusClick Or ColorClick Then
Form1.Repaint;
End;