X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3fe03e474dc460020c8b99759bee9ebd717ce21a..150c8d89c7f5e04045e55391b34167f2c4165b8b:/src/msw/cursor.cpp diff --git a/src/msw/cursor.cpp b/src/msw/cursor.cpp index 19063594b3..31d0f4e86d 100644 --- a/src/msw/cursor.cpp +++ b/src/msw/cursor.cpp @@ -38,6 +38,7 @@ #endif #include "wx/module.h" +#include "wx/image.h" #include "wx/msw/private.h" #ifndef __WXMICROWIN__ #include "wx/msw/dib.h" @@ -52,7 +53,7 @@ // wxWin macros // ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxCursorBase) +IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxGDIObject) // ---------------------------------------------------------------------------- // globals @@ -96,7 +97,7 @@ wxCursorRefData::wxCursorRefData() m_width = 32; m_height = 32; - m_destroyCursor = FALSE; + m_destroyCursor = TRUE; } void wxCursorRefData::Free() @@ -120,6 +121,79 @@ wxCursor::wxCursor() { } +wxCursor::wxCursor( const wxImage & image ) +{ + //image has to be 32x32 + wxImage image32 = image.Scale(32,32); + unsigned char * rgbBits = image32.GetData(); + int w = image32.GetWidth() ; + int h = image32.GetHeight() ; + bool bHasMask = image32.HasMask() ; + int imagebitcount = (w*h)/8; + + unsigned char r, g, b ; + unsigned char * bits = new unsigned char [imagebitcount]; + unsigned char * maskBits = new unsigned char [imagebitcount]; + + int i,j, i8; unsigned char c, cMask; + for (i=0; i mid grey + if (c>127) + bits[i] = bits[i] | cMask ; + cMask = cMask / 2 ; + } + } + if (bHasMask) + { + r = image32.GetMaskRed() ; + g = image32.GetMaskGreen() ; + b = image32.GetMaskBlue() ; + + for (i=0; i= w) + hotSpotX = 0; + if (hotSpotY < 0 || hotSpotY >= h) + hotSpotY = 0; + + wxCursorRefData *refData = new wxCursorRefData; + m_refData = refData; + refData->m_hCursor = (WXHCURSOR) CreateCursor ( wxGetInstance(), hotSpotX, hotSpotY, w, h, /*AND*/ maskBits, /*XOR*/ bits ); + + delete [] bits ; + delete [] maskBits; + +} + wxCursor::wxCursor(const char WXUNUSED(bits)[], int WXUNUSED(width), int WXUNUSED(height), @@ -145,7 +219,6 @@ wxCursor::wxCursor(const wxString& cursor_file, #else refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), cursor_file); #endif - refData->m_destroyCursor = FALSE; } else if (flags == wxBITMAP_TYPE_CUR) { @@ -303,7 +376,8 @@ wxCursor::wxCursor(int cursor_type) case wxCURSOR_QUESTION_ARROW: { // refData->m_hCursor = (WXHCURSOR) LoadImage(wxGetInstance(), wxT("wxCURSOR_QARROW"), IMAGE_CURSOR, 16, 16, LR_MONOCHROME); - refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_QARROW")); +// refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_QARROW")); + refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_HELP); break; } case wxCURSOR_BLANK: @@ -311,11 +385,20 @@ wxCursor::wxCursor(int cursor_type) refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_BLANK")); break; } + case wxCURSOR_RIGHT_ARROW: + { + refData->m_hCursor = (WXHCURSOR) LoadCursor(wxGetInstance(), wxT("wxCURSOR_RIGHT_ARROW")); + break; + } default: case wxCURSOR_ARROW: refData->m_hCursor = (WXHCURSOR) LoadCursor((HINSTANCE) NULL, IDC_ARROW); break; } + + // no need to destroy the stock cursors + // TODO: check this + //m_refData->m_destroyCursor = FALSE; #endif }