Visual C++ - kako koristiti MFC kontrole?

poruka: 110
|
čitano: 14.069
|
moderatori: XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
17 godina
neaktivan
offline
Visual C++ pomoć

evo ovako... radim jednu aplikaciju u visual c++-u. složio sam sučelje, i sad slijedi ono teže, trebam to sučelje "oživit".

 

pogledajte sliku i ovi se brojevi odnose na brojeve na slici

 

 

u combobox-u na broju 1 je lista od desetak i više riječi. kako da kad u programu odaberem određenu riječ ta neki drugi string u programu poprimi taj string s kojim ću dalje posebno baratati?

 

kako da kad kliknem na taj gumb broj 2 da se otvori openfile dijalog u kojem odabirem određenu datoteku pa da se onda u textbox-u na broju 3 ispise putanja do te datoteke?

 

kako da napravim da određena varijabla poprimi vrijednost 0 ako je checkbox na broju 4 odznačen, odnosno 1 ako je označen?

 

kako da vrijednost iz textboxa 5 poprimi neka int varijabla?

 

 

naravno, ne morate mi dat gotovi kod, nego me usmjerite gdje trebam traziti. što uopće trebam tražiti i na kojim mjestima? guglo bi ja, al kad ne znam ni sta terbam guglat Sramim seNeodlucan

Atomska bubamara
 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Visual C++ pomoć

Ne razumijem zašto se mučiš s mfc-om jer bi npr. u C++ Builderu ili C#-u bilo puno jednostavno. Ali dobro...

 

Glede combobox-a.. Prvo napravi desni klik na njega a zatim odabrati Add varijable... Pod Variable name unesi npr. MojCombo. Zatim prilikom klika na gumb postaviš ovaj code:

 

CString izabran;
if(MojCombo.GetCurSel() < 0){
    MessageBox(L"Ništa nije izabrano");
    return;
}
MojCombo.GetLBText(MojCombo.GetCurSel(), izabran);
MessageBox(izabran);

 

Ako želiš programski nešto staviti u combobox možeš upotrijebiti

 

MojCombo.AddString(L"Nešto");

 

Što se tiče odabira datoteke.. Također prvo napravi desni klik na editbox u koji želiš spremiti ime odabrane datoteke. Opet odaberi Add varijable, a pod Variable name unesi npr. MojEdit. Sada pri kliku na gumb unesi sljedeće:

 

CFile f;

CString strFilter = L"TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||" ;
CFileDialog FileDlg(true, L".bcr", NULL, 0, strFilter);

if( FileDlg.DoModal() == IDOK )
    MojEdit.SetWindowTextW(FileDlg.GetFileName());

 

Ako želiš doći do putanje datoteke možeš koristiti FileDlg.GetFolderPath().

 

Za slučaj CheckBox-a opet ponovi istu stvar kao i gore tj. dodaj tom objektu varijablu. Npr. MojCheckBox. Sada njegovo stanje provjeravaš ovako:

 

if(MojCheckBox.GetCheck() == 1)
    MessageBox(L"Označeno");
else
    MessageBox(L"Nije označeno");

 

I u zadnjem slučaju kada želiš neki broj iz edit polja spremiti u varijablu:

 

CString broj;
MojEdit.GetWindowText(broj);
int n = _wtoi(broj);

 

Umjesto dodjeljivanja varijabli objektima moguće im je pristupati preko identifikatora, no to ne bih preporučio.

 

 

 

17 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

polako se ja uhodavam u ovo, ide nakako... :)

nego, imam sljedeći problem. trebam System::String ^ pretvoriti u std::string. guglao sam, al to ništa ne radi kod mene

 

trebam od String ^-a doći do polja char znakova. pa sam prvo mislio String ^ pretvorit u String, pa onda njega u char *

Atomska bubamara
Poruka je uređivana zadnji put ned 5.6.2011 21:31 (jurluk).
 
0 0 hvala 0
17 godina
moderator
offline
Re: Visual C++ - kako koristiti MFC kontrole?

Imašovdje i ovdje nešto o tome.

17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

ma vidio sam ja to, al mi ništa od toga nije radilo

 

ali evo našao sam rješenje

 

trebam text iz textboxa pretvorit u char* pa sam to napravio ovako

 

