UEFI 中简单的GUI编程 - EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL的使用

bin 1月前 91

UEFI中有一个可以进行简单的GUI编程的Protocol,即EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL。利用它可以设置控制台的背景色,前景色,控制光标的位置,显示隐藏光标等。

该Protocol定义如下:

typedef struct _EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL {
EFI_TEXT_RESET Reset;
EFI_TEXT_STRING OutputString;
EFI_TEXT_TEST_STRING TestString;
EFI_TEXT_QUERY_MODE QueryMode;
EFI_TEXT_SET_MODE SetMode;
EFI_TEXT_SET_ATTRIBUTE SetAttribute;
EFI_TEXT_CLEAR_SCREEN ClearScreen;
EFI_TEXT_SET_CURSOR_POSITION SetCursorPosition;
EFI_TEXT_ENABLE_CURSOR EnableCursor;
SIMPLE_TEXT_OUTPUT_MODE *Mode;
} EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL;

下面来看看每一个成员函数的作用。

1.EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.Reset()

该Protocol用于重置控制台输出,属于硬件重置。执行后控制台的所有输出会被清空,相当于重启控制台。

2.EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.OutputString()

该Protocol用于在控制台绘制一个字符串。

3.EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.TestString()

该Protocol用于测试输出设备是否支持显示指定的字符串

4.EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode()

该Protocol用于获取输出设备的长度和宽度,用Colume和Row表示

5.EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetMode()

该Protocol用于设置输出设备的模式

6.EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetAttribute()

该Protocol用于设置输出设备的前景色和背景色

7.EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.ClearScreen()

该Protocol用于清除当前屏幕,超过当前屏幕部分是不会清除的,按PageUp/PageDown还是会存在的,除非使用Reset重置

8.EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.SetCursorPosition()

该Protocol用于设置光标的位置,使用行列进行定位

9.EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.EnableCursor()

该Protocol用于启用、禁用光标

下面用个实例说明一下,比如要在控制台的指定位置边画一个矩形。

1.需要先知道屏幕的长和宽,可以使用QueryMode函数取得

2.根据得到的长宽,用SetCursorPosition()设置光标的位置

EFI_STATUS DrawRectangle(
	IN UINTN Cols1,
	IN UINTN Rows1,
	IN UINTN Cols2,
	IN UINTN Rows2,
	IN UINTN TextAttribute
){
    UINTN x, y;
    UINTN TextAttributeBak;
    CHAR16 Buffer[200];
        // 一行空格
    for (x = 0; x < Cols2 - Cols1; x++){
        Buffer[x] = ' ';
    }
    Buffer[x] = '\0';
        // 备份控制台当前颜色配置
    TextAttributeBak = gST->ConOut->Mode->Attribute;
    // 设置控制台颜色
    gST->ConOut->SetAttribute(gST->ConOut, TextAttribute);

    for (y = Rows1; y < Rows2; y++){
            // 设置每行矩形坐标
        gST->ConOut->SetCursorPosition(
            gST->ConOut,
            Cols1,
            y
        );
        // 输出一行空格
        gST->ConOut->OutputString(
            gST->ConOut,
            Buffer
        );
    }
    // 还原控制台颜色配置
    gST->ConOut->SetAttribute(gST->ConOut, TextAttributeBak);
    
    return EFI_SUCCESS;
}

调用函数在38列,0行,58列,5行画一个绿色矩形:

DrawRectangle(38, 0, 58, 5, EFI_GREEN | EFI_BACKGROUND_GREEN);

结果如下:

《UEFI 中简单的GUI编程 - EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL的使用》



最新回复 (0)
返回