Skip to main content
GameDev.net gamedev.net
🔒 Locked

Anyone has simple samplecode for a directX cursor available?

Started by lnd Jun 16, 2006 at 6:01 AM 1 replies 1.5k views
Original Post
lnd
lnd
Hi, i'm quite new to directX, could anyone post a sample program here that just displays a directX cursor loaded from for example a bitmap or so? Thanks in advance
exorcist_bob
exorcist_bob
If this helps any, here is the source on how to load a directx cursor from a HCURSOR, straight from the DXUT source:

//--------------------------------------------------------------------------------------// Gives the D3D device a cursor with image and hotspot from hCursor.//--------------------------------------------------------------------------------------HRESULT DXUTSetDeviceCursor( IDirect3DDevice9* pd3dDevice, HCURSOR hCursor, bool bAddWatermark ){    HRESULT hr = E_FAIL;    ICONINFO iconinfo;    bool bBWCursor;    LPDIRECT3DSURFACE9 pCursorSurface = NULL;    HDC hdcColor = NULL;    HDC hdcMask = NULL;    HDC hdcScreen = NULL;    BITMAP bm;    DWORD dwWidth;    DWORD dwHeightSrc;    DWORD dwHeightDest;    COLORREF crColor;    COLORREF crMask;    UINT x;    UINT y;    BITMAPINFO bmi;    COLORREF* pcrArrayColor = NULL;    COLORREF* pcrArrayMask = NULL;    DWORD* pBitmap;    HGDIOBJ hgdiobjOld;    ZeroMemory( &iconinfo, sizeof(iconinfo) );    if( !GetIconInfo( hCursor, &iconinfo ) )        goto End;    if (0 == GetObject((HGDIOBJ)iconinfo.hbmMask, sizeof(BITMAP), (LPVOID)&bm))        goto End;    dwWidth = bm.bmWidth;    dwHeightSrc = bm.bmHeight;    if( iconinfo.hbmColor == NULL )    {        bBWCursor = TRUE;        dwHeightDest = dwHeightSrc / 2;    }    else     {        bBWCursor = FALSE;        dwHeightDest = dwHeightSrc;    }    // Create a surface for the fullscreen cursor    if( FAILED( hr = pd3dDevice->CreateOffscreenPlainSurface( dwWidth, dwHeightDest,         D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pCursorSurface, NULL ) ) )    {        goto End;    }    pcrArrayMask = new DWORD[dwWidth * dwHeightSrc];    ZeroMemory(&bmi, sizeof(bmi));    bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);    bmi.bmiHeader.biWidth = dwWidth;    bmi.bmiHeader.biHeight = dwHeightSrc;    bmi.bmiHeader.biPlanes = 1;    bmi.bmiHeader.biBitCount = 32;    bmi.bmiHeader.biCompression = BI_RGB;    hdcScreen = GetDC( NULL );    hdcMask = CreateCompatibleDC( hdcScreen );    if( hdcMask == NULL )    {        hr = E_FAIL;        goto End;    }    hgdiobjOld = SelectObject(hdcMask, iconinfo.hbmMask);    GetDIBits(hdcMask, iconinfo.hbmMask, 0, dwHeightSrc,         pcrArrayMask, &bmi, DIB_RGB_COLORS);    SelectObject(hdcMask, hgdiobjOld);    if (!bBWCursor)    {        pcrArrayColor = new DWORD[dwWidth * dwHeightDest];        hdcColor = CreateCompatibleDC( hdcScreen );        if( hdcColor == NULL )        {            hr = E_FAIL;            goto End;        }        SelectObject(hdcColor, iconinfo.hbmColor);        GetDIBits(hdcColor, iconinfo.hbmColor, 0, dwHeightDest,             pcrArrayColor, &bmi, DIB_RGB_COLORS);    }    // Transfer cursor image into the surface    D3DLOCKED_RECT lr;    pCursorSurface->LockRect( &lr, NULL, 0 );    pBitmap = (DWORD*)lr.pBits;    for( y = 0; y < dwHeightDest; y++ )    {        for( x = 0; x < dwWidth; x++ )        {            if (bBWCursor)            {                crColor = pcrArrayMask[dwWidth*(dwHeightDest-1-y) + x];                crMask = pcrArrayMask[dwWidth*(dwHeightSrc-1-y) + x];            }            else            {                crColor = pcrArrayColor[dwWidth*(dwHeightDest-1-y) + x];                crMask = pcrArrayMask[dwWidth*(dwHeightDest-1-y) + x];            }            if (crMask == 0)                pBitmap[dwWidth*y + x] = 0xff000000 | crColor;            else                pBitmap[dwWidth*y + x] = 0x00000000;            // It may be helpful to make the D3D cursor look slightly             // different from the Windows cursor so you can distinguish             // between the two when developing/testing code.  When            // bAddWatermark is TRUE, the following code adds some            // small grey "D3D" characters to the upper-left corner of            // the D3D cursor image.            if( bAddWatermark && x < 12 && y < 5 )            {                // 11.. 11.. 11.. .... CCC0                // 1.1. ..1. 1.1. .... A2A0                // 1.1. .1.. 1.1. .... A4A0                // 1.1. ..1. 1.1. .... A2A0                // 11.. 11.. 11.. .... CCC0                const WORD wMask[5] = { 0xccc0, 0xa2a0, 0xa4a0, 0xa2a0, 0xccc0 };                if( wMask[y] & (1 << (15 - x)) )                {                    pBitmap[dwWidth*y + x] |= 0xff808080;                }            }        }    }    pCursorSurface->UnlockRect();    // Set the device cursor    if( FAILED( hr = pd3dDevice->SetCursorProperties( iconinfo.xHotspot,         iconinfo.yHotspot, pCursorSurface ) ) )    {        goto End;    }    hr = S_OK;End:    if( iconinfo.hbmMask != NULL )        DeleteObject( iconinfo.hbmMask );    if( iconinfo.hbmColor != NULL )        DeleteObject( iconinfo.hbmColor );    if( hdcScreen != NULL )        ReleaseDC( NULL, hdcScreen );    if( hdcColor != NULL )        DeleteDC( hdcColor );    if( hdcMask != NULL )        DeleteDC( hdcMask );    SAFE_DELETE_ARRAY( pcrArrayColor );    SAFE_DELETE_ARRAY( pcrArrayMask );    SAFE_RELEASE( pCursorSurface );    return hr;}


Hope this helps,
exorcist_bob
streamer
streamer
you can do this:
1.load bitmap as texture (your cursor) and hide windows cursor at start
ShowCursor(false);

2. in WM_MOUSEMOVE handle mouse movement and set two global variables for mouse cordinates (ex:
POINT g_Mouse;...case WM_MOUSEMOVE:g_Mouse.x = LOWORD (lParam);g_Mouse.y = HIWORD (lParam);break;

...

3. Use sprite to show your DX cursor.
D3DXVECTOR3 vPosition(0,0,0);vPosition.x = (float)g_Mouse.x;vPosition.y = (float)g_Mouse.y;	pSprite->Begin(D3DXSPRITE_ALPHABLEND );pSprite->Draw( g_pCursor, 0, 0,&vPosition, 0xffffffff);pSprite->End();

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.