通过c ++在Tclsh中动态字体着色

时间:2010-07-07 04:28:11

标签: c++ tcl swig

我是一个业余尝试破解一个小项目。它是一个简单的笔记存储和检索控制台应用程序在Windows Vista(和XP - 我希望从USB棒上运行整个事情)。

我使用Sqlite作为存储和Tcl / SQL脚本来添加注释(和标记!),并通过标记检索它们。 3个表和一个“Toxi”架构。

所以无论如何......我想从“dos提示”或更频繁的tclsh(不希望!)中使用它。我不想要窗口shell或者根本不使用TK。但是为了帮助在视觉上区分某些东西,标准输出stdout,来自时间戳的笔记等,我想用某种粗略的标记动态地改变字体颜色。

我找到了一个可以做到这一点的c ++项目! Jaded Hobo提出来:http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=9130。 Jaded Hobo说头文件“Console.H”足以包含在c ++项目中,但他不知道TCL。

我找到SWIG,接口编译器,我将尝试一下。但我对一些事情一无所知:

  1. 只需一个头文件即可吗?

  2. SWIG Win32示例不像'nix示例那样具有启发性,他们使用MS VC ++(VStudio) - 我想使用Quincy / MinGW。

    (哦,顺便说一下,这是我第一次尝试使用任何类型的C语言。那么你能说明如何在昆西使用SWIG吗?)

  3. 如何从标题源中收集到我在Tcl脚本中键入的内容以便使用它?

  4. 感谢您阅读本文,更不用说回答了。我开始把它放在comp.lang.tcl上,但我不喜欢我的电子邮件地址广播。

1 个答案:

答案 0 :(得分:2)

标题本身不够。另一方面,你真的不需要做那么多工作,因为this page表明API实际上非常简单。这是您需要的C代码:

#include <tcl.h>
#include <windows.h>

static int MySetConsoleColorCmd(
    ClientData clientData, Tcl_Interp *interp,
    int objc, Tcl_Obj *const objv[])
{
    HANDLE hConsole;
    int code;

    /* Parse arguments, first for argument count, then for number format */
    if (objc != 2) {
        Tcl_WrongNumArgs(interp, 1, objv, "colorCode");
        return TCL_ERROR;
    } else if (Tcl_GetIntFromObj(interp, objv[1], &code) != TCL_OK) {
        return TCL_ERROR;
    }

    /* Get console handle, checking for the error case */
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hConsole == INVALID_HANDLE_VALUE) {
        Tcl_SetResult(interp, "not a console application", TCL_STATIC);
        return TCL_ERROR;
    }

    /* Set the color! */
    SetConsoleTextAttribute(hConsole, code);
    return TCL_OK;
}

/* Standard entry point for loadable library */
int Consolecolor_Init(Tcl_Interp *interp) {
    Tcl_CreateObjCommand(interp, "consolecolor", MySetConsoleColorCmd,
            NULL, NULL);
    return TCL_OK;
}

将其编译成一个DLL(它没有任何花哨的依赖关系,超出Tcl本身),称为consolecolor.dll(名称应该稍微与入口点函数匹配),然后你就可以使用{ {3}}命令将新的consolecolor命令导入到您的代码中,如下所示:

load /path/to/consolecolor.dll

# Duplicate example from the page mentioned at the top of this answer
for {set k 1} {$k < 255} {incr k} {
    consolecolor $k
    puts "$k => I want to be nice today!"
}

有关如何选择颜色的指南,请参阅load