elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  gui con wxwidgets
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: gui con wxwidgets  (Leído 5,286 veces)
tca153

Desconectado Desconectado

Mensajes: 18


Ver Perfil
gui con wxwidgets
« en: 10 Junio 2024, 19:25 pm »

hola estoy tratando de hacer un programa para windows usando codeblocks y wxwidgets, el programa tiene que seleccionar un archivo para luego mostrarlo en hexa pero la parte de la seleccion me esta matando, no de que hacer, si fuera un winapi32 usaria DLGDIRLIST pero necesiat que le pase el HWND de la ventana padre, y en wxwidgets no se como hacerlo, tiene algo parecido pero su prototipo es wxwindow y no se si es compatible, alguien sabe como hacer la seleccion de archivos desde un wxlistbox?


En línea

Danielㅤ


Conectado Conectado

Mensajes: 1.756


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: gui con wxwidgets
« Respuesta #1 en: 10 Junio 2024, 23:56 pm »

Hola, primero que nada podrías decirnos en que lenguaje de programación estás queriendo crear tu programa?.

Segundo, yo personalmente no te recomiendo CodeBlocks porque en su momento lo he usado y es demasiado pesado, podrías buscar otro compilador mejor, más liviano.

Aquí te dejo la página oficial de WxWidgets donde podrás encontrar toda la documentación y también tutoriales:

https://www.wxwidgets.org/

En cuanto a lo que preguntas de la selección de archivos y el listbox, todo eso está explicado en la documentación y de hecho lo que preguntas es una de las preguntas más frecuentes por eso vas a encontrar la respuesta fácilmente.


Saludos


En línea

tca153

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: gui con wxwidgets
« Respuesta #2 en: 11 Junio 2024, 17:28 pm »

si perdona es en C++



gracias, en cuanto a codeblocks lo uso porque me resulta mas liviano, otro que probé fue vscode pero en mi maquina esta muy lento, y como también tengo una maquina con linux no estoy usando dev-c++



hola de nuevo, encontré de casualidad  el control wxgenericdirctrl que se supone puede hacer todo lo que quiero, pero, al probarlo en un frame no compila, codeblock no reconoce el tipo, pero si lo intento desde un programa hecho en fase a dialogos (dialog base) si anda, como puedo usar este control en un frame?



de nuevo ya resolvi a medias el problema, pero ahora tengo otro, ya que puedo llenar un listbox con los archivos de una carpeta, ahora quiero poder navegar por todas las carpetas pero al cambiar de carpeta, el contenido de la anterior permanece, intente de todo para borrar la lista vieja pero no lo hace solo agrega el contenido del directorio nuevo al viejo. Hay alguna forma de borrar ya intente con DESELECTED pero no consegui nada, vi que hay una funcion DOCLEAR pero es protegida, hererada de wxITEMCONTAINER, y no se como hacerla funcionar, si alguien dabe como se puede hacer esto?



al final lo descubri, la unica forma de borrar un listbox es usando una funcion del winapi, que en codeblocks, no se si sera igual en las demas, es SendMessadeW, (en la descripcion de winapi hecha en la pagina conclase.com usan SendMessage sin la W). Y hay que hacerlo asi

HWND hctrl = (HWND)ListBox1->GetHandle();  //de aca consigo el handler del listbox
SendMessageW(hctrl, LB_RESETCONTENT, 0, 0); // y enviando esto logro borrar el listbox

Ya lo probe y funciona bien, y como dije es la unica forma que encontre
« Última modificación: 21 Junio 2024, 08:01 am por Eternal Idol » En línea

tca153

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: gui con wxwidgets
« Respuesta #3 en: 18 Julio 2024, 19:00 pm »

al final lo logre o casi todo todavía me queda un ultimo inconveniente, y es este, para mostrar el progreso del programa uso una wxgauge, hasta ahi todo bien, el problema surge cuando por algun motivo el formulario pierde el foco, al pasar eso el programa sigue y al terminar recupera el foco y todo anda bien, pero hasta que termina la barra de progreso deja de actualizar, es mas pienso que como se queda en los bucles mucho tiempo, impido que el programa procese los eventos y es eso lo que lleva a la falla, recuerdo que en visual basic se agregaba un comando que lo resolvia pero no me acuerdo como se llamaba, habra algun comando similar. aca les dejo el main del programa