String ^myString = textbox1->Text;
array<Byte> ^chars = System::Text::Encoding::ASCII->GetBytes(myString);
pin_ptr<Byte> charsPointer = &(chars[0]);
char *nativeCharsPointer = reinterpret_cast<char *>(static_cast<unsigned char *>(charsPointer));
std::string str(nativeCharsPointer, chars->Length);
char *name = new char [str.size()+1];
strcpy (name, str.c_str());

 

i dalje taj name onda predajem drugoj funkciji koja otvara datoteku sa fopen bez problema :D

Atomska bubamara
17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

pa ja ne mog vjerovat... isti taj kod mi radi u jednom projektu, a u drugom ne

 

error C2039: 'string' : is not a member of 'std'
error C2065: 'string' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 'str'
error C3861: 'str': identifier not found
error C2065: 'str' : undeclared identifier
error C2228: left of '.size' must have class/struct/union
    type is ''unknown-type''
error C2065: 'str' : undeclared identifier
error C2228: left of '.c_str' must have class/struct/union
    type is ''unknown-type''

 

Neodlucan

Atomska bubamara
17 godina
moderator
offline
Re: Visual C++ - kako koristiti MFC kontrole?

Da ti ne fali #include <string>?

17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

ahaha, pa ne mog vjerovat, da, to je falilo. a nije mi jasno, kako? u drugom projektu nisam uključio string, a radi ok. baš sam sad pregledo sve sourceove i headere i nigdje nema Neodlucan

Atomska bubamara
17 godina
moderator
offline
Re: Visual C++ - kako koristiti MFC kontrole?
jurluk kaže...

ahaha, pa ne mog vjerovat, da, to je falilo. a nije mi jasno, kako? u drugom projektu nisam uključio string, a radi ok. baš sam sad pregledo sve sourceove i headere i nigdje nema Neodlucan

Možda je na neki drugi način biblioteka string bila uključena (opcije za kompajler/linker?)

 

Uglavnom, čim ti se napiše "undeclaren identifier", odmah bi ti se trebala upaliti žaruljica - ili nisi uključio biblioteku u kojoj se nalazi taj identifikator, ili nisi odredio namespace, ili si pogrešno napisao (misspellao) identifikator u pitanju. Samo treba pročitati poruke o greški i malo razmisliti o svemu.

17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
mbaksa kaže...
Možda je na neki drugi način biblioteka string bila uključena (opcije za kompajler/linker?)

sumnjam, jer ja nisam ništa dirao, a oba projekta su istog tipa, windows forms aplication, no dobro...

Atomska bubamara
17 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

sad mi treba sljedeće. trebam napraviti da se u textbox unose samo brojevi. našao sam ovaj način. jel nema više ni jedan drugi? radi meni i taj, samo me zanima...

 

a kako ograničiti da se unose brojevi samo određenog intervala, npr [50, 100]?

Atomska bubamara
Poruka je uređivana zadnji put uto 7.6.2011 12:53 (jurluk).
 
0 0 hvala 0
17 godina
moderator
offline
Re: Visual C++ - kako koristiti MFC kontrole?
jurluk kaže...

sad mi treba sljedeće. trebam napraviti da se u textbox unose samo brojevi. našao sam ovaj način. jel nema više ni jedan drugi? radi meni i taj, samo me zanima...

 

a kako ograničiti da se unose brojevi samo određenog intervala, npr [50, 100]?

Postoji neki opravdani razlog da se ti mučiš s tim stvarima? Mislim... MFC - what's the point? U svakom normalnom GUI frameworku imaš nekakvu up-down kontrolu kojoj odrediš interval brojeva i ona se brine da se u textbox/edit nalaze samo brojevi u tom intervalu.

 

Ako se sam hoćeš s tim opterećivati, onda je jasno da trebaš napraviti handler za promjenu teksta u textboxu i gledati - ako se unutra nalazi neispravna vrijednost, onda "resetirati" vrijednost ili vratiti zadnju ispravno upisanu vrijednost.

15 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
jurluk kaže...

sad mi treba sljedeće. trebam napraviti da se u textbox unose samo brojevi. našao sam ovaj način. jel nema više ni jedan drugi? radi meni i taj, samo me zanima...

Zapravo ima, i to prilicno standardni nacin.

http://msdn.microsoft.com/en-us/library/bb775464%28v=vs.85%29.aspx

Dakle dodjeli Edit kontroli stil ES_NUMBER, i neces moci upisivati nista osim brojeva

 

