Problém s kalkulačkou – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s kalkulačkou – C / C++ – Fórum – Programujte.comProblém s kalkulačkou – C / C++ – Fórum – Programujte.com

 

Dox
~ Anonymní uživatel
1 příspěvek
16. 3. 2008   #1
-
0
-

Delam si takovou jednoduchou kalkulacku. Chci aby fungovala á la Kalkulačka Windows. Tzn po stisku tlacitka operatoru, mi zustanou cisla v edit box, smazou se az po druhem kliknuti na jakekoliv tlacitko nebo stisknuti klavesy cislice.
Chtel jsem to resit pomoci promenne BOOL clear, pokud jeji hodnota bude TRUE, pak po stisku leveho tlacitka mysi se text v edit boxu smaze.
Jenomze pri kliknuti na jednotlive tlacitka se zprava WM_LBUTTONDOWN asi vubec neposila :) Posle se pouze pokud kliknu v nejake oblasti okna a ne na tlacitka.

Jak tohle resit aniz bych nemusel pridat podminku



if(clear==true) {
SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TEXT(""));
clear = false;
}

Ke kazdemu tlacitku ?



INT_PTR CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

switch (uMsg)
{
case WM_INITDIALOG:
SetClassLongPtr(hWnd, GCLP_HICONSM, (LONG_PTR)LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON1)));

break;

case WM_LBUTTONDOWN:
if(clear==true) {
SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TEXT(""));
clear = false;
}
break;

case WM_COMMAND:
switch (LOWORD(wParam))
{
case BT_C:
SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TEXT(""));
number = 0;
buffer = 0;
break;


case BT_PLUS:
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText, 200);

tstrtoc_s(TchText, lstrlen(TchText), ChText);
buffer = atof(ChText); //nahrati cisel do promenne buffer
operation = 1; //nastaveni operace scitani
//SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TEXT(""));
clear = true;
break;

case BT_MINUS:
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText, 200);

tstrtoc_s(TchText, lstrlen(TchText), ChText);
buffer = atof(ChText); //nahrati cisel do promenne buffer
operation = 2; //nastaveni operace scitani
//SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TEXT(""));
clear = true;
break;

case BT_EQUALS: //tlacitko =
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText, 200);

tstrtoc_s(TchText, lstrlen(TchText), ChText);
number = atof(ChText);

switch(operation)
{
case 1:
number = buffer + number;
sprintf_s(ChText, "%f", number);
cstrtot_s(ChText, sizeof(ChText), TchText);

SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText);

break;
case 2:
number = buffer - number;
sprintf_s(ChText, "%f", number);
cstrtot_s(ChText, sizeof(ChText), TchText);

SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText);

break;
}

break;

case BT_0:
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText, 200);
lstrcat(TchText, TEXT("0")); //prida znak k TCHAR TchText
SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText);
break;
case BT_1:
GetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText, 200);
lstrcat(TchText, TEXT("1")); //prida znak k TCHAR TchText
SetWindowText(GetDlgItem(hWnd, IDC_EDIT), TchText);
break;

//atd...jednotliva tlacitka cisel

case WM_DESTROY:
PostQuitMessage(0);
break;

}
break;
}
return FALSE;
}


btw Jaky je rozdil mezi tlacitkem C a CE ? :)

Nahlásit jako SPAM
IP: 213.192.4.–
Jura
~ Anonymní uživatel
637 příspěvků
16. 3. 2008   #2
-
0
-

Zdravím,

zpráva WM_LBUTTONXX, se posílá, když uživatel klikne na KLIENTSKOU oblast okna, tzn. mimo DĚTSKÁ okna. Pokud bych to musel psát v C, tak bych to udělal, asi takto:




TCHAR chBuf[ MAX_BUF ];
HWND hWndCtl = ( HWND ) lParam; // podle MSDN by melo byt v lParam handle detskeho okna, pokud ne, tak ziskavat pres GetDlgItem( hWnd, LOWORD( wParam ) )
// ziskam text z deskeho okna
GetWindowText( hWndCtl, chBuf, MAX_BUF );
// tady si zjistis, jestli se jedna o operaci, tzn. v chBuf[0] bude '+', '-', '*', '=' atd. a osetrit CE a C !!!!
int iOperationID = VybranaOperaceCislo( chBuf );
if( iOperationID != -1 )
{
// byla vybrana operace s ID, tak to nejak zpracuj
}
else // kliklo se na nejaky prvek
{ TCHAR chEditText[ MAX_EDIT_TEXT ];
GetWindowText( GetDlgItem( Wnd, IDC_EDIT ), chEditText, MAX_EDIT_TEXT );
int iLength = lstrlen( chEditText );
if( iLength < MAX_EDIT_TEXT )
{ chEditText[ iLength ] = chBuf[0];
SetWindowText( GetDlgItem( hWnd, IDC_EDIT ), chEditText );
}
}



No, psano z hlavy, ale myslenka je snad jasna.

Nahlásit jako SPAM
IP: 85.207.192.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 30 hostů

Podobná vlákna

Problem s &lt; a &gt; — založil 7raul

Problém — založil Ma.ty

Problém — založil Dfire

Problém v C++ — založil Anonim

Problem — založil roonill

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý