GENERIC.H

#define IDM_ABOUT 100
#define ICONLISTBOX 101

int PASCAL WinMain(HANDLE, HANDLE, LPSTR, int);
BOOL InitApplication(HANDLE);
BOOL InitInstance(HANDLE, int);
long FAR PASCAL MainWndProc(HWND, unsigned, WORD, LONG);
BOOL FAR PASCAL About(HWND, unsigned, WORD, LONG);


GENERIC.RC

#include "windows.h"
#include "generic.h"

GenericMenu MENU
BEGIN
  POPUP      "&Help"
    BEGIN
    MENUITEM "&About Generic...", IDM_ABOUT
  END
END

AboutBox DIALOG 35, 17, 114, 89
  CAPTION "About Generic"
  STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
  BEGIN
    CONTROL "OK", IDOK, "BUTTON", WS_TABSTOP, 41, 69, 32, 14
    CONTROL "Icon List", ICONLISTBOX, "LISTBOX", WS_CHILD |
    WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_VSCROLL |
    LBS_NOTIFY | LBS_OWNERDRAWFIXED, 22, 15, 70, 40
  END

GENERIC.C




extern  BOOL FAR PASCAL About
    (
    HWND            hDlg,
    unsigned int    message,
    WORD            wParam,
    LONG            lParam
    )
{
    static  HWND  hListBox;

    switch ( message )
    {
    case WM_INITDIALOG:
        hListBox = GetDlgItem( hDlg, ICONLISTBOX );
        SendMessage( hListBox, LB_ADDSTRING, 0, 1001L );
        SendMessage( hListBox, LB_ADDSTRING, 0, 1002L );
        SendMessage( hListBox, LB_ADDSTRING, 0, 1003L );
        SendMessage( hListBox, LB_ADDSTRING, 0, 1004L );
        SendMessage( hListBox, LB_ADDSTRING, 0, 1005L );
        SendMessage( hListBox, LB_ADDSTRING, 0, 1006L );
        SendMessage( hListBox, LB_ADDSTRING, 0, 1007L );
        SendMessage( hListBox, LB_ADDSTRING, 0, 1008L );
        return TRUE;

    case WM_DRAWITEM:
        {
            auto    LPDRAWITEMSTRUCT lpDIS;
            auto    HDC     hDC;
            auto    RECT    rc;
            auto    int     iOldDC;
            auto    char    szText[40];

            // Mache aus lParam einen Zeiger auf die DRAWITEMSTRUCT.
            lpDIS = (LPDRAWITEMSTRUCT)lParam;

            // Ist es ein Listenfeld?
            if ( lpDIS->CtlType != ODT_LISTBOX )
            return TRUE;

            // Ein paar Angaben werden dauernd gebraucht. Kopieren.
            hDC = lpDIS->hDC;
            rc = lpDIS->rcItem;

            // Zustand des bergebenen Kontextes aufbewahren.
            iOldDC = SaveDC( hDC );

            // Einen Listeneintrag malen.
            if ( lpDIS->itemAction & ODA_DRAWENTIRE )
            {
                // In diesem Beispiel malen ein paar einfache GDI-Aufrufe
                // das "Symbol." In einer Anwendung stehen hier oft Aufrufe
                // von DrawIcon oder BitBlt.
                Rectangle( hDC, rc.left+4, rc.top+3, rc.left+14, rc.top+12 );
                Rectangle( hDC, rc.left+6, rc.top+4, rc.left+12, rc.top+8 );

                // Bei Bedarf Textfarbe auf Grau setzen.
                if ( lpDIS->itemState & ODS_DISABLED
                ||   lpDIS->itemState & ODS_GRAYED )
                SetTextColor( hDC, GetSysColor( COLOR_GRAYTEXT ) );

                // Text aus dem Listeneintrag ausgeben.
                SelectObject( hDC, GetStockObject( ANSI_VAR_FONT ) );
                ExtTextOut( hDC, rc.left+20, rc.top+1, 0, &rc, szText,
                    wsprintf( szText, "Item # %lu", lpDIS->itemData ),
                    NULL );

                // Auswahlzustand anzeigen
                if ( lpDIS->itemState & ODS_SELECTED )
                    InvertRect( hDC, &rc );

                // Fokuszustand anzeigen
                if ( lpDIS->itemState & ODS_FOCUS )
                    DrawFocusRect( hDC, &rc );
            }
            else
            {
                // Auswahlzustand ndern
                if ( lpDIS->itemAction & ODA_SELECT )
                    InvertRect( hDC, &rc );

                // Fokuszustand ndern
                if ( lpDIS->itemAction & ODA_FOCUS )
                    DrawFocusRect( hDC, &rc );
            }

            // Original-DC wieder einsetzen
            RestoreDC( hDC, iOldDC );
        }
        return TRUE;

    case WM_COMMAND:
        if ( wParam == IDOK || wParam == IDCANCEL )
        {
            EndDialog( hDlg, TRUE );
            return TRUE;
        }
        break;
    }
    return FALSE;
}

