이전 장에서 생성한 HIISimpleForm 애플리케이션과 비슷한 내용으로 새로운 HIIStaticForm 애플리케이션을 생성한다. 이전 장에서 생성한 애플리케이션과 차이는 폼 내용만 변경하므로 생성하는 방법은 다루지 않는다. Strings.uni 파일도 수정해야 한다.
VFR의 내용은 아래 내용으로 작성한다.
#define HIISTATICFORM_FORMSET_GUID {0x32783cc5, 0xe551, 0x4b61, {0xb7, 0xbd, 0x41, 0xba, 0x71, 0x7f, 0xba, 0x81}}
formset
guid = HIISTATICFORM_FORMSET_GUID,
title = STRING_TOKEN(HIISTATICFORM_FORMSET_TITLE),
help = STRING_TOKEN(HIISTATICFORM_FORMSET_HELP),
form
formid = 1,
title = STRING_TOKEN(HIISTATICFORM_FORMID1_TITLE);
endform;
endformset;
빌드를 진행하면 아래와 같은 코드를 생성한다.
Build/UefiLessonsPkg/RELEASE_GCC5/X64/UefiLessonsPkg/HIIStaticForm/HIIStaticForm/DEBUG/Form.lst
2개의 opcode EFI_IFR_SUBTITLE과 EFI_IFR_END가 있다. 이미 EFI_IFR_END의 구조를 확인했기 때문에 이번에는 EFI_IFR_SUBTITLE을 확인한다.
EFI_IFR_SUBTITLE
Summary:
Creates a sub-title in the current form.
Prototype:
#define EFI_IFR_SUBTITLE_OP 0x02
typedef struct _EFI_IFR_SUBTITLE {
EFI_IFR_OP_HEADER Header;
EFI_IFR_STATEMENT_HEADER Statement;
UINT8 Flags;
} EFI_IFR_SUBTITLE;
Members:
Header The sequence that defines the type of opcode as well as the length of the opcode being defined.
For this tag, Header.OpCode = EFI_IFR_SUBTITLE_OP.
Flags Identifies specific behavior for the sub-title.
다른 subtitle
위에서 했던 것과 비슷하게 subtitle을 하나 더 생성한다.
...
form
formid = 1,
title = STRING_TOKEN(HIISTATICFORM_FORMID1_TITLE);
subtitle text = STRING_TOKEN(SUBTITLE1);
subtitle text = STRING_TOKEN(SUBTITLE2);
endform;
...
이 subtitle2는 subtitle1 뒤에 출력된다. 이 원칙은 모든 폼 요소에 적용된다. 기본적으로 다음 요소는 단순히 다른 문자열로 이동한다.
subtitle 범위 활용
위에서 봤듯이 EFI_IFR_SUBTITLE은 나중에 EFI_IFR_END에 의해 닫힌 범위를 열 수 있다.
subtitle 범위 내의 요소를 정의하여 범위 내의 모든 요소를 들여 쓸 수 있다.
아래 내용을 Form.vfr 파일에 작성한다.
subtitle
text = STRING_TOKEN(SUBTITLE3),
subtitle text = STRING_TOKEN(SUBTITLE4);
endsubtitle;
opcode EFI_IFR_SUBTITLE-EFI_IFR_SUBTITLE-EFI_IFR_END-EFI_IFR_END를 확인할 수 있다. 만약 SUBTITLE4를 SUBTITLE3 범위에 넣지 않았을 경우에는 EFI_IFR_SUBTITLE-EFI_IFR_END-EFI_IFR_SUBTITLE-EFI_IFR_END로 된다.
더 깊게 이해하기 위해 SUBTITLE3의 범위 안에 다른 subtitle을 추가하고 범위 뒤에 다른 subtitle을 추가한다.
subtitle
text = STRING_TOKEN(SUBTITLE3),
subtitle text = STRING_TOKEN(SUBTITLE4);
subtitle text = STRING_TOKEN(SUBTITLE5);
endsubtitle;
subtitle text = STRING_TOKEN(SUBTITLE6);
Build/UefiLessonsPkg/RELEASE_GCC5/X64/UefiLessonsPkg/HIIStaticForm/HIIStaticForm/DEBUG/Form.lst를 확인하면 text가 범위를 열지 않아 하나의 EFI_IFR_TEXT만 생성된다.
text
>00000078: 03 08 0C 00 0D 00 00 00
help = STRING_TOKEN(0x000D),
text = STRING_TOKEN(0x000C);
EFI_IFR_TEXT
Summary:
Creates a static text and image.
Prototype:
#define EFI_IFR_TEXT_OP 0x03
typedef struct _EFI_IFR_TEXT {
EFI_IFR_OP_HEADER Header;
EFI_IFR_STATEMENT_HEADER Statement;
EFI_STRING_ID TextTwo;
} EFI_IFR_TEXT;
Members:
Header The sequence that defines the type of opcode as well as the length of the opcode being defined.
For this tag, Header.OpCode = EFI_IFR_TEXT_OP.
Statement Standard statement header.
TextTwo The string token reference to the secondary string for this opcode.
Description:
This is a static text/image statement.
아래는 EFI_IFR_STATEMENT_HEADER 필드에 대한 정의다.
EFI_IFR_STATEMENT_HEADER
Summary:
Standard statement header.
Prototype:
typedef struct _EFI_IFR_STATEMENT_HEADER {
EFI_STRING_ID Prompt;
EFI_STRING_ID Help;
} EFI_IFR_STATEMENT_HEADER;
Members:
Prompt The string identifier of the prompt string for this particular statement. The value 0 indicates no prompt string.
Help The string identifier of the help string for this particular statement. The value 0 indicates no help string
Description:
This is the standard header for statements, including questions.
text 요소는 아래와 같이 출력된다.
text 요소와 subtitle 요소의 차이점은 text 요소는 선택할 수 있다는 점이다.
TEXT1 title을 생성했던 방법과 똑같이 TEXT2 title을 생성한다.
방향키를 사용해 Text1 title과 Text2 title을 선택할 수 있고 선택된 text에 따라 help도 자동으로 변경된다.
다른 text 필드
text 필드에 다른 text 요소를 추가할 수 있다.
text
help = STRING_TOKEN(TEXT3_HELP),
text = STRING_TOKEN(TEXT3_TEXT),
text = STRING_TOKEN(TEXT3_TEXT_TWO);