На лету раскраска шрифтов в Tclsh через c ++ - PullRequest
0 голосов
/ 07 июля 2010

Я любитель, пытаюсь взломать небольшой проект. Это простое консольное приложение для хранения и поиска заметок в Windows Vista (и XP - я надеюсь запустить все это с USB-накопителя).

Я использую Sqlite в качестве хранилища и сценарии Tcl / SQL для добавления заметок (и тегов!), А также извлекаю их по тегам. 3 таблицы и схема "Toxi".

Так или иначе ... Я хочу использовать его либо из "DOS-приглашения", либо более часто по tclsh (НЕ желаю!) Я не хочу использовать оконную оболочку или использовать TK вообще. Но чтобы помочь визуально отличить некоторые вещи, от stdin от 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 с Quincy?)

  3. Как я могу узнать из исходного заголовка, что, черт возьми, набрать в моем сценарии Tcl, чтобы использовать его?

Спасибо, что прочитали это, не говоря уже об ответе. Я начал помещать его на comp.lang.tcl, но мне не нравится, когда мой адрес электронной почты транслируется таким образом.

1 Ответ

2 голосов
/ 09 июля 2010

Заголовка недостаточно.С другой стороны, вам действительно не нужно слишком много работать, поскольку эта страница указывает на то, что 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 (имя должно несколько соответствовать функции точки входа), а затем вы сможете использовать команду load для импорта новой команды 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!"
}

Для получения инструкций о том, какчтобы выбрать цвета, см. эту страницу MSDN .

...