wxWidgets 에 zip 과 png, jpg 추가 하기

============================================
image 추가

#include "wx/wx.h"

bool MyApp::OnInit()
{
#if wxUSE_LIBPNG
    wxImage::AddHandler(new wxPNGHandler);
#endif
#if wxUSE_LIBJPEG
    wxImage::AddHandler(new wxJPEGHandler);
#endif


============================================
zip 추가

#include "wx/fs_zip.h"

bool MyApp::OnInit()
{
    wxFileSystem::AddHandler(new wxZipFSHandler);
Posted by stekilove
,
wxWidgets 에서 sound call

#include "wx/sound.h"
#include "wx/numdlg.h"

bool MyFrame::playAsyncOnStack()
{
    wxString sndFile=wxString("9000g.wav");
    wxBusyCursor busy;
    wxSound snd(sndFile);
    if (snd.IsOk()) snd.Play(wxSOUND_ASYNC);
    return snd.IsOk();
}
Posted by stekilove
,
wxWidgets 에서 wxHtmlWindow 에
tag를 추가 하는 cpp 만들기.

#include "wx/wxprec.h"

#ifdef __BORLANDC__
    #pragma hdrstop
#endif

#if wxUSE_HTML && wxUSE_STREAMS

#ifndef WX_PRECOMP
    #include "wx/textctrl.h"
    #include "wx/html/htmlwin.h"
    #include "wx/html/m_templ.h"
#endif

TAG_HANDLER_BEGIN(MYBIND, "MYBIND")

TAG_HANDLER_PROC(tag)
{
    wxWindow *wnd;
    int ax, ay;
    int fl = 0;

    tag.ScanParam(wxT("X"), wxT("%i"), &ax);
    tag.ScanParam(wxT("Y"), wxT("%i"), &ay);

    if (tag.HasParam(wxT("FLOAT"))) fl = ax;

    wnd = new wxTextCtrl(
        m_WParser->GetWindow(),
        wxID_ANY,
        tag.GetParam(wxT("NAME")),
        wxPoint(0,0),
        wxSize(ax, ay),
        wxTE_MULTILINE
    );

    wnd->Show(true);

    m_WParser->GetContainer()->InsertCell(new wxHtmlWidgetCell(wnd, fl));

    return false;
}

TAG_HANDLER_END(MYBIND)



TAGS_MODULE_BEGIN(MyBind)

    TAGS_MODULE_ADD(MYBIND)

TAGS_MODULE_END(MyBind)


#endif
Posted by stekilove
,

wxWidgets 에서 wxHtmlWindow 를 사용해서
나만의 custom tag를 만들어서 event를 추가 했다.
초보적인 접근 방법이라 부끄럽다. -_-;;

class MyFrame : public wxFrame
{
public:
    <<생략>>
    void OnClicked(wxCommandEvent& event){

         if(event.GetEventType() == wxEVT_COMMAND_BUTTON_CLICKED ){
             wxMessageBox(((wxButton *)event.GetEventObject())->GetLabel() );
         }
        
    };
}

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    <<생략>>
    EVT_BUTTON (wxID_OK, MyFrame::OnClicked)
END_EVENT_TABLE()




================================================[ wxHtmlWindow 사용시 ]
/*


TAG HANDER FOR 'MYBUTTON' TAG


*/

 
TAG_HANDLER_BEGIN(MYBUTTON, "MYBUTTON")
   
    TAG_HANDLER_PROC(tag)
    {
        wxWindow *wnd;
        int ax, ay;
        int fl = 0;
       
        tag.ScanParam(wxT("X"), wxT("%i"), &ax);
        tag.ScanParam(wxT("Y"), wxT("%i"), &ay);
       
        wnd = new wxButton(m_WParser->GetWindow(),
                                      wxID_OK,
                                      tag.GetParam(wxT("NAME")),
                                      wxPoint(ax, ay));
        wnd->Show(true);
   
        m_WParser->GetContainer()->InsertCell(new wxHtmlWidgetCell(wnd, fl));
   
        return false;
    }

TAG_HANDLER_END(MYBUTTON)

TAGS_MODULE_BEGIN(MyButton)
    TAGS_MODULE_ADD(MYBUTTON)
TAGS_MODULE_END(MyButton)



======================================[ html ]
<myButton name="voice" x=100 y=30>
<myButton name="korean" x=100 y=30>


======================================[연구]
wxButton을 상속받아서
html element의 속성 ( 예. id, name, value 등 )을
설정할 수 있는 field를 추가 해 보자.

IMG, MAP, AREA등 괜찮은 html 구현 소스가 있는 곳
   http://stuff.mit.edu/afs/sipb/project/vlcplayer/src/wxGTK-2.8.7/src/html/
Posted by stekilove
,
wxWidgets 2.9.0

Dev-C++ 에서 컴파일 시 parameter 순서. ^^;;
html을 사용할 때 아래와 같이 했었다.
불필요한 library들도 있긴 하지만
앞으로 모든 것을 적용한다는 가정 하에 남겨 두었다.

==========================================
-s -mthreads -mwindows

-lwx_mswu_html-2.9

-lwx_mswu_core-2.9
-lwx_baseu-2.9

-lwx_mswu_gl-2.9
-lwx_baseu_net-2.9
-lwx_baseu_xml-2.9

-lwx_mswu_richtext-2.9

-lwx_mswu_aui-2.9
-lwx_mswu_adv-2.9
-lwx_mswu_xrc-2.9
-lwx_mswu_media-2.9
-lwx_mswu_propgrid-2.9
-lwx_mswu_qa-2.9

-lwxexpat-2.9
-lwxjpeg-2.9
-lwxpng-2.9
-lwxregexu-2.9
-lwxtiff-2.9
-lwxzlib-2.9
-lwxscintilla-2.9

-lrpcrt4 -loleaut32 -lole32 -luuid -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -lctl3d32 -ladvapi32 -lwsock32 -lgdi32

==========================================================

wxwidgets library map
wxwidgets 2.9.0 devpack 구한 곳

Posted by stekilove
,
wxWidgets

wxHtmlWindow 상속받아서
OnLinkClicked 를 overriding 해 본다.

==================== 클래스 =========================
class MyHtmlWin : public wxHtmlWindow {
public:
    MyHtmlWin(){}
    MyHtmlWin( wxWindow *parent ) : wxHtmlWindow( parent ){}
    ~MyHtmlWin(){}
    virtual void OnLinkClicked(const wxHtmlLinkInfo& link)
    {
        wxString msg;
        msg.Append(wxString("link to [")).Append(link.GetHref()).Append(wxString("]"));
          
        wxString msgTitle;
        msgTitle.Printf(_T("Message (%s)"), wxVERSION_STRING );
        wxMessageBox(msg, msgTitle, wxOK | wxICON_INFORMATION, this);

        wxHtmlWindow::OnLinkClicked(link);
      
    }
};

==================== 사용 =========================
MyHtmlWin *html;

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame((wxFrame *)NULL, wxID_ANY, title, pos, size)
     html = new MyHtmlWin(this);
    html -> SetRelatedFrame(this, _("HTML : %s"));   
    html -> SetRelatedStatusBar(0);  // 상태바
    html -> LoadPage(wxT("start.htm"));
Posted by stekilove
,
It's very simple program, but very difficult for me at that time.
cause, I'm newbie.

i made this to use wxWidget sample project layout.

//============================================================================
// Name        : prjEx02.cpp
// Author      : stekilove@gmail.com
// Version     :
// Copyright   : Copy right stekilove@gmail.com.
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <wx/wxprec.h>
#ifndef WX_PRECOMP
   #include <wx/wx.h>
#endif

#include "wx/statline.h"

class MainApp: public wxApp
{
  public:
      virtual bool OnInit();
};

class MainFrame: public wxFrame
{
  public:
      MainFrame(const wxString &title, const wxPoint &pos, const wxSize &size);
      wxButton *btnOk;
      wxTextCtrl * wtcOutput;
      wxTextCtrl * wtcAnswer;
      void onQuit(wxCommandEvent &event);
      void onButtonOk(wxCommandEvent &event);
      void onTextAnswerEnter(wxCommandEvent &event);
  private:
      DECLARE_EVENT_TABLE()
};

enum
{
   ID_MAINWIN_QUIT = wxID_HIGHEST+1
   , ID_BUTTON_OK
   , ID_BUTTON_NEXT
   , ID_TEXT_ANSWER_ENTER
};


BEGIN_EVENT_TABLE(MainFrame, wxFrame)
    EVT_MENU(ID_MAINWIN_QUIT, MainFrame::onQuit)
    EVT_BUTTON(ID_BUTTON_OK, MainFrame::onButtonOk)
    EVT_TEXT_ENTER(ID_TEXT_ANSWER_ENTER, MainFrame::onTextAnswerEnter)
END_EVENT_TABLE()

IMPLEMENT_APP(MainApp)

bool MainApp::OnInit()
{
   MainFrame *win = new MainFrame(_("Frame"), wxPoint (100, 100), wxSize(450, 340));
   win->Show(TRUE);
   SetTopWindow(win);

   return TRUE;
}

MainFrame::MainFrame(const wxString &title, const wxPoint &pos, const wxSize &size)
    : wxFrame((wxFrame *) NULL, -1, title, pos, size)
{
    wxMenu *FileMenu = new wxMenu;
    wxMenuBar *MenuBar = new wxMenuBar;

    FileMenu->Append(ID_MAINWIN_QUIT, _("&Quit 종료."));

    MenuBar->Append(FileMenu, _("&File"));
    SetMenuBar(MenuBar);

    CreateStatusBar(2);
    SetStatusText(_("Welcome my steki world!"));

    //=====================================================
    //TODO: steki's coding...

    // make main panel..
    wxPanel *p = new wxPanel(this,-1);

    // make component..
    wxStaticBox *sb = new wxStaticBox(p, wxID_ANY, _T("Image or picture"));
    wxStaticText *st = new wxStaticText( p, wxID_ANY, _T("Steki and Tong loves each other!!"));
    wtcOutput = new wxTextCtrl( p, wxID_ANY, _T("some output text.."), wxDefaultPosition, wxSize(100,60), wxTE_MULTILINE );
    wxStaticLine *sl = new wxStaticLine( p, wxID_ANY, wxDefaultPosition, wxSize(3,3), wxHORIZONTAL);
    wxStaticText *stAnswer = new wxStaticText(p, wxID_ANY, _T("Label"));
    wtcAnswer = new wxTextCtrl(p, ID_TEXT_ANSWER_ENTER, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER);
    wxButton *btnNext = new wxButton( p, ID_BUTTON_NEXT, _T("Next"));
    btnOk = new wxButton( p, ID_BUTTON_OK, _T("Ok"));

    // add component into layout..
    wxBoxSizer *statsizer = new wxStaticBoxSizer( sb , wxVERTICAL );
    statsizer->Add (  st        ,    wxSizerFlags().Align(wxALIGN_LEFT).Border(wxALL, 30));

    wxGridSizer *gridsizer = new wxGridSizer(2, 5, 5);
    gridsizer->Add(  stAnswer    , wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL));
    gridsizer->Add(  wtcAnswer    , wxSizerFlags(1).Align(wxGROW | wxALIGN_CENTER_VERTICAL));

    wxBoxSizer *button_box = new wxBoxSizer( wxHORIZONTAL );
    button_box->Add(  btnOk        , wxSizerFlags().Border(wxALL, 7));
    button_box->Add(  btnNext    , wxSizerFlags().Border(wxALL, 7));

    wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
    topsizer->Add(  statsizer    , wxSizerFlags(1).Expand().Border(wxALL & ~wxBOTTOM, 10));
    topsizer->Add(  wtcOutput     , wxSizerFlags(1).Expand().Border(wxALL, 5) );
    topsizer->Add(    sl            ,wxSizerFlags().Expand());
    topsizer->Add(  gridsizer     , wxSizerFlags().Expand().Expand().Border(wxALL, 1) );
    topsizer->Add(  button_box     , wxSizerFlags().Center() );

    p->SetSizer( topsizer );

    topsizer->SetSizeHints( this );
}

void MainFrame::onQuit(wxCommandEvent & WXUNUSED(event))
{
    int answer = wxMessageBox("Quit program?", "Confirm", wxYES_NO, this);
    if (answer == wxYES)
        Close(TRUE);
}

void MainFrame::onButtonOk(wxCommandEvent & WXUNUSED(event))
{
    int answer = wxMessageBox("Quit program?", "Confirm", wxYES_NO | wxCANCEL, this);
    if (answer == wxYES)
        Close(TRUE);
}

void MainFrame::onTextAnswerEnter(wxCommandEvent & WXUNUSED(event))
{
    wtcOutput->AppendText( wtcAnswer->GetValue().Append("\n") );
    wtcAnswer->Clear();
}

Posted by stekilove
,
출처: http://scroogie.de/index.php?/archives/61-Qt4-in-Eclipse.html
번역: stekilove@gmail.com
사죄의 글: 번역시 존칭은 생략합니다.
               그리고, 영어를 못하는 관계로 의역을 포함하거나 혹은
               잘못 된 표현으로 의미전달을 잘 못 한 부분에 대해서는
               필히 한 마디 적어 주셨으면 합니다.

Qt4 in Eclipse

Qt Development in Eclipse, including code completion on Qt Objects.
대학과제로 QT 프로그램을 컴파일 하고 실행시키기 위한 개발 환경이 필요 했었다. 하지만, 처음엔 뭐가 뭔지 알지 못했다. 그래서 다른사람에게도 도움이 될 수 있도록 나의 경험을 적기로 했다.

아래의 짧은 투터리얼에서,
  1. 어떻게 MinGW 로 Qt4 를 인스톨 하고
  2. Eclipse에서 바로 Qt programs을 실행 하고 빌드시키기 위해서
     CDT 플러그인을 어떻게 설정하는지
설명 할 것이다.

먼저, 작업 하다가 커피가 땡길때를 위해 맛있는 커피를 만들 수 있는 커피메이커를 미리 준비해 둬야 할 것이다.

다음으로, 트롤테크가 만든 Qt4 32 커뮤너티 판을 내려받을 필요가 있다:
 http://www.trolltech.com/download/qt/windows.html

만약에 MinGW  설치 된 것이 없다면, mingw을 포함하는 패키지를 내려 받아야한다. 트롤테크에 제공하는 QT 인스톨러는 당신을 위해서 mingw를 설치해 줄 것이다. 이 시점에서 MS Visual Studio 로 Qt4를 사용할 수 없다는 것을 알고 있어야 한다!

이제, QT와 MinGW 가 어디에 설치되었는지 알아 둬야 한다.

Qt가 성공적으로 설치 된 후에,
   1. 시작메뉴에 QT 메뉴가 생긴다,
   2. 그것을 오픈해서 "Qt 4.1.2 (Build Debug Libraris)" 명령을 실행시킨다.
   3. 신규 명령 창이 뜨면 라이센스 승인을 묻는다.
           'y'  를 입력하면
      자동으로 Qt 라이브러리를 만들기 시작 할 것이다.
      그것은 Qt 프로그래밍을 할 때 필요하다. ;-)

시간이 좀 걸릴 것이다, 커피 메이커를 준비하란 말이 기억 나는가? 지금이 그 커피 한잔을 할 시간이다.

기다리기 싫을 때는, Eclipse를 미리 다운 받아도 된다.
 http://www.eclipse.org/downloads/
이 글을 쓰는 동안에 이클립스의 갱신된 버젼은 3.1.2 었다. 이 버젼은 내가 사용하고 있는 것이다.  당신은 필히 Platform Runtime Binary가 필요할 것이다. 하지만, Java 어플리케이션을 개발하기 위해서 JDT를 사용하고 있는지 어떤지 확실치 않다거나 혹은 원하지 않는다면 complete SDK를 다운 받아서 설치 하면 된다. (어찌 되었든, Python, Perl, PHP, Ruby 그리고 당신이 상상할 수 있는 많은 다른 언어들에 대한 플러그인도 있다. 그들 중 몇개는 최근에 나온거이긴 하지만, 통합된 개발 환경에 잘 맞을거라고 본다)

이클립스 설치는 매우 쉬워서, 나의 추축으로는 여러분들이 벌써 실행시키고 있다고 생각한다. 그렇지 않다면 google 로 빨리 찾아 보자. 잘 안된다 싶으면,
이클립스에서,
  Help -> Software Updates -> Find and Install...
