Freigeben über


Erstellen eines Owner-Drawn Kombinationsfelds

In diesem Thema wird die Verwendung eines vom Besitzer gezeichneten Kombinationsfelds veranschaulicht. Im C++-Codebeispiel wird ein vom Besitzer gezeichnetes Dropdownlistenfeld verwendet, um die vier Lebensmittelgruppen anzuzeigen, die jeweils durch eine Bitmap und einen Namen dargestellt werden. Wenn Sie eine Lebensmittelgruppe auswählen, werden die Lebensmittel in dieser Gruppe in einer Liste angezeigt.

Screenshot eines Dialogfelds mit einem Listenfeld und einem erweiterten Dropdownlistenfeld mit einem Symbol und einer Bezeichnung für jedes Element

Das Dialogfeld enthält auch ein Listenfeld (IDLIST) und zwei Schaltflächen: OK (IDOK) und Abbrechen (IDCANCEL). Die KONSTANTEN IDOK und IDCANCEL werden durch die SDK-Headerdateien definiert. Die Konstante IDLIST wird in der Headerdatei der Anwendung definiert, ebenso wie der Steuerelementbezeichner IDCOMBO. Weitere Informationen zu Dialogfeldern finden Sie unter Dialogfelder.

Wichtige Informationen

Technologien

Voraussetzungen

  • C/C++
  • Programmierung der Windows-Benutzeroberfläche

Anweisungen

Schritt 1: Erstellen des Dialogfelds Owner-Drawn

Im Codebeispiel wird die DialogBox-Funktion verwendet, um ein modales Dialogfeld zu erstellen. Die Dialogfeldvorlage IDD_SQMEAL definiert die Fensterstile, Schaltflächen und Steuerelementbezeichner für das Kombinationsfeld. Das Kombinationsfeld in diesem Beispiel verwendet die Stile CBS_DROPDOWNLIST, CBS_OWNERDRAWFIXED, CBS_SORT, CBS_HASSTRINGS, WS_VSCROLL und WS_TABSTOP .

DialogBox(hInst, MAKEINTRESOURCE(IDD_SQMEAL), 
    hWnd, FoodDlgProc);

Schritt 2: Verarbeiten der WM_INITDIALOG und WM_DESTROY Nachrichten in einem Dialogfeld.

Wenn Sie ein Kombinationsfeld in einem Dialogfeld verwenden, antworten Sie normalerweise auf eine WM_INITDIALOG Nachricht, indem Sie das Kombinationsfeld initialisieren. Die Anwendung lädt die Bitmaps, die für das vom Besitzer gezeichnete Kombinationsfeld verwendet werden, und ruft dann die anwendungsdefinierte InitGroupList Funktion auf, um das Kombinationsfeld zu initialisieren. Außerdem wird das erste Listenelement im Kombinationsfeld ausgewählt und dann die anwendungsdefinierte InitFoodList Funktion aufgerufen, um das Listenfeld zu initialisieren.

Im Beispiel ist das kombinationsfeld vom Besitzer gezeichnet ein Dropdownlistenfeld, das die Namen jeder der vier Lebensmittelgruppen enthält. InitGroupList fügt den Namen jeder Lebensmittelgruppe hinzu und verwendet die CB_SETITEMDATA Nachricht, um jedem Listenelement, das eine Lebensmittelgruppe identifiziert, ein Bitmaphandle zuzuordnen.

Das Listenfeld im Beispiel enthält die Namen von Lebensmitteln in der ausgewählten Lebensmittelgruppe. InitFoodList setzt den Inhalt des Listenfelds zurück und fügt dann die Namen der aktuellen Lebensmittelauswahl in das Dropdownlistenfeld aktuelle Lebensmittelgruppe ein.

case WM_INITDIALOG:

    // Call an application-defined function to load bitmap resources.
    if (!LoadIconBitmaps())
    {
        EndDialog(hDlg, -1);
        break;
    }

    // Initialize the food groups combo box and select the first item.
    InitGroupList(hDlg);
    SendDlgItemMessage(hDlg, IDCOMBO, CB_SETCURSEL, 0, 0); 

    // Initialize the food list box and select the first item.
    InitFoodList(hDlg);
    SendDlgItemMessage(hDlg, IDLIST, LB_SETCURSEL, 0, 0); 

     return (INT_PTR)TRUE;

