Create wxCURSOR_RIGHT_ARROW on the fly from normal arrow cursor under MSW.

This allows to avoid having another cursor resource and also makes this cursor
nicer as rightarr.cur looks rather out of place under modern Windows systems.

Closes #14991.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73491 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2013-02-10 16:13:46 +00:00
parent 1ebfe6c58a
commit 6586750c6a
4 changed files with 50 additions and 1 deletions

View File

@@ -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:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 B

View File

@@ -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"

View File

@@ -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 )