[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]

    {
    From: mav@dseg.ti.com (Michael Vincze)

    >I am trying to put together an owner drawn list box that has it's own
    >strings. (i.e. Style := Style AND NOT lbs_HasStrings) Windows never calls
    >my DrawItem method. I think it may have something to do with the fact
    >that I do not know how to tell windows how many items there are in the
    >list box. (Maybe it thinks there are none... *shrug*)
    >
    >If anyone has had this problem, or has knows where I can get source
    >examples of owner-drawn list boxes that have their own strings, please
    >let me know.

    Included is an example of an owner drawn list box.  The example is in
    two parts:  "ownlist.pas", and "ownlist.res".  The resource file has
    been translated with uuencode.

    { Author:   Michael Vincze  12/27/93                              }
    {                                                                 }
    { Purpose:  Shows how to create an owner drawn list box.          }
    {                                                                 }
    { Usage:    Simply run.                                           }

    program OwnListBox;

    uses
      WinCrt,
      BWCC,
      Strings,
      WinTypes,
      WinProcs,
      Objects,
      OWindows,
      ODialogs;

    {$R OwnList}

    const
      ApplicationName: PChar = 'Owner Draw List Box';

      wListBoxId = 200;    { ID of OwnerDrawn ListBox Control }
      wNumItems  = 12;     { Number of items added to ListBox }

    type

      PODListBox = ^TODListBox;
      TODListBox = object (TListBox)
        hIcon1, hIcon2: HICON;
        constructor InitResource  (AParent: PWindowsObject; ResourceID: Integer);
        destructor  Done; virtual;
        procedure   ODADrawEntire (DrawItemStruct: PDrawItemStruct);
        procedure   ODAFocus      (DrawItemStruct: PDrawItemStruct);
        procedure   ODASelect     (DrawItemStruct: PDrawItemStruct);
        procedure   DrawEntry     (DrawItemStruct: PDrawItemStruct);
        procedure   DrawSelf      (DrawItemStruct: PDrawItemStruct);
        end;

      TTemplateApplication = object (TApplication)
        procedure InitMainWindow; virtual;
        end;

      PTemplateWindow = ^TTemplateWindow;
      TTemplateWindow = object (TDlgWindow)
        AnOwnListBox: PODListBox;
        constructor Init (AParent: PWindowsObject; ATitle: PChar);
        procedure   SetupWindow; virtual;
        function    GetClassName : PChar; virtual;
        destructor  Done; virtual;
        procedure   WMMeasureItem (var Msg: TMessage); virtual wm_First +
    wm_MeasureItem;
        procedure   WMDrawItem    (var Msg: TMessage); virtual wm_First +
    wm_DrawItem;
        end;

    constructor TODListBox.InitResource (AParent: PWindowsObject; ResourceID:
    Integer);
    begin
    inherited InitResource (AParent, ResourceId);
    hIcon1 := LoadIcon (0, idi_Exclamation);
    {
    hIcon2 := LoadIcon (0, idi_Question);
    }
    hIcon2 := LoadIcon (hInstance, 'icon_1')
    end;

    destructor TODListBox.Done;
    begin
    inherited Done;
    DestroyIcon (hIcon2);
    end;

    procedure TODListBox.ODADrawEntire (DrawItemStruct: PDrawItemStruct);
    begin
    DrawEntry (DrawItemStruct);
    if (DrawItemStruct^.itemState and ods_Focus) <> 0 then
      DrawFocusRect (DrawItemStruct^.hDC, DrawItemStruct^.rcItem);
    end;

    procedure TODListBox.ODAFocus (DrawItemStruct: PDrawItemStruct);
    begin
    DrawFocusRect (DrawItemStruct^.hDC, DrawItemStruct^.rcItem);
    end;

    procedure TODListBox.ODASelect (DrawItemStruct: PDrawItemStruct);
    begin
    DrawEntry (DrawItemStruct);
    if (DrawItemStruct^.itemState and ods_focus) <> 0 then
      DrawFocusRect (DrawItemStruct^.hDC, DrawItemStruct^.rcItem);
    end;

    procedure TODListBox.DrawSelf (DrawItemStruct: PDrawItemStruct);
    begin
    with DrawItemStruct^ do
      begin
      if (itemAction and oda_DrawEntire) <> 0 then
        ODADrawEntire (DrawItemStruct)
      else if (itemAction and oda_Focus) <> 0 then
        ODAFocus (DrawItemStruct)
      else if (itemAction and oda_Select) <> 0 then
        ODASelect (DrawItemStruct)
      end;
    end;

    procedure TODListBox.DrawEntry (DrawItemStruct: PDrawItemStruct);
    var
      dwColor : Word;
      szString: array [0..100] of Char;
      TextRect: TRect;
      bkColor : LongInt;
    begin
    wvsprintf (szString, 'This is ListBox Entry %d', DrawItemStruct^.itemID );
    dwColor := GetTextColor (DrawItemStruct^.hDC);
    CopyRect (TextRect, DrawItemStruct^.rcItem);
    Inc (TextRect.Left, 50);

    {
    Should create a logbrush that is the background and then fill
    if in appropriately.

    FillRect (DrawItemStruct^.hDC, DrawItemStruct^.rcItem, GetStockObject
    (gray_brush));
    }
    if (DrawItemStruct^.itemState and ODS_SELECTED) <> 0 then
      begin
      SetTextColor (DrawItemStruct^.hDC,  RGB ($ff,0,0));
      if (hIcon1) <> 0 then
        DrawIcon (DrawItemStruct^.hDC,
                  DrawItemStruct^.rcItem.left+10,
                  DrawItemStruct^.rcItem.top,
                  hIcon1);
      end
    else
      begin
      if (hIcon2) <> 0 then
        DrawIcon (DrawItemStruct^.hDC,
                  DrawItemStruct^.rcItem.left+10,
                  DrawItemStruct^.rcItem.top,
                  hIcon2);
      end;
    DrawText (DrawItemStruct^.hDC,
              szString,
              StrLen (szString),
              TextRect,
              DT_SINGLELINE or DT_VCENTER or DT_LEFT);

    SetTextColor (DrawItemStruct^.hDC, dwColor);
    end;

    procedure TTemplateApplication.InitMainWindow;
    begin
    MainWindow := New (PTemplateWindow, Init (nil, 'MainDialog'));
    end;

    constructor TTemplateWindow.Init (AParent: PWindowsObject; ATitle: PChar);
    begin
    inherited Init (AParent, ATitle);
    AnOwnListBox := New (PODListBox, InitResource (@Self, wListBoxId));
    end;

    function TTemplateWindow.GetClassName;
    begin GetClassName := 'BorDlg' end;

    destructor TTemplateWindow.Done;
    begin
    inherited Done;
    end;

    procedure TTemplateWindow.SetupWindow;
    var
      I: Word;
    begin
    inherited SetupWindow;
    for I :=0 to wNumItems - 1 do
      AnOwnListBox^.AddString (MAKEINTRESOURCE( i ));
    end;

    procedure TTemplateWindow.WMMeasureItem (var Msg: TMessage);
    var
      lpMeasureItem: PMEASUREITEMSTRUCT;
    begin
    lpMeasureItem := PMEASUREITEMSTRUCT (Msg.LParam);

    if (lpMeasureItem^.CtlType = ODT_LISTBOX) and (lpMeasureItem^.CtlID =
    wListBoxId) then
      lpMeasureItem^.itemHeight := GetSystemMetrics (SM_CYICON)
    else
      DefWndProc (Msg);
    end;

    procedure TTemplateWindow.WMDrawItem (var Msg: TMessage);
    begin
    if (PDrawItemStruct (Msg.lParam)^.CtlId) = wListBoxId then
      AnOwnListBox^.DrawSelf (PDrawItemStruct (Msg.lParam));
    Msg.Result := 1;
    end;

    var
      Application:TTemplateApplication;

    begin
    Application.Init (ApplicationName);
    Application.Run;
    Application.Done;
    end.

    {---------- snip ---------- snip ---------- snip ---------- snip ----------}

    begin 644 ownlist.res
    M_P, _P$ ,!#H @  *    "    !      0 $      "  @
    M                 (   (    " @ "     @ "  ("   " @(  P,#
    M_P  _P   /__ /\   #_ /\ __\  /___P
    M    N[N[NP             +N[N[N[N[L          +N[N[N[N[N[NP
    M    N[N[N[N[N[N[NP      "[N[N[N[N[N[N[NP     +N[N[N[N[N[N[N[
    MNP    N[N[N[N[N[N[N[N[NP   +N[N[N[N[N[N[N[N[L   N[N[N[N[N[N[
    MN[N[N[L  +N[N[N[N[N[N[N[N[N[  "[N[N[N[N[N[N[N[N[NP +   +N[N[
    MN[N[N[N[N[NP +N[L+N[N[N[N[N[N[N[L "[N[L+NPNPNPNP"P  L+  N[N[
    M"[L NPL+L+L+N["P +N[NP"["P  L+L+  N[  "[N[L "PNPNP +"P"PL  +
    M"[N[ + +L+L L N[ +L "P"[NP"[N[N[N[N[N[N[L "[   +N[N[N[N[N[N[
    MNP  N[N[N[N[N[N[N[N[N[L  +N[N[N[N[N[N[N[N[N[   +N[N[N[N[N[N[
    MN[N[L   "[N[N[N[N[N[N[N[N[    "[N[N[N[N[N[N[N[L     "[N[N[N[
    MN[N[N[NP      "[N[N[N[N[N[N[        "[N[N[N[N[N[L          +
    MN[N[N[N[L             "[N[N[                             /_P
    M#___@ '__@  ?_P  #_X   ?\   #^    ?    #P    X    &    !@
    M 0                                          @    8    &    !
    MP    \    /@   '\   #_@  !_\   __@  ?_^  ?__\ ___P4 34%)3D1)
    M04Q/1P P$*X      ,B !1( $@#: ((  &)O<F1L9P!/=VYE<B!$<F%W;B!,
    M:7-T0F]X %T 9@ @ !0  0    -00F]R0G1N $)U='1O;@  $0 0 +@ " #_
    M_P   E""3W=N97(@1')A=VX@)DQI<W1B;W@  !( &@"X #8 R "1 *%0@P
    M  !< -H  @!F  (  %!";W)3:&%D90    D "P#( $D 9P !  !00F]R4VAA
    M9&4   #_#@!)0T].7S$ ,! 4       !  $ (" 0  0  0#H @   0#_#P#_
    M 0 P'#     .  X  8  24-/3E\Q !( !0 !@ !-04E.1$E!3$]'
    +

    end

    {---------- end ---------- end ---------- end ---------- end ----------}

[Back to WIN-OS2 SWAG index] [Back to Main SWAG index] [Original]