-#include "IListCtrl.h"
-#include <commctrl.h>
-
-class IListCtrlImpl : public IListCtrl
-{
-public:
- IListCtrlImpl(HWND hwndListCtrl) : m_hwndListCtrl(hwndListCtrl)
- {
- }
-
- int GetColumnCount() const
- {
- return Header_GetItemCount(ListView_GetHeader(m_hwndListCtrl));
- }
-
- int GetRowCount() const
- {
- return ListView_GetItemCount(m_hwndListCtrl);
- }
-
- String GetColumnName(int col) const
- {
- LVCOLUMN lvc;
- TCHAR columnName[256]; // Assuming max col header will never be > 256
- lvc.mask = LVCF_TEXT;
- lvc.pszText = &columnName[0];
- lvc.cchTextMax = sizeof(columnName) / sizeof(TCHAR);
- ListView_GetColumn(m_hwndListCtrl, col, &lvc);
- return lvc.pszText;
- }
-
- String GetItemText(int row, int col) const
- {
- TCHAR text[512]; // Assuming max col header will never be > 512
- ListView_GetItemText(m_hwndListCtrl, row, col, text, sizeof(text)/sizeof(text[0]));
- return text;
- }
-
- void *GetItemData(int row) const
- {
+#pragma once\r
+\r
+#include "IListCtrl.h"\r
+#include <commctrl.h>\r
+#include <atlimage.h>\r
+\r
+class IListCtrlImpl : public IListCtrl\r
+{\r
+public:\r
+ explicit IListCtrlImpl(HWND hwndListCtrl) : m_hwndListCtrl(hwndListCtrl)\r
+ {\r
+ }\r
+\r
+ ~IListCtrlImpl() override {}\r
+\r
+ int GetColumnCount() const override\r
+ {\r
+ return Header_GetItemCount(ListView_GetHeader(m_hwndListCtrl));\r
+ }\r
+\r
+ int GetRowCount() const override\r
+ {\r
+ return ListView_GetItemCount(m_hwndListCtrl);\r
+ }\r
+\r
+ String GetColumnName(int col) const override\r
+ {\r
+ LVCOLUMN lvc;\r
+ TCHAR columnName[256]; // Assuming max col header will never be > 256\r
+ lvc.mask = LVCF_TEXT;\r
+ lvc.pszText = &columnName[0];\r
+ lvc.cchTextMax = sizeof(columnName) / sizeof(TCHAR);\r
+ ListView_GetColumn(m_hwndListCtrl, col, &lvc);\r
+ return lvc.pszText;\r
+ }\r
+\r
+ String GetItemText(int row, int col) const override\r
+ {\r
+ TCHAR text[512]; // Assuming max col header will never be > 512\r
+ text[0] = '\0';\r
+ ListView_GetItemText(m_hwndListCtrl, row, col, text, sizeof(text)/sizeof(text[0]));\r
+ return text;\r
+ }\r
+\r
+ void *GetItemData(int row) const override\r
+ {\r
LVITEM lvi = {0};\r
lvi.iItem = row;\r
lvi.mask = LVIF_PARAM;\r
::SendMessage(m_hwndListCtrl, LVM_GETITEM, 0, (LPARAM)&lvi);\r
return (void *)lvi.lParam;\r
- }
-
- int GetBackColor(int row) const
- {
- NMLVCUSTOMDRAW nmlvcd = {0};
- nmlvcd.nmcd.hdr.code = NM_CUSTOMDRAW;
- nmlvcd.nmcd.hdr.idFrom = GetDlgCtrlID(m_hwndListCtrl);
- nmlvcd.nmcd.hdr.hwndFrom = m_hwndListCtrl;
- nmlvcd.nmcd.dwDrawStage = CDDS_ITEMPREPAINT | CDDS_SUBITEM;
- nmlvcd.nmcd.dwItemSpec = row;
- SendMessage(GetParent(m_hwndListCtrl), WM_NOTIFY, (WPARAM)m_hwndListCtrl, (LPARAM)&nmlvcd);
- return nmlvcd.clrTextBk;
- }
-
- bool IsSelectedItem(int sel) const
- {
- return !!ListView_GetItemState(m_hwndListCtrl, sel, LVIS_SELECTED);
- }
-
- int GetNextItem(int sel, bool selected = false, bool reverse = false) const
- {
- return ListView_GetNextItem(m_hwndListCtrl, sel, (selected ? LVNI_SELECTED : 0) | (reverse ? LVNI_ABOVE : 0));
- }
-
- int GetNextSelectedItem(int sel, bool reverse = false) const
- {
- return ListView_GetNextItem(m_hwndListCtrl, sel, LVNI_SELECTED | (reverse ? LVNI_ABOVE : 0));
- }
-
- unsigned GetSelectedCount() const
- {
- return ListView_GetSelectedCount(m_hwndListCtrl);
- }
-
-protected:
- HWND m_hwndListCtrl;
-};
+ }\r
+\r
+ int GetTextColor(int row) const override\r
+ {\r
+ NMLVCUSTOMDRAW nmlvcd = {0};\r
+ nmlvcd.nmcd.hdr.code = NM_CUSTOMDRAW;\r
+ nmlvcd.nmcd.hdr.idFrom = GetDlgCtrlID(m_hwndListCtrl);\r
+ nmlvcd.nmcd.hdr.hwndFrom = m_hwndListCtrl;\r
+ nmlvcd.nmcd.dwDrawStage = CDDS_ITEMPREPAINT | CDDS_SUBITEM;\r
+ nmlvcd.nmcd.dwItemSpec = row;\r
+ SendMessage(GetParent(m_hwndListCtrl), WM_NOTIFY, (WPARAM)m_hwndListCtrl, (LPARAM)&nmlvcd);\r
+ return nmlvcd.clrText;\r
+ }\r
+\r
+ int GetBackColor(int row) const override\r
+ {\r
+ NMLVCUSTOMDRAW nmlvcd = {0};\r
+ nmlvcd.nmcd.hdr.code = NM_CUSTOMDRAW;\r
+ nmlvcd.nmcd.hdr.idFrom = GetDlgCtrlID(m_hwndListCtrl);\r
+ nmlvcd.nmcd.hdr.hwndFrom = m_hwndListCtrl;\r
+ nmlvcd.nmcd.dwDrawStage = CDDS_ITEMPREPAINT | CDDS_SUBITEM;\r
+ nmlvcd.nmcd.dwItemSpec = row;\r
+ SendMessage(GetParent(m_hwndListCtrl), WM_NOTIFY, (WPARAM)m_hwndListCtrl, (LPARAM)&nmlvcd);\r
+ return nmlvcd.clrTextBk;\r
+ }\r
+\r
+ bool IsSelectedItem(int sel) const override\r
+ {\r
+ return !!ListView_GetItemState(m_hwndListCtrl, sel, LVIS_SELECTED);\r
+ }\r
+\r
+ int GetNextItem(int sel, bool selected = false, bool reverse = false) const override\r
+ {\r
+ return ListView_GetNextItem(m_hwndListCtrl, sel, (selected ? LVNI_SELECTED : 0) | (reverse ? LVNI_ABOVE : 0)); \r
+ }\r
+\r
+ int GetNextSelectedItem(int sel, bool reverse = false) const override\r
+ {\r
+ return ListView_GetNextItem(m_hwndListCtrl, sel, LVNI_SELECTED | (reverse ? LVNI_ABOVE : 0)); \r
+ }\r
+\r
+ unsigned GetSelectedCount() const override\r
+ {\r
+ return ListView_GetSelectedCount(m_hwndListCtrl);\r
+ }\r
+\r
+ int GetIndent(int row) const override\r
+ {\r
+ LVITEM item = {0};\r
+ item.mask = LVIF_INDENT;\r
+ item.iItem = row;\r
+ ListView_GetItem(m_hwndListCtrl, &item);\r
+ return item.iIndent;\r
+ }\r
+\r
+ int GetIconIndex(int row) const override\r
+ {\r
+ LVITEM item = {0};\r
+ item.mask = LVIF_IMAGE;\r
+ item.iItem = row;\r
+ ListView_GetItem(m_hwndListCtrl, &item);\r
+ return item.iImage;\r
+ }\r
+\r
+ int GetIconCount() const override\r
+ {\r
+ HIMAGELIST hImageList = ListView_GetImageList(m_hwndListCtrl, LVSIL_SMALL);\r
+ return ImageList_GetImageCount(hImageList);\r
+ }\r
+\r
+ std::string GetIconPNGData(int iconIndex) const override\r
+ {\r
+ HIMAGELIST hImageList = ListView_GetImageList(m_hwndListCtrl, LVSIL_SMALL);\r
+ IMAGEINFO imageInfo;\r
+ std::string ret;\r
+ if (ImageList_GetImageInfo(hImageList, iconIndex, &imageInfo))\r
+ {\r
+ HDC hdcMem = CreateCompatibleDC(nullptr);\r
+ BITMAPINFO bmpinfo = { 0 };\r
+ bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);\r
+ int w = imageInfo.rcImage.right - imageInfo.rcImage.left;\r
+ int h = imageInfo.rcImage.bottom - imageInfo.rcImage.top;\r
+ void *pBits;\r
+ bmpinfo.bmiHeader.biWidth = w;\r
+ bmpinfo.bmiHeader.biHeight = h;\r
+ bmpinfo.bmiHeader.biPlanes = 1;\r
+ bmpinfo.bmiHeader.biBitCount = 32;\r
+ bmpinfo.bmiHeader.biCompression = BI_RGB;\r
+ HBITMAP hbmpImage = CreateDIBSection(nullptr, &bmpinfo, DIB_RGB_COLORS, &pBits, nullptr, 0);\r
+ if (hbmpImage != nullptr)\r
+ {\r
+ HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcMem, hbmpImage);\r
+ ImageList_Draw(hImageList, iconIndex, hdcMem, 0, 0, ILD_TRANSPARENT);\r
+ CImage image;\r
+ image.Attach(hbmpImage);\r
+ image.SetHasAlphaChannel(true);\r
+ IStream *pStream = nullptr;\r
+ if (SUCCEEDED(CreateStreamOnHGlobal(nullptr, TRUE, &pStream)))\r
+ {\r
+ image.Save(pStream, Gdiplus::ImageFormatPNG);\r
+ STATSTG stat;\r
+ if (SUCCEEDED(pStream->Stat(&stat, STATFLAG_NONAME)))\r
+ {\r
+ LARGE_INTEGER li = { 0 };\r
+ ret.resize(stat.cbSize.LowPart, 0);\r
+ pStream->Seek(li, STREAM_SEEK_SET, nullptr);\r
+ pStream->Read(&ret[0], stat.cbSize.LowPart, nullptr);\r
+ }\r
+ pStream->Release();\r
+ }\r
+ SelectObject(hdcMem, hbmpOld);\r
+ DeleteObject(hdcMem);\r
+ DeleteObject(hbmpImage);\r
+ }\r
+ }\r
+ return ret;\r
+ }\r
+\r
+protected:\r
+ HWND m_hwndListCtrl;\r
+};\r