jurluk kaže...

a kako ograničiti da se unose brojevi samo određenog intervala, npr [50, 100]?

Ovo je veoma zanimljiv problem. Recimo kako ces sprijeciti unos broja 9? Tvoj kod nece znati kani li korisnik upisati jos jednu devetku nakon ove prve ili ce ostati na prvoj...

Lakse bi ti bilo izvrsiti provjeru vrijednosti kada korisnik klikne na neku drugu kontrolu, i izbaciti poruku korisniku da je unesena vrijednost nevazeca.

 

Druga opcija koja mi pada na pamet je koristenje Slider kontrole kojoj bi pocetni broj bio 50, a krajnji 100...

So then I typed GOTO 500 - and here I am!
Poruka je uređivana zadnji put uto 7.6.2011 14:09 (rustweaver).
17 godina
moderator
offline
Re: Visual C++ - kako koristiti MFC kontrole?
rustweaver kaže...
Ovo je veoma zanimljiv problem. Recimo kako ces sprijeciti unos broja 9? Tvoj kod nece znati kani li korisnik upisati jos jednu devetku nakon ove prve ili ce ostati na prvoj...

Lakse bi ti bilo izvrsiti provjeru vrijednosti kada korisnik klikne na neku drugu kontrolu, i izbaciti poruku korisniku da je unesena vrijednost nevazeca.

Zapravo bi to trebao raditi na nekakav OnExit event - znači, kad textbox izgubi fokus. Nemam pojma ima li toga u MFC-u.

 

Zapravo, baš sad pogledao - event OnExit, ON_EN_KILLFOCUS: http://www.functionx.com/visualc/controls/editbox.htm

15 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
mbaksa kaže...

Zapravo bi to trebao raditi na nekakav OnExit event - znači, kad textbox izgubi fokus. Nemam pojma ima li toga u MFC-u.

 

Zapravo, baš sad pogledao - event OnExit, ON_EN_KILLFOCUS: http://www.functionx.com/visualc/controls/editbox.htm

Pa da, samo kad izgubi fokus. Drukcije ne ide, racunala ne citaju umove :D

So then I typed GOTO 500 - and here I am!
17 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

mah, ja sam dao glupi primjer pa sam vam s time samo zakomplicirao. naravno da bi bio problem da zapravo prihvaća brojeve iz intervala [50, 100], ali pri pisanju posta nisam mislio na to. meni zapravo najmanji broj treba bit 0, pa do nekog drugog, ovisi. tako da je stvar onda puno lakša

 

rustweaver kaže...
Zapravo ima, i to prilicno standardni nacin.

http://msdn.microsoft.com/en-us/library/bb775464%28v=vs.85%29.aspx

Dakle dodjeli Edit kontroli stil ES_NUMBER, i neces moci upisivati nista osim brojeva

što se tiče toga, to dozvoljava upis samo brojeva i ništa drugo? znači prema tome ne bih mogao unijeti točku koja bi mi bila decimalna točka?

 

uglavnom, ja sam to riješio ovako

 

 if (isdigit(e->KeyChar) || iscntrl(e->KeyChar) || e->KeyChar=='.') {
             e->Handled = false;
          }
          else {
             e->Handled = true;
          }

 

kako onda broj iz textboxa koji je zapravo string pretvorit u int/float?

ja sam to privremeno napravio onako String ^ preko string u char * pa onda atoi/atof :D  ima neki drugi bolji način?

Atomska bubamara
 
0 0 hvala 0
15 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
jurluk kaže...
što se tiče toga, to dozvoljava upis samo brojeva i ništa drugo? znači prema tome ne bih mogao unijeti točku koja bi mi bila decimalna točka?

Tocno tako. Jedini znak koji moze biti unesen je znamenka. Prouci si malo i ostale stilove na toj stranici, tek toliko da znas sto sve sa Edit kontrolom mozes raditi...

 

jurluk kaže...
kako onda broj iz textboxa koji je zapravo string pretvorit u int/float?

ja sam to privremeno napravio onako String ^ preko string u char * pa onda atoi/atof :D  ima neki drugi bolji način?

Ne vidim nista lose u atof, ako ti trebaju floating point brojevi, ali atoi je nepotreban jer postoji i:

GetDlgItemInt

 

EDIT: cini se da postoji i GetDlgItemFloat, nije dio standardnog Win32 API-ja, nego DirectX API-ja, dovoljno je kratka da ju mozes jednostavno prekopirati u svoj program:

 

float GetDlgItemFloat(HWND hDlg, int id){      TCHAR *pEnd;      TCHAR szItemText[20];      GetDlgItemText(hDlg, id, szItemText, 20);      return (float)strtod(szItemText, &pEnd);}

So then I typed GOTO 500 - and here I am!
Poruka je uređivana zadnji put uto 7.6.2011 15:40 (rustweaver).
17 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

"nabavio" sam Embarcadero RAD Studio 2010 pa sad mislim ovaj programčić napraviti i u njemu.

 

pa da vas odmah pitam da se hvatam tog posla ili ne? jer sam več dobar dio napravio, sad ide ono teže, pa ono...

 

nigdje u dokumentaciji ne mogu naći kojeg tipa je text u nekom textboxu? pa da ga onda pretvorim u char*

 

kako otvoriti drugu formu klikom na određeni gumb?

 

Neodlucan

Atomska bubamara
 
0 0 hvala 0
15 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
jurluk kaže...
nigdje u dokumentaciji ne mogu naći kojeg tipa je text u nekom textboxu? pa da ga onda pretvorim u char*

 

kako otvoriti drugu formu klikom na određeni gumb?

 

Neodlucan

Pa u textboxu i jest char* (tocnije winapi to naziva lpSz)

Mozda ti ovo pomogne: http://en.wikipedia.org/wiki/Hungarian_notation

 

Sto se otvaranja forme (dialoga) tice, bojim se da ti nisam od prevelike koristi, znam to u cistom API-ju izvesti, ali ne i u MFC-u, VCL-u ili nekom trecem frameworku.

 

So then I typed GOTO 500 - and here I am!
Poruka je uređivana zadnji put sri 8.6.2011 16:58 (rustweaver).
17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
rustweaver kaže...

Pa u textboxu i jest char* (tocnije winapi to naziva lpSz)

hmm, koliko vidim nije char* nego AnsiString, pa ovo onda ovo funkcionira

 

   AnsiString str =  Edit1->Text;
   const char *name = str.c_str();

 

edit:

zapravo mora ići const char * :)

Atomska bubamara
Poruka je uređivana zadnji put sri 8.6.2011 17:21 (jurluk).
15 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

AnsiString je borlandova umotvorina. Edit box kontrola u sebi drzi najobicniji char*. Posve je drugo kako C++ Builder pristupa kontroli...

 

Evo vise o tome

http://www.functionx.com/bcb/topics/strings.htm

So then I typed GOTO 500 - and here I am!
Poruka je uređivana zadnji put sri 8.6.2011 17:25 (rustweaver).
17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

znam, znam, baš sam i gledo one neke lekcije na toj stranici. ima svega...

e sad trebam napraviti da se unose samo brojevi, jer ono od jučer ne radi

 

kod bi trebao biti isti, samo ja ne znam dalje... ako je uopće i ovo točno :/

handled tu nešto ne štima

 

void __fastcall TForm2::t2KeyPress(TObject *Sender, wchar_t &Key)
{
    if(isdigit(Key) || iscntrl(Key) || Key=='.')
    {
       Key->Handled = false;
    }
    else
    {
       Key->Handled = true;
    }
}

 

Atomska bubamara
Poruka je uređivana zadnji put sri 8.6.2011 18:35 (jurluk).
16 godina
offline
Visual C++ - kako koristiti MFC kontrole?

Ja koristim vec dosta dugo ovu klasu, jako jednostavna za koristenje, a ima brdo funkcionalnosti, od toga da li dozvoljava samo integere, do broja decimalnih mjesta i range-a, te mozes zadati nedozvoljene znakove itd.

Lack of money is the root of all evil. George Bernard Shaw
 
0 0 hvala 0
17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

eh, al to ne mogu koristit sa VCL-om

 

sad vidim da textbox ima svojstvo NumbersOnly, ali kad ga stavim na true, onda ne mogu upisati ni točku

Atomska bubamara
17 godina
moderator
offline
Re: Visual C++ - kako koristiti MFC kontrole?
jurluk kaže...

eh, al to ne mogu koristit sa VCL-om

 

sad vidim da textbox ima svojstvo NumbersOnly, ali kad ga stavim na true, onda ne mogu upisati ni točku

Nemam sad instalirano ništa s VCL-om, no kod VCL-a imaš evente vezane uz upisani znak - OnKeyPress i slične. http://docwiki.embarcadero.com/VCL/en/Controls.TWinControl.OnKeyPress

 

Probaj vrijednost Key promijeniti u 0 ako ti ne odgovara znak (numerička znamenka ili decimalni separator). Ili, ako ne funkcionira, pozovi abort (toga ima u Delphiju, ne znam kako je u C++Builderu).

 

Edit: Zašto ne instaliraš neku već gotovu komponentu koja je namijenjena unosu brojeva? Većina komponenti za Delphi bi trebala biti kompatibilna i s C++Builderom:

http://www.torry.net/pages.php?id=88

 

 

Poruka je uređivana zadnji put čet 9.6.2011 21:13 (mbaksa).
16 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
rustweaver kaže...

Lakse bi ti bilo izvrsiti provjeru vrijednosti kada korisnik klikne na neku drugu kontrolu, i izbaciti poruku korisniku da je unesena vrijednost nevazeca.

 

Samo ne kroz dijalog!!
Ako nesto ne mogu smisliti, to je kad upisujem neke vrijednosti i onda tek kad zelim 'commitati' vrijednost, izbaci mi gresku.

 

Idealno rijesenje mi se pokazalo u obliku markiranja pogreske unutar opisne labele pored texta. Dodati ikonu s "X" ili eventualno obojati text u crveno. To je po uzoru na web siteove i radi sasvim dobro.

 

 

 

Edit:

jedna stvar koja se cesto vidja u GUI-ima, pa je eventualno bolje rijesenje od mojeg jer je ocekivano, je umjesto javljanja errora automatsko popravljanje unosa u granicu.

Dakle, prvo pored textboxa (iako bi ja koristio spinner kako je vec netko spomenuo) obavezno dodas labelu u kojoj naznacis granice, i onda ako netko unese broj koji je van granica, clippas broj.

You're such an inspiration for the ways that I'll never ever choose to be...... Oh so many ways for me to show you how the savior has abandoned you.....
Poruka je uređivana zadnji put čet 9.6.2011 21:13 (Deus ex machina).
15 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?
Deus ex machina kaže...

Samo ne kroz dijalog!!
Ako nesto ne mogu smisliti, to je kad upisujem neke vrijednosti i onda tek kad zelim 'commitati' vrijednost, izbaci mi gresku.

{#}

 

A nisam htio komplicirati. Ovo bojanje u crveno i ostali vizualni hintovi bi zakomplicirali cijelu stvar. Ali moram priznati da se nisam sjetio ove ideje sa trimmanjem vrijednosti u vazeci range. To je dokaz da je pravilno rjesenje uvijek ono najjednostavnije :D

So then I typed GOTO 500 - and here I am!
17 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

kako dinamički kreirati button ili više buttona na nekoj formi? znači prilikom izvođenja programa, korisnik odabere broj 1 do 5, i toliki broj buttona se stvori na formi. VCL, ne MFC

 

edit: ne treba, našao sam

 

jel se mora na kraju programa nekako osloboditi ta memorija sa delete, ili program to sam odradi? jer sam negdje pročitao da se to može, a i ne mora, jer to program sam odradi :/

 

edit2: našao sam kako stvoriti jedan, a kako više njih? jel može preko polja?

Atomska bubamara
Poruka je uređivana zadnji put čet 23.6.2011 18:59 (jurluk).
 
0 0 hvala 0
14 godina
neaktivan
offline
Visual C++ - kako koristiti MFC kontrole?

https://rapidshare.com/files/2050116641/Dynamic_button.zip

 

... a što se tiče otvaranje druge forme - jednostavno

 

Form2->ShowModal();

 

ili

 

Form2->Show();

 

Sam ćeš primjetiti razliku između ova dva poziva.

Poruka je uređivana zadnji put čet 23.6.2011 20:12 (TracerCPP).
Moj PC  
1 0 hvala 1
17 godina
neaktivan
offline
Re: Visual C++ - kako koristiti MFC kontrole?

ma savršeno! nema šta... hvala puno! :)

 

e sad, tracer jel znaš kako ograničiti da se u textbox unose samo brojevi uključujući i točku. evo ovdje sam to napravio za MFC, a sad mi treba za VCL :/

Atomska bubamara
Nova poruka
E-mail:
Lozinka:
 
vrh stranice