Wenn sie die WM_DESTROY-Nachricht empfängt, löscht die Anwendung die Bitmaps im Kombinationsfeld vom Besitzer gezeichnet.

case WM_DESTROY:

    // Call the application-defined function to free the bitmap resources.
    DeleteIconBitmaps();
    break;

Schritt 3: Verarbeiten der WM_MEASUREITEM Nachricht.

Ein vom Besitzer gezeichnetes Kombinationsfeld sendet die WM_MEASUREITEM Nachricht an die übergeordnete Fenster- oder Dialogfeldprozedur, damit die Anwendung die Dimensionen der einzelnen Listenelemente festlegen kann. Da das Beispielkombinationsfeld das CBS_OWNERDRAWFIXED-Format aufweist, sendet das System die WM_MEASUREITEM Nachricht nur einmal. Kombinationsfelde mit dem CBS_OWNERDRAWVARIABLE Format senden eine WM_MEASUREITEM Nachricht für jedes Listenelement.

Der lParam-Parameter ist ein Zeiger auf eine MEASUREITEMSTRUCT-Struktur , die das Steuerelement und das Listenelement identifiziert. Sie enthält auch die Standarddimensionen des Listenelements. Im Beispiel wird der elementHeight-Strukturmember geändert, um sicherzustellen, dass die Listenelemente hoch genug sind, um die Bitmaps der Lebensmittelgruppe aufzunehmen.

case WM_MEASUREITEM:
    {
    // Set the height of the items in the food groups combo box.
    LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT) lParam;

    if (lpmis->itemHeight < CY_BITMAP + 2)
        lpmis->itemHeight = CY_BITMAP + 2;

    break;
    }

Schritt 4: Verarbeiten der WM_DRAWITEM Nachricht.

Ein vom Besitzer gezeichnetes Kombinationsfeld sendet die WM_DRAWITEM Nachricht jedes Mal an die übergeordnete Fenster- oder Dialogfeldprozedur, wenn die Anwendung ein Listenelement neu streichen muss. Der lParam-Parameter ist ein Zeiger auf eine DRAWITEMSTRUCT-Struktur , die das Steuerelement und das Listenelement identifiziert. Es enthält auch Informationen, die zum Zeichnen des Elements erforderlich sind.

Die Beispielanwendung zeigt den Listenelementtext und die Bitmap an, die der Lebensmittelgruppe zugeordnet ist. Wenn das Element über den Fokus verfügt, zeichnet es auch ein Fokusrechteck. Vor dem Anzeigen des Texts legt das Beispiel die Vordergrund- und Hintergrundfarben basierend auf dem ausgewählten Element fest. Da das Kombinationsfeld das CBS_HASSTRINGS Format aufweist, behält das Kombinationsfeld den Text für jedes Listenelement bei, das mithilfe der CB_GETLBTEXT Nachricht abgerufen werden kann.

Welche Bitmaps für das Listenelement verwendet werden, hängt von der Lebensmittelgruppe ab. InitGroupList verwendet die CB_SETITEMDATA Nachricht, um jedem Listenelement ein Bitmaphandle zuzuordnen. Die Fensterprozedur ruft das Bitmaphandle aus dem elementData-Member der DRAWITEMSTRUCT-Struktur ab. Das System verwendet zwei Bitmaps für jedes Lebensmittelgruppensymbol: eine monochrome Bitmap mit dem SRCAND-Rastervorgang, um den unregelmäßigen Bereich hinter dem Bild zu löschen, und eine farbliche Bitmap mit dem SRCPAINT-Rastervorgang zum Zeichnen des Bilds.