/***************************************************************
 * Name:      exploradorMain.cpp
 * Purpose:   Code for Application Frame
 * Author:     ()
 * Created:   2024-06-15
 * Copyright:  ()
 * License:
 **************************************************************/

#include "exploradorMain.h"
#include <wx/msgdlg.h>
#include <wx/dir.h>
#include <wx/file.h>
#include <wx/volume.h>
#include <Windowsx.h>
#include <wx/msw/winundef.h>
#include "cifrado.h"
#include <string>
#include <wx/msgdlg.h>
#include <wx/filedlg.h>
#include "mydialog.h"
#include <ctime>
#include "supercifrado.h"

//(*InternalHeaders(exploradorFrame)
#include <wx/bitmap.h>
#include <wx/font.h>
#include <wx/icon.h>
#include <wx/image.h>
#include <wx/intl.h>
#include <wx/settings.h>
#include <wx/string.h>
//*)


//helper functions
enum wxbuildinfoformat {
    short_f, long_f };

wxString wxbuildinfo(wxbuildinfoformat format)
{
    wxString wxbuild(wxVERSION_STRING);

    if (format == long_f )
    {
#if defined(__WXMSW__)
        wxbuild << _T("-Windows");
#elif defined(__UNIX__)
        wxbuild << _T("-Linux");
#endif

#if wxUSE_UNICODE
        wxbuild << _T("-Unicode build");
#else
        wxbuild << _T("-ANSI build");
#endif // wxUSE_UNICODE
    }

    return wxbuild;
}

//(*IdInit(exploradorFrame)
const long exploradorFrame::ID_LISTBOX1 = wxNewId();
const long exploradorFrame::ID_COMBOBOX1 = wxNewId();
const long exploradorFrame::ID_GENERICDIRCTRL1 = wxNewId();
const long exploradorFrame::ID_STATICTEXT1 = wxNewId();
const long exploradorFrame::ID_GAUGE1 = wxNewId();
const long exploradorFrame::ID_PROGRESSDIALOG1 = wxNewId();
//*)

BEGIN_EVENT_TABLE(exploradorFrame,wxFrame)
    //(*EventTable(exploradorFrame)
    //*)
END_EVENT_TABLE()

