/**************/ /* autoldde.c */ /***************************************************************************** ** PROGRAM: autoldde (muokattu ohjelmasta laskurm2.c ) ** Windows: Win 3.1 & WIN32 ** PURPOSE: Autolaskuri mallina DDE-palvelimesta ja asiakkaasta. ** Mahdollisuus kopioida leikekirjaan valmis viite. ** Toinen ikkuna, johon saadaan DDE-asiakas. ** Asiakas ikkunan linkit voidaan ottaa leikekirjasta ** tai Edit-ikkunaan kirjoitetun linkin mukaan. ** Yksinkertaistettu versio. ** USAGE: ** Esim EXCELissä kirjoitetaan kaava =AUTOLDDE|LKM!HA ** Quattro Prossa kaava @DDELINK([AUTOLDDE|LKM]"HA") ** Tässä tapauksessa nämä kaavat voidaan kopoida automaattisesti ** aktivoimalla joku laskurin nappula ja Edit/Copy ** Sitten esim. taulukkolaskennassa Edit/Paste Link ja DDE-linkki ** on valmis! ** Asiakas ikkunan 2 pientä linkkikenttää saadaan aktivoimalla ** jompikumpi niistä ja valitsemalla sen jälkeen Edit/Paste Link ** Mikäli kumpikaan ei ole valittu tulee linkki aina isoon ikkunaan. ** Ison ikkunan linkki saadaan myös edit-ikkunan tekstin mukaan ** valitsemalla Edit/Do Edit Link. ** ** HUOM! ** Toteutuksessa on molemmille ikkunoille laiskuuden vuoksi ** sama menu. Oikeassa ohjelmassa tämä ei ole suotavaa! ** Mallissa palvelin toimii toisesta ikkunasta ja asiakas ** toisesta. Tarvittaessa molemmat voivat toimia samassa ** ikkunassa! ** ** Tämä malli toimii vain Windows 3.1:ssä, koska siinä on ** käytetty read-only Edit-kenttiä. Poistamalla read-only, ** pitäisi toimia myös Win 3.0:ssa ** ** Editor: Vesa Lappalainen ( DDE-palvelin yleiskäytöiseksi+leikekirja) ** ( DDE-asiakas ) ** Kari Heikkilä ( DDE-palvelin ) ** ** DDE palvelimen (server) vaatimat lisäykset merkitty ds ** DDE asiakkaan (client) vaatimat lisäykset merkitty dc ** ** Projektiin tarvitaan ** autoldde.c - tämä tiedosto ** autoldde.def - moduulin määrittely ** autoldde.rc - resurssit ** ALI\ddeser.c - dde-palvelin ** ALI\ddecli.c - dde-asiakas ** ALI\tabhand.c - viestitaulukon käsittely ** ALI\mdialog.c - dialogien käsittely ** ALI\clipboard.c - leikekirjan käsittely ** *****************************************************************************/ #include #include #include "tabhand.h" #include "mdialog.h" #include "ddeser.h" /* ds */ #include "ddecli.h" /* dc */ #include "autoldde.h" #define SERVICE "AutolDDE" /* ds */ #define TOPIC "Lkm" /* ds */ /****************************************************************************/ TDIALOGPROC(MsgTbl,MainDlgProc) mDlgMAIN(NULL,"LASKURI",MainDlgProc) /****************************************************************************/ static int laskurit[LASKUREITA] = {0,0}; static HWND hcWnd = NULL; /* ds */ /****************************************************************************/ int UpdateData(HWND hWnd,int n,HDDEDATA hData,LONG size) /* dc */ /* Tällä aliohjelmalla päivitetään näyttöön DDE-serverin ilmoittamat ** muutokset. Aliohjelmaa ei tarvita, mikäli muutokset tulevat suoraan ** johonkin ikkunaan, jonka sisältö voidaan muuttaa SetWindowTextillä. ** Tässä tapauksessa aliohjelma on kirjoitettu mallin vuoksi. */ { #pragma argsused char ddedata[100]; HWND hswnd = GetDlgItem(hWnd,ID_LINK+n); DdeGetData(hData,(void *)ddedata,sizeof(ddedata),0); SetWindowText(hswnd,ddedata); return 0; } /****************************************************************************/ int ShowStatic(HWND hWnd, int nr, int value) /* Aliohjelmalla tulostetaan Static ikkunaan numero */ { char s[20]; HWND hswnd = GetDlgItem(hWnd,nr); wsprintf(s,"%d ",value); SetWindowText(hswnd,s); InformDDEChangeSN(nr); /* Tarvit. jos autom. *//* ds */ return 0; } /****************************************************************************/ /* Viestien käsittely: */ /****************************************************************************/ static EVENT lisaa(tMSGParam *msg) { return ShowStatic(msg->hWnd,msg->id-HA+HAL,++laskurit[msg->id-HA]); } static EVENT WM_command_NOLLAA(tMSGParam *msg) { int i; for (i=0; ihWnd,HAL+i,laskurit[i] = 0); return 0; } static EVENT WM_command_IDM_EDIT_COPY(tMSGParam *msg) { /* Leikekirjaan se laskuri, jonka nappula akt.*/ int id = GetDlgCtrlID(GetFocus()); /* Mikä nappula aktiivinen? */ if ( id < HA || HA+LASKUREITA-1 < id ) return 1; LinkToClipboardSN(msg->hWnd,id-HA+HAL); /* ds */ return 0; } static EVENT WM_command_IDM_EDIT_PASTE_LINK(tMSGParam *msg) /* dc */ { int id = GetDlgCtrlID(GetFocus()); (void)msg; if ( ID_LINK<=id && id<=ID_LINK2 ) /* Tämä tarvitsee funktion */ LinkFromClipboard(id-ID_LINK,hcWnd,UpdateData,NULL,CF_TEXT); else /* Tämä toimii automaattisesti */ AutoLinkFromClipboard(9,hcWnd,ID_AUTOLINK); return 0; } static EVENT WM_command_IDM_EDIT_DO_EDIT_LINK(tMSGParam *msg) /* dc */ { /* Otetaan edit-ikkunan teksti ja siitä linkki */ char link[100]; (void)msg; GetDlgItemText(hcWnd,ID_EDITLINK,link,sizeof(link)); AutoLinkFromText(8,hcWnd,ID_AUTOLINK,link); return 0; } static EVENT WM_command_IDM_EDIT_RESET_CLIENT_LINKS(tMSGParam *msg) /* dc */ { CloseAllDDEClients(); (void)msg; return 0; } static EVENT WM_initdialog(tMSGParam *msg) { static int init_count = 0; if ( init_count ) return 0; /* Toiselle dialogille ei tarvitse tehdä */ init_count++; mAddAcceleratorType(msg->hWnd,"PIKA",0); /* Keksipä miksi tämä? */ hcWnd = DoModelessDialog(NULL,"Client",MainDlgProc); /* dc */ InitDDEServer(GetWindowInstance(msg->hWnd),SERVICE,NULL); /* ds */ AddAutoTextService(TOPIC,"ha",HAL,msg->hWnd); /* ds */ AddAutoTextService(TOPIC,"ka",KAL,msg->hWnd); /* ds */ return 0; } static EVENT WM_close(tMSGParam *msg) { (void)msg; CloseDDEServer(); /* ds */ CloseAllDDEClients(); /* dc */ PostQuitMessage(0); return 0; } /****************************************************************************/ /* Viestien käsittelytaulukko */ /****************************************************************************/ tMSGEntry MsgTbl[] = { { WM_COMMAND , TRANGE , DoC, lisaa , 0 , 0, HA,HA+LASKUREITA-1}, { WM_COMMAND , IDM_FILE_EXIT , DoC , WM_close }, { WM_COMMAND , EXIT , DoC , WM_close }, { WM_COMMAND , IDCANCEL , DoC , WM_close }, { WM_COMMAND , NOLLAA , DoC , WM_command_NOLLAA }, /*a*/ { WM_COMMAND , IDM_EDIT_COPY , DoC , WM_command_IDM_EDIT_COPY }, /*a*/ { WM_COMMAND , IDM_EDIT_PASTE_LINK , DoC , WM_command_IDM_EDIT_PASTE_LINK }, /*a*/ { WM_COMMAND , IDM_EDIT_DO_EDIT_LINK , DoC , WM_command_IDM_EDIT_DO_EDIT_LINK }, /*a*/ { WM_COMMAND , IDM_EDIT_RESET_CLIENT_LINKS , DoC , WM_command_IDM_EDIT_RESET_CLIENT_LINKS }, /*a*/ { WM_INITDIALOG , DoC , DoC , WM_initdialog }, /*a*/ { WM_CLOSE , DoC , DoC , WM_close }, /*a*/ { 0 } }; /****************************************************************************/