diff --git a/docs/changes.txt b/docs/changes.txt index 2d107a109c..63ea382529 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -648,6 +648,7 @@ wxMSW: - Fix appearance of multiline coloured wxCheckBox (Catalin Raceanu). - Allow creating wxCursor from ANI files (Catalin Raceanu). - Add wxIcon::CreateFromHICON() (troelsk). +- Improve wxCURSOR_RIGHT_ARROW appearance (DoltAlya). wxOSX/Cocoa: diff --git a/include/wx/msw/rightarr.cur b/include/wx/msw/rightarr.cur deleted file mode 100644 index c54c3ac4b0..0000000000 Binary files a/include/wx/msw/rightarr.cur and /dev/null differ diff --git a/include/wx/msw/wx.rc b/include/wx/msw/wx.rc index 771779f447..c6f941fb7c 100644 --- a/include/wx/msw/wx.rc +++ b/include/wx/msw/wx.rc @@ -50,7 +50,6 @@ WXCURSOR_PBRUSH CURSOR DISCARDABLE "wx/msw/pbrush.cur" WXCURSOR_PLEFT CURSOR DISCARDABLE "wx/msw/pntleft.cur" WXCURSOR_PRIGHT CURSOR DISCARDABLE "wx/msw/pntright.cur" WXCURSOR_BLANK CURSOR DISCARDABLE "wx/msw/blank.cur" -WXCURSOR_RIGHT_ARROW CURSOR DISCARDABLE "wx/msw/rightarr.cur" WXCURSOR_CROSS CURSOR DISCARDABLE "wx/msw/cross.cur" diff --git a/src/msw/cursor.cpp b/src/msw/cursor.cpp index 6ffb9e6401..ec9b67c969 100644 --- a/src/msw/cursor.cpp +++ b/src/msw/cursor.cpp @@ -276,6 +276,45 @@ wxCursor::wxCursor(const wxString& filename, } } +namespace +{ + +void ReverseBitmap(HBITMAP bitmap, int width, int height) +{ + MemoryHDC hdc; + SelectInHDC selBitmap(hdc, bitmap); + ::StretchBlt(hdc, width - 1, 0, -width, height, + hdc, 0, 0, width, height, SRCCOPY); +} + +HCURSOR CreateReverseCursor(HCURSOR cursor) +{ + ICONINFO info; + if ( !::GetIconInfo(cursor, &info) ) + return NULL; + + HCURSOR cursorRev = NULL; + + BITMAP bmp; + if ( ::GetObject(info.hbmMask, sizeof(bmp), &bmp) ) + { + ReverseBitmap(info.hbmMask, bmp.bmWidth, bmp.bmHeight); + if ( info.hbmColor ) + ReverseBitmap(info.hbmColor, bmp.bmWidth, bmp.bmHeight); + info.xHotspot = (DWORD)bmp.bmWidth - 1 - info.xHotspot; + + cursorRev = ::CreateIconIndirect(&info); + } + + ::DeleteObject(info.hbmMask); + if ( info.hbmColor ) + ::DeleteObject(info.hbmColor); + + return cursorRev; +} + +} // anonymous namespace + // Cursors by stock number void wxCursor::InitFromStock(wxStockCursor idCursor) { @@ -340,6 +379,16 @@ void wxCursor::InitFromStock(wxStockCursor idCursor) deleteLater = true; } + if ( !hcursor && idCursor == wxCURSOR_RIGHT_ARROW) + { + hcursor = ::LoadCursor(NULL, IDC_ARROW); + if ( hcursor ) + { + hcursor = CreateReverseCursor(hcursor); + deleteLater = true; + } + } + if ( !hcursor ) { if ( !stdCursor.isStd )