Uptime
Mureakuha
Sisällysluettelo |
Dialogit
Yleistä
Tällä pienellä sivulla tutustumme kuinka voimme tehdä yksinkertaisen ohjelman käyttäen pohjana yhtä dialogia. Dialogit ovat valmiita ikkunaluokka tyyppejä. Windows hoitaa dialogien luonnin ja taustan värityksen, kohdistimen hallinnan ja muita yleisiä käyttöliittymän hallintaan liittyviä tehtäviä. Yleensä ohjelmat näyttävät tietoja ja asetuksia dialogeissa.
Pieni ohjelma on helppo rakentaa yhden tai muutaman dialogin varaan, eikä käyttöliittymän hallintaan liittyvää koodia tule paljon. Tässä esimerkissä rakennamme yksinkertaisen sovelluksen joka näyttää tietokoneen päälläoloajan.
Tällä sivulla kuvataan projektin aloittaminen Visual Studio 2003 ympäristössä. Ohjelman IDE on vähän sekava ja tuottaa joskus harmaita hiuksia.
Aloitus
Tee uusi windows sovellus ohjelma. File / New / Project. Visual C++ Projects / Win32 / Win32 Project. Anna ohjelmallesi nimi uptime. Mene seuraavaksi Application Settings välilehdelle ja rastita kohta Empty project jonka jälkeen paina Finish.
Lisää projectiin uusi lähdekoodi tiedosto. Add New Item / Visual C++ / Code / C++ File -> kirjoita nimeksi uptime.c (käytämme C kieltä esimerkissä).
Dialogi
Dialogien muokkaus tapahtuu nykyään lähes kaikissa IDE:ssä jollakin graaffisella työkalulla. Lisää dialogi Project / Add resource / Dialog. Niin eteesi pitäisi ilmestyä pieni pohja jossa on OK ja Cancel nappulat. Poista Cancel nappula, aktivoimalla se ja painamalla Del.
Aktivoi itse dialogi ja muuta seuraavia aseuksia. Caption: Uptime, Position Center: True, Tool Window: True. Näin dialogia saadaan vähän pienemmäksi ja keskelle ruutua.
Siirrä OK nappi dialogin alalaitaan. Tee uusi static text muotoinen teksti kenttä napin yläpuolelle. Kun olet tyytyäinen muokkaa myös tämän asetuksia. ID: IDC_UPTIME ja Alingt text: Center ja Caption: tyhjäksi. Kun olet tyytyväinen dialogiin niin tallenna ja sulje.
Koodi
Kannattaa pistää varoitus taso suureksi ja Unicode tuki päälle koodin kirjoittamisen aluksi. Project / Properties valitse että Configuratin on All Configurations. Sitten C/C++ / General / Warning Level / Level 4 ja Properties / C/C++ / General / Preprosessor / Preprosessor defininatins, lisää UNICODE ja _UNICODE.
Muokkaa mieleiseksi tai copy pastea seuraava koodi:
#include <windows.h> #include <wchar.h> #include "resource.h" static BOOL CALLBACK DialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); static BOOL SetUptime(HWND hDlg); void ErrorExit(); INT APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, INT nCmdShow) { INT i; UNREFERENCED_PARAMETER(lpCmdLine); UNREFERENCED_PARAMETER(nCmdShow); UNREFERENCED_PARAMETER(hinstPrev); i = (INT) DialogBox(hinst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC) DialogFunc); if(i == -1) ErrorExit(); return i; } static BOOL CALLBACK DialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { BOOL bRet; UNREFERENCED_PARAMETER(lParam); switch (msg) { case WM_INITDIALOG: bRet = SetUptime(hwndDlg); if(!bRet) ErrorExit(); bRet = (BOOL) SetTimer(hwndDlg, 1, 1000, NULL); if(!bRet) ErrorExit(); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: bRet = EndDialog(hwndDlg,1); if(!bRet) ErrorExit(); return TRUE; } break; case WM_TIMER: bRet = SetUptime(hwndDlg); if(!bRet) ErrorExit(); break; case WM_CLOSE: bRet = KillTimer(hwndDlg, 1); if(!bRet) ErrorExit(); bRet = EndDialog(hwndDlg,0); if(!bRet) ErrorExit(); return TRUE; } return FALSE; } BOOL SetUptime(HWND hDlg) { DWORD dwUptime; INT dd; INT hh; INT mm; TCHAR buf[27]; dwUptime = GetTickCount(); dd = dwUptime / 86400000; dwUptime = dwUptime - (dd * 86400000); hh = dwUptime / 3600000; dwUptime = dwUptime - (hh * 3600000); mm = dwUptime / 60000; dwUptime = dwUptime - (mm * 60000); dwUptime = dwUptime / 1000; if(wsprintf (buf, TEXT("Uptime: %d days, %.2d:%.2d:%.2d.\n"), dd, hh, mm, dwUptime) < 4) return FALSE; return SetDlgItemText(hDlg, IDC_UPTIME, buf); } void ErrorExit() { LPVOID lpMsgBuf; if (FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL )) { MessageBox( NULL, (LPCTSTR)lpMsgBuf, TEXT("Uptime - Error"), MB_OK | MB_ICONINFORMATION ); LocalFree( lpMsgBuf ); } ExitProcess(1); }
Toiminta
Ohjelma alkaa tavalliseen tapaan WinMain() funktiosta. Jossa kutsutaan DialogBox() funktiota. Windows luo dialogin ja kaikki siihen kuuluvat kontrollit. Dialogi kuvataan resussi tiedostossa jonka loimme aikaisemmin. Dialogin toiminta määrätään DialogFunc():ssa.
Dialogien takaisin kutsunta funktio eroaa normaalien ikkunoitten funktioista pikkasen. Rakenteellisesti se on yksinkertaisempi. Dialogi alustetaan WM_INITDIALOG viestin yhteydessä, eikä WM_CREATE kuten normaalisti. Esimerkissämme kutsumme SetUptime() funktioita jotta dialogi ei olisi luomisen jälkeen tyhjä. Sen jälkeen luodaan ajastin jota kutsutaan sekunnin välein.
WM_TIMER viestin yhteydessä päivitetään uusi aika teksti kontrolliin. Dialogien käsittelyyn on valmiita funktioita, jotka vähentävät kirjoitus työtä. Käytämme SetDlgItemText() funktioita teksti kontrollin päivittämiseen.
Dialogin on reagoitava viesteihin. Tärkein viesti johonka on reagoitava on WM_CLOSE. Tälläöin käyttäjä haluaa sulkea ohjelman. Jos emme käsittelisi tätä viestiä niin ohjelma ei sulkeutuisi x ruksista.
Erilaiset kontrollit lähettävät WM_COMMAND viestin kautta ilmoituksia. Kun OK nappia painetaan niin pystymme testaamme sen tässä. OK napin sulkee vain ohjelman.
Viimeistely
Kun ohjelma on testattu toimivaksi on aika lisätät Manifesti. Manifestin suostumuksella Windows käytää ohjelmassa XP:n tyylejä. Eli ohjelmaan täytyy lisätä yksi tiedosto.
Luo uusi tiedosto ja tallenna se nimellä uptime.exe.manifest tiedoston sisällöksi tulee:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="Uptime" type="win32" /> <description>Show computer uptime.</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>
Avaa uptime:n resussi tiedosto teksti editointi moodissa (uptime.rc) File / Open File / pen With / C++ Source Code editor. Lisää CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "Uptime.exe.manifest" rivi. Tallenna ja käännä. Nyt ohjelman pitäisi käyttää XP:n tyylejä. Tee lopullinen käännös joka ei sisällä debuggaus koodia Build / Configuration Manager / Release. Build.