case WM_DRAWITEM:
    {
    COLORREF clrBackground;
    COLORREF clrForeground;
    TEXTMETRIC tm;
    int x;
    int y;
    HRESULT hr;
    size_t cch;

    LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
       
    if (lpdis->itemID == -1) // Empty item)
        break;

    // Get the food icon from the item data.
    hbmIcon = (HBITMAP) lpdis->itemData;

    // The colors depend on whether the item is selected.
    clrForeground = SetTextColor(lpdis->hDC, 
        GetSysColor(lpdis->itemState & ODS_SELECTED ?
        COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT));

    clrBackground = SetBkColor(lpdis->hDC, 
        GetSysColor(lpdis->itemState & ODS_SELECTED ?
        COLOR_HIGHLIGHT : COLOR_WINDOW));

    // Calculate the vertical and horizontal position.
    GetTextMetrics(lpdis->hDC, &tm);
    y = (lpdis->rcItem.bottom + lpdis->rcItem.top - tm.tmHeight) / 2;
    x = LOWORD(GetDialogBaseUnits()) / 4;

    // Get and display the text for the list item.
    SendMessage(lpdis->hwndItem, CB_GETLBTEXT,
        lpdis->itemID, (LPARAM) achTemp);

    hr = StringCchLength(achTemp, 256, &cch);
    if (FAILED(hr))
    {
        // TODO: Write error handler.
    }

    ExtTextOut(lpdis->hDC, CX_BITMAP + 2 * x, y,
        ETO_CLIPPED | ETO_OPAQUE, &lpdis->rcItem,
        achTemp, (UINT)cch, NULL);

    // Restore the previous colors.
    SetTextColor(lpdis->hDC, clrForeground);
    SetBkColor(lpdis->hDC, clrBackground);
    
    //  Draw the food icon for the item. 
    HDC hdc = CreateCompatibleDC(lpdis->hDC); 
    if (hdc == NULL) 
        break; 
 
    SelectObject(hdc, hbmMask); 
    BitBlt(lpdis->hDC, x, lpdis->rcItem.top + 1, 
        CX_BITMAP, CY_BITMAP, hdc, 0, 0, SRCAND); 
 
    SelectObject(hdc, hbmIcon); 
    BitBlt(lpdis->hDC, x, lpdis->rcItem.top + 1, 
        CX_BITMAP, CY_BITMAP, hdc, 0, 0, SRCPAINT); 
 
    DeleteDC(hdc); 
  
    // If the item has the focus, draw the focus rectangle.
    if (lpdis->itemState & ODS_FOCUS)
        DrawFocusRect(lpdis->hDC, &lpdis->rcItem);

    break;
    }

Schritt 5: Verarbeiten der WM_COMMAND Nachricht.

Wenn ein Ereignis in einem Dialogfeldsteuerelement auftritt, benachrichtigt das Steuerelement die Dialogfeldprozedur mithilfe einer WM_COMMAND Meldung. Im Beispiel werden Benachrichtigungen aus dem Kombinationsfeld, dem Listenfeld und der Schaltfläche OK verarbeitet. Der Steuerelementbezeichner befindet sich im Wort "wParam mit niedriger Reihenfolge", und der Benachrichtigungscode im Wort "wParam".

Wenn der Steuerelementbezeichner IDCOMBO ist, ist im Kombinationsfeld ein Ereignis aufgetreten. Als Reaktion ignoriert die Dialogfeldprozedur alle anderen Kombinationsfeldereignisse mit Ausnahme CBN_SELENDOK, was angibt, dass eine Auswahl getroffen wurde, das Dropdownlistenfeld geschlossen wurde und die vorgenommenen Änderungen akzeptiert werden sollten. Die Dialogfeldprozedur ruft auf InitFoodList , um den Inhalt des Listenfelds zurückzusetzen und die Namen der aktuellen Auswahl in das Dropdownlistenfeld hinzuzufügen.

Wenn der Steuerelementbezeichner IDLIST ist, ist im Listenfeld ein Ereignis aufgetreten. Dies führt dazu, dass die Dialogfeldprozedur alle Listenfeldereignisse außer LBN_DBLCLK ignoriert, was angibt, dass der Benutzer auf ein Listenelement doppelt geklickt hat. Dieses Ereignis wird auf die gleiche Weise verarbeitet, als ob eine OK-Schaltfläche ausgewählt wurde.

Wenn der Steuerelementbezeichner IDOK ist, hat der Benutzer die Schaltfläche OK ausgewählt. Daraufhin fügt die Dialogfeldprozedur den Namen der ausgewählten Lebensmittel in das mehrzeilige Bearbeitungssteuerelement der Anwendung ein, und ruft dann die EndDialog-Funktion auf, um das Dialogfeld zu schließen.

