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

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkWinInit.c --
  3.  *
  4.  * This file contains Windows-specific interpreter initialization
  5.  * functions.
  6.  *
  7.  * Copyright (c) 1995-1997 Sun Microsystems, Inc.
  8.  *
  9.  * See the file "license.terms" for information on usage and redistribution
  10.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11.  *
  12.  * RCS: @(#) $Id: tkWinInit.c,v 1.11 2003/02/18 19:18:33 hobbs Exp $
  13.  */
  14. #include "tkWinInt.h"
  15. /*
  16.  * The Init script (common to Windows and Unix platforms) is
  17.  * defined in tkInitScript.h
  18.  */
  19. #include "tkInitScript.h"
  20. /*
  21.  *----------------------------------------------------------------------
  22.  *
  23.  * TkpInit --
  24.  *
  25.  * Performs Windows-specific interpreter initialization related to the
  26.  *      tk_library variable.
  27.  *
  28.  * Results:
  29.  * A standard Tcl completion code (TCL_OK or TCL_ERROR).  Also
  30.  * leaves information in the interp's result.
  31.  *
  32.  * Side effects:
  33.  * Sets "tk_library" Tcl variable, runs "tk.tcl" script.
  34.  *
  35.  *----------------------------------------------------------------------
  36.  */
  37. int
  38. TkpInit(interp)
  39.     Tcl_Interp *interp;
  40. {
  41.     /*
  42.      * This is necessary for static initialization, and is ok otherwise
  43.      * because TkWinXInit flips a static bit to do its work just once.
  44.      */
  45.     TkWinXInit(Tk_GetHINSTANCE());
  46.     return Tcl_Eval(interp, initScript);
  47. }
  48. /*
  49.  *----------------------------------------------------------------------
  50.  *
  51.  * TkpGetAppName --
  52.  *
  53.  * Retrieves the name of the current application from a platform
  54.  * specific location.  For Windows, the application name is the
  55.  * root of the tail of the path contained in the tcl variable argv0.
  56.  *
  57.  * Results:
  58.  * Returns the application name in the given Tcl_DString.
  59.  *
  60.  * Side effects:
  61.  * None.
  62.  *
  63.  *----------------------------------------------------------------------
  64.  */
  65. void
  66. TkpGetAppName(interp, namePtr)
  67.     Tcl_Interp *interp;
  68.     Tcl_DString *namePtr; /* A previously initialized Tcl_DString. */
  69. {
  70.     int argc, namelength;
  71.     CONST char **argv = NULL, *name, *p;
  72.     name = Tcl_GetVar(interp, "argv0", TCL_GLOBAL_ONLY);
  73.     namelength = -1;
  74.     if (name != NULL) {
  75. Tcl_SplitPath(name, &argc, &argv);
  76. if (argc > 0) {
  77.     name = argv[argc-1];
  78.     p = strrchr(name, '.');
  79.     if (p != NULL) {
  80. namelength = p - name;
  81.     }
  82. } else {
  83.     name = NULL;
  84. }
  85.     }
  86.     if ((name == NULL) || (*name == 0)) {
  87. name = "tk";
  88. namelength = -1;
  89.     }
  90.     Tcl_DStringAppend(namePtr, name, namelength);
  91.     if (argv != NULL) {
  92. ckfree((char *)argv);
  93.     }
  94. }
  95. /*
  96.  *----------------------------------------------------------------------
  97.  *
  98.  * TkpDisplayWarning --
  99.  *
  100.  * This routines is called from Tk_Main to display warning
  101.  * messages that occur during startup.
  102.  *
  103.  * Results:
  104.  * None.
  105.  *
  106.  * Side effects:
  107.  * Displays a message box.
  108.  *
  109.  *----------------------------------------------------------------------
  110.  */
  111. void
  112. TkpDisplayWarning(msg, title)
  113.     CONST char *msg; /* Message to be displayed. */
  114.     CONST char *title; /* Title of warning. */
  115. {
  116.     Tcl_DString msgString, titleString;
  117.     Tcl_Encoding unicodeEncoding = TkWinGetUnicodeEncoding();
  118.     /*
  119.      * Truncate MessageBox string if it is too long to not overflow
  120.      * the screen and cause possible oversized window error.
  121.      */
  122. #define TK_MAX_WARN_LEN (1024 * sizeof(WCHAR))
  123.     Tcl_UtfToExternalDString(unicodeEncoding, msg, -1, &msgString);
  124.     Tcl_UtfToExternalDString(unicodeEncoding, title, -1, &titleString);
  125.     if (Tcl_DStringLength(&msgString) > TK_MAX_WARN_LEN) {
  126. Tcl_DStringSetLength(&msgString, TK_MAX_WARN_LEN);
  127. Tcl_DStringAppend(&msgString, (char *) L" ...", 4 * sizeof(WCHAR));
  128.     }
  129.     MessageBoxW(NULL, (WCHAR *) Tcl_DStringValue(&msgString),
  130.     (WCHAR *) Tcl_DStringValue(&titleString),
  131.     MB_OK | MB_ICONEXCLAMATION | MB_SYSTEMMODAL
  132.     | MB_SETFOREGROUND | MB_TOPMOST);
  133.     Tcl_DStringFree(&msgString);
  134.     Tcl_DStringFree(&titleString);
  135. }