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
,
GCC C++ Compiler
Directories
  C:\bin\msys\1.0\local\include\wx-2.8
  C:\bin\msys\1.0\local\include
  C:\bin\msys\1.0\local\include

-D
  _WXMSW__
  WXUSINGDLL
  WX_PRECOMP

Optimization
  Optimize more (-O2)

Debuging
  Maximum (-g3)

Miscellaneous
  -c -fmessage-length=0 -mthreads -Wundef -Wno-ctor-dtor-privacy -fno-strict-aliasing

MinGW C++ Linker
Libraries
  rpcrt4
  oleaut32
  ole32
  uuid
  winspool
  winmm
  shell32
  comctl32
  comdlg32
  ctl3d32
  advapi32
  wsock32
  gdi32
  wx_base_xml-2.8
  wx_msw_adv-2.8
  wx_msw_html-2.8
  wx_msw_core-2.8
  wx_base-2.8
  wxtiff-2.8
  wxpng-2.8
  wxzlib-2.8
  wxregex-2.8
  wxexpat-2.8
  sqlite3

Libraries
  "C:\bin\msys\1.0\local\lib"

Miscellaneous
  -mthreads -mwindows


기타
Run Configurations / Environment / PATH 에
dll경로를 지정해서 올려 준다.
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
,
작성자: 전병관
제목: 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
,