/**************/ /* tmdialog.c */ /***************************************************************************** PROGRAM: tmdialog.c PURPOSE: Dialogien, tabhand.c:n ja kääntämisen yhteisiä aliohjelmia. Tarkoitus helpottaa sellaisen ohjelman kirjoittamista, joka hyväksyy ja tekee DaD:ta, käyttää kahta kieltä, vähintään yhtä dialogia, optiodialogia jne.. AUTHOR: Vesa Lappalainen 20.8.1995 UPDATE: 22.8.1995 + paljon lisää käsittelijöitä USAGE: 1) Laitetaan viestitaulukkoon halutut käsittelijät WM_INIDIALOG -viestin käsittelijässä kutsutaan omaini = tmDoInit(File,msg->hWnd); ... oma alustuskäsittely 2) Tiedostotapahtumat CM_FILE??? käsitellään luomalla käsittelijä aliohjelmat: FILE_EVENTS(File,tmDoClose(msg->hWnd),omaini); ja laittamalla viestitaulukkoon EV_HANDLE_CM_FILE, Kirjoitetaan tietysti filename.c:n vaatimat: File -tietue ja aliohjelmat: MyRead, MySave ja MyNew Jos halutaa omia lopetusrutiineja, kirjoitetaan DoClose aliohjelma, joka kutsuu jossakin vaiheessa tmDoClose ja käsittelijät luodaankin FILE_EVENTS(File,DoClose(msg->hWnd),omaini); 3) Esim. kielen mukaan kääntyvä about-dialogi luodaan viestitaulukon käsittelijällä: EV_HANDLE_TWM_COMMAND_CM_HELPABOUT(Version), 4) Projektiin tarvitaan: ALI\tmdialog.c ALI\filename.c ALI\transdlg.c ALI\language.c ALI\mdialog.c ALI\optdlg.c ALI\dropfile.c ALI\mjonot.c ALI\inifile.c ALI\savepos.c ALI\tabhand.c - tämän voi jättää pois jos ei käytetä tabhandin ominaisuuksia Riitää #include "tmdialog.h" ======================= Aliohjelmat ja makrot: ======================= ------------------------------------------------------------------------- BOOL CALLBACK _export TMDialogAbout(HWND,UINT,WPARAM,LPARAM); - Callback funktio About-dialogien totetuttamiseksi, jossa alussa kutsutaan aina TranslateDialog ------------------------------------------------------------------------- EVENT EVENT_handler_TAbout(tMSGParam *msg); - käsittelijä ABout-viestille EV_HANDLE_TABOUT(message,wParam,Version) - vastaava viestitaulukkon tuleva rivi, Version on Versioninfon osoite (tai NULL, jos Version infoa ei käytetä), ks. mdialog.h EV_HANDLE_TWM_COMMAND_CM_HELPABOUT(Version) - määritelty EV_HANDLE_TABOUT(WM_COMMAND,CM_HELPABOUT,Version) ------------------------------------------------------------------------- EVENT WM_command_CM_OPTIONS_DAD(tMSGParam *msg); - Käsittelejä DaD:n optioiden muuttamiseksi EV_HANDLE_WM_COMMAND_OPTIONS_DAD - vastaava viestitaulukkoon tuleva rivi, viesti on aina nimellä WM_COMMAND_OPTIONS_DAD ------------------------------------------------------------------------- EVENT WM_command_CM_OPTIONS_LANGUAGE(tMSGParam *msg); - käsittelijä kielen muuttamiseksi päinvastaiseksi EV_HANDLE_WM_COMMAND_OPTIONS_LANGUAGE(trafile) - vastaava viestitaulukkoon tuleva rivi, trafile on käännöstiedoston nimi tai NULL (jos NULL, niin nimi muodostuu INI-tieodston nimestä) ------------------------------------------------------------------------- EVENT WM_command_CM_EDITOPTIONS(tMSGParam *msg); - käsittelijä optioiden editoimiseksi, kutsuu aina [General] IniEditor= editoria -INI-tiedoston nimellä. Jos editoria ei ole mainittu, käyttää NOTEPADia EV_HANDLE_WM_COMMAND_EDITOPTIONS(id) - vastaava viestitaulukon rivi. id == WM_COMMAND viestin id-osa. ------------------------------------------------------------------------- const char *tmDoInit(HWND hWnd,FileType *File); - lukee -INI-tiedoston (nimenä ohjelman nimi.INI) (estimisjärjestys ks. inifile.c). Paluttaa INI-tiedoston nimen Alustaa: IniEditor Kielen siten, että käännöstiedosto luetaan jos kieli==1 Asettaa Optio-dialogin käsittelijän eteen kielenkääntäjän Palauttaa edellisella kerralla käytössä olleet tiedostojen nimet File-menun -listaan. Alustaa DaD:n hyväksymään pudotuksen Alustaa DaD:n optiot Palauttaa ikkunan viimekertaisen paikan Jos komentorivillä on tiedoston nimi ilman mitään optiomerkkiä, niin aukaiseen tämän tiedoston Jollei, niin jos [OLD] oldfile=1 (oletus), niin lukee viimeksi auki olleen tiedoston. Jos File == NULL, niin tiedostoa ei lueta. ------------------------------------------------------------------------- int tmDoClose(HWND hWnd); - tallettaa optioita samaan INI-tiedostoon, kuin alustuksessa käyt. Kieltää pudotuksen Tallettaa DaD:n optiot Tallettaa ikkunan paikan Tallettaa käytetyn kielen ja vapauttaa kääntäjän tarvitseman muistin Lisäksi filename.c:n makro FILE_EVENTS luo lopetusfunktion, joka talletataa vnahojen tiedostojen listan ja viimeisimmän tiedoston. tmDoClose voidaan laittaa suoraan ko makron funktioksi: FILE_EVENTS(File,tmDoClose(msg->hWnd),omaini); ------------------------------------------------------------------------- const char *tmGetIniEditorName(void); - Palauttaa INI-tiedostosta löytyneen INI-editorin nimen tai "notepad" *****************************************************************************/ #include #include "tmdialog.h" #include "dos.h" static char tmIniEditor[100]; static char tmIniName[100]; /*****************************************************************************/ TrINITPROC(MDialogAbout,TMDialogAbout,BOOL); /****************************************************************************/ EVENT EVENT_handler_TAbout(tMSGParam *msg) { return (int)DoModalDialogParam(msg->hWnd,"About",TMDialogAbout,msg->extra); } /****************************************************************************/ EVENT WM_command_CM_OPTIONS_DAD(tMSGParam *msg) { DaDOptionDialog(msg->hWnd); return 0; } /****************************************************************************/ EVENT WM_command_CM_OPTIONS_LANGUAGE(tMSGParam *msg) { FlipProgramLanguageAndRead(msg->hWnd,(const char *)(msg->extra)); return 0; } /*****************************************************************************/ EVENT WM_command_CM_EDITOPTIONS(tMSGParam *msg) { #pragma argsused char s[100]; kopioi_jono(N_S(s),tmGetIniEditorName()); liita_jono(N_S(s)," "); liita_jono(N_S(s),tmIniName); WinExec(s,SW_SHOW); return 0; } /*****************************************************************************/ const char *tmDoInit(HWND hWnd,FileType *File) { int i; FindIniFileName(N_S(tmIniName),NULL); GetPrivateProfileString("GENERAL","IniEditor","notepad",N_S(tmIniEditor),tmIniName); ReadLanguageIfNeeded(hWnd,tmIniName); SetOptPreHandler(TranslateHandler); RestoreOldFilenames(hWnd,tmIniName); InitDragAndDrop(tmIniName,0); DragAcceptFiles(hWnd,TRUE); RestorePos(hWnd,tmIniName,TMPOS,0); if ( File == NULL ) return tmIniName; for (i=1; i<_argc; i++) if ( _argv[i][0] && _argv[i][0] != '-' ) { OpenFileName(hWnd,File,_argv[i]); return tmIniName; } if ( GetPrivateProfileInt(OLDNAMES,"oldfile",1,tmIniName) ) OpenLastFile(hWnd,File,tmIniName); return tmIniName; } /*****************************************************************************/ int tmDoClose(HWND hWnd) { DragAcceptFiles(hWnd,FALSE); InitDragAndDrop(tmIniName,1); SavePos(hWnd,tmIniName,TMPOS,1); SaveLanguageAndFree(tmIniName,NULL,NULL); return 0; } /*****************************************************************************/ const char *tmGetIniEditorName(void) { return tmIniEditor; }