/**************/ /* kieli.c */ /**************************************************************************** ** PROGRAM: kieli.c ** PURPOSE: Erikielisten menujen käyttäminen ja lipun piiräminen ** pääikkunan alalaitaan. ** ** Projektiin lisää ** kieli.c ** ALI/tausta.c - bittikarttojen piirto ** ALI/tabhand.c - jos käytetään viestitaulukon käsittelyä ** ** Käyttäjän täytyy tehdä resurssitiedostoon ** haluamansa kokoiset liput bittikarttoina nimille ** KIELI_? , missä ? on juokseva numero 1:stä eteenpäin ** Vastaavasti tehdään menut samoille nimille ** ja mikäli menuun halutaan lipunkuva, pitää ** kielet numeroida menun johonkin kohtaan ** IDM_OPTIONS_LANGUAGE+? eteenpäin, missä ? alkaa 0:sta. ** Jos lipunkuva halutaan myös ikkunan alalaitaan, ** pitää se tehdä User Draw push buttonina, jolle ** annetaan tunnus ID_LANGUAGE. ** Tunnukset löytyvät tiedostosta kieli.h ** ** Aliohjelmat: (nykyisin toimii vain yhdelle ikkunalle kerralla) ** void AlustaKielet(HWND hWnd); ** - alustaa kielet ikkunaa hWnd varten ** void PoistaKielet(HWND hWnd); ** - poistaa ikkunan hWnd kieliä varten tehdyt varaukset ** tätä ei ole pakko kutsua, jos viestitaulukossa on rivi ** LOOK_TABLE(LanguageMsgTbl), ** Ko. rivi on muutenkin oltava viestitaulokossa, jotta ** kielen vaihto ja lipun ylläpito toimisi. ** int AsetaKieli(HWND hWnd,int k); ** - vaihdetaan kieleksi kieli numero k ** int MikaKieli(HWND hWnd); ** - kysytään mikä kieli on tällä hetkellä käytössä (esim ohjelman ** lopussa talletusta varten). ** ** Suunnitelmia: ** ------------- ** - ikkunakohtaiset kielet ****************************************************************************/ #include #include #include "tausta.h" #include "tabhand.h" #include "kieli.h" /***************************************************************************/ typedef struct { char name[20]; int item; HBITMAP hBit; HMENU hMenu; } LanguageType; /***************************************************************************/ #define MAX_KIELIA 10 static int Kielia = 0; static LanguageType Languages[MAX_KIELIA] = { {"",IDM_OPTIONS_LANGUAGE,NULL,NULL} }; static int kieli=0; static HWND hWnd_kieli = NULL; /* Mille ikkunalle kielet nyt käytössä */ /***************************************************************************/ int AsetaKieli(HWND hWnd,int k) { kieli = k; if ( kieli >= Kielia ) kieli = 0; SetMenu(hWnd,Languages[kieli].hMenu); InvalidateRect(hWnd,NULL,FALSE); return 0; } /***************************************************************************/ int MikaKieli(HWND hWnd) { if ( hWnd == hWnd_kieli ) return kieli; return 0; } /***************************************************************************/ void AlustaKielet(HWND hWnd) /* Ladataan tarvittavat bittikartat ja vaihdetaan ne kussakin menussa ** kunkin kielen valinnan tilalle. Kielten valinnat tulee olla numeroitu ** juoksevasti. Jos joku valinta puuttuu, lisätään se ensimmäisen kielen ** yläpuolelle. Jos jonkin kielisessä menussa ei ole yhtään kielenvaihtoa, ** ei sinne niitä lisätäkään! */ { int i,j; HINSTANCE hInstance = GetWindowInstance(hWnd); if ( hWnd_kieli ) return; hWnd_kieli = hWnd; for (i=0; i= 0 ) /* Lisätään puuttuvat kielet */ for (j=0; j=0; i--) DestroyMenu(Languages[i].hMenu); for (i=Kielia-1; i>=0; i--) DeleteObject(Languages[i].hBit); Kielia = 0; } /***************************************************************************/ static EVENT WM_drawitem_ID_LANGUAGE(tMSGParam *msg) { DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)msg->lParam; HWND hwnd = GetDlgItem(msg->hWnd,ID_LANGUAGE); TaytaBittikartalla(hwnd,dis->hDC,Languages[kieli].hBit); return 0; } static EVENT WM_command_LANGUAGE(tMSGParam *msg) /* #man# */ { return AsetaKieli(msg->hWnd,msg->id - IDM_OPTIONS_LANGUAGE); } static EVENT WM_command_ID_LANGUAGE(tMSGParam *msg) { return AsetaKieli(msg->hWnd,++kieli); } static EVENT WM_destroy(tMSGParam *msg) { PoistaKielet(msg->hWnd); return CONTINUE_TABLE; } tMSGEntry LanguageMsgTbl[] = { { WM_COMMAND, TRANGE, DoC, WM_command_LANGUAGE,0,0, IDM_OPTIONS_LANGUAGE,IDM_OPTIONS_LANGUAGE+MAX_KIELIA-1}, { WM_DRAWITEM , ID_LANGUAGE , DoC , WM_drawitem_ID_LANGUAGE }, /*a*/ { WM_COMMAND , ID_LANGUAGE , DoC , WM_command_ID_LANGUAGE }, /*a*/ { WM_DESTROY , DoC , DoC , WM_destroy }, /*a*/ { 0 } };