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

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkWinTest.c --
  3.  *
  4.  * Contains commands for platform specific tests for
  5.  * the Windows platform.
  6.  *
  7.  * Copyright (c) 1997 Sun Microsystems, Inc.
  8.  * Copyright (c) 2000 by Scriptics Corporation.
  9.  * Copyright (c) 2001 by ActiveState Corporation.
  10.  *
  11.  * See the file "license.terms" for information on usage and redistribution
  12.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  13.  *
  14.  * RCS: @(#) $Id: tkWinTest.c,v 1.7 2002/08/14 15:31:21 vincentdarley Exp $
  15.  */
  16. #include "tkWinInt.h"
  17. HWND tkWinCurrentDialog;
  18.  
  19. /*
  20.  * Forward declarations of procedures defined later in this file:
  21.  */
  22. int TkplatformtestInit(Tcl_Interp *interp);
  23. static int TestclipboardObjCmd(ClientData clientData,
  24.     Tcl_Interp *interp, int objc,
  25.     Tcl_Obj *CONST objv[]);
  26. static int TestwineventCmd(ClientData clientData, 
  27.     Tcl_Interp *interp, int argc, CONST char **argv);
  28. /*
  29.  *----------------------------------------------------------------------
  30.  *
  31.  * TkplatformtestInit --
  32.  *
  33.  * Defines commands that test platform specific functionality for
  34.  * Unix platforms.
  35.  *
  36.  * Results:
  37.  * A standard Tcl result.
  38.  *
  39.  * Side effects:
  40.  * Defines new commands.
  41.  *
  42.  *----------------------------------------------------------------------
  43.  */
  44. int
  45. TkplatformtestInit(
  46.     Tcl_Interp *interp) /* Interpreter to add commands to. */
  47. {
  48.     /*
  49.      * Add commands for platform specific tests on MacOS here.
  50.      */
  51.     
  52.     Tcl_CreateObjCommand(interp, "testclipboard", TestclipboardObjCmd,
  53.     (ClientData) Tk_MainWindow(interp), (Tcl_CmdDeleteProc *) NULL);
  54.     Tcl_CreateCommand(interp, "testwinevent", TestwineventCmd,
  55.             (ClientData) Tk_MainWindow(interp), (Tcl_CmdDeleteProc *) NULL);
  56.     return TCL_OK;
  57. }
  58. /*
  59.  *----------------------------------------------------------------------
  60.  *
  61.  * AppendSystemError --
  62.  *
  63.  * This routine formats a Windows system error message and places
  64.  * it into the interpreter result.  Originally from tclWinReg.c.
  65.  *
  66.  * Results:
  67.  * None.
  68.  *
  69.  * Side effects:
  70.  * None.
  71.  *
  72.  *----------------------------------------------------------------------
  73.  */
  74. static void
  75. AppendSystemError(
  76.     Tcl_Interp *interp, /* Current interpreter. */
  77.     DWORD error) /* Result code from error. */
  78. {
  79.     int length;
  80.     WCHAR *wMsgPtr;
  81.     char *msg;
  82.     char id[TCL_INTEGER_SPACE], msgBuf[24 + TCL_INTEGER_SPACE];
  83.     Tcl_DString ds;
  84.     Tcl_Obj *resultPtr = Tcl_GetObjResult(interp);
  85.     length = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
  86.     | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, error,
  87.     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (WCHAR *) &wMsgPtr,
  88.     0, NULL);
  89.     if (length == 0) {
  90. char *msgPtr;
  91. length = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM
  92. | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, error,
  93. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (char *) &msgPtr,
  94. 0, NULL);
  95. if (length > 0) {
  96.     wMsgPtr = (WCHAR *) LocalAlloc(LPTR, (length + 1) * sizeof(WCHAR));
  97.     MultiByteToWideChar(CP_ACP, 0, msgPtr, length + 1, wMsgPtr,
  98.     length + 1);
  99.     LocalFree(msgPtr);
  100. }
  101.     }
  102.     if (length == 0) {
  103. if (error == ERROR_CALL_NOT_IMPLEMENTED) {
  104.     msg = "function not supported under Win32s";
  105. } else {
  106.     sprintf(msgBuf, "unknown error: %ld", error);
  107.     msg = msgBuf;
  108. }
  109.     } else {
  110. Tcl_Encoding encoding;
  111. encoding = Tcl_GetEncoding(NULL, "unicode");
  112. msg = Tcl_ExternalToUtfDString(encoding, (char *) wMsgPtr, -1, &ds);
  113. Tcl_FreeEncoding(encoding);
  114. LocalFree(wMsgPtr);
  115. length = Tcl_DStringLength(&ds);
  116. /*
  117.  * Trim the trailing CR/LF from the system message.
  118.  */
  119. if (msg[length-1] == 'n') {
  120.     msg[--length] = 0;
  121. }
  122. if (msg[length-1] == 'r') {
  123.     msg[--length] = 0;
  124. }
  125.     }
  126.     sprintf(id, "%ld", error);
  127.     Tcl_SetErrorCode(interp, "WINDOWS", id, msg, (char *) NULL);
  128.     Tcl_AppendToObj(resultPtr, msg, length);
  129.     if (length != 0) {
  130. Tcl_DStringFree(&ds);
  131.     }
  132. }
  133. /*
  134.  *----------------------------------------------------------------------
  135.  *
  136.  * TestclipboardObjCmd --
  137.  *
  138.  * This procedure implements the testclipboard command. It provides
  139.  * a way to determine the actual contents of the Windows clipboard.
  140.  *
  141.  * Results:
  142.  * A standard Tcl result.
  143.  *
  144.  * Side effects:
  145.  * None.
  146.  *
  147.  *----------------------------------------------------------------------
  148.  */
  149. static int
  150. TestclipboardObjCmd(clientData, interp, objc, objv)
  151.     ClientData clientData; /* Main window for application. */
  152.     Tcl_Interp *interp; /* Current interpreter. */
  153.     int objc; /* Number of arguments. */
  154.     Tcl_Obj *CONST objv[]; /* Argument values. */
  155. {
  156.     TkWindow *winPtr = (TkWindow *) clientData;
  157.     HGLOBAL handle;
  158.     char *data;
  159.     int code = TCL_OK;
  160.     if (objc != 1) {
  161. Tcl_WrongNumArgs(interp, 1, objv, (char *) NULL);
  162. return TCL_ERROR;
  163.     }
  164.     if (OpenClipboard(NULL)) {
  165. /*
  166.  * We could consider using CF_UNICODETEXT on NT, but then we
  167.  * would have to convert it from External.  Instead we'll just
  168.  * take this and do "bytestring" at the Tcl level for Unicode
  169.  * inclusive text
  170.  */
  171. handle = GetClipboardData(CF_TEXT);
  172. if (handle != NULL) {
  173.     data = GlobalLock(handle);
  174.     Tcl_AppendResult(interp, data, (char *) NULL);
  175.     GlobalUnlock(handle);
  176. } else {
  177.     Tcl_AppendResult(interp, "null clipboard handle", (char *) NULL);
  178.     code = TCL_ERROR;
  179. }
  180. CloseClipboard();
  181. return code;
  182.     } else {
  183. Tcl_AppendResult(interp, "couldn't open clipboard: ", (char *) NULL);
  184. AppendSystemError(interp, GetLastError());
  185. return TCL_ERROR;
  186.     }
  187.     return TCL_OK;
  188. }
  189. /*
  190.  *----------------------------------------------------------------------
  191.  *
  192.  * TestwineventCmd --
  193.  *
  194.  * This procedure implements the testwinevent command. It provides
  195.  * a way to send messages to windows dialogs.
  196.  *
  197.  * Results:
  198.  * A standard Tcl result.
  199.  *
  200.  * Side effects:
  201.  * None.
  202.  *
  203.  *----------------------------------------------------------------------
  204.  */
  205. static int
  206. TestwineventCmd(clientData, interp, argc, argv)
  207.     ClientData clientData; /* Main window for application. */
  208.     Tcl_Interp *interp; /* Current interpreter. */
  209.     int argc; /* Number of arguments. */
  210.     CONST char **argv; /* Argument strings. */
  211. {
  212.     HWND hwnd = 0;
  213.     int id;
  214.     char *rest;
  215.     UINT message;
  216.     WPARAM wParam;
  217.     LPARAM lParam;
  218.     static TkStateMap messageMap[] = {
  219. {WM_LBUTTONDOWN, "WM_LBUTTONDOWN"},
  220. {WM_LBUTTONUP, "WM_LBUTTONUP"},
  221. {WM_CHAR, "WM_CHAR"},
  222. {WM_GETTEXT, "WM_GETTEXT"},
  223. {WM_SETTEXT, "WM_SETTEXT"},
  224. {-1, NULL}
  225.     };
  226.     if ((argc == 3) && (strcmp(argv[1], "debug") == 0)) {
  227. int b;
  228. if (Tcl_GetBoolean(interp, argv[2], &b) != TCL_OK) {
  229.     return TCL_ERROR;
  230. }
  231. TkWinDialogDebug(b);
  232. return TCL_OK;
  233.     }
  234.     if (argc < 4) {
  235. return TCL_ERROR;
  236.     }
  237. #if 0
  238.     TkpScanWindowId(interp, argv[1], &id);
  239.     if (
  240. #ifdef _WIN64
  241. (sscanf(string, "0x%p", &number) != 1) &&
  242. #endif
  243. Tcl_GetInt(interp, string, (int *)&number) != TCL_OK) {
  244. return TCL_ERROR;
  245.     }
  246. #endif
  247.     hwnd = (HWND) strtol(argv[1], &rest, 0);
  248.     if (rest == argv[1]) {
  249. hwnd = FindWindow(NULL, argv[1]);
  250. if (hwnd == NULL) {
  251.     Tcl_SetResult(interp, "no such window", TCL_STATIC);
  252.     return TCL_ERROR;
  253. }
  254.     }
  255.     UpdateWindow(hwnd);
  256.     id = strtol(argv[2], &rest, 0);
  257.     if (rest == argv[2]) {
  258. HWND child;
  259. char buf[256];
  260. child = GetWindow(hwnd, GW_CHILD);
  261. while (child != NULL) {
  262.     SendMessage(child, WM_GETTEXT, (WPARAM) sizeof(buf), (LPARAM) buf);
  263.     if (strcasecmp(buf, argv[2]) == 0) {
  264. id = GetDlgCtrlID(child);
  265. break;
  266.     }
  267.     child = GetWindow(child, GW_HWNDNEXT);
  268. }
  269. if (child == NULL) {
  270.     return TCL_ERROR;
  271. }
  272.     }
  273.     message = TkFindStateNum(NULL, NULL, messageMap, argv[3]);
  274.     if (message < 0) {
  275. message = strtol(argv[3], NULL, 0);
  276.     }
  277.     wParam = 0;
  278.     lParam = 0;
  279.     if (argc > 4) {
  280. wParam = strtol(argv[4], NULL, 0);
  281.     }
  282.     if (argc > 5) {
  283. lParam = strtol(argv[5], NULL, 0);
  284.     }
  285.     switch (message) {
  286. case WM_GETTEXT: {
  287.     Tcl_DString ds;
  288.     char buf[256];
  289.     GetDlgItemText(hwnd, id, buf, 256);
  290.     Tcl_ExternalToUtfDString(NULL, buf, -1, &ds);
  291.     Tcl_AppendResult(interp, Tcl_DStringValue(&ds), NULL);
  292.     Tcl_DStringFree(&ds);
  293.     break;
  294. }
  295. case WM_SETTEXT: {
  296.     Tcl_DString ds;
  297.     Tcl_UtfToExternalDString(NULL, argv[4], -1, &ds);
  298.     SetDlgItemText(hwnd, id, Tcl_DStringValue(&ds));
  299.     Tcl_DStringFree(&ds);
  300.     break;
  301. }
  302. default: {
  303.     char buf[TCL_INTEGER_SPACE];
  304.     
  305.     sprintf(buf, "%d", 
  306.     SendDlgItemMessage(hwnd, id, message, wParam, lParam));
  307.     Tcl_SetResult(interp, buf, TCL_VOLATILE);
  308.     break;
  309. }
  310.     }
  311.     return TCL_OK;
  312. }
  313.