/**************/ /* allwtop.c */ /**************************************************************************** PROGRAM: allwtop.c Windows: Win 3.1 (& Win32 ?) PURPOSE: Aliohjelmakirjasto "allways on top" -tilan ylläpitämiseksi AUTHOR: Vesa Lappalainen 18.8.1995 USAGE: Käyttäjän pitää 0) Liittää projektiin ALI\allwtop.c ja pääohjelmaan #include "allwtop.h" 1) Kutsua tarvittavia aliohjelmia ============ Aliohjelmat: (allwtop.c, allwtop.h) ============ int IsAllwaysOnTop(HWND hWnd) - tutkii onko tila päällä vaiko ei int AllwaysOnTop(HWND hWnd,int NewTop) - asetetaan AllwaysOnTop tila päälle (1) pois (0) tai päinvastoin (-1) int SaveAllwaysOnTop(HWND hWnd,const char *ininame) - kirjoittaa -INI tiedostoon tilan arvon int GetAllwaysOnTop(HWND hWnd,const char *ininame,const char *sec,int def) - ottaa -INI -tiedostosta tilan arvon HMENU AppendSystemMenuAllwaysOnTop(HWND hWnd,const char *ininame,int def) - lisää systeemimenuun kohdan Allways on top ja laittaa tämän arvoksi ininame-tiedostosta kohdasta [POS] olevan arvon. Jos arvoa ei ole, laitetaan arvoksi def (0 v 1). Palauttaa systeemimenun kahvan, jotta samalla kertaa voidaan lisätä muitakin kohtia systeemimenuun EVENT WM_syscommand_CM_ALLWAYSONTOP(tMSGParam *msg) - käsittelee CM_ALLWAYSONTOP -viestin Tämän laittamiseksi viestitaulukkoon on makro EV_HANDLE_CM_ALLWAYSONTOP EV_HANDLE_CM_ALLWAYSONTOP_AND_ADD(def) - käsittelee edellisen lisäksi myös WM_INITDIALOG -viestin ja näin AllwaysOnTop lisääminen ei vaadi välttämättä muuta kuin ko. makron lisäämisen viestitaulukon alkuun (ennen omia WM_INITDIALOG -käsit.). Tosin tällä makrolla ei voi lukea arvoa INI-tiedostosta. ======== Vikoja: ======== - ei estä useita kutsuja, eli kirjastoa pitää käyttää "oikein", eli esim Append... kutsua saa kutsua vain kerran. - ei voi hoitaa samassa ohjelmassa useamman ikkunan tilaa, eli ei voi toistaiseksi olla DLL. Tosin tämä vika on helppo korjata muuttamalla aliohjelmaa IsAllwaysOnTop ******************************************************************************/ #include #include #include "tabhand.h" #include "allwtop.h" /*****************************************************************************/ static int Top=1; /*****************************************************************************/ int IsAllwaysOnTop(HWND hWnd) #pragma argsused /* Onko AllwaysOnTop tila päällä (1) vai ei (0) */ { return Top; } /*****************************************************************************/ int AllwaysOnTop(HWND hWnd,int NewTop) /* Asetetaan AllwaysOnTop tila päälle (1) pois (0) tai päinvastoin (-1) */ { HMENU hMenu = GetSystemMenu(hWnd, FALSE) ; if ( NewTop == -1 ) Top = (Top == 0); else Top = NewTop; CheckMenuItem(hMenu,CM_ALLWAYSONTOP,MF_BYCOMMAND | ( Top ? MF_CHECKED : MF_UNCHECKED ) ); SetWindowPos(hWnd,Top ? HWND_TOPMOST : HWND_NOTOPMOST, 0,0,0,0,SWP_NOMOVE | SWP_NOSIZE); return 0; } /*****************************************************************************/ int SaveAllwaysOnTop(HWND hWnd,const char *ininame) { char s[20]; WritePrivateProfileString("POS","AllwaysOnTop",itoa(IsAllwaysOnTop(hWnd),s,10),ininame); return 0; } /*****************************************************************************/ int GetAllwaysOnTop(HWND hWnd,const char *ininame,int def) { return AllwaysOnTop(hWnd,GetPrivateProfileInt("POS","AllwaysOnTop",def,ininame)); } /***************************************************************************/ HMENU AppendSystemMenuAllwaysOnTop(HWND hWnd,const char *ininame,int def) { HMENU hMenu = GetSystemMenu(hWnd, FALSE) ; // append own items to systemmenu AppendMenu(hMenu, MF_SEPARATOR, 0, NULL) ; AppendMenu(hMenu, MF_STRING, CM_ALLWAYSONTOP, "Allways on top") ; if ( ininame ) GetAllwaysOnTop(hWnd,ininame,def); else AllwaysOnTop(hWnd,def); return hMenu; } /***************************************************************************/ EVENT WM_syscommand_CM_ALLWAYSONTOP(tMSGParam *msg) { return AllwaysOnTop(msg->hWnd,-1); } /***************************************************************************/ EVENT AllwaysOnTopInitDialog(tMSGParam *msg) { AppendSystemMenuAllwaysOnTop(msg->hWnd,NULL,(int)msg->extra); return CONTINUE_TABLE; }