X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/03966fcb3f5aeea7d8e6652d40e6804811a785d8..fcdd53359135f790b85728c4254b97095a56dad8:/src/msw/treectrl.cpp diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index 14246836db..7aa4079cf6 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -2691,6 +2691,43 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) // notify us before painting each item *result = m_hasAnyAttr ? CDRF_NOTIFYITEMDRAW : CDRF_DODEFAULT; + + // windows in TreeCtrl use one-based index for item state images, + // 0 indexed image is not being used, we're using zero-based index, + // so we have to add temp image (of zero index) to state image list + // before we draw any item, then after items are drawn we have to + // delete it (in POSTPAINT notify) + if (m_imageListState && m_imageListState->GetImageCount() > 0) + { + #define hImageList (HIMAGELIST)m_imageListState->GetHIMAGELIST() + + // add temporary image + int width, height; + m_imageListState->GetSize(0, width, height); + + HBITMAP hbmpTemp = ::CreateBitmap(width, height, 1, 1, NULL); + int index = ::ImageList_Add(hImageList, hbmpTemp, hbmpTemp); + ::DeleteObject(hbmpTemp); + + if ( index != -1 ) + { + // move images to right + for ( int i = index; i > 0; i-- ) + ::ImageList_Copy(hImageList, i, hImageList, i-1, 0); + + // we must remove the image in POSTPAINT notify + *result |= CDRF_NOTIFYPOSTPAINT; + } + + #undef hImageList + } + break; + + case CDDS_POSTPAINT: + // we are deleting temp image of 0 index, which was + // added before items were drawn (in PREPAINT notify) + if (m_imageListState && m_imageListState->GetImageCount() > 0) + m_imageListState->Remove(0); break; case CDDS_ITEMPREPAINT: @@ -2821,11 +2858,12 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) switch ( hdr->code ) { case NM_DBLCLK: - // we translate NM_DBLCLK into ACTIVATED event, so don't interpret - // the return code of this event handler as the return value for - // NM_DBLCLK - otherwise, double clicking the item to toggle its - // expanded status would never work - *result = false; + // we translate NM_DBLCLK into ACTIVATED event and if the user + // handled the activation of the item we shouldn't proceed with + // also using the same double click for toggling the item expanded + // state -- but OTOH do let the user to expand/collapse the item by + // double clicking on it if the activation is not handled specially + *result = processed; break; case NM_RCLICK: