2007. február 11., vasárnap

How to change the client area of a TListBox


Problem/Question/Abstract:

I have created my own listbox control as a descendant of TListBox. What I want to be able to do is to change the client area of the listbox so that I can draw a label above the list box area. I can change the client rect by overriding the CreateWnd method like this:

procedure TMyListBox.CreateWnd;
begin
  inherited CreateWnd;
  ClientHeight := Height - 20;
end;

But I can't move the client rect down (ie change the origin). Using ClientOrigin.X := 20 does not work as the ClientOrigin property is read only. I'm thinking maybe I need to override the CreateParams method to do this. Any ideas?

Answer:

You have to respond to the WM_NCCALCSIZE message:

procedure TREDCustomListBox.WMNCCalcSize(var Msg: TWMNCCALCSIZE);
begin
  inherited;
  Inc(MSG.CalcSize_Params^.rgrc[0].Top, FHeader.Height);
end;

That is a the method within my own listbox which does exactly what you want to do. Notice how I'm incrementing the client area by the height of the header (which I implemented as a separate class so I can do the same thing in other controls). It was a fun exercise.

Another clue: You have to paint the header in WM_NCPAINT

Nincsenek megjegyzések:

Megjegyzés küldése