zl程序教程

您现在的位置是:首页 >  系统

当前栏目

reactos操作系统实现(55)

操作系统 实现 55 reactos
2023-09-14 09:10:38 时间

在语言选择里,倒底做了什么样的事情,让ROS系统可以选择不同的语言?ROS系统又是怎么样实现不同的语言支持的呢?

#001  static PAGE_NUMBER

#002  LanguagePage(PINPUT_RECORD Ir)

#003  {

 

初始化语言列表。

#004      /* Initialize the computer settings list */

#005      if (LanguageList == NULL)

#006      {

 

根据安装的配置文件选择语言。

#007          LanguageList = CreateLanguageList(SetupInf, DefaultLanguage);

#008 

#009          if (LanguageList == NULL)

#010          {

#011             PopupError("Setup failed to initialize available translations", NULL, NULL, POPUP_WAIT_NONE);

#012             return INTRO_PAGE;

#013          }

#014      }

#015 

 

在屏幕上显示语言列表。

#016      DrawGenericList(LanguageList,

#017                      2,

#018                      18,

#019                      xScreen - 3,

#020                      yScreen - 3);

#021 

 

滚动选择的语言上。

#022      ScrollToPositionGenericList (LanguageList, GetDefaultLanguageIndex());

#023 

#024      MUIDisplayPage(LANGUAGE_PAGE);

#025 

 

循环处理,直到用户选择了安装的语言。

#026      while(TRUE)

#027      {

#028          CONSOLE_ConInKey(Ir);

#029 

 

使用向下方向键选择语言。

#030          if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&

#031              (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN))  /* DOWN */

#032          {

#033  #if 0

#034              SelectedLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList));

#035 

#036              /* Redraw language selection page in native language */

#037              MUIDisplayPage(LANGUAGE_PAGE);

#038  #endif

#039 

#040              ScrollDownGenericList (LanguageList);

#041          }

 

使用向上方向键选择语言。

#042          else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&

#043                   (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP))  /* UP */

#044          {

#045  #if 0

#046              SelectedLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList));

#047 

#048              /* Redraw language selection page in native language */

#049              MUIDisplayPage(LANGUAGE_PAGE);

#050  #endif

#051 

#052              ScrollUpGenericList (LanguageList);

#053          }

#054          if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&

#055              (Ir->Event.KeyEvent.wVirtualKeyCode == VK_NEXT))  /* PAGE DOWN */

#056          {

#057              ScrollPageDownGenericList (LanguageList);

#058          }

#059          else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&

#060                   (Ir->Event.KeyEvent.wVirtualKeyCode == VK_PRIOR))  /* PAGE UP */

#061          {

#062              ScrollPageUpGenericList (LanguageList);

#063          }

 

如果用户按F3退出安装程序。

#064          else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&

#065                   (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3))  /* F3 */

#066          {

#067              if (ConfirmQuit(Ir) == TRUE)

#068                  return QUIT_PAGE;

#069          }

 

如果用户按回车键,就选择相应的语言,并且进入下一个页面。

#070          else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D)  /* ENTER */

#071          {

#072              SelectedLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList));

#073 

#074              if (wcscmp(SelectedLanguageId, DefaultLanguage))

#075              {

#076                  UpdateKBLayout();

#077              }

#078 

#079              // Load the font

#080              SetConsoleCodePage();

#081 

 

这里进入下一个介绍页面。

#082              return INTRO_PAGE;

#083          }

#084          else if ((Ir->Event.KeyEvent.uChar.AsciiChar > 0x60) && (Ir->Event.KeyEvent.uChar.AsciiChar < 0x7b))

#085          {

#086              /* a-z */

#087              GenericListKeyPress (LanguageList, Ir->Event.KeyEvent.uChar.AsciiChar);

#088          }

#089      }

#090 

#091      return INTRO_PAGE;

#092  }

 

通过上面的函数处理,就可以选不同的语言。在函数里调用SetConsoleCodePage函数来设置代码页,也就是通过代码页来实现不同的语言来显示。也就是通过下面的代码来实现:

#001  BOOL WINAPI

#002  SetConsoleOutputCP(

#003       IN UINT wCodepage)

#004  {

#005       HANDLE hConsoleOutput;

#006       IO_STATUS_BLOCK IoStatusBlock;

#007       NTSTATUS Status;

#008 

#009       hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);

#010 

#011       Status = NtDeviceIoControlFile(

#012              hConsoleOutput,

#013              NULL,

#014              NULL,

#015              NULL,

#016              &IoStatusBlock,

#017              IOCTL_CONSOLE_LOADFONT,

#018              &wCodepage,

#019              sizeof(ULONG),

#020              NULL,

#021              0);

#022       return NT_SUCCESS(Status);

#023  }

 

代码页的作用,就是设置不同国家的编码方式。比如同一个16进制的码8022,在不同国家里,它是表示不同的语言文字。因此选择代码页,就相当于选择不同国家的语言排列方式。