C++ wxWidgets i notatnik


(arekk-99) #1

Witajcie.
Chciałem sobie napisać taki fajny notatniczek, bo zacząłem się uczyć wx z c++
Skorzystałem z tego linka:
http://www.dreamincode.net/forums/topic/67058-wxwidgets-part-iii-creating-a-notepad-application/
Ale nie pojawia mi się okienko. Może ktoś mi na to zerknąć?
Informuję, że kod przepisywałem, a nie przeklejałem. Wolałbym mieć to w więcej, niż jednym pliku, więc podzieliłem sobie to wg klas.
mainapp.h:

#include "notemain.h"
class MainApp: public wxApp
{
public:
virtual bool onInit();
};

mainapp.cpp:

#include "mainapp.h"
wxIMPLEMENT_APP(MainApp);
bool MainApp::onInit()
{
Notepad *main = new Notepad();
main->Show(true);
return true;
}

notemain.h:

#include <wx/wxprec.h>
#ifndef WX_PRECOMP
    #include <wx/wx.h>
#endif
class Notepad: public wxFrame
{
public:
Notepad();
private:
wxMenuBar *menu;
wxMenu *file;
wxTextCtrl *text;
void onSave(wxCommandEvent &e);
void onOpen(wxCommandEvent &e);
void onExit(wxCommandEvent &e);
wxDECLARE_EVENT_TABLE();
};
enum controls {ID_SAVE = 1000, ID_OPEN, ID_EXIT};

ostatni plik, notemain.cpp:

#include "notemain.h"
wxBEGIN_EVENT_TABLE(Notepad, wxFrame)
EVT_MENU(ID_SAVE, Notepad::onSave)
EVT_MENU(ID_OPEN, Notepad::onOpen)
EVT_MENU(ID_EXIT, Notepad::onExit)
wxEND_EVENT_TABLE()
Notepad::Notepad() : wxFrame(NULL, wxID_ANY, wxT("Simplenote"), wxDefaultPosition, wxSize(1024,600))
{
this->menu = new wxMenuBar();
this->file = new wxMenu();
this->file->Append(ID_SAVE, wxT("Zapisz\tctrl+s"));
this->file->Append(ID_OPEN, wxT("Otwórz\tctrl+o"));
this->file->AppendSeparator();
this->file->Append(ID_EXIT, wxT("Zamknij\tctrl+q"));
this->menu->Append(file, wxT("&Plik"));
this->SetMenuBar(menu);
this->text = new wxTextCtrl(this, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER | wxTE_MULTILINE);
CreateStatusBar();
}
void Notepad::onSave(wxCommandEvent &e)
{
wxFileDialog *sd = new wxFileDialog(this, wxT("Zapisz Plik~"), wxT(""), wxT(""), wxT("Wszystkie pliki (*.*)"), wxFD_SAVE);
int resp = sd->ShowModal();
if(resp == wxID_OK)
{
this->text->SaveFile(sd->GetPath());
}
}
void Notepad::onOpen(wxCommandEvent &e)
{
wxFileDialog *od = new wxFileDialog(this, wxT("Otwórz plik"), wxT(""), wxT(""), wxT("Wszystkie pliki (*.*)"), wxFD_OPEN);
int resp = od->ShowModal();
if(resp == wxID_OK)
{
this->text->LoadFile(od->GetPath());
}
}
void Notepad::onExit(wxCommandEvent &e)
{
Close(true);
}

(Fizyda) #2

W mainapp.cpp na samym końcu brakło: IMPLEMENT_APP(MainApp)


(arekk-99) #3

a NIE MOŻE BYĆ NA POCZĄTKU?


(Fizyda) #4

Nie powinno mieć znaczenia, po prostu nie zauważyłem, że użyłeś tego makra. Patrzyłem jeszcze w kod i nic więcej do głowy mi nie przychodzi :frowning: .


(arekk-99) #5

Dobra, musi być OnInit, zamiast onInit.
Wiesz jak przechwycić z parametru wejściowego ścieżkę do pliku i od razu go otworzyć?


(Fizyda) #6

W wxWidget nie bo nie znam w ogóle biblioteki, ale myślę, że problem jest na tyle prosty, że znajdzie się rozwiązanie na stack overflow.

