Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
突出显示文本的SDL文本框 我正在制作一个C++程序,使用SDL来显示文本框。我已经完成了文本框的基本功能,如键入文本、限制、复制/粘贴等。但我一直在努力使其能够突出显示文本_C++_Text_Textbox_Sdl_Highlight - Fatal编程技术网

突出显示文本的SDL文本框 我正在制作一个C++程序,使用SDL来显示文本框。我已经完成了文本框的基本功能,如键入文本、限制、复制/粘贴等。但我一直在努力使其能够突出显示文本

突出显示文本的SDL文本框 我正在制作一个C++程序,使用SDL来显示文本框。我已经完成了文本框的基本功能,如键入文本、限制、复制/粘贴等。但我一直在努力使其能够突出显示文本,c++,text,textbox,sdl,highlight,C++,Text,Textbox,Sdl,Highlight,以下是我如何绘制文本框: void draw_text_box(SDL_Surface *screan, char *message, struct textbox *text_box, int r, int g, int b) { int temp_width; int temp_frame; SDL_Surface *text; SDL_Color textcolor = {0,0,0,0}; SDL_Rect temp_location, clr_b

以下是我如何绘制文本框:

void draw_text_box(SDL_Surface *screan, char *message, struct textbox *text_box, int r, int g, int b)
{
    int temp_width;
    int temp_frame;
    SDL_Surface *text;
    SDL_Color textcolor = {0,0,0,0};
    SDL_Rect temp_location, clr_box;

    temp_width = text_box->location.w; //preserve the correct width

    temp_location = text_box->location;
    temp_location.y += 4;
    temp_location.h = 12;

    clr_box = text_box->location;

    //colors!
    textcolor.r = r;
    textcolor.g = g;
    textcolor.b = b;

    //text = TTF_RenderText_Solid(ttf_font, text_box->prev_message, textcolor);
    //SDL_BlitSurface( text, NULL, screan, &text_box->location);//<-changes "location" width to width of text

    //clear
    SDL_FillRect(screan, &clr_box, SDL_MapRGB(screen->format, 0, 0, 0));

    //strcpy(text_box->prev_message, message);

    //set the text
    text = TTF_RenderText_Solid(ttf_font, message, textcolor);

    if(!text) return;

    //set the offset
    temp_location.x = text_box->last_shift;
    temp_location.y = 0;
    temp_location.h = text->h;

    if(text_box->cursor_loc - text_box->last_shift > temp_location.w)
    temp_location.x = text_box->cursor_loc - temp_location.w;

    if(text_box->cursor_loc - 3 < text_box->last_shift)
    temp_location.x = text_box->cursor_loc - 3;

    if(temp_location.x < 0) temp_location.x = 0;
    text_box->last_shift = temp_location.x;

    //draw
    SDL_BlitSurface( text, &temp_location, screan, &text_box->location);//<-changes "location" width to width of text
    text_box->location.w = temp_width;
}
void set_text_box_text(SDL_Surface *screan, struct textbox *text_box, char *message)
{
    if(text_box->message != message)
        strcpy(text_box->message, message);

    text_box->char_amt = strlen(message);
    text_box->cursor = text_box->char_amt;
    text_box->last_shift = 0;

    if (screan) //if not NULL
    {
        if (text_box->selected)
            select_text_box(screan,text_box);
        else
            unselect_text_box(screan,text_box);
    }
    else
    {
        ;//text_box->prev_message[0] = '\0';
    }
}
void select_text_box(SDL_Surface *screan, struct textbox *text_box)
{
    char temp_message[405] = "";
    char temp_left[405];
    int i;

    text_box->selected = 1;

    if (text_box->pass_char == '\0')
    {
        if (text_box->cursor != 0)
        {
            left(temp_left, text_box->message, text_box->cursor);
            strcat(temp_message, temp_left);
        }

        temp_message[text_box->cursor] = '|';
        temp_message[text_box->cursor + 1] = '\0';

        right(temp_left, text_box->message, text_box->cursor);
        strcat(temp_message, temp_left);
    }
    else
    {
        for(i=0;i<text_box->cursor;i++)
            temp_message[i] = text_box->pass_char;

        temp_message[i] = '|';

        for(i++;i<text_box->char_amt + 1;i++)
            temp_message[i] = text_box->pass_char;

        temp_message[i] = '\0';
    }

    draw_text_box(screan, temp_message, text_box, 250, 250, 250);

}

void unselect_text_box(SDL_Surface *screan, struct textbox *text_box)
{
    char temp_message[405];
    int i;

    text_box->selected = 0;

    if (text_box->pass_char == '\0')
        draw_text_box(screan, text_box->message, text_box, 250, 250, 250);
    else
    {
        for(i=0;i<text_box->char_amt;i++)
            temp_message[i] = text_box->pass_char;

        temp_message[i] = '\0';
        draw_text_box(screan, temp_message, text_box, 250, 250, 250);
    }
}
选择并取消选择文本框:

void draw_text_box(SDL_Surface *screan, char *message, struct textbox *text_box, int r, int g, int b)
{
    int temp_width;
    int temp_frame;
    SDL_Surface *text;
    SDL_Color textcolor = {0,0,0,0};
    SDL_Rect temp_location, clr_box;

    temp_width = text_box->location.w; //preserve the correct width

    temp_location = text_box->location;
    temp_location.y += 4;
    temp_location.h = 12;

    clr_box = text_box->location;

    //colors!
    textcolor.r = r;
    textcolor.g = g;
    textcolor.b = b;

    //text = TTF_RenderText_Solid(ttf_font, text_box->prev_message, textcolor);
    //SDL_BlitSurface( text, NULL, screan, &text_box->location);//<-changes "location" width to width of text

    //clear
    SDL_FillRect(screan, &clr_box, SDL_MapRGB(screen->format, 0, 0, 0));

    //strcpy(text_box->prev_message, message);

    //set the text
    text = TTF_RenderText_Solid(ttf_font, message, textcolor);

    if(!text) return;

    //set the offset
    temp_location.x = text_box->last_shift;
    temp_location.y = 0;
    temp_location.h = text->h;

    if(text_box->cursor_loc - text_box->last_shift > temp_location.w)
    temp_location.x = text_box->cursor_loc - temp_location.w;

    if(text_box->cursor_loc - 3 < text_box->last_shift)
    temp_location.x = text_box->cursor_loc - 3;

    if(temp_location.x < 0) temp_location.x = 0;
    text_box->last_shift = temp_location.x;

    //draw
    SDL_BlitSurface( text, &temp_location, screan, &text_box->location);//<-changes "location" width to width of text
    text_box->location.w = temp_width;
}
void set_text_box_text(SDL_Surface *screan, struct textbox *text_box, char *message)
{
    if(text_box->message != message)
        strcpy(text_box->message, message);

    text_box->char_amt = strlen(message);
    text_box->cursor = text_box->char_amt;
    text_box->last_shift = 0;

    if (screan) //if not NULL
    {
        if (text_box->selected)
            select_text_box(screan,text_box);
        else
            unselect_text_box(screan,text_box);
    }
    else
    {
        ;//text_box->prev_message[0] = '\0';
    }
}
void select_text_box(SDL_Surface *screan, struct textbox *text_box)
{
    char temp_message[405] = "";
    char temp_left[405];
    int i;

    text_box->selected = 1;

    if (text_box->pass_char == '\0')
    {
        if (text_box->cursor != 0)
        {
            left(temp_left, text_box->message, text_box->cursor);
            strcat(temp_message, temp_left);
        }

        temp_message[text_box->cursor] = '|';
        temp_message[text_box->cursor + 1] = '\0';

        right(temp_left, text_box->message, text_box->cursor);
        strcat(temp_message, temp_left);
    }
    else
    {
        for(i=0;i<text_box->cursor;i++)
            temp_message[i] = text_box->pass_char;

        temp_message[i] = '|';

        for(i++;i<text_box->char_amt + 1;i++)
            temp_message[i] = text_box->pass_char;

        temp_message[i] = '\0';
    }

    draw_text_box(screan, temp_message, text_box, 250, 250, 250);

}

void unselect_text_box(SDL_Surface *screan, struct textbox *text_box)
{
    char temp_message[405];
    int i;

    text_box->selected = 0;

    if (text_box->pass_char == '\0')
        draw_text_box(screan, text_box->message, text_box, 250, 250, 250);
    else
    {
        for(i=0;i<text_box->char_amt;i++)
            temp_message[i] = text_box->pass_char;

        temp_message[i] = '\0';
        draw_text_box(screan, temp_message, text_box, 250, 250, 250);
    }
}
void选择文本框(SDL\u表面*screan,结构文本框*text\u框)
{
字符临时信息[405]=“”;
左半焦温度[405];
int i;
文本框->所选=1;
如果(文本框->传递字符='\0')
{
如果(文本框->光标!=0)
{
左侧(临时左侧,文本框->消息,文本框->光标);
strcat(临时信息,临时左侧);
}
临时消息[文本框->光标]='|';
临时消息[文本框->光标+1]='\0';
右侧(临时左侧,文本框->消息,文本框->光标);
strcat(临时信息,临时左侧);
}
其他的
{
对于(i=0;icursor;i++)
临时消息[i]=文本框->传递字符;
临时消息[i]=“|”;
对于(i++;ichar_金额+1;i++)
临时消息[i]=文本框->传递字符;
临时消息[i]='\0';
}
绘制文本框(屏幕、临时消息、文本框、250、250);
}
void取消选择文本框(SDL曲面*screan,结构文本框*文本框)
{
字符临时信息[405];
int i;
文本框->所选=0;
如果(文本框->传递字符='\0')
绘制文本框(屏幕,文本框->消息,文本框,250,250);
其他的
{
对于(i=0;ichar\u金额;i++)
临时消息[i]=文本框->传递字符;
临时消息[i]='\0';
绘制文本框(屏幕、临时消息、文本框、250、250);
}
}

欢迎来到Stackoverflow!请发布一个,这样我们可以帮助您。欢迎使用堆栈溢出!您的问题很难回答,因为它不包含您的代码。您需要发布您的代码,以便人们可以查看并解释如何继续。您最好创建一个。另见。您可以使用该按钮更新您的问题。祝你好运非常感谢。问题已更新。