reactos操作系统实现(55)
在语言选择里,倒底做了什么样的事情,让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,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,在不同国家里,它是表示不同的语言文字。因此选择代码页,就相当于选择不同国家的语言排列方式。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |