Autor
|
Tema: gui con wxwidgets (Leído 10,951 veces)
|
tca153
Desconectado
Mensajes: 18
|
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ㅤ
Desconectado
Mensajes: 1.853
🔵🔵🔵🔵🔵🔵🔵
|
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
Mensajes: 18
|
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
Mensajes: 18
|
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ㅤ
Desconectado
Mensajes: 1.853
🔵🔵🔵🔵🔵🔵🔵
|
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: 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
Mensajes: 18
|
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ㅤ
Desconectado
Mensajes: 1.853
🔵🔵🔵🔵🔵🔵🔵
|
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
Mensajes: 18
|
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ㅤ
Desconectado
Mensajes: 1.853
🔵🔵🔵🔵🔵🔵🔵
|
|
|
|
En línea
|
|
|
|
tca153
Desconectado
Mensajes: 18
|
te lo agradezco ahora por unos dias a estudiar esto y despues a ver que sale
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Opinion sobre WxWidgets
Programación C/C++
|
Komodo
|
9
|
6,262
|
5 Agosto 2010, 07:02 am
por leogtz
|
|
|
[Duda]Librerías Qt o wxwidgets
Programación C/C++
|
EMascheG
|
6
|
3,888
|
12 Agosto 2012, 21:42 pm
por EMascheG
|
|
|
problema wxwidgets
Programación C/C++
|
dnsdirm
|
0
|
1,917
|
8 Octubre 2012, 02:59 am
por dnsdirm
|
|
|
[?] Qt vs wxWidgets
Programación C/C++
|
MeCraniDOS
|
5
|
3,544
|
8 Febrero 2017, 11:48 am
por MAFUS
|
|
|
Interpretar la documentacion de wxwidgets
Programación C/C++
|
Nucleorion
|
0
|
1,762
|
5 Febrero 2017, 12:46 pm
por Nucleorion
|
|