Eli tutustuin VIsual studioon ja sillä windows koodaamiseen. Ongelmia kuitenkin.
Jos teen kirjoituskenttiä esim:
Nopeus:
Voima:
Ketteryys:
Niin miten saan näiden tiedot kirjoitettua hyväksymis nappulaa painaessa tekstitiedostoon?
Edit:
+ sellainen pieni ongelma. että en saa horizontal slideria tulostettua? Yritän saada sitä "static text" alueeseen tulostettua, mutta ei millään konstilla ohjeita?
Yhdistä "hyväksymisnappula" funktioon, ns. "slot" ainakin Qt:ssa, WINAPI:sta en tiedä. Funktiossa jotain tällaista:
std::ofstream virta ("ominaisuudet"); virta << "Nopeus;" << nopeuskentta->value () << std::endl; virta << "Voima;" << voimakentta->value () << std::endl; virta << "Ketteryys;" << ketteryyskentta->value () << std::endl; virta.close();
En siis osaa WINAPI:a, mutta olettaisin, että jotain tuohon suuntaan :)
Mites sitten käytännössä tuo onnistuu Visual Studion C++:lla? Kyseessähän on recourse tiedostot ja dialogit jotka rakennetaan toolboxista. Jos tekstikentän nimi on esim IDC_EDIT1, niin koodi ei toimi jos merkkaan:
IDC_EDIT1->value, vaan tulee virhe:
Error 1 error C2227: left of '->value' must point to class/struct/union/generic type c:\users\mika\documents\visual studio 11\projects\win32project9\win32project9\
const int TEKSTI_PITUUS_MAX = 256; CString strText; GetDlgItem(IDC_EDIT)->GetWindowText(strText, TEKSTI_PITUUS_MAX); // GetDlgItem(IDC_EDIT)->GetWindowText(strText);
Tuo kirjoittaa idc_editin arvon strText-muuttujaan, ainakin tämän mukaan.
Lisäys: Ehdottaisin otsikon muuttamista osuvammaksi, mm. hakukoneoptimointia ajatellen ;)
Lisäys: GetWindowText
Tuossa vielä määrittely linkissä. Virhevisti siis johtuu siitä, että IDC_EDIT1 ei ole olio, vaan ID, jolloin on käytettävä GetDlgItem-funktiota palauttamaan olio, joka vastaa kyseistä edittiä.
Lisäsin koodiin vielä ton TEKSTI_PITUUS_MAX-vakion, koska GetWindowText taitaa haluta toisena parametrina luettavien merkkien määrän ylärajan. Haluaisi se vielä ensimmäiseksi parametriksi jonkun handlen, mutta kun vähän googlaa, niin ei porukka näytä antavan kuin yhden parametrin, eli sen stringin. En näistä tiedä :D Joku viisaampi voisi valaista asiaa.
Vesikuusen koodi toimii MFC-projekteissa, mutta Mika taitaa käyttää raakaa WinAPIa.
char *buf; int len; /* hDlg on kahva minkä saat luodessasi dialogin. */ /* IDC_EDIT on resursseissa määritetty tunnus editille, jonka haluat lukea */ GetWindowTextLength(GetDlgItem(hDlg, IDC_EDIT)); if (len > 0 && (buf = (char*)malloc(len+1))) { len = GetWindowText(GetDlgItem(hDlg, IDC_EDIT), buf, len); /* kirjoita puskurista len määrä tavuja tiedostoon */ free(buf); }
mika132 kirjoitti:
sellainen pieni ongelma. että en saa horizontal slideria tulostettua? Yritän saada sitä "static text" alueeseen tulostettua, mutta ei millään konstilla ohjeita?
Windowsista ei löydy valmista mekanismia scroll barin sitomiseen staattiseen tekstikenttään. Helpoin tapa tuon ympäri on käyttää edit-kontrollia, jolle antaa tyylit WS_HSCROLL | ES_MULTILINE | ES_READONLY
sekä jättää laajennettu tyyli WS_EX_CLIENTEDGE
pois, jolloin lopputulos näyttää tältä.
Kannattaa harkita johonkin moderniin GUI-kirjastoon tutustumista, koska ne ovat helpompia käyttää.
No siis joo. En ymmärrä tätä erroria:
Error 1 error C2664: 'GetWindowTextW' : cannot convert parameter 2 from 'char *' to 'LPWSTR'
Saan tuon aina. Käytin yllä olevaa koodia ja tuo errori rivi on:
len = GetWindowText(GetDlgItem(hDlg, IDC_EDIT1), buf, len);
Eikös tuo nyt ole aika helppo ymmärtää.. Olet määritellyt, että käytät unicode funktioita (wide eli W) ja GetWindowText on siis alias GetWindowTextW:lle joka haluaa toiseksi parametriksi LPWSTR eli Long Pointer to Wide STRing eli wchar_t* ja sinä annat char*
Eli ainakin hyvin selvästi ongelmana on, että et voi antaa 8-bittisiä merkkejä sisältävää merkkijonoa funktiolle, jolle pitäisi antaa 16-bittisiä merkkejä.
Aiheesta lisää esim.
http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc
mika132 kirjoitti:
No siis joo. En ymmärrä tätä erroria: ...
Vaihda projektin asetuksista merkistö tai käytä wchar_t
-tyyppiä merkkijonoille.
Aihe on jo aika vanha, joten et voi enää vastata siihen.