Recenze  |  Aktuality  |  Články
Doporučení  |  Diskuze
Auto-Moto
Mobilní telefony
Notebooky  |  Tablety
Příslušenství
Wearables  |  Ostatní
Svět hardware  |  Digimanie  |   TV Freak

Začínám s WinAPI - problém s úpravou textu v textboxu

Zax_ce4you (222)|4.8.2009 21:48
Zdravím,

rozhodl jsem se přejít z .NETu na nativní kód (důvody snad psát nemusím, programátoři by jistě vymysleli mnohem víc důvodů než já), bohužel už řeším zdánlivě nevyřešitelné...
Jako zkoušku jsem si řekl, že zkusím naprogramovat nějakou kalkulačku. Vykreslení prvků je bezproblémové, problém však nastává po stisknutí tlačítka s číslem. Po stisku by se měla vzít hodnota textboxu, k ní by se měl přidat znak číslice a to celé by se mělo zapsat zpět do textboxu. Problém je, že ihned po spuštění aplikace spadne. Přikládám problémový kód (bez něj aplikace nespadne):
[code]static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
TCHAR chText[100];
TCHAR chText2[100];
switch (msg)
{
case WM_COMMAND:
// Problémový kód BEGIN
if ( lParam == (LPARAM) g_but1 )
{
GetWindowText(g_text1,chText2,100); // Získání textu
_stprintf(chText, L"%s1", chText2); // Přidání číslice 1 za text
SetWindowText(g_text1,chText); // Vložení zpět do textboxu
}
// Problémový kód END
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_QUIT:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}[/code]

Původně byl problém v řádku
[code]_stprintf(chText, L"%s1", chText2);[/code]
Bez toho L před stringem mi kompilátor hlásí chybu
[code]Type error in argument 2 to 'swprintf'; expected 'const wchar_t *' but found 'char *'.[/code]
O přidání Lka jsem se dočetl zde, s Lkem se program zkompiluje bez chyby, ovšem padá.

Upozorňuji, že s WinAPI začínám a zatím dost tápu. Chápu, že pro někoho je toto banalita, pro mě je to však velký problém, který jsem zatím ani s Googlem nevyřešil :(

Předem děkuji všem

EDIT: Používám Pelles C

EDIT2:
Nový postřeh - zkusil jsem spustit tu padající verzi, okno se vykreslilo i se všemi prvky, podařilo se mi rychle (před spadnutím) tapnout na tlačítko 1 a výsledek je ten, že se stalo přesně to, co mělo - do textboxu se přidala jednička... zvláštní
RStein (2012)|5.8.2009 09:59
Dobrý den,
hlavní problém bude v tom, že vám chybí příkaz break. Takže přejdete do další sekce CASE, kde si pošlete QUIT message. :)
V C++ musí být každá sekce case ukončena příkazem break, jinak projdete všemi sekcemi ncase příkazu switch, které následují po první vyhovující (splňující podmínku) sekci case.
Jedna z "oblíbených" chyb v C++, V C# musíte s výjimkou prázdných sekcí CASE říci, co chcete udělat (break, goto case x).

[code]case WM_COMMAND:
{
// Problémový kód BEGIN
if ( lParam == (LPARAM) g_but1 )
{
GetWindowText(g_text1,chText2,100); // Získání textu
_stprintf(chText, L"%s1", chText2); // Přidání číslice 1 za text
SetWindowText(g_text1,chText); // Vložení zpět do textboxu
}
break;
}
[/code]
Zax_ce4you (222)|5.8.2009 11:39
:) teď by se mi hodil smajlík chytající se za hlavu :) čekal jsem banalitu, ale až takovou fakt ne.. přiznávám, že tohle byla skutečně blbost, na kterou jsem mohl přijít sám :-D díky moc
Basičan (11)|29.8.2009 17:10
Pro tento případ doporučuji knihu Windows Api (jsou tam snad všechny možné i nemožné postupy), akorát v programu PelesC jsem měl problémy s češtinou.