Priklady (samples) programovani pro PDA v C++
Zdravim vsechny,
dneska jsem se presvedcil na PDA/WM5 jak obrovsky rozdil je v rychlosti aplikace psane v C++ a aplikace psane v NetCF (konkretne C#) a rad bych do toho taky zkusil strcit frnak :) Nemuzu ale najit na netu zadne priklady pro C++ napr. nejake uplne jednoduche pro zacatek (formular + tlacitko "close") :( Muze nekdo prosim hodit nejakej odkaz?
dneska jsem se presvedcil na PDA/WM5 jak obrovsky rozdil je v rychlosti aplikace psane v C++ a aplikace psane v NetCF (konkretne C#) a rad bych do toho taky zkusil strcit frnak :) Nemuzu ale najit na netu zadne priklady pro C++ napr. nejake uplne jednoduche pro zacatek (formular + tlacitko "close") :( Muze nekdo prosim hodit nejakej odkaz?
:? ja jsem nasel jenom samply pro VB a CSharp :( muzes pls nahodit cestu k C++ samplum?
EDIT: aaa uz to mam dikec;)
EDIT: aaa uz to mam dikec;)
oboji ;) ale tohle je hardcore programovani na to ja nemam cas takze to vidim na OpenNetCF ;) akorat jestli se dostanu k "vyrobe" moji dlouho planovane klavesky tak to proste budu muset prekousnout :/
OpenNET.CF je ale jen "nadstavba" .NET CF, takže si moc nepomůžeš. A SIP v .NET CF nenapíšeš. Tedy pokud to nebude samý PInvoke. :-)
TO PHACKER:
jj to uz vim ;) jinak rekl bych ze asi budes takovej ten hard-code programator (neboli programator co se muze plnym pravem titulovat "programator") tak bys mozna mohl vedet jak vyresit jednu vec co mi jeste chybi k vytvareni SIPu modifikaci samplu DvorakSip ( [odkaz, pro zobrazení se přihlaste] ) a sice to, jak zvetsit canvas SIPu. Zkousel jsem menit nastavenou velikost v hlavnim kodu i v hlavickach ale bez vysledku (porad je to 80x240 a ja potrebuju 100x240) :( Zkousel jsem vsechno mozny a nechapu kde takova blbost muze byt schovana :mad: Fakt to nechapu a kdybych ten kod nevidel tak by me ani ve snu nenapadlo ze takova blbost bude nekde schovana :/ Muzes mi s tim pls helpnout?
jj to uz vim ;) jinak rekl bych ze asi budes takovej ten hard-code programator (neboli programator co se muze plnym pravem titulovat "programator") tak bys mozna mohl vedet jak vyresit jednu vec co mi jeste chybi k vytvareni SIPu modifikaci samplu DvorakSip ( [odkaz, pro zobrazení se přihlaste] ) a sice to, jak zvetsit canvas SIPu. Zkousel jsem menit nastavenou velikost v hlavnim kodu i v hlavickach ale bez vysledku (porad je to 80x240 a ja potrebuju 100x240) :( Zkousel jsem vsechno mozny a nechapu kde takova blbost muze byt schovana :mad: Fakt to nechapu a kdybych ten kod nevidel tak by me ani ve snu nenapadlo ze takova blbost bude nekde schovana :/ Muzes mi s tim pls helpnout?
Tak jsem se do kodu v rychosti dival - mam pocit, ze GetSipOnfo velikost vzdy nezmeni (ze jde ze strany programu je o doporuceni).
Zkousel jste tento kod v metode Showing?
[CODE]
RECT defRect;
RECT rcClients;
IMINFO imInfo;
//Souradnice si zvolte podle sebe
GetWindowRect(hwnd, &rcClients);
defRect.left=rcClients.left;
defRect.top=rcClients.bottom - BITMAP_HEIGHT
defRect.right=rcClients.left+ BITMAP_WIDTH;
defRect.bottom=rcClients.bottom;
imInfo.rcSipRect=defRect;
g_pIMCallback->SetImInfo(&iminfo);
[/CODE]
BTW: Neverte tomu, ze dobry programator se pozna podle toho, ze programuje v C++ - potkal jsem prilis mnoho "prasaku", kteri v C++ psali naprosto zversky kod s tunou chyb a tvrdili, kolik let maji praxe. Programator, ktery v C++ programuje dele, a nezna treba pri pouzivani kritickych sekci idiom RAII je mnohem horsi nestesti, nez programator v C# nebo Jave, kteremu na stribrnem podnose prinese samotny jazyk podporu pro RAII.
Zkousel jste tento kod v metode Showing?
[CODE]
RECT defRect;
RECT rcClients;
IMINFO imInfo;
//Souradnice si zvolte podle sebe
GetWindowRect(hwnd, &rcClients);
defRect.left=rcClients.left;
defRect.top=rcClients.bottom - BITMAP_HEIGHT
defRect.right=rcClients.left+ BITMAP_WIDTH;
defRect.bottom=rcClients.bottom;
imInfo.rcSipRect=defRect;
g_pIMCallback->SetImInfo(&iminfo);
[/CODE]
BTW: Neverte tomu, ze dobry programator se pozna podle toho, ze programuje v C++ - potkal jsem prilis mnoho "prasaku", kteri v C++ psali naprosto zversky kod s tunou chyb a tvrdili, kolik let maji praxe. Programator, ktery v C++ programuje dele, a nezna treba pri pouzivani kritickych sekci idiom RAII je mnohem horsi nestesti, nez programator v C# nebo Jave, kteremu na stribrnem podnose prinese samotny jazyk podporu pro RAII.
Po kosmeticke uprave kodu v metode Showing na
[CODE] RECT defRect;
RECT rcClients;
IMINFO imInfo;
//Souradnice si zvolte podle sebe
GetWindowRect(g_hwndMain, &rcClients);
defRect.left=rcClients.left;
defRect.top=rcClients.bottom - BITMAP_HEIGHT;
defRect.right=rcClients.left + BITMAP_WIDTH;
defRect.bottom=rcClients.bottom;
imInfo.rcSipRect=defRect;
g_pIMCallback->SetImInfo(&imInfo);
return NOERROR;[/CODE]
se mi zobrazuje tohle:
[odkaz, pro zobrazení se přihlaste]
Zkousel jsem si s tim pohrat, ale bez vysledku (SIP byl vzdycky vsude mozne jenom ne dole a kdyz byl dole tak mel na vysku zase 80pix a ne 100pix jak jsem nove nastavil). Nevite co s tim?
[CODE] RECT defRect;
RECT rcClients;
IMINFO imInfo;
//Souradnice si zvolte podle sebe
GetWindowRect(g_hwndMain, &rcClients);
defRect.left=rcClients.left;
defRect.top=rcClients.bottom - BITMAP_HEIGHT;
defRect.right=rcClients.left + BITMAP_WIDTH;
defRect.bottom=rcClients.bottom;
imInfo.rcSipRect=defRect;
g_pIMCallback->SetImInfo(&imInfo);
return NOERROR;[/CODE]
se mi zobrazuje tohle:
[odkaz, pro zobrazení se přihlaste]
Zkousel jsem si s tim pohrat, ale bez vysledku (SIP byl vzdycky vsude mozne jenom ne dole a kdyz byl dole tak mel na vysku zase 80pix a ne 100pix jak jsem nove nastavil). Nevite co s tim?
Podival jsem do sveho projektu (neverejneho) a tady mate upravu, ktera u me urcite funguje (kod mam ale jeste podstatne slozitejsi, takze doufam, ze tohle jsou vsechny potrebne upravy a spravne pojmenovane promenne).
Muzete predat i handly na Bitmapy. A byt vami, podivam Vam se, jestli vam z toho puvodniho prikladu nevadi makro SCALEY...
[CODE]
RECT defRect;
RECT rcClients;
IMINFO imInfo;
RECT defRect;
RECT rcClients;
IMINFO imInfo;
//Souradnice si zvolte podle sebe
GetWindowRect(g_hwndMain, &rcClients);
defRect.left=rcClients.left;
defRect.top=rcClients.bottom - BITMAP_HEIGHT;
defRect.right=rcClients.left + BITMAP_WIDTH;
defRect.bottom=rcClients.bottom;
imInfo.rcSipRect=defRect;
imInfo.cbSize=sizeof(IMINFO);
imInfo.fdwFlags = SIPF_DOCKED | SIPF_ON;
g_pIMCallback->SetImInfo(&imInfo);
MoveWindow(g_hwndMain, 0, 0, defRect.right - defRect.left, defRect.bottom -defRect.top, false);
return NOERROR;
[/CODE]
Muzete predat i handly na Bitmapy. A byt vami, podivam Vam se, jestli vam z toho puvodniho prikladu nevadi makro SCALEY...
[CODE]
RECT defRect;
RECT rcClients;
IMINFO imInfo;
RECT defRect;
RECT rcClients;
IMINFO imInfo;
//Souradnice si zvolte podle sebe
GetWindowRect(g_hwndMain, &rcClients);
defRect.left=rcClients.left;
defRect.top=rcClients.bottom - BITMAP_HEIGHT;
defRect.right=rcClients.left + BITMAP_WIDTH;
defRect.bottom=rcClients.bottom;
imInfo.rcSipRect=defRect;
imInfo.cbSize=sizeof(IMINFO);
imInfo.fdwFlags = SIPF_DOCKED | SIPF_ON;
g_pIMCallback->SetImInfo(&imInfo);
MoveWindow(g_hwndMain, 0, 0, defRect.right - defRect.left, defRect.bottom -defRect.top, false);
return NOERROR;
[/CODE]
bohuzel porad to zlobi... tedka se uz zobrazi jen "pruhledne" okno a pak se kousne cela SIP funkce ve WM5 :( mohl byste prosim az budete mit chvilku zkusit implementovat ten vas kod do tohodle zjednoduseneho samplu?:
[odkaz, pro zobrazení se přihlaste]
Hned uvidite co to dela (myslim to "pruhledne" okno) a urcite budete vedet jak z toho ven ;) Ja se s tim patlam skoro cely den zkousim vsechno mozny a porad nic... nejbliz jsem byl zatim s timhle vasim kodem:
[CODE] RECT defRect;
RECT rcClients;
IMINFO imInfo;
//Souradnice si zvolte podle sebe
GetWindowRect(g_hwndMain, &rcClients);
defRect.left=rcClients.left;
defRect.top=rcClients.bottom - BITMAP_HEIGHT;
defRect.right=rcClients.left + BITMAP_WIDTH;
defRect.bottom=rcClients.bottom;
imInfo.rcSipRect=defRect;
g_pIMCallback->SetImInfo(&imInfo);
return NOERROR;[/CODE]
[odkaz, pro zobrazení se přihlaste]
Hned uvidite co to dela (myslim to "pruhledne" okno) a urcite budete vedet jak z toho ven ;) Ja se s tim patlam skoro cely den zkousim vsechno mozny a porad nic... nejbliz jsem byl zatim s timhle vasim kodem:
[CODE] RECT defRect;
RECT rcClients;
IMINFO imInfo;
//Souradnice si zvolte podle sebe
GetWindowRect(g_hwndMain, &rcClients);
defRect.left=rcClients.left;
defRect.top=rcClients.bottom - BITMAP_HEIGHT;
defRect.right=rcClients.left + BITMAP_WIDTH;
defRect.bottom=rcClients.bottom;
imInfo.rcSipRect=defRect;
g_pIMCallback->SetImInfo(&imInfo);
return NOERROR;[/CODE]
A naplnte opravdu kompletne celou strukturu - vcetne handlu na Bitmapy atd (to same co delate v GetSipInfo).
Jestlize budete mit stale problem se sekanim (asi nekonencou rekurzi) aplikace, dejte pouze tento flag imInfo.fdwFlags = SIPF_DOCKED.
Jestlize budete mit stale problem se sekanim (asi nekonencou rekurzi) aplikace, dejte pouze tento flag imInfo.fdwFlags = SIPF_DOCKED.
A jeste jeden pokus:
Odstrante vsechno, co jsme spolecne dali do metody Showing.
A reknete mi, co se stane, kdyz ten vas priklad (resp. metodu GetSipInfo) rozsirite o volani
[CODE]
SendMessage (m_hwndMain, MYMSG_METHCALL, MSGCODE_GETINFO, (LPARAM) pimi);
[/CODE]
A pridejte si do h souboru tyto deklarace
[CODE]
#define MYMSG_METHCALL (WM_USER+100)
#define MSGCODE_GETINFO 1
[/CODE]
Odstrante vsechno, co jsme spolecne dali do metody Showing.
A reknete mi, co se stane, kdyz ten vas priklad (resp. metodu GetSipInfo) rozsirite o volani
[CODE]
SendMessage (m_hwndMain, MYMSG_METHCALL, MSGCODE_GETINFO, (LPARAM) pimi);
[/CODE]
A pridejte si do h souboru tyto deklarace
[CODE]
#define MYMSG_METHCALL (WM_USER+100)
#define MSGCODE_GETINFO 1
[/CODE]
mno tak po vyzkouseni techto pokusu se zmenilo akorat to, ze SIP funkce se uplne nekousne a lze otevrit nabidku dalsich klavesnic ktere se ale neprepnou a uz se nezobrazuje "pruhledne" okno a misto nej je tam zakously otisk predchozi klavesnice... to jsem teda necekal ze to bude takovy problem vyporadat se s velikosti resp. vyskou canvasu SIPu :) :dead:
Uprimne netusim, co Vam tam muze tak haprovat.
A zkousel jste vsechny varianty zvlast? Zkousite to v PDAnebo jen v emulatoru? Zkusil jste si vypsat do souborunejake debug hlasky? Abyste vedel, jake funkce jsou volany a v jakem poradi a kdy se nektera volani zacykli?
Na starsich Windows CE, pro ktere jsem SIP psal, tyhle problemy fakt neznam...
A zkousel jste vsechny varianty zvlast? Zkousite to v PDAnebo jen v emulatoru? Zkusil jste si vypsat do souborunejake debug hlasky? Abyste vedel, jake funkce jsou volany a v jakem poradi a kdy se nektera volani zacykli?
Na starsich Windows CE, pro ktere jsem SIP psal, tyhle problemy fakt neznam...
Mno zkousel jsem to jen v emulatoru co je s WM5 SDK... jinak pokud vim vetsina kodu co byly na starsi WinCE tak na WinCE 5 nefungovala - cetl jsem nejaky diskuze kde byly popsany zmeny ale tak moc jsem tomu nerozumnel...
Emulator je obcas na tyto systemove hratky nespolehlivy.
O zmenach vim, proto jsem upravoval kod do poskytnuteho prikladu.
Pokud me nenapadne nic dalsiho, zkusim upravit a prepsat ten priklad. Ale pocitejte s tim az nekdy pristi vikend... po 15.11.
O zmenach vim, proto jsem upravoval kod do poskytnuteho prikladu.
Pokud me nenapadne nic dalsiho, zkusim upravit a prepsat ten priklad. Ale pocitejte s tim az nekdy pristi vikend... po 15.11.
mno jestli budete mit cas tak by to bylo fajn zkusit to primo na tom prikladu ;) zatim zkusim MSDN forum treba nekdo z tamnich bude vedet...
Tak zatim diky moc za pomoc a dobrou noc :)
Tak zatim diky moc za pomoc a dobrou noc :)
Ty svoje okno vytvaris jako child hlavniho SIP okna. Pokud to je maly, tak se muzes po...t, ale svoje nezvetsis. Musis zvetsit toho parenta. Takze v metode CInputMethod::Select:
[CODE]RECT rcSip;
GetWindowRect(hwndSip, &rcSip);
int hdiff = BITMAP_HEIGHT-(rcSip.bottom-rcSip.top);
MoveWindow(hwndSip, rcSip.left, rcSip.top-hdiff, BITMAP_WIDTH, BITMAP_HEIGHT, FALSE);
g_hwndMain = CreateWindow(g_ptszClassName,TEXT(""),WS_CHILD,0,0,BITMAP_WIDTH,BITMAP_HEIGHT,hwndSip,(HMENU)NULL,g_hInstDll,NULL );[/CODE]
[CODE]RECT rcSip;
GetWindowRect(hwndSip, &rcSip);
int hdiff = BITMAP_HEIGHT-(rcSip.bottom-rcSip.top);
MoveWindow(hwndSip, rcSip.left, rcSip.top-hdiff, BITMAP_WIDTH, BITMAP_HEIGHT, FALSE);
g_hwndMain = CreateWindow(g_ptszClassName,TEXT(""),WS_CHILD,0,0,BITMAP_WIDTH,BITMAP_HEIGHT,hwndSip,(HMENU)NULL,g_hInstDll,NULL );[/CODE]
Saman: Tak to me nenapadlo, ze se snazi bkf1 narvat vsechno do maleho okna, kdyz na zacatku psal, ze vsechny moznosti, jak tradicne okno zvetsit, zkousel :)
no jo no, pod svicnem byva nejvetsi tma :)
no jo no, pod svicnem byva nejvetsi tma :)
TO SAMAN:
Dikec funguje to ;) Fakt dik moc tohle je reseni myho problemu ;)
TO RSTEIN:
Mno ja zkousel vsechny moznosti, ktery mi davaji smysl + to co jste mi radil i kdyz je dost mozny ze jsem vase rady spatne pouzil... jako rikam jsem takovej ten hloupej Pascalista :D takze potrebuju vedet co presne kam hodit... vlastni hlavou vymyslim vetsinou jenom takovy ty z vaseho pohledu jednoduchy konstrukce typu IF...THEN atd. Kazdopadne vam dekuji moc za rady ;)
Dikec funguje to ;) Fakt dik moc tohle je reseni myho problemu ;)
TO RSTEIN:
Mno ja zkousel vsechny moznosti, ktery mi davaji smysl + to co jste mi radil i kdyz je dost mozny ze jsem vase rady spatne pouzil... jako rikam jsem takovej ten hloupej Pascalista :D takze potrebuju vedet co presne kam hodit... vlastni hlavou vymyslim vetsinou jenom takovy ty z vaseho pohledu jednoduchy konstrukce typu IF...THEN atd. Kazdopadne vam dekuji moc za rady ;)
Jeste mam jeden problem ktery me celkem zaskocil. Ten sample DvorakSip nezvlada psani ceskych znaku jako ěščřž atd. Po stisknuti tlacitka ke kteremu je prirazen takovy znak se nic nenapise (zadny znak). Zkousel jsem najit nejaky zpusob jak to vlozit treba ze bych misto konkretniho znaku napsal jeho kod treba u00e1 ale nefunguje :/ Nevite prosim nekdo jak z toho ven? Asi se znaky unicode pisou v jinem tvaru ne? Tusim ze v CSharpu staci napsat jen treba u00e1 a hned to vyhodi odpovidajici znak...
EDIT: tak jsem si nasel ze unicode znaky se pisou v takovym tvaru: '\u00E1'
ale stejne to nefunguje - zadny znak se nenapise :(
Nenapada nikoho aspon v ktere casti kodu bych mel hledat problem? Prosim aspon zkuste nekdo neco nahodit treba na to prijdu sam ;) Zkousel jsem to treba vyresit v casti
[CODE]typedef struct {
BYTE bVk;
UINT wcUnshift;
UINT wcShift;
UINT nCtrl;
DWORD fdwFlags;
int nLeft;
} KEYENTRY;[/CODE]
ale bez uspechu :(
Jinak sample je na [odkaz, pro zobrazení se přihlaste]
EDIT: tak jsem si nasel ze unicode znaky se pisou v takovym tvaru: '\u00E1'
ale stejne to nefunguje - zadny znak se nenapise :(
Nenapada nikoho aspon v ktere casti kodu bych mel hledat problem? Prosim aspon zkuste nekdo neco nahodit treba na to prijdu sam ;) Zkousel jsem to treba vyresit v casti
[CODE]typedef struct {
BYTE bVk;
UINT wcUnshift;
UINT wcShift;
UINT nCtrl;
DWORD fdwFlags;
int nLeft;
} KEYENTRY;[/CODE]
ale bez uspechu :(
Jinak sample je na [odkaz, pro zobrazení se přihlaste]