해 보기 바란다.

소프트웨어 갱신을 외 부르는지 묻지 마라, 도움말 메뉴가 어디에 있는지도 마찬가지다.
이런 편리한 도구와 함께 추가된 이클립스 모듈의 대부분을 설치 된다는 사실을 순순히 받아 들이는 편이 좋다.
  1.  첫 페이지에 나오는 도움말에서, "Search for new features to install"을 선택하고 next를 클릭하자. 다음 화면에서 너에게 "Update sites"로 불려지는 항목들을 보여 준다. 그것은 이클립스에서 자동으로 설치해 줄 수 있는 플러그인 등록의 한 종류이다.
  2. 지금 "New Remote Site"를 클릭한다. CDT로 명명한다. CDT Update
    Site:  http://download.eclipse.org/tools/cdt/releases/eclipse3.1
  3. CDT를 갱신체크 하자. 이클립스는 mirror 에 대해서 물어 볼 것이다.
    그러면, 당신이 살고 있는 지역을 선택하고 OK를 눌러서 계속 해라.
  4. 다음 결과에서 CDT 앞에 있는 box를 선택하고 다음을 클릭하자.
  5. 라이센스를 받고 최종 다음을 클릭하면 CDT를 내려받기 시작한다.
    당신의 네트워크 상태에 따라서 시간이 걸립니다.
  6. 다운이 완료 되었을 때, "install all"을 선택할 수 있는 창이 나오면,
    최종 이클립스를 다시 기동시켜야 합니다.
    아마도, C/C++ 을 제공 받게 될 겁니다.


