3 #include "IListCtrl.h"
\r
4 #include <commctrl.h>
\r
5 #include <atlimage.h>
\r
7 class IListCtrlImpl : public IListCtrl
\r
10 explicit IListCtrlImpl(HWND hwndListCtrl) : m_hwndListCtrl(hwndListCtrl)
\r
14 ~IListCtrlImpl() override {}
\r
16 int GetColumnCount() const override
\r
18 return Header_GetItemCount(ListView_GetHeader(m_hwndListCtrl));
\r
21 int GetRowCount() const override
\r
23 return ListView_GetItemCount(m_hwndListCtrl);
\r
26 String GetColumnName(int col) const override
\r
29 TCHAR columnName[256]; // Assuming max col header will never be > 256
\r
30 lvc.mask = LVCF_TEXT;
\r
31 lvc.pszText = &columnName[0];
\r
32 lvc.cchTextMax = sizeof(columnName) / sizeof(TCHAR);
\r
33 ListView_GetColumn(m_hwndListCtrl, col, &lvc);
\r
37 String GetItemText(int row, int col) const override
\r
39 TCHAR text[512]; // Assuming max col header will never be > 512
\r
41 ListView_GetItemText(m_hwndListCtrl, row, col, text, sizeof(text)/sizeof(text[0]));
\r
45 void *GetItemData(int row) const override
\r
49 lvi.mask = LVIF_PARAM;
\r
50 ::SendMessage(m_hwndListCtrl, LVM_GETITEM, 0, (LPARAM)&lvi);
\r
51 return (void *)lvi.lParam;
\r
54 int GetTextColor(int row) const override
\r
56 NMLVCUSTOMDRAW nmlvcd = {0};
\r
57 nmlvcd.nmcd.hdr.code = NM_CUSTOMDRAW;
\r
58 nmlvcd.nmcd.hdr.idFrom = GetDlgCtrlID(m_hwndListCtrl);
\r
59 nmlvcd.nmcd.hdr.hwndFrom = m_hwndListCtrl;
\r
60 nmlvcd.nmcd.dwDrawStage = CDDS_ITEMPREPAINT | CDDS_SUBITEM;
\r
61 nmlvcd.nmcd.dwItemSpec = row;
\r
62 SendMessage(GetParent(m_hwndListCtrl), WM_NOTIFY, (WPARAM)m_hwndListCtrl, (LPARAM)&nmlvcd);
\r
63 return nmlvcd.clrText;
\r
66 int GetBackColor(int row) const override
\r
68 NMLVCUSTOMDRAW nmlvcd = {0};
\r
69 nmlvcd.nmcd.hdr.code = NM_CUSTOMDRAW;
\r
70 nmlvcd.nmcd.hdr.idFrom = GetDlgCtrlID(m_hwndListCtrl);
\r
71 nmlvcd.nmcd.hdr.hwndFrom = m_hwndListCtrl;
\r
72 nmlvcd.nmcd.dwDrawStage = CDDS_ITEMPREPAINT | CDDS_SUBITEM;
\r
73 nmlvcd.nmcd.dwItemSpec = row;
\r
74 SendMessage(GetParent(m_hwndListCtrl), WM_NOTIFY, (WPARAM)m_hwndListCtrl, (LPARAM)&nmlvcd);
\r
75 return nmlvcd.clrTextBk;
\r
78 bool IsSelectedItem(int sel) const override
\r
80 return !!ListView_GetItemState(m_hwndListCtrl, sel, LVIS_SELECTED);
\r
83 int GetNextItem(int sel, bool selected = false, bool reverse = false) const override
\r
85 return ListView_GetNextItem(m_hwndListCtrl, sel, (selected ? LVNI_SELECTED : 0) | (reverse ? LVNI_ABOVE : 0));
\r
88 int GetNextSelectedItem(int sel, bool reverse = false) const override
\r
90 return ListView_GetNextItem(m_hwndListCtrl, sel, LVNI_SELECTED | (reverse ? LVNI_ABOVE : 0));
\r
93 unsigned GetSelectedCount() const override
\r
95 return ListView_GetSelectedCount(m_hwndListCtrl);
\r
98 int GetIndent(int row) const override
\r
101 item.mask = LVIF_INDENT;
\r
103 ListView_GetItem(m_hwndListCtrl, &item);
\r
104 return item.iIndent;
\r
107 int GetIconIndex(int row) const override
\r
110 item.mask = LVIF_IMAGE;
\r
112 ListView_GetItem(m_hwndListCtrl, &item);
\r
113 return item.iImage;
\r
116 int GetIconCount() const override
\r
118 HIMAGELIST hImageList = ListView_GetImageList(m_hwndListCtrl, LVSIL_SMALL);
\r
119 return ImageList_GetImageCount(hImageList);
\r
122 std::string GetIconPNGData(int iconIndex) const override
\r
124 HIMAGELIST hImageList = ListView_GetImageList(m_hwndListCtrl, LVSIL_SMALL);
\r
125 IMAGEINFO imageInfo;
\r
127 if (ImageList_GetImageInfo(hImageList, iconIndex, &imageInfo))
\r
129 HDC hdcMem = CreateCompatibleDC(nullptr);
\r
130 BITMAPINFO bmpinfo = { 0 };
\r
131 bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
\r
132 int w = imageInfo.rcImage.right - imageInfo.rcImage.left;
\r
133 int h = imageInfo.rcImage.bottom - imageInfo.rcImage.top;
\r
135 bmpinfo.bmiHeader.biWidth = w;
\r
136 bmpinfo.bmiHeader.biHeight = h;
\r
137 bmpinfo.bmiHeader.biPlanes = 1;
\r
138 bmpinfo.bmiHeader.biBitCount = 32;
\r
139 bmpinfo.bmiHeader.biCompression = BI_RGB;
\r
140 HBITMAP hbmpImage = CreateDIBSection(nullptr, &bmpinfo, DIB_RGB_COLORS, &pBits, nullptr, 0);
\r
141 if (hbmpImage != nullptr)
\r
143 HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcMem, hbmpImage);
\r
144 ImageList_Draw(hImageList, iconIndex, hdcMem, 0, 0, ILD_TRANSPARENT);
\r
146 image.Attach(hbmpImage);
\r
147 image.SetHasAlphaChannel(true);
\r
148 IStream *pStream = nullptr;
\r
149 if (SUCCEEDED(CreateStreamOnHGlobal(nullptr, TRUE, &pStream)))
\r
151 image.Save(pStream, Gdiplus::ImageFormatPNG);
\r
153 if (SUCCEEDED(pStream->Stat(&stat, STATFLAG_NONAME)))
\r
155 LARGE_INTEGER li = { 0 };
\r
156 ret.resize(stat.cbSize.LowPart, 0);
\r
157 pStream->Seek(li, STREAM_SEEK_SET, nullptr);
\r
158 pStream->Read(&ret[0], stat.cbSize.LowPart, nullptr);
\r
160 pStream->Release();
\r
162 SelectObject(hdcMem, hbmpOld);
\r
163 DeleteObject(hdcMem);
\r
164 DeleteObject(hbmpImage);
\r
171 HWND m_hwndListCtrl;
\r