/**************/ /* strlib.c */ /**************************************************************************** LIBRARY: STRLIB.C PURPOSE: "Malli DLL-kirjaston" työosa, joka voidaan liittää sellaisenaan myös tavalliseksi kirjastoksi. Editor: Vesa Lappalainen 10.11.1992 USAGE: 1) Lisätään omaan ohjelmaan #include "strlib.h" 2) Kutsut aliohjelmiin: KysyJono(...) ============================= Aliohjelmien tarkempi kuvaus: ============================= ------------------------------------------------------ int WINAPI_LIB KysyJono(LCPSTR kysymys, LPCSTR oletus, LPSTR jono, int max_pit) ------------------------------------------------------ Kysytään merkkijono käyttäjältä. Kysymykseen tulee dialogi, jonka otsikkona on kysymys. Dialogissa on kaksi nappulaa OK ja CANCEL. Mikäli valitaan OK (=Return), palautetaan vastatusta jonosta niin monta merkkiä kuin tulokseen sopii. Muuten (CANCEL = ESC) ei tulosta muuteta. Palauttaa: -1 = painettiin ESC tai CANCEL 0 <= annetun merkkijonon pituus LPSTR kysymys - dialogin otsikoksi tulostuva kysymys LPSTR oletus - edit-kenttään oletuksena tulostuva arvo LPSTR jono - tulosjono int max_pit - tulosjonon suurin sallittu pituus (myös \0) Tyyppi WINAPI_LIB on joko WINAPI tai WINAPI _export sen mukaan, tuleeko tästä .DLL vai ei. ------------------------------------------------------ int WINAPI_LIB KysyJonoPaikka(int x,int y); ------------------------------------------------------ Määrää kysymysdialogin paikan. Jollei tätä kutusta, niin sama paikka kuin ed. kerralla jäi. ******************************************************************************** Tämän kirjaston käyttämiseksi tavallisena kirjastona pitää projektissa olla Pääohjelma.cpp ALI\owl\strlib.cpp (tai strlib.obj tai .lib, jossa tämä on mukana) ALI\strlib.rc ???.def Lisäksi tarvitaan strlib.h ******************************************************************************** KIRJASTOISTA (*.lib ja *.dll): ============================== Jos moduli halutaan lisätä johonkin kirjastoon, pitää tämä moduli ensin kääntää oikealla muistimallilla strlib.obj ja sitten objekti lisätään kirjastoon vaikkapa TLIB -komennolla: TLIB oma.lib +-strlib.obj eli otetaan vanha pois ja lisätään uusi tilalle (jos ei ole ennestään, tulee tietysti varoitus ettei vanhaa voi poistaa). Jos tästä kirjastosta halutaan .dll, niin ks. ALI\dllmain.c ******************************************************************************** -------------------------------------------------------------------------------- Toteutuksesta: ============== Myös kutsunut ikkuna selvitetään GetFocus-kutsulla, jottei sitä tarvitse tuoda parametrina. Jostain syystä dialogin CloseWindow(-1) kaataa ohjelman. Tästä syystä merkkijonon pituus lasketaan vasta kutsufunktiossa. Myöskään dialogissa TWindow::Attr.X ei anna oikeaa tulosta. Ja WM_MOVE -viestin pt on client-nurkan koordinaatti => hankaluuksia dialogin saamiseksi oikealle paikalleen. -------------------------------------------------------------------------------- Tehtäviä: 1) Käännä tästä .dll versio ja kokeile toimintaa useammalla eri pääohjelman esiintymällä (eli syöttö kesken kahdessa ohjelmassa yhtäaikaa). Toimiiko? *******************************************************************************/ #include #include "strlib.h" GetModule #define NOPOS -9999 /******************************************************************************/ class TDlgPos { // Luokka, joka tallettaa ikkunan paikan TPoint p; public: TDlgPos() : p(NOPOS,NOPOS) {} int Set(const TPoint &pt) { p = pt; return 0; } int Move(TWindow &wnd) { if ( p.x == NOPOS ) return 1; wnd.SetWindowPos(NULL,p.x,p.y,0,0, SWP_NOSIZE | SWP_NOZORDER); return 0; } int Query(TWindow &wnd) { TRect rc; wnd.GetWindowRect(rc); p.x = rc.left; p.y = rc.top; return 0; } }; static TDlgPos DlgPos; // Staattinen dialogin edellisen kerran paikka //------------------------------------------------------------------------------ class TAskStrDialog : public TDialog { const char *prompt; const char *def; char *str; int maxlen; public: TAskStrDialog(TWindow *parent,const char *p,const char *d, char *s, int m) : TDialog(parent,"KYSYJONO",DLL_G_ResMod), // Huom. modulin käyttö!!! prompt(p),def(d),str(s),maxlen(m) { } virtual ~TAskStrDialog() { } void SetupWindow() { TDialog::SetupWindow(); SetWindowText(prompt); SetDlgItemText(EDITJONO,def); DlgPos.Move(*this); } void BNOk() { GetDlgItemText(EDITJONO,str,maxlen); CloseWindow(IDOK); } // void EvMove(TPoint &pt) { DlgPos.Set(pt); } void EvMove(TPoint &pt) { DlgPos.Query(*this); } // void EvMove(TPoint &pt) { DlgPos.Set( // TPoint(TWindow::Attr.X,TWindow::Attr.Y)); } DECLARE_RESPONSE_TABLE(TAskStrDialog); }; DEFINE_RESPONSE_TABLE1(TAskStrDialog, TDialog) EV_WM_MOVE, EV_BN_CLICKED(IDOK,BNOk), END_RESPONSE_TABLE; /******************************************************************************/ int WINAPI_LIB KysyJono(LPCSTR kysymys, LPCSTR oletus, LPSTR jono, int max_pit) { TWindow wnd(GetFocus()); int ret=TAskStrDialog(&wnd,kysymys,oletus,jono,max_pit).Execute(); if ( ret != IDOK ) return -1; return strlen(jono); } /******************************************************************************/ int WINAPI_LIB KysyJonoPaikka(int x,int y) { return DlgPos.Set(TPoint(x,y)); }