UEFI开发学习2 – 简单的GUI编程
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);
结果如下:
版权声明:
作者:bin
链接:https://ay123.net/mystudy/uefi/695/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论