EDIT:
No i się nie pomyliłem, od razu pierwszy link i gotowe rozwiązanie i to nawet w dokumentacji biblioteki: https://wiki.wxwidgets.org/Command-Line_Arguments


(arekk-99) #7

Dobra, dzięki. :smiley:


(arekk-99) #8

Dobra. Nie chcę tworzyć następnego tematu, gdyż sprawa nadal dotyczy tego samego. Skonfigurowałem sobie visual studio, zebym mógł pracować z wx. Chcę otworzyć plik podany w parametrze, ale mam problem.

#include "notemain.h"
class MainApp: public wxApp
{
public:
virtual bool OnInit();
virtual void OnInitCmdLine(wxCmdLineParser &parser);
virtual bool OnCmdLineParsed(wxCmdLineParser &parser);

};
static const wxCmdLineEntryDesc g_cmdLineDesc[] =
{
	{ wxCMD_LINE_SWITCH, wxT("h"), wxT("help"), wxT("displays help on the command line parameters"),
	wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
	{ wxCMD_LINE_SWITCH, wxT("t"), wxT("test"), wxT("test switch"),
	wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_MANDATORY },
	{ wxCMD_LINE_SWITCH, wxT("s"), wxT("silent"), wxT("disables the GUI") },
	{ wxCMD_LINE_NONE }
};
DECLARE_APP(MainApp);

Błąd jest w ostatnim };
błędy 2440. Nie można skonwertować const wchar_t ileś tam do const char. Czyli:
error C2440: ‘initializing’ : cannot convert from ‘const wchar_t [5]’ to ‘const char *’ Category: Error, Default Order: 2, Description: error C2440: ‘initializing’ : cannot convert from ‘const wchar_t [5]’ to ‘const char *’, File: d:\projekty\simplenote\mainapp.h, Line: 18, Column: 1, Project: simplenote

Co z tym zrobić?


(Fizyda) #9

Przeczytaj: http://docs.wxwidgets.org/3.0/group__group__funcmacro__string.html#ga437ea6ba615b75dac8603e96ec864160 oraz poczytaj o różnicy pomiędzy char i wchar_t.


(arekk-99) #10

Dobra, ale to i tak mi nic nie wyjaśnia. Nie przepisywałem tego, a skoro podają to w przykładach na oficjalnej wiki, no to powinno działać.
Co jest źle i co muszę poprawić, by mi ot ruszyło tak, jak powinno?
I jeszcze jedno pytanie. Jak ustawiłem sobie sn jako domyślny program odczytujący dokumenty tekstowe, to i tak z argumentów nie otwiera mi pliku tekstowego. Jak to wygląda? Jaki parametr Windows przekazuje, że NOtepad wie, jak ten plik otworzyć, i że to w ogóle jest plik?


(Fizyda) #11

To nie przepisywałeś, czy podają tak w przykładach? Podaj link do przykładów bo może ja czegoś nie wiem zwłaszcza, że w życiu nie używałem tej biblioteki.

Nie wiem, ale jestem pewny, że google wie i już ktoś pytał o to milionowy raz i otrzymał tysiąc odpowiedzi. Ja zgaduję, że trzeba dodać wpis do rejestru systemowego.


(arekk-99) #12

Tutaj
https://wiki.wxwidgets.org/Command-Line_Arguments


(Fizyda) #13

No to nie wiem, być może ktoś popełnił błąd lub przykład był napisany dla jakiejś starszej wersji i nie zaktualizowany. Spróbuj nie używać klasy wxT tylko zwykłe cstringi.


(arekk-99) #14

Dobra, pomogło.
Teraz kolejny problem. wx nie reaguje na to, że chcę używać unicode, więc zamiast normalnych Polskich znaczków i w menu aplikacji i w plikach otwieranych z parametrów wywala dziwne krzaczki. Character Set jest ustawiony use unicode character set w ustawieniach projektu.


(Fizyda) #15

Chyba nie liczysz na to, że będę szukał rozwiązania w necie każdego Twojego problemu? Nie znam tej biblioteki i w ogóle szczerze mówiąc nie chcę znać bo uważam, ze są inne dużo lepsze. Znajdź jakąś grupę czy kanał pomocy dla tej biblioteki i pytaj ludzi którzy z nią pracują, albo szukaj w google rozwiązań bo na 100% twój problem jest rozwiązany i ktoś już o to pytał na stacku.