/*++ Copyright (c) 1994-1998, Microsoft Corporation All rights reserved. Module Name: mousectl.c Abstract: This module contains the routines for the Mouse control. Revision History: --*/ // // Include Files. // #include "main.h" #include "mousectl.h" #include "rc.h" // // Constant Declarations. // #define MOUSECTL_BITMAP_NAME MAKEINTRESOURCE(IDB_MOUSE) #define MOUSECTL_DATA 0 // // These are indices into the VGA palette! // #define MOUSECTL_BKGND_INDEX 14 // light cyan #define MOUSECTL_LBUTTON_INDEX 13 // light magenta #define MOUSECTL_RBUTTON_INDEX 11 // light yellow #define MOUSECTL_LBUTTON_ALTERNATE 5 // magenta #define MOUSECTL_RBUTTON_ALTERNATE 3 // yellow #define MOUSECTL_NORMAL_COLOR RGB(255, 255, 255) #define HALFRGB(c) RGB(GetRValue(c) / 2, GetGValue(c) / 2, GetBValue(c) / 2) // // Typedef Declarations. // typedef struct tagMOUSECTLDATA { HWND window; // window handle for this control BOOL swapped; // are the buttons swapped? HBITMAP image; // DIB section image of mouse HDC imagedc; // DC where image lives HBITMAP olddcimage; // previous inhabitant of imagedc POINT offset; // offset of bitmap in control SIZE size; // size of bitmap } MOUSECTLDATA, *PMOUSECTLDATA; // // Forward Declarations. // LRESULT CALLBACK MouseControlWndProc( HWND window, UINT message, WPARAM wParam, LPARAM lParam); void MouseControlShowSwap( PMOUSECTLDATA ctldata); //////////////////////////////////////////////////////////////////////////// // // SetMouseControlData // //////////////////////////////////////////////////////////////////////////// __inline void SetMouseControlData( HWND window, PMOUSECTLDATA ctldata) { SetWindowLongPtr(window, MOUSECTL_DATA, (LONG_PTR)ctldata); } //////////////////////////////////////////////////////////////////////////// // // GetMouseControlData // //////////////////////////////////////////////////////////////////////////// __inline PMOUSECTLDATA GetMouseControlData( HWND window) { return ((PMOUSECTLDATA)GetWindowLongPtr(window, MOUSECTL_DATA)); } //////////////////////////////////////////////////////////////////////////// // // RegisterMouseControlStuff // //////////////////////////////////////////////////////////////////////////// BOOL RegisterMouseControlStuff( HINSTANCE instance) { WNDCLASS wc; wc.style = 0; wc.lpfnWndProc = MouseControlWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = sizeof(PMOUSECTLDATA); wc.hInstance = instance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); wc.lpszMenuName = NULL; wc.lpszClassName = MOUSECTL_CLASSNAME; return (RegisterClass(&wc)); } //////////////////////////////////////////////////////////////////////////// // // CreateMouseControlData // //////////////////////////////////////////////////////////////////////////// PMOUSECTLDATA CreateMouseControlData( HWND window) { PMOUSECTLDATA ctldata = (PMOUSECTLDATA)LocalAlloc(LPTR, sizeof(MOUSECTLDATA)); if (ctldata) { ctldata->window = window; SetMouseControlData(window, ctldata); } return (ctldata); } //////////////////////////////////////////////////////////////////////////// // // DestroyMouseControlData // //////////////////////////////////////////////////////////////////////////// void DestroyMouseControlData( PMOUSECTLDATA ctldata) { if (ctldata) { SetMouseControlData(ctldata->window, 0); LocalFree(ctldata); } } //////////////////////////////////////////////////////////////////////////// // // MouseControlNCCreate // //////////////////////////////////////////////////////////////////////////// BOOL MouseControlNCCreate( PMOUSECTLDATA ctldata, LPCREATESTRUCT cs) { if (!ctldata) { return (FALSE); } ctldata->image = LoadImage( cs->hInstance, MOUSECTL_BITMAP_NAME, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ); if (ctldata->image) { ctldata->imagedc = CreateCompatibleDC(NULL); if (ctldata->imagedc) { BITMAP bm; ctldata->olddcimage = SelectBitmap(ctldata->imagedc, ctldata->image); ctldata->offset.x = ctldata->offset.y = 0; if (GetObject(ctldata->image, sizeof(BITMAP), &bm)) { ctldata->size.cx = bm.bmWidth; ctldata->size.cy = bm.bmHeight; ctldata->offset.x = (cs->cx - ctldata->size.cx) / 2; ctldata->offset.y = (cs->cy - ctldata->size.cy) / 2; ctldata->swapped = FALSE; MouseControlShowSwap(ctldata); return (TRUE); } SelectBitmap(ctldata->imagedc, ctldata->olddcimage); ctldata->olddcimage = NULL; } DeleteBitmap(ctldata->image); ctldata->image = NULL; } ctldata->olddcimage = NULL; ctldata->imagedc = NULL; return (FALSE); } //////////////////////////////////////////////////////////////////////////// // // MouseControlNCDestroy // //////////////////////////////////////////////////////////////////////////// void MouseControlNCDestroy( PMOUSECTLDATA ctldata) { if (ctldata) { if (ctldata->olddcimage) { SelectBitmap(ctldata->imagedc, ctldata->olddcimage); ctldata->olddcimage = NULL; } if (ctldata->imagedc) { DeleteDC(ctldata->imagedc); ctldata->imagedc = NULL; } if (ctldata->image) { DeleteBitmap(ctldata->image); ctldata->image = NULL; } DestroyMouseControlData(ctldata); } } //////////////////////////////////////////////////////////////////////////// // // MouseControlPaint // //////////////////////////////////////////////////////////////////////////// void MouseControlPaint( PMOUSECTLDATA ctldata) { PAINTSTRUCT ps; HDC dc = BeginPaint(ctldata->window, &ps); BitBlt( dc, ctldata->offset.x, ctldata->offset.y, ctldata->size.cx, ctldata->size.cy, ctldata->imagedc, 0, 0, SRCCOPY|NOMIRRORBITMAP); EndPaint(ctldata->window, &ps); } //////////////////////////////////////////////////////////////////////////// // // MouseControlSetColor // //////////////////////////////////////////////////////////////////////////// __inline void MouseControlSetColor( PMOUSECTLDATA ctldata, UINT index, COLORREF color) { RGBQUAD rgbq = { GetBValue(color), GetGValue(color), GetRValue(color), 0 }; SetDIBColorTable(ctldata->imagedc, index, 1, &rgbq); } //////////////////////////////////////////////////////////////////////////// // // MouseControlShowSwap // //////////////////////////////////////////////////////////////////////////// void MouseControlShowSwap( PMOUSECTLDATA ctldata) { MouseControlSetColor( ctldata, MOUSECTL_BKGND_INDEX, GetSysColor(COLOR_BTNFACE) ); MouseControlSetColor( ctldata, ctldata->swapped ? MOUSECTL_RBUTTON_INDEX : MOUSECTL_LBUTTON_INDEX, GetSysColor(COLOR_HIGHLIGHT) ); MouseControlSetColor( ctldata, ctldata->swapped ? MOUSECTL_RBUTTON_ALTERNATE : MOUSECTL_LBUTTON_ALTERNATE, HALFRGB(GetSysColor(COLOR_HIGHLIGHT)) ); MouseControlSetColor( ctldata, ctldata->swapped ? MOUSECTL_LBUTTON_INDEX : MOUSECTL_RBUTTON_INDEX, MOUSECTL_NORMAL_COLOR ); MouseControlSetColor( ctldata, ctldata->swapped ? MOUSECTL_LBUTTON_ALTERNATE : MOUSECTL_RBUTTON_ALTERNATE, HALFRGB(MOUSECTL_NORMAL_COLOR) ); InvalidateRect(ctldata->window, NULL, FALSE); } //////////////////////////////////////////////////////////////////////////// // // MouseControlSetSwap // //////////////////////////////////////////////////////////////////////////// void MouseControlSetSwap( HWND window, BOOL swap) { PMOUSECTLDATA ctldata = GetMouseControlData(window); if (ctldata->swapped != swap) { ctldata->swapped = swap; MouseControlShowSwap(ctldata); } } //////////////////////////////////////////////////////////////////////////// // // MouseControlWndProc // //////////////////////////////////////////////////////////////////////////// LRESULT CALLBACK MouseControlWndProc( HWND window, UINT message, WPARAM wParam, LPARAM lParam) { PMOUSECTLDATA ctldata = (message == WM_NCCREATE) ? CreateMouseControlData(window) : GetMouseControlData(window); switch (message) { HANDLE_MSG(ctldata, WM_NCCREATE, MouseControlNCCreate ); HANDLE_MSG(ctldata, WM_NCDESTROY, MouseControlNCDestroy); HANDLE_MSG(ctldata, WM_PAINT, MouseControlPaint ); } return (DefWindowProc(window, message, wParam, lParam)); }