Kurz3 - Kapitola2

17. června 2007 v 15:52 | http://www.sweb.cz/kurz_evt/ |  Programování pro WinCE

5.2 Kostra programu TestCOM s využitím MFC

Dnes je úkolem vytvořit fungující kostru programu, příště si ji rozebereme. Abychom si vyzkoušeli tvorbu programu ve všech krocích a prozkoumali vazby mezi jednotlivými prvky, budeme tento program vytvářet "ručně". Záměrně nepoužijeme pomocníka ClassWizard, který by dokázal ušetřit psaní velké části zdrojového kódu.
Začneme klasicky - File-New a jako Projects vybereme "WCE Application". Jméno projektu zvolíme např. "TestCOM" a určíme si umístění složky s projektem. Jako druh aplikace si zvolíme "An empty project". eVC nám připravil prázdný projekt.
Nejprve si do něj vložíme dva soubory, které by měly stačit pro celou aplikaci. Pomocí File-New na kartě Files označte "C/C++ Header File" a jméno můžeme zvolit stejné s naším projektem - TestCOM. Zkontrolujte, zda je zatrženo "Add to project", aby byl soubor přidán do našeho projektu.
Do nově vytvořeného souboru TestCOM.h opište nebo vložte následující kód:
////// Trida prvniho dialogu - Volby portu
class CPrvni: public CPropertyPage
{
public:
CPrvni():CPropertyPage(IDD_PRVNI) {};
protected:
afx_msg void OnKonec();
DECLARE_MESSAGE_MAP()
};

////// Trida druheho dialogu - Signalove bity
class CDruhy: public CPropertyPage
{
public:
CDruhy():CPropertyPage(IDD_DRUHY) {};
};

////// Trida tretiho dialogu - Prenos dat
class CTreti: public CPropertyPage
{
public:
CTreti():CPropertyPage(IDD_TRETI) {};
};

////// Trida ctvrteho dialogu - Napoveda
class CCtvrty: public CPropertyPage
{
public:
CCtvrty():CPropertyPage(IDD_CTVRTY) {};
};

////// Trida ramce stranek
class CRamecStranek: public CPropertySheet
{
CPrvni mPrvni;
CDruhy mDruhy;
CTreti mTreti;
CCtvrty mCtvrty;
public:
CRamecStranek(LPCTSTR pszCaption, CWnd *pParentWnd=NULL)
{
AddPage(&mPrvni);
AddPage(&mDruhy);
AddPage(&mTreti);
AddPage(&mCtvrty);
}
};

////// Trida aplikace
class CAplikace: public CWinApp
{
CRamecStranek *m_pStranky;
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
};
Hlavičkový soubor bychom měli, přidáme podobným způsobem C++ Source File - TestCOM.cpp (opět nezapomeňte na zatržení "Add to project"). Do souboru napište:
#include <afxwin.h>
#include <afxdlgs.h>
#include "resource.h"
#include "TestCOM.h"

CAplikace mojeAplikace;

///////////////////////////////////////
//// CAplikace
BOOL CAplikace::InitInstance()
{
m_pMainWnd = m_pStranky = new CRamecStranek(_T(" "));
m_pStranky->SetTitle(_T("TestCOM"));
m_pStranky->DoModal();
return TRUE;
}

int CAplikace::ExitInstance()
{
if(m_pStranky) delete m_pStranky;
return 0;
}

///////////////////////////////////////
//// CPrvni
BEGIN_MESSAGE_MAP(CPrvni,CPropertyPage)
ON_BN_CLICKED(IDC_KONEC,OnKonec)
END_MESSAGE_MAP()

void CPrvni::OnKonec()
{
mojeAplikace.m_pMainWnd->DestroyWindow();
}
Máme připraven zdrojový kód aplikace, na první spuštění ještě chybí zdroje dialogů. V menu přes Insert-Resource... nebo pomocí Ctrl-R otevřete dialog pro vložení zdrojů. Zvolte dialog a potvrďte New. Na ploše dialogu ponechejte pouze jedno tlačítko s popisem "Exit Test", kterému změníte ID na IDC_KONEC. Doporučuji upravit velikost plochy dialogu na 138x141 (rozměry jsou uvedeny vpravo dole).
Vlastnosti dialogu upravte podle obrázku:

obr. 51 Nastavení vlastností prvního dialogu
Na kartě Styles změňte navíc Style na "Child" a Border na "Thin".
Stejným způsobem vložte další tři dialogy s názvy (Caption):
  • Signals - IDD_DRUHY
  • Serial - IDD_TRETI
  • About - IDD_CTVRTY
Vlastnosti a velikosti nastavte stejně, dialogy však ponechejte prázdné (bez tlačítek).
Když okna se všemi 4 dialogy uzavřete, zjistíte, že eVC právě vytvořené dialogy ponechal ve Script1.
Jestliže si označíte složku Script1, pak ji můžete snadno uložit pomocí File-Save As... pod vhodným jménem. My zvolíme TestCOM.rc. Na záložce FileView klikněte pravým tlačítkem na Resource Files a zvolte Add Files to Folder... Nyní si vyberte právě vytvořený soubor TestCOM.rc do této složky a výsledkem by měla být nová záložka ResourceView.
Své zdroje si od tohoto okamžiku můžete prohlížet již známým postupem na záložce ResourceView.
Nyní se můžeme pokusit sestavit a spustit aplikaci. Kostru jsem testoval na Pocket PC Emulátoru. Před vlastním překladem je nutné upozornit překladač, že budeme používat knihovnu MFC. Project-Settings... (nebo Alt-F7) otevře karty nastavení projektu. Na kartě General zvolte "Use MFC in a Shared DLL". Nezbývá než se pokusit aplikaci sestavit...
Předpokládám, že se vám v hlášení při linkování asi objevilo:
error LNK2019: unresolved external symbol _WinMain@16 referenced in function _WinMainCRTStartup
V Helpu lze při troše štěstí a pátrání objevit následující slova:
If you are using Unicode and MFC, you will get an unresolved external on _WinMain@16 if you don't create an entry point to wWinMainCRTStartup. Use the /ENTRY option or type this value in the Project Settings dialog box. (To find this option in the development environment, click Settings on the Project menu, then click the Link tab and click Output in the Category box.)
Budeme se jich tedy držet a Project-Settings... na kartě Link v kategorii Output do pole Entry-point symbol vložte požadovaný vstupní bod: wWinMainCRTStartup.
Nyní by se již mělo dát aplikaci úspěšně přeložit a otestovat např. v emulátoru HPC Pro 2.11...:

obr. 52 Program spuštěný v emulátoru HPC Pro 2.11
... nebo emulátoru Pocket PC:

obr. 53 Program spuštěný v emulátoru Pocket PC
Měli byste být schopni přepínat mezi jednotlivými kartami a po kliknutí na tlačítko na první kartě se aplikace ukončí.
Poznámka: Emulátor Palm PC 2.11 se na mém počítači choval nevyzpytatelně. Nezkoumal jsem hlouběji proč :-(
U Casio E15 (Palm PC 2.11) bylo nutné zvětšit plochu dialogu o cca 20 vpravo a dole. Také netuším proč...

Co bychom si měli z této lekce zapamatovat?

  • Pokud překladač hlásí chyby, je třeba hledat v Helpu :-)
 

Buď první, kdo ohodnotí tento článek.

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.