Začínám s WinAPI - problém s úpravou textu v textboxu
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í
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í
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]
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]
:) 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
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.