Wenn der Steuerelementbezeichner IDCANCEL ist, hat der Benutzer auf die Schaltfläche Abbrechen geklickt. Als Antwort ruft die Dialogfeldprozedur EndDialog auf, um das Dialogfeld zu schließen.

case WM_COMMAND:
        switch (LOWORD(wParam)) 
        { 
            case IDCOMBO: 
                if (HIWORD(wParam) == CBN_SELENDOK) 
                { 
                    InitFoodList(hDlg); 
                    SendDlgItemMessage(hDlg, IDLIST, 
                        LB_SETCURSEL, 0, 0); 
                } 
                break; 
 
            case IDLIST: 
                if (HIWORD(wParam) != LBN_DBLCLK) 
                    break; 
 
            // For a double-click, process the OK case. 
            case IDOK: 
 
                // Get the text for the selected list item. 
                hwnd = GetDlgItem(hDlg, IDLIST); 

                // Here it is assumed the text can fit into achTemp.
                // If there is doubt, call LB_GETTEXTLENGTH first.
                SendMessage(hwnd, LB_GETTEXT, 
                    SendMessage(hwnd, LB_GETCURSEL, 0, 0), 
                    (LPARAM) achTemp); 
 
                // TODO: Do something with the selected text.
 
                EndDialog(hDlg, 0); 
                break; 
 
            case IDCANCEL: 
                hwnd = GetDlgItem(hDlg, IDCOMBO); 
                if (SendMessage(hwnd, CB_GETDROPPEDSTATE, 0, 0)) 
                    SendMessage(hwnd, CB_SHOWDROPDOWN, FALSE, 0); 
                else EndDialog(hDlg, 0); 
        } 
        break; 

Vollständiges Beispiel

Im Folgenden sind die Dialogfeldprozedur und die unterstützenden Funktionen für das Dialogfeld Square Meal aufgeführt.

#define ID_BREAD 0
#define ID_DAIRY 1
#define ID_FRUIT 2
#define ID_MEAT  3

#define CX_BITMAP 24
#define CY_BITMAP 24

HBITMAP hbmBread;
HBITMAP hbmDairy;
HBITMAP hbmMeat;
HBITMAP hbmFruit;
HBITMAP hbmMask;