만약 CDT가 보여주는 코드 방식이 싫다면,  GNU Indent와 적절한 이클립스 플러그인 Simple Indent를 설치하고 싶을 것이다.
    URL for GNU Indent:
          http://mysite.wanadoo-members.co.uk/indent/beautify.html

윈도우 상에서, cygwin으로 GNU Indent를 설치 할 수 있다. 그것은 devel category에 있다. 나중에 환경변수 %PATH%에 cybin \bin을 추가해야 한다. Cygwin을 설치하기 싫으면, GnuWin32 (http://gnuwin32.sourceforge.net/) 로 부터 그 version을 사용할 수 있다.  Simple Indent 를 설치 하려면 이클립스 업데이트 사이트를 이용한다.
   http://softwitch.net/eclipseUpdate (
     Homepage:
       http://softwitch.net/blog/index.php/simple-indent-code-formatter-for-cdt/
   ).


Qt ? Qt가 적절하게 잘 실행되는지 지켜보자, 문제가 있다면 컴파일을 다시 해야 한다.
첫 뻔 째 시도에서, 나는  ld.exe와 qjpeg1.dll 에 대해서 오류가 발생했었다.  만약 당신도 똑같은 문제와 만났다면, 이전에 취소된 build처리 때문일 것이다.  `make clean´  을 시도 해보거나 도움이 안된다면, Qt4를 다시 설치한다. ( 이것이 어리석은 제안이란 걸 나도 알지만, 잘되면 만사 땡이다 ).

자~, Qt 설치가 드디어 끝이 났나요? 축하 축하, 이제 거의다 끝나 갑니다.

Eclipse를 다시 시작해보자, 지금 우리는 Qt 사용을 위해서 이클립스를 설정 할 것이다.
 1. workspace에 C++ Projects 를 신규생성 한다.
 2. 메뉴 Run -> External Tools -> External Tools 을 클릭한다.
    external tool 관리창이 뜰 것이다.
 3. 왼 쪽 편에 있는 프로그램을 선택하고
    QMake 이름으로 신규를 추가 한다.
        3.1. qmake.exe (대략 C:\Qt4\bin\ )를 그 위치로 가르킨다.
        3.2. assistant.exe로 QtAssistantone 이름으로 추가 한다.
    External Tools 창을 닫는다.
 4. 메뉴 Window -> Preferences 를 클릭한다.
        4.1. General -> Editors -> File Associations 를 연다.
        4.2. 확장자 .ui 와 .ts 파일을 추가 한다.
        4.3. 그것으로 QtDesigner 와 QtLinguist 를 연결한다.
     Preferences 창을 닫는다.

자~, 모두 끝이 났다. 이제 첫 번 째,  Qt 어플리케이션을 시작해 보자. 슬프게도, 이클립스에서 makefile 생성을 다루는 방법은 나도 잘 모르지만, Qmake로 하는 것은 전혀 문제가 안된다.

표준 C++ Project를 하나 생성  해보자.
세 개의 신규 파일을 추가 한다:
    helloworld.pro
    helloworld.cpp.

helloworld.pro 에 아래의 코드를 복사 하자:

LIBS += -Lbin
INCLUDEPATH += .
QMAKE_LIBDIR = bin
QMAKE_CXXFLAGS_DEBUG += -DQTTEST_DEBUG
DEFINES = MYFLAGS
TARGET = qttest
DESTDIR = bin
CONFIG += debug \
warn_on \
qt \
opengl \
thread \
rtti
TEMPLATE = app
SOURCES += helloworld.cpp
DEPENDPATH +=


인수는 거의 자체 설명이 있다, 이것은 기본적으로 qmake가 어떻게 makefile을 만드는지 이야기 한다. 그거슨 이클립스가 당신 프로젝트를 생성하기 위해 사용할 것이다.

지금 컴파일을 위해서 파일을 추가 하자.
helloworld.cpp:

#include
#include

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QPushButton hello("Hello world!");
hello.resize(100, 30);

hello.show();
return app.exec();
}


지금 우리는 make targets 를 생성한다.
이클립스에서 메뉴Window -> Show View -> Make Targets 을 연다.
그리고 새로운  Targets을 두 개 추가 한다:

Target Name: qmake
Make Target: helloworld.pro
Build Command: qmake

그리고,

Target Name: all
Make Target: all
Build Command: default (make)

이제, qmake target 을 더블클릭하고
Problems 와 Console View를 지켜보자.
이것이 성공적이라면,  이클립스가 예제 프로그래을 생성할 수 있는 makefile이 있을 것이다.

"all" target을 더블 클릭 해 보자.
당신 어플리케이션은 bin\ 폴더로 이전 할  준비를 하고 있을 것이다!



Hope this is helpful for someone.
Posted by stekilove
,
작성자: 전병관
제목: eclipse c++에서 MinGW과 wxWidgets을 이용해서 프로그램 개발

환경:
OS - VISTA home edition


설치:
install MinGW-5.1.4.exe into c:\bin\MinGW
uncompress gdb-6.8-mingw-3.tar.bz2 to c:\bin\MinGW
install MSYS-1.0.10.exe
uncompress wxMSW-2.8.8-Setup.zip to D:\hobby_cpp\wxMSW-2.8.8
uncompress eclipse-cpp-ganymede-win32.zip to d:\hobby_cpp\eclipse

작업단계:

run MSYS in window                                                        
$ vi .profile
alias ls="ls --color -F"
alias rm="rm -i"
export PS1='`pwd`> '

$ source .profile
/home/로그인아이디> mkdir wxMSW-2.8.8
/home/로그인아이디> vi /etc/fstab
c:/bin/MinGW /ming
d:/hobby_cpp/wxMSW-2.8.8 /home/로그인아이디/wxMSW-2.8.8

/home/로그인아이디> cd wxMSW-2.8.8
/home/로그인아이디/wxMSW-2.8.8> ls
BuildCVS.txt     config.guess*  locale/            wx-config-inplace.in*
INSTALL-MSW.txt  config.sub*    misc/              wx-config.in*
Makefile.in      configure*     mkinstalldirs*     wxBase.spec
README-MSW.txt   configure.in   regen*             wxGTK.spec
acinclude.m4     contrib/       samples/           wxMGL.spec
aclocal.m4       demos/         setup.h.in         wxMotif.spec
art/             docs/          src/               wxX11.spec
autoconf_inc.m4  include/       tests/             wxwin.m4
autogen.sh*      install-sh*    utils/
build/           lib/           version-script.in

/home/로그인아이디/wxMSW-2.8.8> configure
/home/로그인아이디/wxMSW-2.8.8> make all



run eclise c++                                                                

make a new project in c++

c/c++ compile configuration in project properties
    -D__WXMSW__
    -I.
    -DWXUSINGDLL
    -I./../../samples
    -I/home/steki/wxMSW-2.8.8/lib/wx/include/msw-ansi-release-2.8
    -I../../include
    -DWX_PRECOMP
    -mthreads
    -Wall
    -Wundef
    -Wno-ctor-dtor-privacy
    -O2
    -fno-strict-aliasing
    ./widgets.cpp

c/c++ link configuration in project properties
    -mthreads
    -L/home/steki/wxMSW-2.8.8/lib
    -mwindows
    
    -lrpcrt4 -loleaut32 -lole32 -luuid -lwinspool -lwinmm -lshell32
    -lcomctl32 -lcomdlg32 -lctl3d32 -ladvapi32 -lwsock32 -lgdi32

    -lwx_base_xml-2.8
    -lwx_msw_adv-2.8
    -lwx_msw_html-2.8
    -lwx_msw_core-2.8
    -lwx_base-2.8
    -lwxtiff-2.8
    -lwxjpeg-2.8
    -lwxpng-2.8
    -lwxzlib-2.8
    -lwxregex-2.8
    -lwxexpat-2.8

make and build a program
   make class to use wxWidgets.

run the program compiled.                                                                 
    set PATH to access libs.

Posted by stekilove
,
edit source with try-catch.


StekiDB.h                                                                   

#ifndef __STEKIDB_h__
#define __STEKIDB_h__

#include <wx/string.h>
#include <wx/list.h>
#include <sqlite3.h>

class StekiDBException
{
private:
    wxString msg;
public:
    StekiDBException(const wxString &msg){ this->msg.Append(msg); };
    virtual ~StekiDBException(){};
    const wxString getMessage() const {
        return msg;
    }
};

class StekiDBConnection
{
private:
        wxString dbName;     
       
public:
    sqlite3 *db;

    StekiDBConnection(const wxString &dbName);
    virtual ~StekiDBConnection();
    void close();
};

class StekiDBResultSet : public wxList
{
public:
    StekiDBResultSet();
    ~StekiDBResultSet();
};

class StekiDBStatement
{
private:
    StekiDBConnection *conn;
public:
    StekiDBStatement(StekiDBConnection *conn);
    virtual ~StekiDBStatement();
    StekiDBResultSet * executeQuery( const wxString &sql );
};

class StekiDBValue : public wxObject
{
public:
    wxString *value;
    wxString *colName;
public:
    StekiDBValue(wxString *colName, wxString *value){ this->colName=colName; this->value=value; }
    virtual ~StekiDBValue(){ free(value); free(colName); }
};


#endif



StekiDB.cpp                                                                             

#include "StekiDB.h"

/**
**  StekiDBConnection
**
**/

StekiDBConnection::StekiDBConnection(const wxString &dbName){
    this->dbName=dbName;
   
    char *zErrMsg = 0;
    int rc;
   
    rc = sqlite3_open(dbName, &db);
    if( rc )
    {
        throw ( StekiDBException(wxString("Can't open database: ").Append( wxString(sqlite3_errmsg(db))))  );
//        wxMessageBox(wxT("Can't open database: ") + wxString(sqlite3_errmsg(db)));
    }
}

StekiDBConnection::~StekiDBConnection(){
    close();
}

void StekiDBConnection::close(){
    if(db!=NULL) sqlite3_close(db);
}

/**
**  callback_resultset
**
**/

static int callback_resultset(void *pArg, int argc, char **argv, char **azColName)
{
    StekiDBResultSet *rset=(StekiDBResultSet *)pArg;

    wxList *list=new wxList();
    int i;
    for(i=0; i<argc; i++)
    {
        //printf("%s=%s, ", azColName[i], argv[i] ? argv[i] : "NULL");
        wxString *colName = new wxString( azColName[i] );
        wxString *str = new wxString( argv[i] ? argv[i] : "NULL" );
        StekiDBValue *value = new StekiDBValue( colName, str );
        list->Append( value  );
    }
    rset->Append( list );

    return 0;
}

/**
**  StekiDBResultSet
**
**/
StekiDBResultSet::StekiDBResultSet(){
}

StekiDBResultSet::~StekiDBResultSet(){
    this->DeleteContents(true);
}

/**
**  StekiDBStatement
**
**/

StekiDBStatement::StekiDBStatement(StekiDBConnection *conn){
    this->conn=conn;
}

/**
**
**
**/
StekiDBStatement::~StekiDBStatement(){
}

StekiDBResultSet * StekiDBStatement::executeQuery( const wxString &sql ){
    char *zErrMsg = 0;
   
    StekiDBResultSet *rset = new StekiDBResultSet();

    int rc = sqlite3_exec(conn->db, sql.c_str(), callback_resultset, rset, &zErrMsg);
    if( rc!=SQLITE_OK )
    {
        throw ( StekiDBException(wxString("SQL error: ").Append( wxString(zErrMsg)))  );
//        wxMessageBox(wxT("SQL error: ") + wxString(zErrMsg));
    }

    return rset;
}



Example.cpp                                                                     

void MyFrame::OnMyDBReadBtn(wxCommandEvent&)
{
    StekiDBConnection *conn;
    StekiDBStatement *stmt;
    StekiDBResultSet *rset;

    try {
        conn = new StekiDBConnection("steki.db");
        stmt = new StekiDBStatement(conn);   
        rset = stmt->executeQuery( "select * from x" );

        for ( wxList::Node *node = rset->GetFirst(); node; node = node->GetNext() ){
            wxList *rsetlist = (wxList *)node->GetData();
          
            for ( wxList::Node *node2 = rsetlist->GetFirst(); node2; node2 = node2->GetNext() ){
                StekiDBValue *value = (StekiDBValue *)node2->GetData();
              
                wtc->AppendText( *value->value );
                wtc->AppendText( "," );
            }  
            wtc->AppendText("\n");
        }
    } catch (StekiDBException e) {
        wxMessageBox(e.getMessage());
    }

    if(rset!=NULL) free (rset);
    if(stmt!=NULL) free (stmt);
    if(conn!=NULL) free (conn);
}
Posted by stekilove
,