exploradorFrame::exploradorFrame(wxWindow* parent,wxWindowID id)
{
    wxArrayString Lista;
    Lista = wxFSVolume::GetVolumes();

    //(*Initialize(exploradorFrame)
    Create(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("wxID_ANY"));
    SetClientSize(wxSize(600,320));
    SetBackgroundColour(wxColour(0,128,192));
    {
       wxIcon FrameIcon;
       FrameIcon.CopyFromBitmap(wxBitmap(wxImage(_T("C:\\Users\\tca15\\Downloads\\keys_security_private_lock_1739.ico"))));
       SetIcon(FrameIcon);
    }
    ListBox1 = new wxListBox(this, ID_LISTBOX1, wxPoint(260,40), wxSize(335,255), 0, 0, 0, wxDefaultValidator, _T("ID_LISTBOX1"));
    wxFont ListBox1Font(10,wxFONTFAMILY_MODERN,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_NORMAL,false,_T("Terminal"),wxFONTENCODING_DEFAULT);
    ListBox1->SetFont(ListBox1Font);
    ComboBox1 = new wxComboBox(this, ID_COMBOBOX1, wxEmptyString, wxPoint(16,176), wxSize(192,32), 0, 0, wxCB_READONLY|wxTE_PROCESS_ENTER|wxBORDER_DOUBLE|wxBORDER_SUNKEN|wxBORDER_STATIC, wxDefaultValidator, _T("ID_COMBOBOX1"));
    ComboBox1->Hide();
    wxFont ComboBox1Font(12,wxFONTFAMILY_MODERN,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_BOLD,false,_T("Terminal"),wxFONTENCODING_DEFAULT);
    ComboBox1->SetFont(ComboBox1Font);
    DirCtrl1 = new wxGenericDirCtrl(this, ID_GENERICDIRCTRL1, wxEmptyString, wxPoint(5,40), wxSize(250,255), wxDIRCTRL_DIR_ONLY, wxEmptyString, 0, _T("ID_GENERICDIRCTRL1"));
    Statico = new wxStaticText(this, ID_STATICTEXT1, wxEmptyString, wxPoint(5,5), wxSize(590,30), wxBORDER_SIMPLE, _T("ID_STATICTEXT1"));
    Statico->SetForegroundColour(wxColour(255,0,128));
    Statico->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
    wxFont StaticoFont(14,wxFONTFAMILY_MODERN,wxFONTSTYLE_NORMAL,wxFONTWEIGHT_BOLD,false,_T("Terminal"),wxFONTENCODING_DEFAULT);
    Statico->SetFont(StaticoFont);
    Gauge = new wxGauge(this, ID_GAUGE1, 100, wxPoint(5,300), wxSize(590,15), wxGA_HORIZONTAL|wxGA_SMOOTH|wxGA_PROGRESS, wxDefaultValidator, _T("ID_GAUGE1"));
    Gauge->Hide();

    Connect(ID_GENERICDIRCTRL1,wxEVT_DIRCTRL_SELECTIONCHANGED,(wxObjectEventFunction)&exploradorFrame::OnGenericDirCtrl1SelectionChanged);
    //*)
    Connect(ID_LISTBOX1,wxEVT_LISTBOX_DCLICK,(wxObjectEventFunction)&exploradorFrame::OnListBox1DClick);
    DirCtrl1->ShowHidden(true);
    DirCtrl1->ExpandPath(wxGetCwd());
    explorar(wxGetCwd());
}

exploradorFrame::~exploradorFrame()
{
    //(*Destroy(exploradorFrame)
    //*)
}

void exploradorFrame::explorar(wxString Ruta)
{
    wxSetWorkingDirectory (Ruta);
    wxDir dir(wxGetCwd());
    wxArrayString Lista;
    wxString filename;
    unsigned int i=0;
    bool cont;
    HWND hctrl = (HWND)ListBox1->GetHandle();  //de aca consigo el handler del listbox

    SendMessageW(hctrl, LB_RESETCONTENT, 0, 0); // y enviando esto logro borrar el listbox
    if ( !dir.IsOpened() )
    {
        Lista.Add("No Existe",1);
        ListBox1->InsertItems(Lista,0);
        dir.Close();
        return;
    }
    Statico->SetLabel(dir.GetNameWithSep());
    cont = dir.GetFirst(&filename, "", wxDIR_DIRS|wxDIR_DOTDOT);
    while ( cont )
    {
        if(filename!=".")
        {
            Lista.Add(filename.MakeUpper());
            i++;
        }
        cont = dir.GetNext(&filename);
    }
    cont = dir.GetFirst(&filename, "", wxDIR_FILES|wxDIR_HIDDEN);
    while ( cont )
    {
        if(filename!=".")
        {
            Lista.Add(filename);
            i++;
        }
        cont = dir.GetNext(&filename);
    }
    ListBox1->InsertItems(Lista,0);
    dir.Close();
}

void exploradorFrame::OnClose(wxCommandEvent& event)
{
    Destroy();
}

void exploradorFrame::OnListBox1DClick(wxCommandEvent& event)
{
    wxDir dir;
    MyDialog Password(this,-1,_("Ingrese la Clave"));
    int Boton;
    if(!wxDirExists(ListBox1->GetString(ListBox1->GetSelection())))
    {
        Boton = Password.ShowModal();
        if(Boton != wxID_CANCEL)
            cifrar(Password.GetPassWord(), Boton);
        explorar(Statico->GetLabel());
    }
    else
    {
        DirCtrl1->CollapseTree();
        explorar(ListBox1->GetString(ListBox1->GetSelection()));
        DirCtrl1->ExpandPath(wxGetCwd());
    }
}

