From: sdottaka Date: Thu, 30 Oct 2014 09:41:37 +0000 (+0900) Subject: Merge with stable X-Git-Tag: 2.16.4+-jp-10~946 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=26130567c3562011343fc4d64a3e8ac9d39babe6;p=winmerge-jp%2Fwinmerge-jp.git Merge with stable --- 26130567c3562011343fc4d64a3e8ac9d39babe6 diff --cc Src/IListCtrl.h index 0cd7088dd,32caa1dd6..d6029cbc7 --- a/Src/IListCtrl.h +++ b/Src/IListCtrl.h @@@ -9,12 -9,11 +9,16 @@@ struct IListCtr virtual int GetRowCount() const = 0; virtual String GetColumnName(int col) const = 0; virtual String GetItemText(int row, int col) const = 0; + virtual void *GetItemData(int row) const = 0; virtual int GetBackColor(int row) const = 0; + virtual bool IsSelectedItem(int sel) const = 0; + virtual int GetNextItem(int sel, bool selected = false, bool reverse = false) const = 0; + virtual int GetNextSelectedItem(int sel, bool reverse = false) const = 0; + virtual unsigned GetSelectedCount() const = 0; + virtual int GetIndent(int row) const = 0; + virtual int GetIconIndex(int row) const = 0; + virtual int GetIconCount() const = 0; + virtual std::string GetIconPNGData(int iconIndex) const = 0; }; #endif diff --cc Src/IListCtrlImpl.h index f32a303b8,36a82082b..b4b4e3a77 --- a/Src/IListCtrlImpl.h +++ b/Src/IListCtrlImpl.h @@@ -57,26 -49,71 +58,91 @@@ public 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); + } + + int GetIndent(int row) const + { + LVITEM item = {0}; + item.mask = LVIF_INDENT; + item.iItem = row; + ListView_GetItem(m_hwndListCtrl, &item); + return item.iIndent; + } + + int GetIconIndex(int row) const + { + LVITEM item = {0}; + item.mask = LVIF_IMAGE; + item.iItem = row; + ListView_GetItem(m_hwndListCtrl, &item); + return item.iImage; + } + + int GetIconCount() const + { + HIMAGELIST hImageList = ListView_GetImageList(m_hwndListCtrl, LVSIL_SMALL); + return ImageList_GetImageCount(hImageList); + } + + std::string GetIconPNGData(int iconIndex) const + { + HIMAGELIST hImageList = ListView_GetImageList(m_hwndListCtrl, LVSIL_SMALL); + IMAGEINFO imageInfo = {0}; + LARGE_INTEGER li = {0}; + IStream *pStream = NULL; + CImage image; + + ImageList_GetImageInfo(hImageList, iconIndex, &imageInfo); + int w = imageInfo.rcImage.right - imageInfo.rcImage.left; + int h = imageInfo.rcImage.bottom - imageInfo.rcImage.top; + CreateStreamOnHGlobal(NULL, TRUE, &pStream); + HDC hdcMem = CreateCompatibleDC(NULL); + BITMAPINFO bmpinfo = {0}; + bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmpinfo.bmiHeader.biWidth = w; + bmpinfo.bmiHeader.biHeight = h; + bmpinfo.bmiHeader.biPlanes = 1; + bmpinfo.bmiHeader.biBitCount = 32; + bmpinfo.bmiHeader.biCompression = BI_RGB; + HBITMAP hbmpImage = CreateDIBSection( NULL, &bmpinfo, DIB_RGB_COLORS, NULL, NULL, NULL); + HBITMAP hbmpOld = (HBITMAP)SelectObject(hdcMem, hbmpImage); + ImageList_Draw(hImageList, iconIndex, hdcMem, 0, 0, ILD_TRANSPARENT); + image.Attach(hbmpImage); + #if _MSC_VER >= 1400 + image.SetHasAlphaChannel(true); + #endif + image.Save(pStream, Gdiplus::ImageFormatPNG); + STATSTG stat; + pStream->Stat(&stat, STATFLAG_NONAME); + std::string ret(stat.cbSize.LowPart, 0); + pStream->Seek(li, STREAM_SEEK_SET, NULL); + pStream->Read(&ret[0], stat.cbSize.LowPart, NULL); + pStream->Release(); + + SelectObject(hdcMem, hbmpOld); + DeleteObject(hdcMem); + DeleteObject(hbmpImage); + return ret; + } - ++ protected: HWND m_hwndListCtrl; };