[WELCOME]: UI improvements:

- Allow only one running instance of the Welcome application at a time.
- Implement translating \xhhhh hexadecimal character specifications in topic text descriptions.
- Allow using the keyboard for navigating amongst the topics, and ENTER key presses to run the selected topic command.
  <rant> *OF COURSE*, because we are ReactOS *SO* we are *buggy* (well, user32/win32k), keyboard navigation via arrow keys *DOES NOT WORK*!! (only navigation via TAB key do work) 8^(((( </rant>
  This however works OK on Windows.
- Improve topic buttons activation when mouse hovers around above the window, as well as when window activation is lost or regained.
- Change the default text font to Tahoma.
- Don't hardcode white brush, but instead use stock object WHITE_BRUSH. Similarly, don't hardcode text black colour, but instead use the ambient text colour of the system.
- Add keyboard shortcuts to the default topic items.
- Shift the window ID of both the checkbox and the Exit buttons to be below a fixed topic-button base ID.
- In GetLocaleName(), use more explicit returned-variable names (cchRet, because it's a returned string length in character numbers).

svn path=/trunk/; revision=75282
This commit is contained in:
Hermès Bélusca-Maïto 2017-07-05 02:02:43 +00:00
parent e22e9fc81f
commit d876a3ea01
30 changed files with 418 additions and 297 deletions

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Добре дошли в операционна система ReactOS.\n\nИзберете си от темите в ляво." IDS_DEFAULTTOPICDESC "Добре дошли в операционна система ReactOS.\n\nИзберете си от темите в ляво."
IDS_CHECKTEXT "Показвай отново този прозорец" IDS_CHECKTEXT "&Показвай отново този прозорец"
IDS_CLOSETEXT "Изход" IDS_CLOSETEXT "&Изход"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Инсталиране на ReactOS" IDS_TOPICBUTTON0 "Инсталиране на &ReactOS"
IDS_TOPICBUTTON1 "Разгледай това CD" IDS_TOPICBUTTON1 "&Разгледай това CD"
IDS_TOPICBUTTON2 "Изход" IDS_TOPICBUTTON2 "&Изход"
END END
/* Topic titles */ /* Topic titles */

View file

@ -9,16 +9,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Vítejte v operačním systému ReactOS.\n\nKlepněte na tlačítko v levém sloupci." IDS_DEFAULTTOPICDESC "Vítejte v operačním systému ReactOS.\n\nKlepněte na tlačítko v levém sloupci."
IDS_CHECKTEXT "Zobrazit dialog znovu" IDS_CHECKTEXT "&Zobrazit dialog znovu"
IDS_CLOSETEXT "Konec" IDS_CLOSETEXT "&Konec"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Instalovat ReactOS" IDS_TOPICBUTTON0 "&Instalovat ReactOS"
IDS_TOPICBUTTON1 "Prohlížet toto CD" IDS_TOPICBUTTON1 "&Prohlížet toto CD"
IDS_TOPICBUTTON2 "Konec" IDS_TOPICBUTTON2 "&Konec"
END END
/* Topic titles */ /* Topic titles */

View file

@ -9,16 +9,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Velkommen til ReactOS operativ System.\n\nKlik på et emne til venstre." IDS_DEFAULTTOPICDESC "Velkommen til ReactOS operativ System.\n\nKlik på et emne til venstre."
IDS_CHECKTEXT "Vis denne dialog igen ved opstart" IDS_CHECKTEXT "&Vis denne dialog igen ved opstart"
IDS_CLOSETEXT "Afslut" IDS_CLOSETEXT "&Afslut"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Installer ReactOS" IDS_TOPICBUTTON0 "&Installer ReactOS"
IDS_TOPICBUTTON1 "Gennemse Cdrom" IDS_TOPICBUTTON1 "&Gennemse Cdrom"
IDS_TOPICBUTTON2 "Afslut" IDS_TOPICBUTTON2 "&Afslut"
END END
/* Topic titles */ /* Topic titles */

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Willkommen in ReactOS.\n\nKlicken Sie auf ein Thema auf der linken Seite." IDS_DEFAULTTOPICDESC "Willkommen in ReactOS.\n\nKlicken Sie auf ein Thema auf der linken Seite."
IDS_CHECKTEXT "Dialog beim nächsen Start wieder anzeigen" IDS_CHECKTEXT "&Dialog beim nächsen Start wieder anzeigen"
IDS_CLOSETEXT "Beenden" IDS_CLOSETEXT "&Beenden"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "ReactOS installieren" IDS_TOPICBUTTON0 "&ReactOS installieren"
IDS_TOPICBUTTON1 "CD durchsuchen" IDS_TOPICBUTTON1 "&CD durchsuchen"
IDS_TOPICBUTTON2 "Beenden" IDS_TOPICBUTTON2 "&Beenden"
END END
/* Topic titles */ /* Topic titles */

View file

@ -9,16 +9,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Καλώς ήλθατε στο ReactOS Λειτουργικό Σύστημα.\n\nΕπιλέξτε ένα θέμα από το μενού στα αριστερά." IDS_DEFAULTTOPICDESC "Καλώς ήλθατε στο ReactOS Λειτουργικό Σύστημα.\n\nΕπιλέξτε ένα θέμα από το μενού στα αριστερά."
IDS_CHECKTEXT "Show this dialog again" IDS_CHECKTEXT "&Show this dialog again"
IDS_CLOSETEXT "Exit" IDS_CLOSETEXT "&Έξοδος"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Εγκατάσταση του ReactOS" IDS_TOPICBUTTON0 "Εγκατάσταση του &ReactOS"
IDS_TOPICBUTTON1 "Εξερεύνηση αυτού του CD" IDS_TOPICBUTTON1 "Εξερεύνηση αυτού του &CD"
IDS_TOPICBUTTON2 "Έξοδος" IDS_TOPICBUTTON2 "&Έξοδος"
END END
/* Topic titles */ /* Topic titles */

View file

@ -9,16 +9,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Welcome to ReactOS Operating System.\n\nClick a topic on the left." IDS_DEFAULTTOPICDESC "Welcome to ReactOS Operating System.\n\nClick a topic on the left."
IDS_CHECKTEXT "Show this dialog again" IDS_CHECKTEXT "&Show this dialog again"
IDS_CLOSETEXT "Exit" IDS_CLOSETEXT "&Exit"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Install ReactOS" IDS_TOPICBUTTON0 "&Install ReactOS"
IDS_TOPICBUTTON1 "Browse this CD" IDS_TOPICBUTTON1 "&Browse this CD"
IDS_TOPICBUTTON2 "Exit" IDS_TOPICBUTTON2 "&Exit"
END END
/* Topic titles */ /* Topic titles */

View file

@ -9,16 +9,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Bienvenido al Sistema Operativo ReactOS.\n\nHaz Click en una opción a la izquierda." IDS_DEFAULTTOPICDESC "Bienvenido al Sistema Operativo ReactOS.\n\nHaz Click en una opción a la izquierda."
IDS_CHECKTEXT "Mostrar este dialogo otra vez" IDS_CHECKTEXT "&Mostrar este dialogo otra vez"
IDS_CLOSETEXT "Salir" IDS_CLOSETEXT "&Salir"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Instalar ReactOS" IDS_TOPICBUTTON0 "&Instalar ReactOS"
IDS_TOPICBUTTON1 "Explorar este CD" IDS_TOPICBUTTON1 "&Explorar este CD"
IDS_TOPICBUTTON2 "Salir" IDS_TOPICBUTTON2 "&Salir"
END END
/* Topic titles */ /* Topic titles */

View file

@ -9,16 +9,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Tere tulemast operatsioonisüsteemi ReactOS.\n\nVali teema vasakult." IDS_DEFAULTTOPICDESC "Tere tulemast operatsioonisüsteemi ReactOS.\n\nVali teema vasakult."
IDS_CHECKTEXT "Näita seda dialoogi veel" IDS_CHECKTEXT "&Näita seda dialoogi veel"
IDS_CLOSETEXT "Välju" IDS_CLOSETEXT "&Välju"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Paigalda ReactOS" IDS_TOPICBUTTON0 "&Paigalda ReactOS"
IDS_TOPICBUTTON1 "Sirvi CD sisu" IDS_TOPICBUTTON1 "&Sirvi CD sisu"
IDS_TOPICBUTTON2 "Välju" IDS_TOPICBUTTON2 "&Välju"
END END
/* Topic titles */ /* Topic titles */

View file

@ -9,16 +9,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Bienvenue sur le système d'exploitation ReactOS.\n\nCliquez sur une section à gauche." IDS_DEFAULTTOPICDESC "Bienvenue sur le système d'exploitation ReactOS.\n\nCliquez sur une section à gauche."
IDS_CHECKTEXT "Afficher cette boîte de dialogue de nouveau." IDS_CHECKTEXT "&Afficher cette boîte de dialogue de nouveau."
IDS_CLOSETEXT "Quitter" IDS_CLOSETEXT "&Quitter"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Installer ReactOS" IDS_TOPICBUTTON0 "&Installer ReactOS"
IDS_TOPICBUTTON1 "Naviguer dans ce CD" IDS_TOPICBUTTON1 "&Naviguer dans ce CD"
IDS_TOPICBUTTON2 "Quitter" IDS_TOPICBUTTON2 "&Quitter"
END END
/* Topic titles */ /* Topic titles */

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Üdvözlünk a ReactOS Operációs Rendszerben.\n\n" IDS_DEFAULTTOPICDESC "Üdvözlünk a ReactOS Operációs Rendszerben.\n\n"
IDS_CHECKTEXT "Show this dialog again" IDS_CHECKTEXT "&Show this dialog again"
IDS_CLOSETEXT "Kilépés" IDS_CLOSETEXT "&Kilépés"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "ReactOS telepítése" IDS_TOPICBUTTON0 "&ReactOS telepítése"
IDS_TOPICBUTTON1 "A CD böngészése" IDS_TOPICBUTTON1 "&A CD böngészése"
IDS_TOPICBUTTON2 "Kilépés" IDS_TOPICBUTTON2 "&Kilépés"
END END
/* Topic titles */ /* Topic titles */

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Selamat datang di ReactOS Operating System.\n\nKlik topik di sisi kiri." IDS_DEFAULTTOPICDESC "Selamat datang di ReactOS Operating System.\n\nKlik topik di sisi kiri."
IDS_CHECKTEXT "Show this dialog again" IDS_CHECKTEXT "&Show this dialog again"
IDS_CLOSETEXT "Exit" IDS_CLOSETEXT "&Keluar"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Instalasi ReactOS" IDS_TOPICBUTTON0 "&Instalasi ReactOS"
IDS_TOPICBUTTON1 "Lihat CD ini" IDS_TOPICBUTTON1 "Lihat &CD ini"
IDS_TOPICBUTTON2 "Keluar" IDS_TOPICBUTTON2 "&Keluar"
END END
/* Topic titles */ /* Topic titles */

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Benvenuto nel ReactOS Operating System.\n\nClicca su un argomento a sinistra." IDS_DEFAULTTOPICDESC "Benvenuto nel ReactOS Operating System.\n\nClicca su un argomento a sinistra."
IDS_CHECKTEXT "Mostra ancora questa finestra" IDS_CHECKTEXT "&Mostra ancora questa finestra"
IDS_CLOSETEXT "Esci" IDS_CLOSETEXT "&Esci"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Installa ReactOS" IDS_TOPICBUTTON0 "&Installa ReactOS"
IDS_TOPICBUTTON1 "Esplora il CD" IDS_TOPICBUTTON1 "Esplora il &CD"
IDS_TOPICBUTTON2 "Esci" IDS_TOPICBUTTON2 "&Esci"
END END
/* Topic Titolos */ /* Topic Titolos */

View file

@ -9,8 +9,8 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "ReactOS へようこそ。\n\n左側のトピックをクリックしてください。" IDS_DEFAULTTOPICDESC "ReactOS へようこそ。\n\n左側のトピックをクリックしてください。"
IDS_CHECKTEXT "Show this dialog again" IDS_CHECKTEXT "&Show this dialog again"
IDS_CLOSETEXT "Exit" IDS_CLOSETEXT "終了(&Q)"
END END
/* Topic buttons */ /* Topic buttons */
@ -18,7 +18,7 @@ STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "ReactOS をインストールする" IDS_TOPICBUTTON0 "ReactOS をインストールする"
IDS_TOPICBUTTON1 "この CD を開く" IDS_TOPICBUTTON1 "この CD を開く"
IDS_TOPICBUTTON2 "終了" IDS_TOPICBUTTON2 "終了(&Q)"
END END
/* Topic titles */ /* Topic titles */

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Sveiki, čia ReactOS Operacinė Sistema.\n\nPasirinkite punktą kairėje." IDS_DEFAULTTOPICDESC "Sveiki, čia ReactOS Operacinė Sistema.\n\nPasirinkite punktą kairėje."
IDS_CHECKTEXT "Rodyti šį langą vėl" IDS_CHECKTEXT "&Rodyti šį langą vėl"
IDS_CLOSETEXT "Išeiti" IDS_CLOSETEXT "&Išeiti"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Įdiegti ReactOS" IDS_TOPICBUTTON0 "Įdiegti &ReactOS"
IDS_TOPICBUTTON1 "Peržiūrėti šį CD" IDS_TOPICBUTTON1 "&Peržiūrėti šį CD"
IDS_TOPICBUTTON2 "Išeiti" IDS_TOPICBUTTON2 "&Išeiti"
END END
/* Topic titles */ /* Topic titles */

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Selamat datang ke ReactOS Operating System.\n\nKlik tajuk di sebelah kiri." IDS_DEFAULTTOPICDESC "Selamat datang ke ReactOS Operating System.\n\nKlik tajuk di sebelah kiri."
IDS_CHECKTEXT "Show this dialog again" IDS_CHECKTEXT "&Show this dialog again"
IDS_CLOSETEXT "Exit" IDS_CLOSETEXT "&Keluar"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Pasang ReactOS" IDS_TOPICBUTTON0 "&Pasang ReactOS"
IDS_TOPICBUTTON1 "Layari CD ini" IDS_TOPICBUTTON1 "&Layari CD ini"
IDS_TOPICBUTTON2 "Keluar" IDS_TOPICBUTTON2 "&Keluar"
END END
/* Topic titles */ /* Topic titles */

View file

@ -9,16 +9,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Welkom bij het ReactOS Operation System.\n\nKlik links op een onderwerp." IDS_DEFAULTTOPICDESC "Welkom bij het ReactOS Operation System.\n\nKlik links op een onderwerp."
IDS_CHECKTEXT "Ga terug naar dit scherm" IDS_CHECKTEXT "&Ga terug naar dit scherm"
IDS_CLOSETEXT "Afsluiten" IDS_CLOSETEXT "&Afsluiten"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Installeer ReactOS" IDS_TOPICBUTTON0 "&Installeer ReactOS"
IDS_TOPICBUTTON1 "Deze CD Verkennen" IDS_TOPICBUTTON1 "&Deze CD Verkennen"
IDS_TOPICBUTTON2 "Afsluiten" IDS_TOPICBUTTON2 "&Afsluiten"
END END
/* Topic titles */ /* Topic titles */

View file

@ -9,16 +9,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Velkommen til ReactOS Operativsystem.\n\nTrykk et emne til venstre." IDS_DEFAULTTOPICDESC "Velkommen til ReactOS Operativsystem.\n\nTrykk et emne til venstre."
IDS_CHECKTEXT "Vis denne dialoget igjen" IDS_CHECKTEXT "&Vis denne dialoget igjen"
IDS_CLOSETEXT "Avslutt" IDS_CLOSETEXT "&Avslutt"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Innstaller ReactOS" IDS_TOPICBUTTON0 "&Innstaller ReactOS"
IDS_TOPICBUTTON1 "Utforsk denne CD" IDS_TOPICBUTTON1 "&Utforsk denne CD"
IDS_TOPICBUTTON2 "Avslutt" IDS_TOPICBUTTON2 "&Avslutt"
END END
/* Topic titles */ /* Topic titles */

View file

@ -15,16 +15,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Witaj w systemie operacyjnym ReactOS.\n\nWybierz temat po lewej." IDS_DEFAULTTOPICDESC "Witaj w systemie operacyjnym ReactOS.\n\nWybierz temat po lewej."
IDS_CHECKTEXT "Pokaż ten dialog ponownie" IDS_CHECKTEXT "&Pokaż ten dialog ponownie"
IDS_CLOSETEXT "Wyjście" IDS_CLOSETEXT "&Wyjście"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Zainstaluj ReactOS" IDS_TOPICBUTTON0 "&Zainstaluj ReactOS"
IDS_TOPICBUTTON1 "Przeglądaj CD" IDS_TOPICBUTTON1 "Przeglądaj &CD"
IDS_TOPICBUTTON2 "Wyjście" IDS_TOPICBUTTON2 "&Wyjście"
END END
/* Topic titles */ /* Topic titles */

View file

@ -9,16 +9,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Bem vindo ao Sistema Operacional ReactOS.\n\nClique em um tópico à esquerda." IDS_DEFAULTTOPICDESC "Bem vindo ao Sistema Operacional ReactOS.\n\nClique em um tópico à esquerda."
IDS_CHECKTEXT "Exibir este diálogo novamente" IDS_CHECKTEXT "&Exibir este diálogo novamente"
IDS_CLOSETEXT "Sair" IDS_CLOSETEXT "&Sair"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Instalar ReactOS" IDS_TOPICBUTTON0 "&Instalar ReactOS"
IDS_TOPICBUTTON1 "Examinar este CD" IDS_TOPICBUTTON1 "Examinar este &CD"
IDS_TOPICBUTTON2 "Sair" IDS_TOPICBUTTON2 "&Sair"
END END
/* Topic titles */ /* Topic titles */

View file

@ -16,16 +16,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Bun venit în Sistemul de Operare ReactOS.\n\nAlegeți o opțiune din stânga." IDS_DEFAULTTOPICDESC "Bun venit în Sistemul de Operare ReactOS.\n\nAlegeți o opțiune din stânga."
IDS_CHECKTEXT "Afișează acest dialog și altă dată" IDS_CHECKTEXT "&Afișează acest dialog și altă dată"
IDS_CLOSETEXT "Ieșire" IDS_CLOSETEXT "&Ieșire"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Instalare ReactOS" IDS_TOPICBUTTON0 "Instalare &ReactOS"
IDS_TOPICBUTTON1 "Explorare CD" IDS_TOPICBUTTON1 "&Explorare CD"
IDS_TOPICBUTTON2 "Ieșire" IDS_TOPICBUTTON2 "&Ieșire"
END END
/* Topic titles */ /* Topic titles */

View file

@ -9,16 +9,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Добро пожаловать в ReactOS.\n\nВыберите пункт слева." IDS_DEFAULTTOPICDESC "Добро пожаловать в ReactOS.\n\nВыберите пункт слева."
IDS_CHECKTEXT "Показывать это окно снова" IDS_CHECKTEXT "&Показывать это окно снова"
IDS_CLOSETEXT "Выход" IDS_CLOSETEXT "&Выход"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Установить ReactOS" IDS_TOPICBUTTON0 "&Установить ReactOS"
IDS_TOPICBUTTON1 "Обзор диска" IDS_TOPICBUTTON1 "&Обзор диска"
IDS_TOPICBUTTON2 "Выход" IDS_TOPICBUTTON2 "&Выход"
END END
/* Topic titles */ /* Topic titles */

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Vitajte v operačnom systéme ReactOS.\n\nKliknite na tlačidlo v ľavom stĺpci." IDS_DEFAULTTOPICDESC "Vitajte v operačnom systéme ReactOS.\n\nKliknite na tlačidlo v ľavom stĺpci."
IDS_CHECKTEXT "Zobraziť toto okno aj nabudúce" IDS_CHECKTEXT "&Zobraziť toto okno aj nabudúce"
IDS_CLOSETEXT "Koniec" IDS_CLOSETEXT "&Koniec"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Inštalovať ReactOS" IDS_TOPICBUTTON0 "&Inštalovať ReactOS"
IDS_TOPICBUTTON1 "Prezerať toto CD" IDS_TOPICBUTTON1 "&Prezerať toto CD"
IDS_TOPICBUTTON2 "Koniec" IDS_TOPICBUTTON2 "&Koniec"
END END
/* Topic titles */ /* Topic titles */

View file

@ -13,16 +13,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Mirë se vini në Sistemin Operative ReactOS.\n\nKliko në një topik në të majtë." IDS_DEFAULTTOPICDESC "Mirë se vini në Sistemin Operative ReactOS.\n\nKliko në një topik në të majtë."
IDS_CHECKTEXT "Trego këtë dialog përsëri" IDS_CHECKTEXT "&Trego këtë dialog përsëri"
IDS_CLOSETEXT "Dil" IDS_CLOSETEXT "&Dil"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Instalo ReactOS" IDS_TOPICBUTTON0 "&Instalo ReactOS"
IDS_TOPICBUTTON1 "Shfleto këtë CD" IDS_TOPICBUTTON1 "&Shfleto këtë CD"
IDS_TOPICBUTTON2 "Dil" IDS_TOPICBUTTON2 "&Dil"
END END
/* Topic titles */ /* Topic titles */

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Välkommen till ReactOS Operating System.\n\nKlicka på ett avsnitt till vänster." IDS_DEFAULTTOPICDESC "Välkommen till ReactOS Operating System.\n\nKlicka på ett avsnitt till vänster."
IDS_CHECKTEXT "Show this dialog again" IDS_CHECKTEXT "&Show this dialog again"
IDS_CLOSETEXT "Exit" IDS_CLOSETEXT "&Avsluta"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Installera ReactOS" IDS_TOPICBUTTON0 "&Installera ReactOS"
IDS_TOPICBUTTON1 "Utforska skivan" IDS_TOPICBUTTON1 "&Utforska skivan"
IDS_TOPICBUTTON2 "Avsluta" IDS_TOPICBUTTON2 "&Avsluta"
END END
/* Topic titles */ /* Topic titles */

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "ReactOS İşletim Dizgesi'ne hoş geldiniz.\n\nSolda bir konuya tıklayınız." IDS_DEFAULTTOPICDESC "ReactOS İşletim Dizgesi'ne hoş geldiniz.\n\nSolda bir konuya tıklayınız."
IDS_CHECKTEXT "Bu iletiyi yine göster." IDS_CHECKTEXT "&Bu iletiyi yine göster."
IDS_CLOSETEXT "Çıkış" IDS_CLOSETEXT "&Çıkış"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "ReactOS'u Kur" IDS_TOPICBUTTON0 "&ReactOS'u Kur"
IDS_TOPICBUTTON1 "Bu CD'yi Araştır" IDS_TOPICBUTTON1 "Bu &CD'yi Araştır"
IDS_TOPICBUTTON2 "Çıkış" IDS_TOPICBUTTON2 "&Çıkış"
END END
/* Topic titles */ /* Topic titles */

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "Ласкаво просимо до операційної системи ReactOS.\n\nКлацніть по темі ліворуч" IDS_DEFAULTTOPICDESC "Ласкаво просимо до операційної системи ReactOS.\n\nКлацніть по темі ліворуч"
IDS_CHECKTEXT "Показувати цей діалог знов" IDS_CHECKTEXT "&Показувати цей діалог знов"
IDS_CLOSETEXT "Вихід" IDS_CLOSETEXT "&Вихід"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "Встановлення ReactOS" IDS_TOPICBUTTON0 "Встановлення &ReactOS"
IDS_TOPICBUTTON1 "Огляд цього CD" IDS_TOPICBUTTON1 "&Огляд цього CD"
IDS_TOPICBUTTON2 "Вихід" IDS_TOPICBUTTON2 "&Вихід"
END END
/* Topic titles */ /* Topic titles */

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "欢迎使用 ReactOS 操作系统。\n\n 请点击左边的主题。" IDS_DEFAULTTOPICDESC "欢迎使用 ReactOS 操作系统。\n\n 请点击左边的主题。"
IDS_CHECKTEXT "Show this dialog again" IDS_CHECKTEXT "&Show this dialog again"
IDS_CLOSETEXT "Exit" IDS_CLOSETEXT "退出(&Q)"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "安装 ReactOS" IDS_TOPICBUTTON0 "安装 &ReactOS"
IDS_TOPICBUTTON1 "浏览 CD" IDS_TOPICBUTTON1 "浏览 &CD"
IDS_TOPICBUTTON2 "退出 " IDS_TOPICBUTTON2 "退出(&Q)"
END END
/* Topic titles */ /* Topic titles */

View file

@ -11,16 +11,16 @@ BEGIN
IDS_DEFAULTTOPICTITLE "ReactOS" IDS_DEFAULTTOPICTITLE "ReactOS"
IDS_DEFAULTTOPICDESC "歡迎使用 ReactOS 作業系統。\n\n 請點選左邊的主題。" IDS_DEFAULTTOPICDESC "歡迎使用 ReactOS 作業系統。\n\n 請點選左邊的主題。"
IDS_CHECKTEXT "Show this dialog again" IDS_CHECKTEXT "&Show this dialog again"
IDS_CLOSETEXT "Exit" IDS_CLOSETEXT "退出(&Q)"
END END
/* Topic buttons */ /* Topic buttons */
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_TOPICBUTTON0 "安裝 ReactOS" IDS_TOPICBUTTON0 "安裝 &ReactOS"
IDS_TOPICBUTTON1 "瀏覽 CD" IDS_TOPICBUTTON1 "瀏覽 &CD"
IDS_TOPICBUTTON2 "退出 " IDS_TOPICBUTTON2 "退出(&Q)"
END END
/* Topic titles */ /* Topic titles */

View file

@ -1,5 +1,10 @@
#pragma once #pragma once
/* Internal button window IDs, below TOPIC_BTN_ID_BASE == 100 */
#define IDC_CHECKBUTTON 98
#define IDC_CLOSEBUTTON 99
/* Strings */
#define IDS_APPTITLE 1000 #define IDS_APPTITLE 1000
#define IDS_DEFAULTTOPICTITLE 1001 #define IDS_DEFAULTTOPICTITLE 1001
#define IDS_DEFAULTTOPICDESC 1002 #define IDS_DEFAULTTOPICDESC 1002
@ -35,7 +40,5 @@
// #define IDB_TOPICBITMAP1 111 // #define IDB_TOPICBITMAP1 111
// #define IDB_TOPICBITMAP2 112 // #define IDB_TOPICBITMAP2 112
#define IDC_CLOSEBUTTON 2000 /* Icons */
#define IDC_CHECKBUTTON 2001
#define IDI_MAIN 3000 #define IDI_MAIN 3000

View file

@ -52,24 +52,15 @@
/* GLOBALS ******************************************************************/ /* GLOBALS ******************************************************************/
TCHAR szFrameClass[] = TEXT("WelcomeWindowClass"); TCHAR szWindowClass[] = TEXT("WelcomeWindowClass");
TCHAR szAppTitle[80]; TCHAR szAppTitle[80];
HINSTANCE hInstance; HINSTANCE hInstance;
HWND hWndMain = NULL; HWND hWndMain = NULL;
HWND hWndDefaultTopic = NULL;
HDC hdcMem = NULL;
ULONG ulInnerWidth = TITLE_WIDTH;
ULONG ulInnerHeight = (TITLE_WIDTH * 3) / 4;
ULONG ulTitleHeight = TITLE_HEIGHT + 3;
HBITMAP hTitleBitmap = NULL;
HBITMAP hDefaultTopicBitmap = NULL;
HWND hWndCloseButton = NULL;
HWND hWndCheckButton = NULL; HWND hWndCheckButton = NULL;
HWND hWndCloseButton = NULL;
BOOL bDisplayCheckBox = FALSE; // FIXME: We should also repaint the OS version correctly! BOOL bDisplayCheckBox = FALSE; // FIXME: We should also repaint the OS version correctly!
BOOL bDisplayExitBtn = TRUE; BOOL bDisplayExitBtn = TRUE;
@ -92,12 +83,20 @@ typedef struct _TOPIC
DWORD dwNumberTopics = 0; DWORD dwNumberTopics = 0;
PTOPIC* pTopics = NULL; PTOPIC* pTopics = NULL;
WNDPROC fnOldBtn;
TCHAR szDefaultTitle[TOPIC_TITLE_LENGTH]; TCHAR szDefaultTitle[TOPIC_TITLE_LENGTH];
TCHAR szDefaultDesc[TOPIC_DESC_LENGTH]; TCHAR szDefaultDesc[TOPIC_DESC_LENGTH];
#define TOPIC_BTN_ID_BASE 100
INT nTopic = -1; // Active (focused) topic INT nTopic = -1; // Active (focused) topic
INT nDefaultTopic = -1; // Default selected topic INT nDefaultTopic = -1; // Default selected topic
HDC hdcMem = NULL;
HBITMAP hTitleBitmap = NULL;
HBITMAP hDefaultTopicBitmap = NULL;
HFONT hFontTopicButton; HFONT hFontTopicButton;
HFONT hFontTopicTitle; HFONT hFontTopicTitle;
HFONT hFontTopicDescription; HFONT hFontTopicDescription;
@ -105,14 +104,11 @@ HFONT hFontCheckButton;
HBRUSH hbrLightBlue; HBRUSH hbrLightBlue;
HBRUSH hbrDarkBlue; HBRUSH hbrDarkBlue;
HBRUSH hbrRightPanel;
RECT rcTitlePanel; RECT rcTitlePanel;
RECT rcLeftPanel; RECT rcLeftPanel;
RECT rcRightPanel; RECT rcRightPanel;
WNDPROC fnOldBtn;
INT_PTR CALLBACK INT_PTR CALLBACK
MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
@ -122,35 +118,35 @@ MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT GetLocaleName(IN LCID Locale, OUT LPTSTR lpLCData, IN SIZE_T cchData) INT GetLocaleName(IN LCID Locale, OUT LPTSTR lpLCData, IN SIZE_T cchData)
{ {
INT ret, ret2; INT cchRet, cchRet2;
/* Try to retrieve the locale language name (LOCALE_SNAME is supported on Vista+) */ /* Try to retrieve the locale language name (LOCALE_SNAME is supported on Vista+) */
ret = GetLocaleInfo(Locale, LOCALE_SNAME, lpLCData, cchData); cchRet = GetLocaleInfo(Locale, LOCALE_SNAME, lpLCData, cchData);
if (ret || (GetLastError() != ERROR_INVALID_FLAGS)) if (cchRet || (GetLastError() != ERROR_INVALID_FLAGS))
return ret; return cchRet;
/* /*
* We failed because LOCALE_SNAME was unrecognized, so try to manually build * We failed because LOCALE_SNAME was unrecognized, so try to manually build
* a language name in the form xx-YY (WARNING: this method has its limitations). * a language name in the form xx-YY (WARNING: this method has its limitations).
*/ */
ret = GetLocaleInfo(Locale, LOCALE_SISO639LANGNAME, lpLCData, cchData); cchRet = GetLocaleInfo(Locale, LOCALE_SISO639LANGNAME, lpLCData, cchData);
if (ret <= 1) if (cchRet <= 1)
return ret; return cchRet;
lpLCData += (ret - 1); lpLCData += (cchRet - 1);
cchData -= (ret - 1); cchData -= (cchRet - 1);
if (cchData <= 1) if (cchData <= 1)
return ret; return cchRet;
/* Try to get the second part; we add the '-' separator only if we succeed */ /* Try to get the second part; we add the '-' separator only if we succeed */
ret2 = GetLocaleInfo(Locale, LOCALE_SISO3166CTRYNAME, lpLCData + 1, cchData - 1); cchRet2 = GetLocaleInfo(Locale, LOCALE_SISO3166CTRYNAME, lpLCData + 1, cchData - 1);
if (ret2 <= 1) if (cchRet2 <= 1)
return ret; return cchRet;
ret += ret2; // 'ret' already counts '-'. cchRet += cchRet2; // 'cchRet' already counts '-'.
*lpLCData = _T('-'); *lpLCData = _T('-');
return ret; return cchRet;
} }
VOID TranslateEscapes(IN OUT LPTSTR lpString) VOID TranslateEscapes(IN OUT LPTSTR lpString)
@ -175,6 +171,7 @@ VOID TranslateEscapes(IN OUT LPTSTR lpString)
// lpString = pEscape + 1; // Loop will stop at the next iteration. // lpString = pEscape + 1; // Loop will stop at the next iteration.
break; break;
/* New-line and carriage return */
case _T('n'): case _T('r'): case _T('n'): case _T('r'):
// case _T('\\'): // others? // case _T('\\'): // others?
// So far we only need to deal with the newlines. // So far we only need to deal with the newlines.
@ -188,6 +185,15 @@ VOID TranslateEscapes(IN OUT LPTSTR lpString)
break; break;
} }
/* \xhhhh hexadecimal character specification */
case _T('x'):
{
LPTSTR lpStringNew;
*pEscape = (WCHAR)_tcstoul(lpString + 1, &lpStringNew, 16);
memmove(lpString, lpStringNew, (_tcslen(lpStringNew) + 1) * sizeof(TCHAR));
break;
}
/* Unknown escape sequence, ignore it */ /* Unknown escape sequence, ignore it */
default: default:
lpString++; lpString++;
@ -477,8 +483,10 @@ _tWinMain(HINSTANCE hInst,
LPTSTR lpszCmdLine, LPTSTR lpszCmdLine,
int nCmdShow) int nCmdShow)
{ {
HANDLE hMutex = NULL;
WNDCLASSEX wndclass; WNDCLASSEX wndclass;
MSG msg; MSG msg;
HWND hWndFocus;
INT xPos, yPos; INT xPos, yPos;
INT xWidth, yHeight; INT xWidth, yHeight;
RECT rcWindow; RECT rcWindow;
@ -486,7 +494,11 @@ _tWinMain(HINSTANCE hInst,
HMENU hSystemMenu; HMENU hSystemMenu;
DWORD dwStyle = WS_OVERLAPPED | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | DWORD dwStyle = WS_OVERLAPPED | WS_CLIPCHILDREN | WS_CLIPSIBLINGS |
WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
BITMAP BitmapInfo; BITMAP BitmapInfo;
ULONG ulInnerWidth = TITLE_WIDTH;
ULONG ulInnerHeight = (TITLE_WIDTH * 3) / 4;
ULONG ulTitleHeight = TITLE_HEIGHT + 3;
UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpszCmdLine); UNREFERENCED_PARAMETER(lpszCmdLine);
@ -503,6 +515,22 @@ _tWinMain(HINSTANCE hInst,
hInstance = hInst; hInstance = hInst;
/* Ensure only one instance is running */
hMutex = CreateMutexW(NULL, FALSE, szWindowClass);
if (hMutex && (GetLastError() == ERROR_ALREADY_EXISTS))
{
/* If already started, find its window */
hWndMain = FindWindowW(szWindowClass, NULL);
/* Activate window */
ShowWindow(hWndMain, SW_SHOWNORMAL);
SetForegroundWindow(hWndMain);
/* Close the mutex handle and quit */
CloseHandle(hMutex);
return 0;
}
/* Load icons */ /* Load icons */
hMainIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN)); hMainIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
@ -518,12 +546,13 @@ _tWinMain(HINSTANCE hInst,
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = NULL; wndclass.hbrBackground = NULL;
wndclass.lpszMenuName = NULL; wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szFrameClass; wndclass.lpszClassName = szWindowClass;
RegisterClassEx(&wndclass); RegisterClassEx(&wndclass);
/* Load the banner bitmap, and compute the window dimensions */
hTitleBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_TITLEBITMAP)); hTitleBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_TITLEBITMAP));
if (hTitleBitmap != NULL) if (hTitleBitmap)
{ {
GetObject(hTitleBitmap, sizeof(BITMAP), &BitmapInfo); GetObject(hTitleBitmap, sizeof(BITMAP), &BitmapInfo);
ulInnerWidth = BitmapInfo.bmWidth; ulInnerWidth = BitmapInfo.bmWidth;
@ -542,6 +571,7 @@ _tWinMain(HINSTANCE hInst,
xWidth = rcWindow.right - rcWindow.left; xWidth = rcWindow.right - rcWindow.left;
yHeight = rcWindow.bottom - rcWindow.top; yHeight = rcWindow.bottom - rcWindow.top;
/* Compute the window position */
xPos = (GetSystemMetrics(SM_CXSCREEN) - xWidth) / 2; xPos = (GetSystemMetrics(SM_CXSCREEN) - xWidth) / 2;
yPos = (GetSystemMetrics(SM_CYSCREEN) - yHeight) / 2; yPos = (GetSystemMetrics(SM_CYSCREEN) - yHeight) / 2;
@ -564,7 +594,7 @@ _tWinMain(HINSTANCE hInst,
LoadConfiguration(); LoadConfiguration();
/* Create main window */ /* Create main window */
hWndMain = CreateWindow(szFrameClass, hWndMain = CreateWindow(szWindowClass,
szAppTitle, szAppTitle,
dwStyle, dwStyle,
xPos, xPos,
@ -587,14 +617,35 @@ _tWinMain(HINSTANCE hInst,
UpdateWindow(hWndMain); UpdateWindow(hWndMain);
while (GetMessage(&msg, NULL, 0, 0) != FALSE) while (GetMessage(&msg, NULL, 0, 0) != FALSE)
{
/* Check for ENTER key presses */
if (msg.message == WM_KEYDOWN && msg.wParam == VK_RETURN)
{
/*
* The user pressed the ENTER key. Retrieve the handle to the
* child window that has the keyboard focus, and send it a
* WM_COMMAND message.
*/
hWndFocus = GetFocus();
if (hWndFocus)
{
SendMessage(hWndMain, WM_COMMAND,
(WPARAM)GetDlgCtrlID(hWndFocus), (LPARAM)hWndFocus);
}
}
/* Allow using keyboard navigation */
else if (!IsDialogMessage(hWndMain, &msg))
{ {
TranslateMessage(&msg); TranslateMessage(&msg);
DispatchMessage(&msg); DispatchMessage(&msg);
} }
}
/* Cleanup */ /* Cleanup */
FreeResources(); FreeResources();
/* Close the mutex handle and quit */
CloseHandle(hMutex);
return msg.wParam; return msg.wParam;
} }
@ -602,15 +653,53 @@ _tWinMain(HINSTANCE hInst,
INT_PTR CALLBACK INT_PTR CALLBACK
ButtonSubclassWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ButtonSubclassWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ {
static WPARAM wParamOld = 0;
static LPARAM lParamOld = 0;
LONG i; LONG i;
if (uMsg == WM_MOUSEMOVE) if (uMsg == WM_MOUSEMOVE)
{ {
i = GetWindowLongPtr(hWnd, GWL_ID); /* Ignore mouse-move messages on the same point */
if ((wParam == wParamOld) && (lParam == lParamOld))
return 0;
/* Retrieve the topic index of this button */
i = GetWindowLongPtr(hWnd, GWLP_ID) - TOPIC_BTN_ID_BASE;
/*
* Change the focus to this button if the current topic index differs
* (we will receive WM_SETFOCUS afterwards).
*/
if (nTopic != i)
SetFocus(hWnd);
wParamOld = wParam;
lParamOld = lParam;
}
else if (uMsg == WM_SETFOCUS)
{
/* Retrieve the topic index of this button */
i = GetWindowLongPtr(hWnd, GWLP_ID) - TOPIC_BTN_ID_BASE;
/* Change the current topic index and repaint the description panel */
if (nTopic != i) if (nTopic != i)
{ {
nTopic = i; nTopic = i;
SetFocus(hWnd); InvalidateRect(hWndMain, &rcRightPanel, TRUE);
}
}
else if (uMsg == WM_KILLFOCUS)
{
/*
* We lost focus, either because the user changed button focus,
* or because the main window to which we belong went inactivated.
* If we are in the latter case, we ignore the focus change.
* If we are in the former case, we reset to the default topic.
*/
if (GetParent(hWnd) == GetForegroundWindow())
{
nTopic = -1;
InvalidateRect(hWndMain, &rcRightPanel, TRUE); InvalidateRect(hWndMain, &rcRightPanel, TRUE);
} }
} }
@ -663,13 +752,6 @@ RunAction(INT nTopic)
} }
static VOID
SubclassButton(HWND hWnd)
{
fnOldBtn = (WNDPROC)SetWindowLongPtr(hWnd, GWL_WNDPROC, (DWORD_PTR)ButtonSubclassWndProc);
}
static DWORD static DWORD
GetButtonHeight(HDC hDC, GetButtonHeight(HDC hDC,
HFONT hFont, HFONT hFont,
@ -707,7 +789,6 @@ OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
hbrLightBlue = CreateSolidBrush(LIGHT_BLUE); hbrLightBlue = CreateSolidBrush(LIGHT_BLUE);
hbrDarkBlue = CreateSolidBrush(DARK_BLUE); hbrDarkBlue = CreateSolidBrush(DARK_BLUE);
hbrRightPanel = CreateSolidBrush(RGB(255, 255, 255));
/* Topic title font */ /* Topic title font */
hFontTopicTitle = CreateFont(-18, 0, 0, 0, FW_NORMAL, hFontTopicTitle = CreateFont(-18, 0, 0, 0, FW_NORMAL,
@ -717,7 +798,7 @@ OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
CLIP_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_QUALITY,
FF_DONTCARE, FF_DONTCARE,
TEXT("Arial")); TEXT("Tahoma"));
/* Topic description font */ /* Topic description font */
hFontTopicDescription = CreateFont(-11, 0, 0, 0, FW_THIN, hFontTopicDescription = CreateFont(-11, 0, 0, 0, FW_THIN,
@ -727,7 +808,7 @@ OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
CLIP_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_QUALITY,
FF_DONTCARE, FF_DONTCARE,
TEXT("Arial")); TEXT("Tahoma"));
/* Topic button font */ /* Topic button font */
hFontTopicButton = CreateFont(-11, 0, 0, 0, FW_BOLD, hFontTopicButton = CreateFont(-11, 0, 0, 0, FW_BOLD,
@ -737,10 +818,10 @@ OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
CLIP_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_QUALITY,
FF_DONTCARE, FF_DONTCARE,
TEXT("Arial")); TEXT("Tahoma"));
/* Load title bitmap */ /* Load title bitmap */
if (hTitleBitmap != NULL) if (hTitleBitmap)
hTitleBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_TITLEBITMAP)); hTitleBitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_TITLEBITMAP));
/* Load topic bitmaps */ /* Load topic bitmaps */
@ -756,7 +837,7 @@ OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
hdcMem = CreateCompatibleDC(ScreenDC); hdcMem = CreateCompatibleDC(ScreenDC);
ReleaseDC(hWnd, ScreenDC); ReleaseDC(hWnd, ScreenDC);
/* Load and create buttons */ /* Load and create the menu buttons */
dwTop = rcLeftPanel.top; dwTop = rcLeftPanel.top;
for (i = 0; i < dwNumberTopics; i++) for (i = 0; i < dwNumberTopics; i++)
{ {
@ -775,13 +856,12 @@ OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
rcLeftPanel.right - rcLeftPanel.left, rcLeftPanel.right - rcLeftPanel.left,
dwHeight, dwHeight,
hWnd, hWnd,
(HMENU)IntToPtr(i), (HMENU)IntToPtr(TOPIC_BTN_ID_BASE + i), // Similar to SetWindowLongPtr(GWLP_ID)
hInstance, hInstance,
NULL); NULL);
hWndDefaultTopic = pTopics[i]->hWndButton;
nDefaultTopic = i; nDefaultTopic = i;
SubclassButton(pTopics[i]->hWndButton);
SendMessage(pTopics[i]->hWndButton, WM_SETFONT, (WPARAM)hFontTopicButton, MAKELPARAM(TRUE, 0)); SendMessage(pTopics[i]->hWndButton, WM_SETFONT, (WPARAM)hFontTopicButton, MAKELPARAM(TRUE, 0));
fnOldBtn = (WNDPROC)SetWindowLongPtr(pTopics[i]->hWndButton, GWLP_WNDPROC, (DWORD_PTR)ButtonSubclassWndProc);
} }
else else
{ {
@ -791,34 +871,7 @@ OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
dwTop += dwHeight; dwTop += dwHeight;
} }
/* Create "Exit" button */ /* Create the checkbox */
if (bDisplayExitBtn)
{
nLength = LoadString(hInstance, IDS_CLOSETEXT, szText, ARRAYSIZE(szText));
if (nLength > 0)
{
hWndCloseButton = CreateWindow(TEXT("BUTTON"),
szText,
WS_VISIBLE | WS_CHILD | BS_FLAT,
rcRightPanel.right - 10 - 57,
rcRightPanel.bottom - 10 - 21,
57,
21,
hWnd,
(HMENU)IDC_CLOSEBUTTON,
hInstance,
NULL);
hWndDefaultTopic = NULL;
nDefaultTopic = -1;
SendMessage(hWndCloseButton, WM_SETFONT, (WPARAM)hFontTopicButton, MAKELPARAM(TRUE, 0));
}
else
{
hWndCloseButton = NULL;
}
}
/* Create checkbox */
if (bDisplayCheckBox) if (bDisplayCheckBox)
{ {
nLength = LoadString(hInstance, IDS_CHECKTEXT, szText, ARRAYSIZE(szText)); nLength = LoadString(hInstance, IDS_CHECKTEXT, szText, ARRAYSIZE(szText));
@ -835,7 +888,7 @@ OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
hWndCheckButton = CreateWindow(TEXT("BUTTON"), hWndCheckButton = CreateWindow(TEXT("BUTTON"),
szText, szText,
WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX /**/| BS_FLAT/**/, WS_CHILDWINDOW | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX | BS_MULTILINE /**/| BS_FLAT/**/,
rcLeftPanel.left + 8, rcLeftPanel.left + 8,
rcLeftPanel.bottom - 8 - 13, rcLeftPanel.bottom - 8 - 13,
rcLeftPanel.right - rcLeftPanel.left - 16, rcLeftPanel.right - rcLeftPanel.left - 16,
@ -853,6 +906,32 @@ OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
} }
} }
/* Create the "Exit" button */
if (bDisplayExitBtn)
{
nLength = LoadString(hInstance, IDS_CLOSETEXT, szText, ARRAYSIZE(szText));
if (nLength > 0)
{
hWndCloseButton = CreateWindow(TEXT("BUTTON"),
szText,
WS_CHILDWINDOW | WS_VISIBLE | WS_TABSTOP | BS_FLAT,
rcRightPanel.right - 10 - 57,
rcRightPanel.bottom - 10 - 21,
57,
21,
hWnd,
(HMENU)IDC_CLOSEBUTTON,
hInstance,
NULL);
nDefaultTopic = -1;
SendMessage(hWndCloseButton, WM_SETFONT, (WPARAM)hFontTopicButton, MAKELPARAM(TRUE, 0));
}
else
{
hWndCloseButton = NULL;
}
}
return 0; return 0;
} }
@ -866,9 +945,9 @@ OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{ {
DestroyWindow(hWnd); DestroyWindow(hWnd);
} }
else if ((LOWORD(wParam) < dwNumberTopics)) else if ((LOWORD(wParam) - TOPIC_BTN_ID_BASE < dwNumberTopics))
{ {
if (RunAction(LOWORD(wParam)) == FALSE) if (RunAction(LOWORD(wParam) - TOPIC_BTN_ID_BASE) == FALSE)
DestroyWindow(hWnd); // Corresponds to a <exit> action. DestroyWindow(hWnd); // Corresponds to a <exit> action.
} }
@ -900,7 +979,6 @@ PaintBanner(HDC hdc, LPRECT rcPanel)
rcPanel->right - rcPanel->left, rcPanel->right - rcPanel->left,
3, 3,
PATCOPY); PATCOPY);
SelectObject(hdc, hOldBrush); SelectObject(hdc, hOldBrush);
} }
@ -939,7 +1017,7 @@ OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
SelectObject(hdc, hOldBrush); SelectObject(hdc, hOldBrush);
/* Right panel */ /* Right panel */
hOldBrush = (HBRUSH)SelectObject(hdc, WHITE_BRUSH); hOldBrush = (HBRUSH)SelectObject(hdc, GetStockObject(WHITE_BRUSH));
PatBlt(hdc, PatBlt(hdc,
rcRightPanel.left, rcRightPanel.left,
rcRightPanel.top, rcRightPanel.top,
@ -957,7 +1035,7 @@ OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
DeleteObject(hPen); DeleteObject(hPen);
/* Draw topic bitmap */ /* Draw topic bitmap */
if ((nTopic == -1) && (hDefaultTopicBitmap != NULL)) if ((nTopic == -1) && (hDefaultTopicBitmap))
{ {
GetObject(hDefaultTopicBitmap, sizeof(BITMAP), &bmpInfo); GetObject(hDefaultTopicBitmap, sizeof(BITMAP), &bmpInfo);
hOldBitmap = (HBITMAP)SelectObject(hdcMem, hDefaultTopicBitmap); hOldBitmap = (HBITMAP)SelectObject(hdcMem, hDefaultTopicBitmap);
@ -971,7 +1049,7 @@ OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
0, 0,
SRCCOPY); SRCCOPY);
} }
else if ((nTopic != -1) && (pTopics[nTopic]->hBitmap != NULL)) else if ((nTopic != -1) && (pTopics[nTopic]->hBitmap))
{ {
GetObject(pTopics[nTopic]->hBitmap, sizeof(BITMAP), &bmpInfo); GetObject(pTopics[nTopic]->hBitmap, sizeof(BITMAP), &bmpInfo);
hOldBitmap = (HBITMAP)SelectObject(hdcMem, pTopics[nTopic]->hBitmap); hOldBitmap = (HBITMAP)SelectObject(hdcMem, pTopics[nTopic]->hBitmap);
@ -1032,7 +1110,7 @@ OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
rcDescription.bottom = rcRightPanel.bottom - 20; rcDescription.bottom = rcRightPanel.bottom - 20;
SelectObject(hdc, hFontTopicDescription); SelectObject(hdc, hFontTopicDescription);
SetTextColor(hdc, RGB(0, 0, 0)); SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
DrawText(hdc, lpDesc, -1, &rcDescription, DT_TOP | DT_WORDBREAK); DrawText(hdc, lpDesc, -1, &rcDescription, DT_TOP | DT_WORDBREAK);
SetBkMode(hdc, OPAQUE); SetBkMode(hdc, OPAQUE);
@ -1059,17 +1137,22 @@ OnDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
UNREFERENCED_PARAMETER(hWnd); UNREFERENCED_PARAMETER(hWnd);
UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(wParam);
#if 0
/* Neither the checkbox button nor the close button implement owner-drawing */
if (lpDis->hwndItem == hWndCheckButton)
return 0;
if (lpDis->hwndItem == hWndCloseButton) if (lpDis->hwndItem == hWndCloseButton)
{ {
DrawFrameControl(lpDis->hDC, DrawFrameControl(lpDis->hDC,
&lpDis->rcItem, &lpDis->rcItem,
DFC_BUTTON, DFC_BUTTON,
DFCS_BUTTONPUSH | DFCS_FLAT); DFCS_BUTTONPUSH | DFCS_FLAT);
return TRUE;
} }
else #endif
{
if (lpDis->CtlID == (ULONG)nTopic) if (lpDis->CtlID == (ULONG)(TOPIC_BTN_ID_BASE + nTopic))
hOldBrush = (HBRUSH)SelectObject(lpDis->hDC, hbrRightPanel); hOldBrush = (HBRUSH)SelectObject(lpDis->hDC, GetStockObject(WHITE_BRUSH));
else else
hOldBrush = (HBRUSH)SelectObject(lpDis->hDC, hbrLightBlue); hOldBrush = (HBRUSH)SelectObject(lpDis->hDC, hbrLightBlue);
@ -1091,29 +1174,52 @@ OnDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam)
InflateRect(&lpDis->rcItem, -10, -4); InflateRect(&lpDis->rcItem, -10, -4);
OffsetRect(&lpDis->rcItem, 0, 1); OffsetRect(&lpDis->rcItem, 0, 1);
GetWindowText(lpDis->hwndItem, szText, ARRAYSIZE(szText)); GetWindowText(lpDis->hwndItem, szText, ARRAYSIZE(szText));
SetTextColor(lpDis->hDC, RGB(0, 0, 0)); SetTextColor(lpDis->hDC, GetSysColor(COLOR_WINDOWTEXT));
iBkMode = SetBkMode(lpDis->hDC, TRANSPARENT); iBkMode = SetBkMode(lpDis->hDC, TRANSPARENT);
DrawText(lpDis->hDC, szText, -1, &lpDis->rcItem, DT_TOP | DT_LEFT | DT_WORDBREAK); DrawText(lpDis->hDC, szText, -1, &lpDis->rcItem, DT_TOP | DT_LEFT | DT_WORDBREAK);
SetBkMode(lpDis->hDC, iBkMode); SetBkMode(lpDis->hDC, iBkMode);
}
return 0; return TRUE;
} }
static LRESULT static LRESULT
OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam) OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
{ {
UNREFERENCED_PARAMETER(wParam); static WPARAM wParamOld = 0;
UNREFERENCED_PARAMETER(lParam); static LPARAM lParamOld = 0;
/* Ignore mouse-move messages on the same point */
if ((wParam == wParamOld) && (lParam == lParamOld))
return 0;
/*
* If the user moves the mouse over the main window, outside of the
* topic buttons, reset the current topic to the default one and
* change the focus to some other default button (to keep keyboard
* navigation possible).
*/
if (nTopic != -1) if (nTopic != -1)
{ {
INT nOldTopic = nTopic;
nTopic = -1; nTopic = -1;
SetFocus(hWnd); /* Also repaint the buttons, otherwise nothing repaints... */
InvalidateRect(pTopics[nOldTopic]->hWndButton, NULL, TRUE);
/* Set the focus to some other default button */
if (hWndCheckButton)
SetFocus(hWndCheckButton);
else if (hWndCloseButton)
SetFocus(hWndCloseButton);
// SetFocus(hWnd);
/* Repaint the description panel */
InvalidateRect(hWndMain, &rcRightPanel, TRUE); InvalidateRect(hWndMain, &rcRightPanel, TRUE);
} }
wParamOld = wParam;
lParamOld = lParam;
return 0; return 0;
} }
@ -1125,7 +1231,7 @@ OnCtlColorStatic(HWND hWnd, WPARAM wParam, LPARAM lParam)
if ((HWND)lParam == hWndCheckButton) if ((HWND)lParam == hWndCheckButton)
{ {
SetBkColor((HDC)wParam, LIGHT_BLUE); SetBkMode((HDC)wParam, TRANSPARENT);
return (LRESULT)hbrLightBlue; return (LRESULT)hbrLightBlue;
} }
@ -1137,11 +1243,24 @@ static LRESULT
OnActivate(HWND hWnd, WPARAM wParam, LPARAM lParam) OnActivate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{ {
UNREFERENCED_PARAMETER(hWnd); UNREFERENCED_PARAMETER(hWnd);
UNREFERENCED_PARAMETER(wParam);
UNREFERENCED_PARAMETER(lParam); UNREFERENCED_PARAMETER(lParam);
nTopic = -1; if (wParam != WA_INACTIVE)
InvalidateRect(hWndMain, &rcRightPanel, TRUE); {
/*
* The main window is re-activated, set the focus back to
* either the current topic or a default button.
*/
if (nTopic != -1)
SetFocus(pTopics[nTopic]->hWndButton);
else if (hWndCheckButton)
SetFocus(hWndCheckButton);
else if (hWndCloseButton)
SetFocus(hWndCloseButton);
// InvalidateRect(hWndMain, &rcRightPanel, TRUE);
}
return 0; return 0;
} }
@ -1157,14 +1276,14 @@ OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
for (i = 0; i < dwNumberTopics; i++) for (i = 0; i < dwNumberTopics; i++)
{ {
if (pTopics[i]->hWndButton != NULL) if (pTopics[i]->hWndButton)
DestroyWindow(pTopics[i]->hWndButton); DestroyWindow(pTopics[i]->hWndButton);
} }
if (hWndCloseButton != NULL) if (hWndCloseButton)
DestroyWindow(hWndCloseButton); DestroyWindow(hWndCloseButton);
if (hWndCheckButton != NULL) if (hWndCheckButton)
DestroyWindow(hWndCheckButton); DestroyWindow(hWndCheckButton);
DeleteDC(hdcMem); DeleteDC(hdcMem);
@ -1174,7 +1293,7 @@ OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
DeleteObject(hTitleBitmap); DeleteObject(hTitleBitmap);
for (i = 0; i < dwNumberTopics; i++) for (i = 0; i < dwNumberTopics; i++)
{ {
if (pTopics[i]->hBitmap != NULL) if (pTopics[i]->hBitmap)
DeleteObject(pTopics[i]->hBitmap); DeleteObject(pTopics[i]->hBitmap);
} }
@ -1182,12 +1301,11 @@ OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
DeleteObject(hFontTopicDescription); DeleteObject(hFontTopicDescription);
DeleteObject(hFontTopicButton); DeleteObject(hFontTopicButton);
if (hFontCheckButton != NULL) if (hFontCheckButton)
DeleteObject(hFontCheckButton); DeleteObject(hFontCheckButton);
DeleteObject(hbrLightBlue); DeleteObject(hbrLightBlue);
DeleteObject(hbrDarkBlue); DeleteObject(hbrDarkBlue);
DeleteObject(hbrRightPanel);
return 0; return 0;
} }