void exploradorFrame::cifrar(wxString Clave, int Boton)
{
    SuperCifrado code;
    unsigned char TPlano[2048],Salida[2048];
    wxString aux;
    wxFile plano, cifrado;
    std::string paso;
    unsigned long long bucle, resto, i;
    wxFileDialog saveFileDialog;

    if(Boton == 9001 || Boton == 9003)
        saveFileDialog.Create(this, _ ( "Guardar archivo ngm" ), wxEmptyString, wxEmptyString, "Archivos ngm (*.ngm)|*.ngm", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
    if(Boton == 9002 || Boton == 9002)
        saveFileDialog.Create(this, _ ( "Guardar archivo" ), wxEmptyString, wxEmptyString, "Archivos  (*.*)|*.*", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
    if(saveFileDialog.ShowModal()== wxID_CANCEL)
        return;

    aux=Statico->GetLabel() + ListBox1->GetString(ListBox1->GetSelection());
    plano.Open(aux,wxFile::read);

    if(!plano.IsOpened())
    {
        wxMessageBox (_("No se puede abrir"),_("ERROR") ,  wxOK | wxCENTRE | wxICON_ERROR , this);
        return;
    }

    if(!cifrado.Create(saveFileDialog.GetPath()))
    {
        wxMessageBox (_("No se puede crear"),_("ERROR") ,  wxOK | wxCENTRE | wxICON_ERROR , this);
        return;
    }

    wxString p;
    paso=Clave;
    code.Init(paso);
    Gauge->Show(true);

    resto = plano.Length() & 0x7ff; //lenght es un tipo longlong
    bucle = plano.Length() >> 11;
    Gauge->SetRange((int)bucle);
    DirCtrl1->Enable(false);
    DirCtrl1->Update();

        int y0=clock();
    switch (Boton)
    {
        case 9001:
            {
            for (i=0;i<bucle;i++)
            {
                plano.Read(TPlano,2048);
                code.DesOrden(TPlano);
                code.Codec(2048,TPlano,Salida);
                cifrado.Write(Salida,2048);
                Gauge->SetFocus();
                Gauge->SetValue(i);
            }
            if(resto)
            {
                plano.Read(TPlano,resto);
                code.Codec(resto,TPlano,Salida);
                cifrado.Write(Salida,resto);
            }
            Gauge->Hide();
                int y1=clock();
                double t=(double(y1-y0)/CLOCKS_PER_SEC);

                p.Printf("%f",t);
                wxMessageBox (_("rclick"), p,  wxOK | wxCENTRE , this);
            DirCtrl1->Enable(true);
            plano.Close();
            cifrado.Close();
            return;
            }
        case 9002:
            {
            for (i=0;i<bucle;i++)
            {
                plano.Read(TPlano,2048);
                code.Codec(2048,TPlano,Salida);
                code.Orden(Salida);
                cifrado.Write(Salida,2048);
                Gauge->SetFocus();
                Gauge->SetValue(i);
            }
            if(resto)
            {
                plano.Read(TPlano,resto);
                code.Codec(resto,TPlano,Salida);
                cifrado.Write(Salida,resto);
            }
            Gauge->Hide();
                int y1=clock();
                double t=(double(y1-y0)/CLOCKS_PER_SEC);
                wxString p;
                p.Printf("%f",t);
                wxMessageBox (_("rclick"), p,  wxOK | wxCENTRE , this);
            DirCtrl1->Enable(true);
            plano.Close();
            cifrado.Close();
            return;
            }
        case 9003:
            {
            for (i=0;i<bucle;i++)
            {
                plano.Read(TPlano,2048);
                code.SuperDesOrden(TPlano,2048);
                code.Codec(2048,TPlano,Salida);
                cifrado.Write(Salida,2048);
                Gauge->SetFocus();
                Gauge->SetValue(i);
            }
            if(resto)
            {
                plano.Read(TPlano,resto);
                code.Codec(resto,TPlano,Salida);
                cifrado.Write(Salida,resto);
            }
            Gauge->Hide();
                int y1=clock();
                double t=(double(y1-y0)/CLOCKS_PER_SEC);
                wxString p;
                p.Printf("%f",t);
                wxMessageBox (_("rclick"), p,  wxOK | wxCENTRE , this);
            DirCtrl1->Enable(true);
            plano.Close();
            cifrado.Close();
            return;
            }
        case 9004:
            {
            for (i=0;i<bucle;i++)
            {
                plano.Read(TPlano,2048);
                code.Codec(2048,TPlano,Salida);
                code.SuperOrden(Salida,2048);
                cifrado.Write(Salida,2048);
                Gauge->SetFocus();
                Gauge->SetValue(i);
            }
            if(resto)
            {
                plano.Read(TPlano,resto);
                code.Codec(resto,TPlano,Salida);
                cifrado.Write(Salida,resto);
            }
            Gauge->Hide();
                int y1=clock();
                double t=(double(y1-y0)/CLOCKS_PER_SEC);
                wxString p;
                p.Printf("%f",t);
                wxMessageBox (_("rclick"), p,  wxOK | wxCENTRE , this);
            DirCtrl1->Enable(true);
            plano.Close();
            cifrado.Close();
            return;
            }
    }
}

void exploradorFrame::OnGenericDirCtrl1SelectionChanged(wxTreeEvent& event)
{
    wxString ruta;

    ruta=DirCtrl1->GetPath();
    if(!ruta.ends_with("\\"))
        ruta.append("\\");
    explorar(ruta);
}
En línea

Danielㅤ


Conectado Conectado

Mensajes: 1.756


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: gui con wxwidgets
« Respuesta #4 en: 19 Julio 2024, 01:35 am »

Yo tuve un problema igual al tuyo, en mis programas con interfaz gráfica utilizaba wxPython y ese problema que comentas lo he resuelto haciendo un Refresh al control del Gauge, es decir refrescar la barra de progreso, en tu caso podría ser algo similar a esto:

Código
  1. Gauge->Refresh();

sólo tenés que saber cuándo usar esa función o instrucción y el problema debería solucionarse.
Haz la prueba y nos comentas.
En línea

tca153

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: gui con wxwidgets
« Respuesta #5 en: 19 Julio 2024, 19:01 pm »

gracias daniel por contestar si eso lo intente y sigue el problema y creo que encontre la causa

#include "errorMain.h"
#include <wx/msgdlg.h>
#include <ctime>

//(*InternalHeaders(errorFrame)
#include <wx/intl.h>
#include <wx/string.h>
//*)

//helper functions
enum wxbuildinfoformat {
    short_f, long_f };

wxString wxbuildinfo(wxbuildinfoformat format)
{
    wxString wxbuild(wxVERSION_STRING);

    if (format == long_f )
    {
#if defined(__WXMSW__)
        wxbuild << _T("-Windows");
#elif defined(__UNIX__)
        wxbuild << _T("-Linux");
#endif

#if wxUSE_UNICODE
        wxbuild << _T("-Unicode build");
#else
        wxbuild << _T("-ANSI build");
#endif // wxUSE_UNICODE
    }

    return wxbuild;
}

//(*IdInit(errorFrame)
const long errorFrame::ID_TEXTCTRL1 = wxNewId();
const long errorFrame::ID_BUTTON1 = wxNewId();
//*)

BEGIN_EVENT_TABLE(errorFrame,wxFrame)
    //(*EventTable(errorFrame)
    //*)
END_EVENT_TABLE()

errorFrame::errorFrame(wxWindow* parent,wxWindowID id)
{
    //(*Initialize(errorFrame)
    Create(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("id"));
    TextCtrl1 = new wxTextCtrl(this, ID_TEXTCTRL1, _("Text"), wxPoint(16,64), wxSize(368,280), 0, wxDefaultValidator, _T("ID_TEXTCTRL1"));
    Button1 = new wxButton(this, ID_BUTTON1, _("Label"), wxPoint(136,408), wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1"));

    Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&errorFrame::OnButton1Click);
    //*)
}

errorFrame::~errorFrame()
{
    //(*Destroy(errorFrame)
    //*)
}


void errorFrame::OnButton1Click(wxCommandEvent& event)
{
    unsigned t0,t1;
    double tim;

    t0=clock();
    do{
        t1=clock();
        tim= (double(t1-t0)/CLOCKS_PER_SEC);
    }while(tim<40.00);

}

en este ejemplo muy simple y bobo ocurre exactamente lo mismo, ojo esto esta hecho a proposito para imitar el ejemplo, en este caso se tarda tanto tiempo en el bucle, igual que en el bucle, igual que en los bucles donde hago el cifrado, que el programa durante ese tiempo, deja de prosesar los mensajes, o algo asi, y entonces se cuelga, de hecho si tratas de cerrar este programa windows alerta de que el programa no responde, pero cuando termina el bucle todo vuelve a la normalidad, este es exactamente el problemaque tengo y no puedo resolver, porque la funcion de cifrado va a tardar lo que tenga que tardar, ni mas ni menos.
no se y solo es pura especulacion, si en este ejemplo, justo debajo de la asignacion a tim colocara una funcion que llamara al prosesamiento de los mensajes por ahi estaria la solucion
pero no se si exista esa funcion, que te parece?
En línea

Danielㅤ


Conectado Conectado

Mensajes: 1.756


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: gui con wxwidgets
« Respuesta #6 en: 20 Julio 2024, 00:39 am »

Bien, ahora por lo último que comentas, entonces el problema es seguramente porque el programa necesita utilizar threads, es decir tenes que crear hilos de ejecución para poder separar la tarea/proceso que hace el programa, separarlo del Gauge, para que la barra de progreso sea independiente por eso tenes ese problema porque el programa primero espera que termine ese proceso/cifrado para después continuar con el progreso del Gauge, eso sucede porque el programa no puede hacer las dos cosas a la vez y para que si lo haga, tenés que crear threads, es decir separar los procesos.

En resumen, tenés que crear un thread para el Gauge.
En línea

tca153

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: gui con wxwidgets
« Respuesta #7 en: 20 Julio 2024, 00:43 am »

por tu respuesta, yo no tengo idea de como usar los hilos tenes alguna idea de donde hay un buen tutorial sobre eso, tutoriales debe haber pero uno bueno nivel principiante no muchos
En línea

Danielㅤ


Conectado Conectado

Mensajes: 1.756


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: gui con wxwidgets
« Respuesta #8 en: 20 Julio 2024, 01:38 am »

https://www.geeksforgeeks.org/multithreading-in-cpp/

https://www.educative.io/blog/modern-multithreading-and-concurrency-in-cpp

https://www.bogotobogo.com/cplusplus/C11/1_C11_creating_thread.php

https://www.tutorialspoint.com/cplusplus/cpp_multithreading.htm
En línea

tca153

Desconectado Desconectado

Mensajes: 18


Ver Perfil
Re: gui con wxwidgets
« Respuesta #9 en: 20 Julio 2024, 19:46 pm »

te lo agradezco ahora por unos dias a estudiar esto y despues a ver que sale
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Opinion sobre WxWidgets
Programación C/C++
Komodo 9 6,018 Último mensaje 5 Agosto 2010, 07:02 am
por leogtz
[Duda]Librerías Qt o wxwidgets
Programación C/C++
EMascheG 6 3,709 Último mensaje 12 Agosto 2012, 21:42 pm
por EMascheG
problema wxwidgets
Programación C/C++
dnsdirm 0 1,791 Último mensaje 8 Octubre 2012, 02:59 am
por dnsdirm
[?] Qt vs wxWidgets
Programación C/C++
MeCraniDOS 5 3,349 Último mensaje 8 Febrero 2017, 11:48 am
por MAFUS
Interpretar la documentacion de wxwidgets
Programación C/C++
Nucleorion 0 1,644 Último mensaje 5 Febrero 2017, 12:46 pm
por Nucleorion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines