コード例 #1
0
ファイル: tkWinTest.c プロジェクト: AlexShiLucky/bitkeeper
static int
TestwineventObjCmd(
    ClientData clientData,	/* Main window for application. */
    Tcl_Interp *interp,		/* Current interpreter. */
    int objc,			/* Number of arguments. */
    Tcl_Obj *const objv[])		/* Argument strings. */
{
    HWND hwnd = 0;
    HWND child = 0;
    HWND control;
    int id;
    char *rest;
    UINT message;
    WPARAM wParam;
    LPARAM lParam;
    LRESULT result;
    static const TkStateMap messageMap[] = {
	{WM_LBUTTONDOWN,	"WM_LBUTTONDOWN"},
	{WM_LBUTTONUP,		"WM_LBUTTONUP"},
	{WM_CHAR,		"WM_CHAR"},
	{WM_GETTEXT,		"WM_GETTEXT"},
	{WM_SETTEXT,		"WM_SETTEXT"},
	{WM_COMMAND,            "WM_COMMAND"},
	{-1,			NULL}
    };

    if ((objc == 3) && (strcmp(Tcl_GetString(objv[1]), "debug") == 0)) {
	int b;

	if (Tcl_GetBoolean(interp, Tcl_GetString(objv[2]), &b) != TCL_OK) {
	    return TCL_ERROR;
	}
	TkWinDialogDebug(b);
	return TCL_OK;
    }

    if (objc < 4) {
	return TCL_ERROR;
    }

    hwnd = INT2PTR(strtol(Tcl_GetString(objv[1]), &rest, 0));
    if (rest == Tcl_GetString(objv[1])) {
	hwnd = FindWindowA(NULL, Tcl_GetString(objv[1]));
	if (hwnd == NULL) {
	    Tcl_SetObjResult(interp, Tcl_NewStringObj("no such window", -1));
	    return TCL_ERROR;
	}
    }
    UpdateWindow(hwnd);

    id = strtol(Tcl_GetString(objv[2]), &rest, 0);
    if (rest == Tcl_GetString(objv[2])) {
	char buf[256];

	child = GetWindow(hwnd, GW_CHILD);
	while (child != NULL) {
	    SendMessageA(child, WM_GETTEXT, (WPARAM) sizeof(buf), (LPARAM) buf);
	    if (strcasecmp(buf, Tcl_GetString(objv[2])) == 0) {
		id = GetDlgCtrlID(child);
		break;
	    }
	    child = GetWindow(child, GW_HWNDNEXT);
	}
	if (child == NULL) {
	    Tcl_AppendResult(interp, "could not find a control matching \"",
		Tcl_GetString(objv[2]), "\"", NULL);
	    return TCL_ERROR;
	}
    }

    message = TkFindStateNum(NULL, NULL, messageMap, Tcl_GetString(objv[3]));
    wParam = 0;
    lParam = 0;

    if (objc > 4) {
	wParam = strtol(Tcl_GetString(objv[4]), NULL, 0);
    }
    if (objc > 5) {
	lParam = strtol(Tcl_GetString(objv[5]), NULL, 0);
    }

    switch (message) {
    case WM_GETTEXT: {
	Tcl_DString ds;
	char buf[256];

#if 0
	GetDlgItemTextA(hwnd, id, buf, 256);
#else
        control = TestFindControl(hwnd, id);
        if (control == NULL) {
            Tcl_SetObjResult(interp,
                             Tcl_ObjPrintf("Could not find control with id %d", id));
            return TCL_ERROR;
        }
        buf[0] = 0;
        SendMessageA(control, WM_GETTEXT, (WPARAM)sizeof(buf),
                     (LPARAM) buf);
#endif
	Tcl_ExternalToUtfDString(NULL, buf, -1, &ds);
	Tcl_AppendResult(interp, Tcl_DStringValue(&ds), NULL);
	Tcl_DStringFree(&ds);
	break;
    }
    case WM_SETTEXT: {
	Tcl_DString ds;

        control = TestFindControl(hwnd, id);
        if (control == NULL) {
            Tcl_SetObjResult(interp,
                             Tcl_ObjPrintf("Could not find control with id %d", id));
            return TCL_ERROR;
        }
	Tcl_UtfToExternalDString(NULL, Tcl_GetString(objv[4]), -1, &ds);
        result = SendMessageA(control, WM_SETTEXT, 0,
                                  (LPARAM) Tcl_DStringValue(&ds));
	Tcl_DStringFree(&ds);
	if (result == 0) {
            Tcl_SetObjResult(interp, Tcl_NewStringObj("failed to send text to dialog: ", -1));
            AppendSystemError(interp, GetLastError());
            return TCL_ERROR;
	}
	break;
    }
    case WM_COMMAND: {
	char buf[TCL_INTEGER_SPACE];
	if (objc < 5) {
	    wParam = MAKEWPARAM(id, 0);
	    lParam = (LPARAM)child;
	}
	sprintf(buf, "%d", (int) SendMessageA(hwnd, message, wParam, lParam));
	Tcl_SetObjResult(interp, Tcl_NewStringObj(buf, -1));
	break;
    }
    default: {
	char buf[TCL_INTEGER_SPACE];

	sprintf(buf, "%d",
		(int) SendDlgItemMessageA(hwnd, id, message, wParam, lParam));
	Tcl_SetObjResult(interp, Tcl_NewStringObj(buf, -1));
	break;
    }
    }
    return TCL_OK;
}
コード例 #2
0
ファイル: tkWinTest.c プロジェクト: starseeker/tcltk
static int
TestwineventCmd(
    ClientData clientData,	/* Main window for application. */
    Tcl_Interp *interp,		/* Current interpreter. */
    int argc,			/* Number of arguments. */
    const char **argv)		/* Argument strings. */
{
    HWND hwnd = 0;
    HWND child = 0;
    int id;
    char *rest;
    UINT message;
    WPARAM wParam;
    LPARAM lParam;
    static const TkStateMap messageMap[] = {
        {WM_LBUTTONDOWN,	"WM_LBUTTONDOWN"},
        {WM_LBUTTONUP,		"WM_LBUTTONUP"},
        {WM_CHAR,		"WM_CHAR"},
        {WM_GETTEXT,		"WM_GETTEXT"},
        {WM_SETTEXT,		"WM_SETTEXT"},
        {WM_COMMAND,            "WM_COMMAND"},
        {-1,			NULL}
    };

    if ((argc == 3) && (strcmp(argv[1], "debug") == 0)) {
        int b;

        if (Tcl_GetBoolean(interp, argv[2], &b) != TCL_OK) {
            return TCL_ERROR;
        }
        TkWinDialogDebug(b);
        return TCL_OK;
    }

    if (argc < 4) {
        return TCL_ERROR;
    }

#if 0
    TkpScanWindowId(interp, argv[1], &id);
    if (
#ifdef _WIN64
        (sscanf(string, "0x%p", &number) != 1) &&
#endif /* _WIN64 */
        Tcl_GetInt(interp, string, (int *)&number) != TCL_OK) {
        return TCL_ERROR;
    }
#endif
    hwnd = INT2PTR(strtol(argv[1], &rest, 0));
    if (rest == argv[1]) {
        hwnd = FindWindowA(NULL, argv[1]);
        if (hwnd == NULL) {
            Tcl_SetObjResult(interp, Tcl_NewStringObj("no such window", -1));
            return TCL_ERROR;
        }
    }
    UpdateWindow(hwnd);

    id = strtol(argv[2], &rest, 0);
    if (rest == argv[2]) {
        char buf[256];

        child = GetWindow(hwnd, GW_CHILD);
        while (child != NULL) {
            SendMessageA(child, WM_GETTEXT, (WPARAM) sizeof(buf), (LPARAM) buf);
            if (strcasecmp(buf, argv[2]) == 0) {
                id = GetDlgCtrlID(child);
                break;
            }
            child = GetWindow(child, GW_HWNDNEXT);
        }
        if (child == NULL) {
            Tcl_AppendResult(interp, "could not find a control matching \"",
                             argv[2], "\"", NULL);
            return TCL_ERROR;
        }
    }
    message = TkFindStateNum(NULL, NULL, messageMap, argv[3]);
    wParam = 0;
    lParam = 0;

    if (argc > 4) {
        wParam = strtol(argv[4], NULL, 0);
    }
    if (argc > 5) {
        lParam = strtol(argv[5], NULL, 0);
    }

    switch (message) {
    case WM_GETTEXT: {
        Tcl_DString ds;
        char buf[256];

        GetDlgItemTextA(hwnd, id, buf, 256);
        Tcl_ExternalToUtfDString(NULL, buf, -1, &ds);
        Tcl_AppendResult(interp, Tcl_DStringValue(&ds), NULL);
        Tcl_DStringFree(&ds);
        break;
    }
    case WM_SETTEXT: {
        Tcl_DString ds;
        BOOL result;

        Tcl_UtfToExternalDString(NULL, argv[4], -1, &ds);
        result = SetDlgItemTextA(hwnd, id, Tcl_DStringValue(&ds));
        Tcl_DStringFree(&ds);
        if (result == 0) {
            Tcl_SetObjResult(interp, Tcl_NewStringObj("failed to send text to dialog: ", -1));
            AppendSystemError(interp, GetLastError());
            return TCL_ERROR;
        }
        break;
    }
    case WM_COMMAND: {
        char buf[TCL_INTEGER_SPACE];
        if (argc < 5) {
            wParam = MAKEWPARAM(id, 0);
            lParam = (LPARAM)child;
        }
        sprintf(buf, "%d", (int) SendMessageA(hwnd, message, wParam, lParam));
        Tcl_SetObjResult(interp, Tcl_NewStringObj(buf, -1));
        break;
    }
    default: {
        char buf[TCL_INTEGER_SPACE];

        sprintf(buf, "%d",
                (int) SendDlgItemMessageA(hwnd, id, message, wParam, lParam));
        Tcl_SetObjResult(interp, Tcl_NewStringObj(buf, -1));
        break;
    }
    }
    return TCL_OK;
}