HBITMAP hbmIcon;
// Message handler for Square Meal dialog box.
INT_PTR CALLBACK FoodDlgProc(HWND hDlg, UINT message, WPARAM wParam, 
    LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    TCHAR achTemp[256];
    HWND hwnd;

    switch (message)
    {
    case WM_INITDIALOG:

        // Call an application-defined function to load bitmap resources.
        if (!LoadIconBitmaps())
        {
            EndDialog(hDlg, -1);
            break;
        }

        // Initialize the food groups combo box and select the first item.
        InitGroupList(hDlg);
        SendDlgItemMessage(hDlg, IDCOMBO, CB_SETCURSEL, 0, 0); 

        // Initialize the food list box and select the first item.
        InitFoodList(hDlg);
        SendDlgItemMessage(hDlg, IDLIST, LB_SETCURSEL, 0, 0); 

         return (INT_PTR)TRUE;
   
    case WM_MEASUREITEM:
        {
        // Set the height of the items in the food groups combo box.
        LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT) lParam;

        if (lpmis->itemHeight < CY_BITMAP + 2)
            lpmis->itemHeight = CY_BITMAP + 2;

        break;
        }

    case WM_DRAWITEM:
        {
        COLORREF clrBackground;
        COLORREF clrForeground;
        TEXTMETRIC tm;
        int x;
        int y;
        HRESULT hr;
        size_t cch;

        LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
           
        if (lpdis->itemID == -1) // Empty item)
            break;

        // Get the food icon from the item data.
        hbmIcon = (HBITMAP) lpdis->itemData;

        // The colors depend on whether the item is selected.
        clrForeground = SetTextColor(lpdis->hDC, 
            GetSysColor(lpdis->itemState & ODS_SELECTED ?
            COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT));

        clrBackground = SetBkColor(lpdis->hDC, 
            GetSysColor(lpdis->itemState & ODS_SELECTED ?
            COLOR_HIGHLIGHT : COLOR_WINDOW));

        // Calculate the vertical and horizontal position.
        GetTextMetrics(lpdis->hDC, &tm);
        y = (lpdis->rcItem.bottom + lpdis->rcItem.top - tm.tmHeight) / 2;
        x = LOWORD(GetDialogBaseUnits()) / 4;

        // Get and display the text for the list item.
        SendMessage(lpdis->hwndItem, CB_GETLBTEXT,
            lpdis->itemID, (LPARAM) achTemp);

        hr = StringCchLength(achTemp, 256, &cch);
        if (FAILED(hr))
        {
            // TODO: Write error handler.
        }

        ExtTextOut(lpdis->hDC, CX_BITMAP + 2 * x, y,
            ETO_CLIPPED | ETO_OPAQUE, &lpdis->rcItem,
            achTemp, (UINT)cch, NULL);

        // Restore the previous colors.
        SetTextColor(lpdis->hDC, clrForeground);
        SetBkColor(lpdis->hDC, clrBackground);
        
        //  Draw the food icon for the item. 
        HDC hdc = CreateCompatibleDC(lpdis->hDC); 
        if (hdc == NULL) 
            break; 
 
        SelectObject(hdc, hbmMask); 
        BitBlt(lpdis->hDC, x, lpdis->rcItem.top + 1, 
            CX_BITMAP, CY_BITMAP, hdc, 0, 0, SRCAND); 
 
        SelectObject(hdc, hbmIcon); 
        BitBlt(lpdis->hDC, x, lpdis->rcItem.top + 1, 
            CX_BITMAP, CY_BITMAP, hdc, 0, 0, SRCPAINT); 
 
        DeleteDC(hdc); 
      
        // If the item has the focus, draw the focus rectangle.
        if (lpdis->itemState & ODS_FOCUS)
            DrawFocusRect(lpdis->hDC, &lpdis->rcItem);

        break;
        }

    case WM_COMMAND:
            switch (LOWORD(wParam)) 
            { 
                case IDCOMBO: 
                    if (HIWORD(wParam) == CBN_SELENDOK) 
                    { 
                        InitFoodList(hDlg); 
                        SendDlgItemMessage(hDlg, IDLIST, 
                            LB_SETCURSEL, 0, 0); 
                    } 
                    break; 
 
                case IDLIST: 
                    if (HIWORD(wParam) != LBN_DBLCLK) 
                        break; 
 
                // For a double-click, process the OK case. 
                case IDOK: 
 
                    // Get the text for the selected list item. 
                    hwnd = GetDlgItem(hDlg, IDLIST); 

                    // Here it is assumed the text can fit into achTemp.
                    // If there is doubt, call LB_GETTEXTLENGTH first.
                    SendMessage(hwnd, LB_GETTEXT, 
                        SendMessage(hwnd, LB_GETCURSEL, 0, 0), 
                        (LPARAM) achTemp); 
 
                    // TODO: Do something with the selected text.
 
                    EndDialog(hDlg, 0); 
                    break; 
 
                case IDCANCEL: 
                    hwnd = GetDlgItem(hDlg, IDCOMBO); 
                    if (SendMessage(hwnd, CB_GETDROPPEDSTATE, 0, 0)) 
                        SendMessage(hwnd, CB_SHOWDROPDOWN, FALSE, 0); 
                    else EndDialog(hDlg, 0); 
            } 
            break; 

    case WM_DESTROY:

        // Call the application-defined function to free the bitmap resources.
        DeleteIconBitmaps();
        break;
    }
    return (INT_PTR)FALSE;
}

