tkWinCursor.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkWinCursor.c --
  3.  *
  4.  * This file contains Win32 specific cursor related routines.
  5.  *
  6.  * Copyright (c) 1995 Sun Microsystems, Inc.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * RCS: @(#) $Id: tkWinCursor.c,v 1.10.2.2 2004/01/28 23:37:28 patthoyts Exp $
  12.  */
  13. #include "tkWinInt.h"
  14. /*
  15.  * The following data structure contains the system specific data
  16.  * necessary to control Windows cursors.
  17.  */
  18. typedef struct {
  19.     TkCursor info; /* Generic cursor info used by tkCursor.c */
  20.     HCURSOR winCursor; /* Win32 cursor handle. */
  21.     int system; /* 1 if cursor is a system cursor, else 0. */
  22. } TkWinCursor;
  23. /*
  24.  * The HAND cursor is only present when WINVER >= 0x0500. If this is
  25.  * not available at runtime, it will default to the unix-style cursor.
  26.  */
  27. #ifndef IDC_HAND
  28. #define IDC_HAND MAKEINTRESOURCE(32649)
  29. #endif
  30. /*
  31.  * The table below is used to map from the name of a predefined cursor
  32.  * to its resource identifier.
  33.  */
  34. static struct CursorName {
  35.     char *name;
  36.     LPCTSTR id;
  37. } cursorNames[] = {
  38.     {"starting", IDC_APPSTARTING},
  39.     {"arrow", IDC_ARROW},
  40.     {"ibeam", IDC_IBEAM},
  41.     {"icon", IDC_ICON},
  42.     {"no", IDC_NO},
  43.     {"size", IDC_SIZEALL},
  44.     {"size_ne_sw", IDC_SIZENESW},
  45.     {"size_ns", IDC_SIZENS},
  46.     {"size_nw_se", IDC_SIZENWSE},
  47.     {"size_we", IDC_SIZEWE},
  48.     {"uparrow", IDC_UPARROW},
  49.     {"wait", IDC_WAIT},
  50.     {"crosshair", IDC_CROSS},
  51.     {"fleur", IDC_SIZEALL},
  52.     {"sb_v_double_arrow", IDC_SIZENS},
  53.     {"sb_h_double_arrow", IDC_SIZEWE},
  54.     {"center_ptr", IDC_UPARROW},
  55.     {"watch", IDC_WAIT},
  56.     {"xterm", IDC_IBEAM},
  57.     {"hand2", IDC_HAND},
  58.     {NULL, 0}
  59. };
  60. /*
  61.  * The default cursor is used whenever no other cursor has been specified.
  62.  */
  63. #define TK_DEFAULT_CURSOR IDC_ARROW
  64. /*
  65.  *----------------------------------------------------------------------
  66.  *
  67.  * TkGetCursorByName --
  68.  *
  69.  * Retrieve a system cursor by name.  
  70.  *
  71.  * Results:
  72.  * Returns a new cursor, or NULL on errors.  
  73.  *
  74.  * Side effects:
  75.  * Allocates a new cursor.
  76.  *
  77.  *----------------------------------------------------------------------
  78.  */
  79. TkCursor *
  80. TkGetCursorByName(interp, tkwin, string)
  81.     Tcl_Interp *interp; /* Interpreter to use for error reporting. */
  82.     Tk_Window tkwin; /* Window in which cursor will be used. */
  83.     Tk_Uid string; /* Description of cursor.  See manual entry
  84.  * for details on legal syntax. */
  85. {
  86.     struct CursorName *namePtr;
  87.     TkWinCursor *cursorPtr;
  88.     int argc;
  89.     CONST char **argv = NULL;
  90.     /*
  91.      * All cursor names are valid lists of one element (for
  92.      * Unix-compatability), even unadorned system cursor names.
  93.      */
  94.     if (Tcl_SplitList(interp, string, &argc, &argv) != TCL_OK) {
  95. return NULL;
  96.     }
  97.     if (argc == 0) {
  98. goto badCursorSpec;
  99.     }
  100.     cursorPtr = (TkWinCursor *) ckalloc(sizeof(TkWinCursor));
  101.     cursorPtr->info.cursor = (Tk_Cursor) cursorPtr;
  102.     cursorPtr->winCursor = NULL;
  103.     cursorPtr->system = 0;
  104.     if (argv[0][0] == '@') {
  105. /*
  106.  * Check for system cursor of type @<filename>, where only
  107.  * the name is allowed.  This accepts any of:
  108.  * -cursor @/winnt/cursors/globe.ani
  109.  * -cursor @C:/Winnt/cursors/E_arrow.cur
  110.  * -cursor {@C:/Program Files/Cursors/bart.ani}
  111.  *      -cursor {{@C:/Program Files/Cursors/bart.ani}}
  112.  * -cursor [list @[file join "C:/Program Files" Cursors bart.ani]]
  113.  */
  114. if (Tcl_IsSafe(interp)) {
  115.     Tcl_AppendResult(interp, "can't get cursor from a file in",
  116.     " a safe interpreter", (char *) NULL);
  117.     ckfree((char *) argv);
  118.     ckfree((char *) cursorPtr);
  119.     return NULL;
  120. }
  121. cursorPtr->winCursor = LoadCursorFromFile(&(argv[0][1]));
  122.     } else {
  123. /*
  124.  * Check for the cursor in the system cursor set.
  125.  */
  126. for (namePtr = cursorNames; namePtr->name != NULL; namePtr++) {
  127.     if (strcmp(namePtr->name, argv[0]) == 0) {
  128. cursorPtr->winCursor = LoadCursor(NULL, namePtr->id);
  129. break;
  130.     }
  131. }
  132. if (cursorPtr->winCursor == NULL) {
  133.     /*
  134.      * Hmm, it is not in the system cursor set.  Check to see
  135.      * if it is one of our application resources.
  136.      */
  137.     cursorPtr->winCursor = LoadCursor(Tk_GetHINSTANCE(), argv[0]);
  138. } else {
  139.     cursorPtr->system = 1;
  140. }
  141.     }
  142.     if (cursorPtr->winCursor == NULL) {
  143. ckfree((char *) cursorPtr);
  144.     badCursorSpec:
  145. ckfree((char *) argv);
  146. Tcl_AppendResult(interp, "bad cursor spec "", string, """,
  147. (char *) NULL);
  148. return NULL;
  149.     } else {
  150. ckfree((char *) argv);
  151. return (TkCursor *) cursorPtr;
  152.     }
  153. }
  154. /*
  155.  *----------------------------------------------------------------------
  156.  *
  157.  * TkCreateCursorFromData --
  158.  *
  159.  * Creates a cursor from the source and mask bits.
  160.  *
  161.  * Results:
  162.  * Returns a new cursor, or NULL on errors.
  163.  *
  164.  * Side effects:
  165.  * Allocates a new cursor.
  166.  *
  167.  *----------------------------------------------------------------------
  168.  */
  169. TkCursor *
  170. TkCreateCursorFromData(tkwin, source, mask, width, height, xHot, yHot,
  171. fgColor, bgColor)
  172.     Tk_Window tkwin; /* Window in which cursor will be used. */
  173.     CONST char *source; /* Bitmap data for cursor shape. */
  174.     CONST char *mask; /* Bitmap data for cursor mask. */
  175.     int width, height; /* Dimensions of cursor. */
  176.     int xHot, yHot; /* Location of hot-spot in cursor. */
  177.     XColor fgColor; /* Foreground color for cursor. */
  178.     XColor bgColor; /* Background color for cursor. */
  179. {
  180.     return NULL;
  181. }
  182. /*
  183.  *----------------------------------------------------------------------
  184.  *
  185.  * TkpFreeCursor --
  186.  *
  187.  * This procedure is called to release a cursor allocated by
  188.  * TkGetCursorByName.
  189.  *
  190.  * Results:
  191.  * None.
  192.  *
  193.  * Side effects:
  194.  * The cursor data structure is deallocated.
  195.  *
  196.  *----------------------------------------------------------------------
  197.  */
  198. void
  199. TkpFreeCursor(cursorPtr)
  200.     TkCursor *cursorPtr;
  201. {
  202.     TkWinCursor *winCursorPtr = (TkWinCursor *) cursorPtr;
  203. }
  204. /*
  205.  *----------------------------------------------------------------------
  206.  *
  207.  * TkpSetCursor --
  208.  *
  209.  * Set the global cursor.  If the cursor is None, then use the
  210.  * default Tk cursor.
  211.  *
  212.  * Results:
  213.  * None.
  214.  *
  215.  * Side effects:
  216.  * Changes the mouse cursor.
  217.  *
  218.  *----------------------------------------------------------------------
  219.  */
  220. void
  221. TkpSetCursor(cursor)
  222.     TkpCursor cursor;
  223. {
  224.     HCURSOR hcursor;
  225.     TkWinCursor *winCursor = (TkWinCursor *) cursor;
  226.     if (winCursor == NULL || winCursor->winCursor == NULL) {
  227. hcursor = LoadCursor(NULL, TK_DEFAULT_CURSOR);
  228.     } else {
  229. hcursor = winCursor->winCursor;
  230.     }
  231.     if (hcursor != NULL) {
  232. SetCursor(hcursor);
  233.     }
  234. }