C++ 如何在Win32中创建带有位图的组合框?

C++ 如何在Win32中创建带有位图的组合框?,c++,winapi,combobox,bitmap,C++,Winapi,Combobox,Bitmap,我想创建一个这样的自定义组合框(如MS Word中的组合框) 是否有任何Win32 API调用(我不能使用MFC)来完成此项工作(如ChooseColor()或ChooseFont()?如果没有,请任何人告诉我如何执行此操作?谢谢 问候, 编辑: 创建“所有者绘制”对话框!!这是唯一的方法吗? 您可以从中派生。您必须实现 WM_MEASUREITEM/OCM_MEASUREITEM对组合框项目进行尺寸测量 WM_DRAWITEM/OCM_DRAWITEM自行绘制。您实际上不需要位图,只需使

我想创建一个这样的自定义组合框(如MS Word中的组合框)

是否有任何Win32 API调用(我不能使用MFC)来完成此项工作(如ChooseColor()或ChooseFont()?如果没有,请任何人告诉我如何执行此操作?谢谢

问候,

编辑: 创建“所有者绘制”对话框!!这是唯一的方法吗?

您可以从中派生。您必须实现

  • WM_MEASUREITEM/OCM_MEASUREITEM
    对组合框项目进行尺寸测量
  • WM_DRAWITEM/OCM_DRAWITEM
    自行绘制。您实际上不需要位图,只需使用GDI绘制即可
    • 您可以从中派生。您必须实现

      • WM_MEASUREITEM/OCM_MEASUREITEM
        对组合框项目进行尺寸测量
      • WM_DRAWITEM/OCM_DRAWITEM
        自行绘制。您实际上不需要位图,只需使用GDI绘制即可

      在Win32中,这被称为所有者绘制的组合框。在线计算的一个好起点是:


      在Win32中,这被称为所有者绘制的组合框。在线计算的一个好起点是:


      您有一些解决问题的选项:

    • 所有常用控件都支持
      WM_SETFONT
      ,因此,如果您找到一种包含所有所需行元素的字体,您可以更改组合框控件的字体,并用相应的文本填充项目
    • combobox
      控件,它将图像与文本相结合(请参阅)。请注意,将选择项目的哪一部分(请尝试)。如果您可以稍微更改对combobox控件的要求,则可以使用此控件
    • 您可以使用owner draw组合框。这样您就完全自由了,但您的代码可能会更长,如果您使用windows的非标准颜色shema或非默认theams,您应该会更认真。在这种情况下,我建议您使用函数
      GetSysColor

    • 你应该欺骗自己什么样的方式最适合你的项目要求。

      你有一些选择来解决你的问题:

    • 所有常用控件都支持
      WM_SETFONT
      ,因此,如果您找到一种包含所有所需行元素的字体,您可以更改组合框控件的字体,并用相应的文本填充项目
    • combobox
      控件,它将图像与文本相结合(请参阅)。请注意,将选择项目的哪一部分(请尝试)。如果您可以稍微更改对combobox控件的要求,则可以使用此控件
    • 您可以使用owner draw组合框。这样您就完全自由了,但您的代码可能会更长,如果您使用windows的非标准颜色shema或非默认theams,您应该会更认真。在这种情况下,我建议您使用函数
      GetSysColor

    • 你应该欺骗自己什么样的方式最符合你的项目要求。

      这是一个业主绘制的组合框的工作代码,说明在其中

      // List image Icon Test.cpp : Defines the entry point for the application.
      //
      
      // READ ME:
      // Create a new c++ desktop application
      // Remove all the code from the cpp section and insert all this code.
      // Create a dialog in VS editor, which had a list box called IDLIST and a combobox called IDCOMBO
      // it will already have ok and cancel buttons these can stay.
      // Create 4 bitmaps any size, only 24x24 will be shown and put them in the source project directory,
      // eg C:\Users\Pts1\source\repos\List image Icon Test\List image Icon Test
      // Rename the bitmaps Black.bmp, Blue.bmp, Red.bmp, Green.bmp and make sure they are of the format bmp not just called bmp.
      // or ideally create the bitmaps so that they are 24x24 and all black,blue etc
      // add IDB_Bread bitmap to the editor or remove them from the code below as instructed. We can load bitmaps directly from file instead.
      // Make sure you change the combobox properties as instructed at the header for the dialog callback procedure.
      //
      #include "stdafx.h"
      #include "List image Icon Test.h"
      #include "strsafe.h"
      
      #pragma comment(linker, "\"/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
      
      #define MAX_LOADSTRING 100
      
      #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, hbmDairy, hbmMeat, hbmFruit, hbmMask, hbmIcon;
      
      HINSTANCE hInst;                                // current instance
      WCHAR szTitle[MAX_LOADSTRING];                  // The title bar text
      WCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
      
      ATOM                MyRegisterClass(HINSTANCE hInstance);
      BOOL                InitInstance(HINSTANCE, int);
      LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
      INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
      
      void InitGroupList(HWND hDlg);
      void DeleteIconBitmaps(void);
      BOOL LoadIconBitmaps(void);
      void InitFoodList(HWND hDlg);
      INT_PTR CALLBACK FoodDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
      
      int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                           _In_opt_ HINSTANCE hPrevInstance,
                           _In_ LPWSTR    lpCmdLine,
                           _In_ int       nCmdShow)
      {
          UNREFERENCED_PARAMETER(hPrevInstance);
          UNREFERENCED_PARAMETER(lpCmdLine);
      
          // TODO: Place code here.
      
          // Initialize global strings
          LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
          LoadStringW(hInstance, IDC_LISTIMAGEICONTEST, szWindowClass, MAX_LOADSTRING);
          MyRegisterClass(hInstance);
      
          // Perform application initialization:
          if (!InitInstance (hInstance, nCmdShow)) return FALSE;
      
          HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_LISTIMAGEICONTEST));
      
          MSG msg;
      
          // Main message loop:
          while (GetMessage(&msg, nullptr, 0, 0))
          {
              if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
              {
                  TranslateMessage(&msg);
                  DispatchMessage(&msg);
              }
          }
      
          return (int) msg.wParam;
      }
      
      
      
      //
      //  FUNCTION: MyRegisterClass()
      //
      //  PURPOSE: Registers the window class.
      //
      ATOM MyRegisterClass(HINSTANCE hInstance)
      {
          WNDCLASSEXW wcex;
      
          wcex.cbSize = sizeof(WNDCLASSEX);
      
          wcex.style          = CS_HREDRAW | CS_VREDRAW;
          wcex.lpfnWndProc    = WndProc;
          wcex.cbClsExtra     = 0;
          wcex.cbWndExtra     = 0;
          wcex.hInstance      = hInstance;
          wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LISTIMAGEICONTEST));
          wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
          wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
          wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_LISTIMAGEICONTEST);
          wcex.lpszClassName  = szWindowClass;
          wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
      
          return RegisterClassExW(&wcex);
      }
      
      //
      //   FUNCTION: InitInstance(HINSTANCE, int)
      //
      //   PURPOSE: Saves instance handle and creates main window
      //
      //   COMMENTS:
      //
      //        In this function, we save the instance handle in a global variable and
      //        create and display the main program window.
      //
      BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
      {
         hInst = hInstance; // Store instance handle in our global variable
      
         HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
      
         if (!hWnd)
         {
            return FALSE;
         }
      
         ShowWindow(hWnd, nCmdShow);
         UpdateWindow(hWnd);
      
         return TRUE;
      }
      
      //
      //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
      //
      //  PURPOSE: Processes messages for the main window.
      //
      //  WM_COMMAND  - process the application menu
      //  WM_PAINT    - Paint the main window
      //  WM_DESTROY  - post a quit message and return
      //
      //
      LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
      {
          switch (message)
          {
          case WM_COMMAND:
              {
                  int wmId = LOWORD(wParam);
                  // Parse the menu selections:
                  switch (wmId)
                  {
                  case IDM_ABOUT:
                      DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, FoodDlgProc);
                      break;
                  case IDM_EXIT:
                      DestroyWindow(hWnd);
                      break;
                  default:
                      return DefWindowProc(hWnd, message, wParam, lParam);
                  }
              }
              break;
          case WM_PAINT:
              {
                  PAINTSTRUCT ps;
                  HDC hdc = BeginPaint(hWnd, &ps);
                  // TODO: Add any drawing code that uses hdc here...
                  EndPaint(hWnd, &ps);
              }
              break;
          case WM_DESTROY:
              PostQuitMessage(0);
              break;
          default:
              return DefWindowProc(hWnd, message, wParam, lParam);
          }
          return 0;
      }
      
      
      // Message handler for Square Meal dialog box. Click on Help -> ABout Box to activate this dialog.
      // You must set the combo box properties to these for this to work.
      //
      // !!!!!   The combo box you create for this example uses the CBS_DROPDOWNLIST, CBS_OWNERDRAWFIXED, (optional)CBS_SORT, CBS_HASSTRINGS, WS_VSCROLL, and (optional) WS_TABSTOP styles. !!!!!!
      //
      
      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())
              {
                  Beep(2000, 250);
                  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)); //originals were strings in editor
      ////dwIndex = SendMessage(hwndGroupsBox, CB_ADDSTRING, 0, (LPARAM)achTemp);
      dwIndex = SendMessage(hwndGroupsBox, CB_ADDSTRING, 0, (LPARAM)_T("Bread"));
      SendMessage(hwndGroupsBox, CB_SETITEMDATA, dwIndex, (LPARAM)hbm1);
      
      //LoadString(hInst, IDS_DAIRY, achTemp, sizeof(achTemp) / sizeof(TCHAR));
      dwIndex = SendMessage(hwndGroupsBox, CB_ADDSTRING, 0, (LPARAM)_T("Dairy"));
      SendMessage(hwndGroupsBox, CB_SETITEMDATA, dwIndex, (LPARAM)hbm2);
      
      //LoadString(hInst, IDS_FRUIT, achTemp, sizeof(achTemp) / sizeof(TCHAR));
      dwIndex = SendMessage(hwndGroupsBox, CB_ADDSTRING, 0, (LPARAM)_T("Meat"));
      SendMessage(hwndGroupsBox, CB_SETITEMDATA, dwIndex, (LPARAM)hbm3);
      
      //LoadString(hInst, IDS_MEAT, achTemp, sizeof(achTemp) / sizeof(TCHAR));
      dwIndex = SendMessage(hwndGroupsBox, CB_ADDSTRING, 0, (LPARAM)_T("Fruit"));
      SendMessage(hwndGroupsBox, CB_SETITEMDATA, dwIndex, (LPARAM)hbm4);
      
          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_OATS, 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_BREAD, achTemp, sizeof(achTemp) / sizeof(TCHAR));
              SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM)achTemp);
      
              LoadString(hInst, IDS_BREAD, achTemp, sizeof(achTemp) / sizeof(TCHAR));
              SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM)achTemp);
      
              LoadString(hInst, IDS_BREAD, achTemp, sizeof(achTemp) / sizeof(TCHAR));
              SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM)achTemp);
      
              LoadString(hInst, IDS_BREAD, achTemp, sizeof(achTemp) / sizeof(TCHAR));
              SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM)achTemp);
      
              break;
      
          case ID_FRUIT:
              LoadString(hInst, IDS_BREAD, achTemp, sizeof(achTemp) / sizeof(TCHAR));
              SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM)achTemp);
      
              LoadString(hInst, IDS_BREAD, achTemp, sizeof(achTemp) / sizeof(TCHAR));
              SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM)achTemp);
      
              LoadString(hInst, IDS_BREAD, achTemp, sizeof(achTemp) / sizeof(TCHAR));
              SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM)achTemp);
      
              break;
      
          case ID_MEAT:
              LoadString(hInst, IDS_BREAD, achTemp, sizeof(achTemp) / sizeof(TCHAR));
              SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM)achTemp);
      
              LoadString(hInst, IDS_BREAD, achTemp, sizeof(achTemp) / sizeof(TCHAR));
              SendMessage(hwndFoodList, LB_ADDSTRING, 0, (LPARAM)achTemp);
      
              LoadString(hInst, IDS_BREAD, 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 = (HBITMAP)LoadImageW(hInst, (wchar_t*) L"Blue.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //File has to be of format .bmp
          if (hbmBread != NULL) hbmDairy = (HBITMAP)LoadImageW(hInst, (wchar_t*) L"Green.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //File has to be of format .bmp
          if (hbmDairy != NULL) hbmMeat = (HBITMAP)LoadImageW(hInst, (wchar_t*)L"Red.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //File has to be of format .bmp
          if (hbmMeat != NULL) hbmFruit = (HBITMAP)LoadImageW(hInst, (wchar_t*)L"Black.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //File has to be of format .bmp
          if (hbmFruit != NULL) hbmMask = (HBITMAP)LoadImageW(hInst, (wchar_t*)L"Black.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //Needs to be a black mask to show other images.
      
      /*
          // original code which still works, you need to put in bitmaps into the editor itself. eg IDB_Bread, IDB_DAIRY, are 48x48 bitmaps in my editor by default.
          hbmBread = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BREAD));
          if (hbmBread != NULL) hbmDairy = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_DAIRY));
          if (hbmDairy != NULL) hbmMeat = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_Green));
          */
      
          //if (hbmMeat != NULL) hbmFruit = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BREAD)); //Bitmap defined in the editor(resource.h) which calls a Black.bmp file. See VS Bitmap editor.
          //if (hbmFruit != NULL) hbmMask = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BREAD));
      
          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));
      }
      
      //List image Icon Test.cpp:定义应用程序的入口点。
      //
      //读给我听:
      //创建一个新的C++桌面应用程序
      //从cpp部分删除所有代码并插入所有此代码。
      //在VS编辑器中创建一个对话框,其中有一个名为IDLIST的列表框和一个名为IDCOMBO的组合框
      //它已经有确定和取消按钮,这些按钮可以保留。
      //创建4个任意大小的位图,只显示24x24,并将它们放在源项目目录中,
      //例如C:\Users\Pts1\source\repos\List图像图标测试\List图像图标测试
      //将位图重命名为Black.bmp、Blue.bmp、Red.bmp、Green.bmp,并确保它们的格式为bmp而不仅仅是bmp。
      //或者理想情况下创建位图,使其为24x24,并且全部为黑色、蓝色等
      //将IDB_面包位图添加到编辑器中,或者按照说明从下面的代码中删除它们。我们可以直接从文件中加载位图。
      //确保按照对话框回调过程标题中的说明更改组合框属性。
      //
      #包括“stdafx.h”
      #包括“列表图像图标测试.h”
      #包括“strsafe.h”
      #pragma注释(链接器“\”/manifestdependency:type='Win32'name='Microsoft.Windows.Common Controls'version='6.0.0.0'processorArchitecture='*'publicKeyToken='6595b64144ccf1df'language='*'\“”)
      #定义最大加载字符串100
      #定义ID_0
      #定义ID_1
      #定义ID_水果2
      #定义ID_肉3
      #定义CX_位图24
      #定义CY_位图24
      HBITMAP hbmBread、hbmDairy、hbmMeat、hbmFruit、hbmMask、hbmIcon;
      HINSTANCE hInst;//当前实例
      WCHAR szTitle[MAX_LOADSTRING];//标题栏文本
      WCHAR szWindowClass[MAX_LOADSTRING];//主窗口类名
      ATOM MyRegisterClass(HINSTANCE HINSTANCE);
      BOOL InitInstance(HINSTANCE,int);
      LRESULT回调WndProc(HWND、UINT、WPARAM、LPARAM);
      INT_PTR回调关于(HWND、UINT、WPARAM、LPARAM);
      void InitGroupList(HWND hDlg);
      void deleteiconbitmap(void);
      BOOL loadiconbitmap(void);
      void InitFoodList(HWND hDlg);
      INT_PTR回调foodldlgproc(HWND hDlg、UINT消息、WPARAM WPARAM、LPARAM LPARAM);
      国际货币基金组织,
      _在当前情况下,
      _在LPWSTR lpCmdLine中,
      _In_uuint(nCmdShow)
      {
      未引用的_参数(HPPreInstance);
      未引用的_参数(lpCmdLine);
      //TODO:将代码放在这里。
      //初始化全局字符串
      LoadStringW(hInstance、IDS\U APP\U TITLE、szTitle、MAX\U LOADSTRING);
      LoadStringW(hInstance、IDC_LISTIMAGEICONTEST、szWindowClass、MAX_LOADSTRING);
      MyRegisterClass(hInstance);
      //执行应用程序初始化:
      如果(!InitInstance(hInstance,nCmdShow))返回FALSE;
      HACCEL hAccelTable=装载加速器(hInstance,MakeintResource)