Primer problema: Tengo un control EDIT de una linea por el cual quiero obtener el input del usuario en una variable int. Para posteriormente hacer la llamada al cifrado. De momento tengo los numeros en un string.
Me gustaría obtener los números directamente en un int desde el EDIT o hacer un cast del string en el cual ya los tengo a un int.
El into lo quiero para saber el número de vueltas que el usuario quiere aplicarle al cifrado Cesar.
Segundo problema: No sé como mostrar el resultado del cifrado de uno de los EDIT que tengo para ello.
Quiero mostrar el contenido del string en el EDIT.
A parte de eso voy a cambiar el tamaño de todo cuando se le de a maximizar. Creo que es bastante sencillo metiendo dentro del swtich (msg) un case con maximizar y dentro todas las ventanas con nuevos ajustes (Copio y pego las actuales y les multiplico w, x, y, z por el mismo numero y debería quedar todo más o menos igual pero más grande. Tendría que cambiar el tamaño de ka fuente de todas la letras.
También quiero detectar el tamaño/resolución del escritorio para redimensionar y que quede lo mejor posible independientemente de la resolucion. Actualmente se ve pequeña la ventana porque hice la gui en 800x600. Podría guardar el tamaño del escritorio en pixeles y hacer operaciones con esas variables para ubicar las ventanas y determinar su tamaño.
Quiero añadir scrollbars a los EDIT grandes. Me imagino que tengo que crear los scrollbars como un elemento independiente y pasarle los handler de los EDIT que quiero que manejen? Nada más no?
La gui la cambiaré, sobre todo colores. Y al maximizar también mostrare opciones avanzadas que no se ven con la ventana normal.
También quiero añadir un menu desplegable con opción para diversos cifrados y que al poner el cursor encima salga una descripción de cada cifrado. No sé muy bien cual es el control adecuado ni como implementarlo.
Tener la opción de aplicar diversos cifrados a la vez, creando un perfil para el usuario con sus ajustes, su convinación de cifrados, etc. En principio lo haría con archivos .txt a menos que exista otra forma de gestionar estos perfiles en la Api. Crear, abrir, borrar, guardar
Por ejemplo un perfil podría ser: Rot13 + Base64 + Rot13.
Asi un usuario que solo utilice el programa para hacer esta convinación de cifrados, no tiene que ir uno por uno aplicándolos. Sería muy molesto si tienes una convinación de 20 cifrados tener que aplicarlos todos uno por uno. Y lo mismo a la hora de descifrarlos.
La idea es añadir estos perfiles nombrados por el usuario en la lista de cifrados disponibles.
Por ejemplo yo elijo Rot13 + Base64 + Rot13 y le llamo Cifrado Manolo.
Pues en la lista desplegable tendría para elegir:
Cifrado Manolo
Cesar
Interseccion
Rot13
Base64
...
No sé exactamente como hacer esto ni como suelen hacerlo los programas.
De momento lo que me preocupa son el primer problema y el segundo. El resto más o menos podré ir haciéndolo a base de prueba y error y buscando en google. Lo comento por si sabeis alguna manera de implementarlo de una forma correcta o si mi approach es equívoco.
El proyecto va a ser grande. Tengo una lista de 200 cifrados distintos que iré implementando mediante funciones a lo largo del tiempo.
Cualquier consejo o cifrado poco común que querais ver lo agradeceré mucho.
El programa va a ser código abierto para que quien quiera lo despedace, use las funciones, haga un programa comercial o lo que sea.
Esa es más o menos mi idea. Cualquier recomendación o crítica será bienvenida.
Código
/* Proyecto compilado en: C++11. Code::Blocs 17.12 Other Linker Settings: -lmingw32 */ /* Por anhadir: -Mostrar resultado del cifrado en hwndEdit2. -Obtener numero de vueltas del cifrado Cesar en int. O hacer cast de string a int. */ /* Por anhadir Lista de comandos: -r Da la vuelta al texto. -f Guarda automaticamente la salida en un fichero y lo abre. El nombre es elegido en pantalla de bienvenida (Aun no implementada). */ /* Lista de cifrados a incluir: Cesar. string CifradoCesar(string Texto, int Vueltas); Interseccion. string CifradoInterseccion(string Texto, int Vueltas, string Caracter); etc. */ #include <string> #include <iostream> #include <windows.h> using namespace std; #define ID_EDIT 1 #define ID_BUTTON 2 #define ID_STATIC 3 std::string Texto_A_Cifrar = ""; string Vueltas_A_Cifrar = ""; string CifradoCesar(string Texto, int Vueltas); string CifradoInterseccion(string Texto, int Vueltas, string Caracter); //Aun sin llamada LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; WNDCLASSW wc = {0}; wc.lpszClassName = L"Edit control"; wc.hInstance = hInstance; wc.hbrBackground = GetSysColorBrush(COLOR_3DDKSHADOW); wc.lpfnWndProc = WndProc; wc.hCursor = LoadCursor(0, IDC_ARROW); RegisterClassW(&wc); CreateWindowW(wc.lpszClassName, L"CIFRADO CESAR", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 250, 170, 430, 390, 0, 0 , hInstance, 0); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hwndEdit; static HWND hwndEdit2; static HWND hwndEdit3; static HWND hwndEdit4; static HWND hwndButton; static HWND hwndStatic; static HWND hwndStatic2; static HWND hwndStatic3; switch (msg) { case WM_CREATE: { hwndStatic3 = CreateWindowW(L"Static", L"VUELTAS CIFRADO ---->", WS_CHILD | WS_VISIBLE, 11, 338, 154, 16, hwnd, (HMENU)ID_STATIC, NULL, NULL); hwndEdit4 = CreateWindowW(L"Edit", L"", WS_CHILD | WS_VISIBLE | ES_NUMBER , 167, 338, 154, 15, hwnd, (HMENU)ID_STATIC, NULL, NULL); hwndStatic2 = CreateWindowW(L"Static", L"CLAVE CIFRADO --------->", WS_CHILD | WS_VISIBLE, 11, 318, 154, 16, hwnd, (HMENU)ID_STATIC, NULL, NULL); hwndEdit3 = CreateWindowW(L"Edit", L"", WS_CHILD | WS_VISIBLE | ES_PASSWORD, 167, 318, 154, 15, hwnd, (HMENU)ID_STATIC, NULL, NULL); hwndEdit2 = CreateWindowW(L"Edit", L"Texto Cifrado.", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL |ES_READONLY, 10, 154, 404, 160, hwnd, (HMENU)ID_EDIT, NULL, NULL); hwndEdit = CreateWindowW(L"Edit", L"Escribe aqui tu texto a cifrar.", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL , 10, 10, 404, 138, hwnd, (HMENU)ID_EDIT, NULL, NULL); hwndButton = CreateWindowW(L"Button", L"ENTER", WS_VISIBLE | WS_CHILD, 333, 323, 80, 28, hwnd, (HMENU)ID_BUTTON, NULL, NULL); hwndStatic = CreateWindowW(L"Static", NULL, WS_VISIBLE | WS_CHILD, 11, 150, 402, 3, hwnd, (HMENU)ID_STATIC, NULL, NULL); } break; case WM_COMMAND: { if (HIWORD(wParam) == BN_CLICKED) { int VueltasEnInt = 0; //Vacia para siguientes llamadas. int len = GetWindowTextLengthW(hwndEdit) + 1; //Longitud de texto a cifrar + null terminator. wchar_t text[len]; //Array de chars unicode con la longitud del texto a cifrar. GetWindowTextW(hwndEdit, text, len); //Obtener el texto en array. //No funciona. GetWindowTextW(hwndEdit4, VueltasEnInt);//Obtener int. Texto_A_Cifrar.clear(); //Vacia el string antes de ser usado. for (int i = 0; i < len; ++i) { Texto_A_Cifrar += static_cast<char>(text[i]); //Llena el string con chars. } /* IGNORAR, Esto es solo un ejemplo para que me acuerda de hacerlo. Usar find para buscar comandos despues de un guion en el texto introducido. Guardar el comando en un char. Ejemplo: char ReverseStr = '0'; char FileStr = '0'; Siendo el texto a cifrar "-r-fTextoDeEjemplo" ReverseStr = 'r'; if (Reverse != '0') { Dar la vuelta a Texto_A_Cifrar; Guardar en Texto_A_Cifrar; } if (File != '0') { Pedir nombre de archivo de texto; Guardar datos del cifrado en archivo de texto; } etc. */ //Eliminar null terminator de string para cifrarlo: unsigned int TamanhoStr = Texto_A_Cifrar.length(); string Texto_Cifrado = ""; Texto_Cifrado.append(Texto_A_Cifrar, 0, TamanhoStr-1); /* Intento de cast de cada char a int. No funciona porque suma los int. Por ejemplo si el usuario escribe en el editbox de vueltas: 152 En vez de dar 152 vueltas al texto, se daran 1 + 5 + 2. 8 Vueltas. No se como solucionarlo. for(auto iter = VueltasEnStr.begin(); iter != VueltasEnStr.end(); ++iter) { if (*iter > 48) { cout << "Contenido iter:" << *iter << endl; VueltasEnInt += (static_cast<int>(*iter) -48) ); cout << "Vuelta en int:" << VueltasEnInt << endl; } } */ //Aplicar cifrado Cesar. Falta obtener vueltas. //Asi sera la llamada: Texto_Cifrado = CifradoCesar(Texto_Cifrado,VueltasEnInt); Texto_Cifrado = CifradoCesar(Texto_Cifrado,VueltasEnInt); //LLamada de prueba: cout << Texto_Cifrado << endl; //Provisional para debug por consola cout << VueltasEnInt << endl; //Provisional para debug por consola /*Sin implementar. Muestra el resultado en Ventana con hwndEdit2 No se hacerlo. Se cambiarle el titulo a la ventana, pero no se cambiar el contenido del EDIT. Necesito cambiar L"Texto Cifrado." por el contenido de Texto_Cifrado*/ } } break; case WM_DESTROY: { PostQuitMessage(0); break; } } return DefWindowProcW(hwnd, msg, wParam, lParam); } //Cesar string CifradoCesar(string Texto, int vueltas) { string TextoSalida = ""; for(auto iter = Texto.begin(); iter != Texto.end(); ++iter) { TextoSalida += (*iter + vueltas); } return TextoSalida; } //Interseccion string CifradoInterseccion(string Texto, int Vueltas, string Caracter) { string Texto2; for (int i = 0; i < Texto.size(); ++i) { Texto2 += Texto[i]; for (int i = 0; i < Vueltas; ++i) { Texto2.append(Caracter); } } return Texto2; }