/**************/ /* portable.h */ /**************************************************************************** Tiedoston makroja: ------------------ SEND_WM_COMMAND(hWnd,id,ctlhWnd,cmd) - lähettää WM_COMMAND viestin Muita hommia yhteensopivuuden varmistamiseksi: ---------------------------------------------- - tarkista kaikkien ohjelmien Win32-kelpoisuus - fontin vaihto Tähän tiedostoon on kasattu eroja, jotka ovat WIN-16 ja WIN-32 versioiden välillä. Ennenkuin teet mitään, tarkista aina myös täältä, onko aikomasi toimenpide erilainen eri WIN-versioissa. Tämä tiedosto ei suinkaa ole täydellinen, ja se täydentyy ajan mukaan. windowsx.h:sta löytyy myös iso kasa eroavaisuuksia: 1. WM_COMMAND-viestin käsittely on muuttunut (samoin kuin monen muun viestin, jossa Win 3.1:ssä tuotiin LPARAM osassa kahva. Win32:ssa kahvat ovat 32-bittisiä, joten koko LPARAM menee kahvaksi ja entinen komennon yläosa onkin nyt 32 bittiseksi muuttuneessa WPARAMissa. Eli: Asia: Win 3.1 Win32 ------------------------------------- ID-numero wp LOWORD(wp) HWND LOWORD(lp) lp komento HIWORD(lp) HIWORD(wp) ------------------------------------- Siis EI pitäisi kirjoittaa: case WM_COMMAND: switch (wParam) { case ID_EDIT_WINDOW: if ( HIWORD(lParam) == EN_CHANGE ) ... eWnd = LOWORD(lp); VAAN pitäisi käyttää "message-crakereita": case WM_COMMAND: switch ( GET_WM_COMMAND_ID(wParam,lParam) ) { case ID_EDIT_WINDOW: if ( GET_WM_COMMAND_CMD(wParam,lParam) == EN_CHANGE ) ... eWnd = GET_WM_COMMAND_HWND(wParam,lParam); Vastaavasti on käänteinen makro, joka tekee SendMessagessa tarvittavan parametrilistan wParam,lParam -osan GET_WM_COMMAND_MPS(id,hWnd,cmd) 2. Monet WindowWordit ovat muuttuneet WindowLongeiksi, esim: Win 3.1: hInstance = GetWindowWord(hWnd,GWW_HINSTANCE)) Win32 : hInstance = GetWindowLong(hWnd,GWL_HINSTANCE)) Tätä varten on makro GetWindowInstance. Loppuja varten (osaa) on tässä tiedostossa makroja. 3. Monet esim. Edit-ikkunan asetusviestit ovat muuttuneet. Esim. alueen valinta Win 3.1: SendMessage(hWnd,EM_SETSEL,0,MAKELONG(s,e)) Win32 : SendMessage(hWnd,EM_SETSEL,s,e) Tätä varten on makro Edit_SetSel(hWnd, s, e) 4. Käytä aina määrittelyä STRICT Sijoita vaikkapa windows.h:n alkuun #define STRICT tai ennen #include :ta 5. Käytä oikeita tietotyyppejä: HMODULE, HINSTANCE, ei HANDLE UINT ei WORD paitsi jos todella halutaan 16 bit WPARAM ei WORD LPARAM, LRESULT ei LONG WNDPROC, DLGPROC ei FARPROC => joudut castaamaan esim FreeProcInstance((FARPROC)myDlgProg) WINAPI ei FAR PASCAL CALLBACK ei FAR PASCAL 6. Jos osoittimia joutuu castaamaan, täytyy usein mennä UINTin kautta: HWND hWnd; LRESULT lResult = (LRESULT)(UINT)hWnd; Tai jos halutaan 32-bittnen tulos, niin esim: char *near pch = ...; LPARAM lParam = (LPARAM)(LPSTR)pch; 7. MakeProcInstance ja FreeProcInstance ovat tulleet tarpeettomiksi! 8. Win 3.1:ssä ei ole POINTS tyyppiä eikä MAKEPOINTS makroa ja WIN32:ssa ei ole MAKEPOINT makroa! => Tehdään 3.1:een täällä POINTS ja MAKEPOINTS ja käytetään aina niitä! 9. GetFreeSpace ei toimi WIN32:ssa ( 10. WIN 32:ssa ei ole MoveTo, => tehdään se. ) 11. WIN32:ssa ei näköjään saa includata print.h:ta. Siis se ehdolliseksi. Vesa Lappalainen 3.8.1994- *****************************************************************************/ #ifndef PORTABLE_H #define PORTABLE_H #ifndef __WINDOWS_H /* BC */ #ifndef INC_WINDOWS /* MSC */ #include #endif #endif #ifndef __WINDOWSX_H #ifndef INC_WINDOWSX #include #endif #endif #ifdef __cplusplus extern "C" { #endif # ifndef __WIN32__ /* WIN-16 ***********************************************/ #define GetClassModule(hWnd) ((HINSTANCE)GetClassWord(hWnd,GCW_HMODULE)) #define SetClassBackround(hWnd,col) SetClassWord(hWnd,GCW_HBRBACKGROUND,(WORD)col); #define POINTS POINT #ifndef MAKEPOINTS #define MAKEPOINTS(l) MAKEPOINT(l) #endif #else /* WIN 32 ************************************************************/ #define GetClassModule(hWnd) ((HINSTANCE)GetClassLong(hWnd,GCL_HMODULE)) #define SetClassBackround(hWnd,col) SetClassLong(hWnd,GCL_HBRBACKGROUND,(WORD)col); #define GetCurrentTask GetCurrentThread //#define MoveTo(hdc,x,y) MoveToEx((hdc),(x),(y),NULL) # endif /* WIN 16/32 ********************************************************/ /*****************************************************************************/ /* Yleisiä siirrettavyysmakroja: */ #define SEND_WM_COMMAND(hWnd,id,ctlhWnd,cmd) \ (SendMessage(hWnd,WM_COMMAND,GET_WM_COMMAND_MPS(id,ctlhWnd,cmd))) #ifdef __cplusplus } #endif #endif /* PORTABLE_H */