// Loads string resources and adds them as items to the drop-down list of
//   the food groups combo box. The bitmap handle of each item&#39;s icon is
//   stored as item data for easy access when the item needs to be drawn.
// 
void InitGroupList(HWND hDlg)
{
    TCHAR achTemp[256];
    DWORD dwIndex;

    // Get the handle of the food groups combo box.
    HWND hwndGroupsBox = GetDlgItem(hDlg, IDCOMBO);

    LoadString(hInst, IDS_BREAD, achTemp, sizeof(achTemp)/sizeof(TCHAR));
    dwIndex = SendMessage(hwndGroupsBox, CB_ADDSTRING, 0, (LPARAM) achTemp);
    SendMessage(hwndGroupsBox, CB_SETITEMDATA, dwIndex, (LPARAM) hbmBread);
    
    LoadString(hInst, IDS_DAIRY, achTemp, sizeof(achTemp)/sizeof(TCHAR)); 
    dwIndex = SendMessage(hwndGroupsBox, CB_ADDSTRING, 0, (LPARAM) achTemp);
    SendMessage(hwndGroupsBox, CB_SETITEMDATA, dwIndex, (LPARAM) hbmDairy);

    LoadString(hInst, IDS_FRUIT, achTemp, sizeof(achTemp)/sizeof(TCHAR));
    dwIndex = SendMessage(hwndGroupsBox, CB_ADDSTRING, 0, (LPARAM) achTemp);
    SendMessage(hwndGroupsBox, CB_SETITEMDATA, dwIndex, (LPARAM) hbmFruit); 

    LoadString(hInst, IDS_MEAT, achTemp, sizeof(achTemp)/sizeof(TCHAR)); 
    dwIndex = SendMessage(hwndGroupsBox, CB_ADDSTRING, 0, (LPARAM) achTemp);
    SendMessage(hwndGroupsBox, CB_SETITEMDATA, dwIndex, (LPARAM) hbmMeat);

    return;
}

// Fills the food list based on the selected item in the food groups
//   combo box.
void InitFoodList(HWND hDlg)
{
    TCHAR achTemp[256];

    HWND hwndGroupsBox = GetDlgItem(hDlg, IDCOMBO);
    HWND hwndFoodList = GetDlgItem(hDlg, IDLIST);

    // Clear the list contents.
    SendMessage(hwndFoodList, LB_RESETCONTENT, 0, 0);

    // Find out which food group is selected.
    int idFoodGroup = SendMessage(hwndGroupsBox, CB_GETCURSEL, 0, 0);

    switch (idFoodGroup)
    {
    case ID_BREAD:
        LoadString(hInst, IDS_OAT, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);

        LoadString(hInst, IDS_WHEAT, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);

        LoadString(hInst, IDS_RYE, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);
        break;

    case ID_DAIRY:
        LoadString(hInst, IDS_CHEDDAR, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);

        LoadString(hInst, IDS_MILK, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);

        LoadString(hInst, IDS_PROCESSED, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);

        LoadString(hInst, IDS_SWISS, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);
        
        break;

    case ID_FRUIT:
        LoadString(hInst, IDS_APPLES, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);

        LoadString(hInst, IDS_BANANAS, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);

        LoadString(hInst, IDS_ORANGES, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);

        break;

    case ID_MEAT:
        LoadString(hInst, IDS_BEEF, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);

        LoadString(hInst, IDS_CHICKEN, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);

        LoadString(hInst, IDS_PORK, achTemp, sizeof(achTemp)/sizeof(TCHAR));
        SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM) achTemp);

        break;

    default:
        break;
    }

    return;
}

// Loads the food icon bitmaps from the application resources.
//
BOOL LoadIconBitmaps(void)
{
    hbmBread = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BREAD));

    if (hbmBread != NULL)
         hbmDairy = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_DAIRY));

    if (hbmDairy != NULL)
         hbmMeat = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_MEAT));

    if (hbmMeat != NULL)
        hbmFruit = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FRUIT));
    
    if (hbmFruit != NULL)
        hbmMask = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_MASK));

    if (hbmMask != NULL)
        return TRUE;
        
    return FALSE;
}

// Frees the icon bitmps.
//
void DeleteIconBitmaps(void)
{
    FreeResource(reinterpret_cast<HGLOBAL>(hbmBread));
    FreeResource(reinterpret_cast<HGLOBAL>(hbmDairy));
    FreeResource(reinterpret_cast<HGLOBAL>(hbmMeat));
    FreeResource(reinterpret_cast<HGLOBAL>(hbmFruit));
    FreeResource(reinterpret_cast<HGLOBAL>(hbmMask));
}

Verwenden von Kombinationsfelden