Obtener Int de un EDIT y otros problemas. Windows Api.

Iniciado por @XSStringManolo, 13 Junio 2019, 20:46 PM

0 Miembros y 3 Visitantes están viendo este tema.

@XSStringManolo

Hola, estoy haciendo un programa que va a tener un montón de opciones y cifrados distintos.

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 (cpp) [Seleccionar]
/*
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;
}

Eternal Idol

Te recomiendo que te tomas el tiempo que necesites para progresar a tu propio ritmo, despues de haber leido documentacion, tutoriales y haber intentado resolver un problema por tu cuenta es cuando deberias crear otro nuevo hilo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

@XSStringManolo

Cita de: Eternal Idol en 13 Junio 2019, 22:52 PM
Te recomiendo que te tomas el tiempo que necesites para progresar a tu propio ritmo, despues de haber leido documentacion, tutoriales y haber intentado resolver un problema por tu cuenta es cuando deberias crear otro nuevo hilo.
Aunque no lo parezca me tirado unas 20 horas seguidas intentando resolverlo  :xD He probado con punteros de int, intentando hacer algoritmos, etc. Y no lo he consegido.
Me he leído 3 libros enteros de programación con windows api y también busqué sobre casts en varios libros como c++ Primer que es bastante extenso y detallado, y otros bastante grandes y no encontré nada.
En los libros de windows api apenas se usan los edit control, aolo se mencionan y se ponen un par de ejemplos. Lo que mas se usan son los messagebox, pop-ups y menus.

Sí he intentado resolver el problema. En el propio código tengo entre comentarios el intento de cast de string a int. Y explico el problema que tengo que no sé como añadir varias cifras al int. He intentado con reinterpret_cast, dinamic_cast, y no lo consigo.

Me gusta aprender rápido, y sé que si alguien sabe como hacerlo, con escribir 2 frases me puede resolver una busqueda de semanas. Por ese motivo precisamente estoy en el foro. Para que me ayuden y poder ayudar yo también para ahorrar mucho tiempo de busquedas a los usuarios.

Disculpa si intervengo más de lo que te gustaría en el foro. No es mi intención ser molesto o llamar la atencion en el foro creando preguntas sin sentido. Realmente no consigo resolver el problema, ni busco que nadie dedique su tiempo a escribirme código, hacerme el programa, etc.

Me esperaba respuestas del estilo:
En vez de usar GetWindowText() usa Getejemplo().
Para mostrar el string en el EDIT tienes que hacer X usando Y.

Nada más.

Muchas gracias por tu tiempo y por tus ayudas en otros hilos.

jmpesp

Cita de: string Manolo en 13 Junio 2019, 20:46 PM
Hola, estoy haciendo un programa que va a tener un montón de opciones y cifrados distintos.

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 e...

TL;DR

Deberias tratar de ser mas concreto acerca de sobre cual es el problema que estas experimentando.
Es dificil que alguien te ayude si escribes un texto tan largo donde agregas demasiados detalles sobre tu programa que son innecesarios para exponer el problema.

Como dijo el compañero mas arriba, si no sabes como hacer X cosa lo primero que debes hacer es revisar la documentacion (la API de Windows esta muy bien documentada).

Cuando tengas algun tipo de problema y quieras exponerlo, es recomendable armar un test-case, es decir, un pequeño programa que replique el problema original. De esta forma no debes publicar el codigo completo y la gente que quiera ayudarte podra entender cual es el problema al instante sin tener que entender o leer el codigo completo.

En base al titulo, parece que lo que buscas es:

UINT GetDlgItemInt(
  HWND hDlg,
  int  nIDDlgItem,
  BOOL *lpTranslated,
  BOOL bSigned
);


CitarThe GetDlgItemInt function retrieves the text of the specified control by sending the control a WM_GETTEXT message. The function translates the retrieved text by stripping any extra spaces at the beginning of the text and then converting the decimal digits. The function stops translating when it reaches the end of the text or encounters a nonnumeric character.


(La documentacion esta en castellano tambien)

@XSStringManolo

Cita de: jmpesp en 14 Junio 2019, 01:10 AM
TL;DR

Deberias tratar de ser mas concreto acerca de sobre cual es el problema que estas experimentando.
Es dificil que alguien te ayude si escribes un texto tan largo donde agregas demasiados detalles sobre tu programa que son innecesarios para exponer el problema.

Como dijo el compañero mas arriba, si no sabes como hacer X cosa lo primero que debes hacer es revisar la documentacion (la API de Windows esta muy bien documentada).

Cuando tengas algun tipo de problema y quieras exponerlo, es recomendable armar un test-case, es decir, un pequeño programa que replique el problema original. De esta forma no debes publicar el codigo completo y la gente que quiera ayudarte podra entender cual es el problema al instante sin tener que entender o leer el codigo completo.

En base al titulo, parece que lo que buscas es:

UINT GetDlgItemInt(
  HWND hDlg,
  int  nIDDlgItem,
  BOOL *lpTranslated,
  BOOL bSigned
);



(La documentacion esta en castellano tambien)

Son varios problemas y buscaba recomendaciones. Quise ponerlos todos en el mismo hilo e intenté ser claro. Principalmente son 2 problemas que describo en 6 lineas al principio.
El resto se puede ignorar, solo aporto más detalles y comento dudas por si alguien lee y me hace recomendaciones sobre el código.

Te tomo el consejo, intentaré ser más claro y concretar más en futuras intervenciones.
No quería hacer un hilo por problema, otro para pedir recomendaciones sobre el código, etc.
Intenté integrarlo todo en único hilo.

Ya voy mirando por la api y ejemplos, si no, no tendría nada hecho.

Ya solucione uno de los principales 2 problemas. Por suerte resolví el problema de mostrar el texto en un EDIT. Y tu me ofreciste una respuesta para el otro problema con el cual me pondré ahora a resolver.

Muchas gracias.









TEMA APARTE:

Pondré el código que resuelve el problema de mostrar un string en un EDIT por si alguiem se encuentra el mismo problema:
Código (cpp) [Seleccionar]
wstring stemp = wstring(Texto_Cifrado.begin(), Texto_Cifrado.end();
LPCWSTR cifrado =stemp.c_str();
SetWindowTextW(hwndEdit2, cifrado);


Para que funcione hay que cambiar las declaraciones de variables y las funciones de
string mivariable; a
wstring mivariable;

jmpesp

Cita de: string Manolo en 14 Junio 2019, 02:08 AM
Son varios problemas y buscaba recomendaciones. Quise ponerlos todos en el mismo hilo e intenté ser claro. Principalmente son 2 problemas que describo en 6 lineas al principio.
El resto se puede ignorar, solo aporto más detalles y comento dudas por si alguien lee y me hace recomendaciones sobre el código.

Te tomo el consejo, intentaré ser más claro y concretar más en futuras intervenciones.
No quería hacer un hilo por problema, otro para pedir recomendaciones sobre el código, etc.
Intenté integrarlo todo en único hilo.

Ya voy mirando por la api y ejemplos, si no, no tendría nada hecho.

Ya solucione uno de los principales 2 problemas. Por suerte resolví el problema de mostrar el texto en un EDIT. Y tu me ofreciste una respuesta para el otro problema con el cual me pondré ahora a resolver.

Muchas gracias.









TEMA APARTE:

Pondré el código que resuelve el problema de mostrar un string en un EDIT por si alguiem se encuentra el mismo problema:
Código (cpp) [Seleccionar]
wstring stemp = wstring(Texto_Cifrado.begin(), Texto_Cifrado.end();
LPCWSTR cifrado =stemp.c_str();
SetWindowTextW(hwndEdit2, cifrado);


Para que funcione hay que cambiar las declaraciones de variables y las funciones de
string mivariable; a
wstring mivariable;


Si la documentacion de MSDN se te hace un poco escasa o dificil de entender, te dejo el siguiente curso de WINAPI que esta en castellano y muy bien explicado.

El curso esta algo viejito pero no obsoleto y seguramente te va a ser de mucha ayuda.

http://winapi.conclase.net/


@XSStringManolo

#6
Ya conocía el curso, gracias.

Me cambié precisamente a Windows api por la documentación que hay.
Quería hacer guis con SDL2 y era imposible siquiera encontrar una calculadora hecha con SDL xD
Perdí muchas semanas para nada(ak menos otras cosas que veia como difíciles ahora me parecen un paseo...). El render ni siquiera es multiplataforma. Si hago render por hardware no funciona en mi hardware, si hago render por software no funciona en mi sistema. Entonces lo de multiplataforma... Ningún documento para hacer guis, solo librerías externas, etc.

Siempre me encuentro problemas con todo y nada me funciona a la primera por eso me saturo y pido ayuda. Por ejemplo ahora tengo:
unsigned int VueltasEnInt;
VueltasEnInt = GetDlgItemInt(hwndEdit4, ID_STATIC2,NULL, false);
Tanto el handler como el ID están puestos en la ventana que tiene el EDIT.

Y siempre me devuelve 0. Estoy probando a meterle un puntero a bool, y todo lo que pone en la documentación para encontrar cual es el problema.

Así me tiro horas para hacer funcionar funciones que en teoría tienen un funcionamiento sencillo.

Edit: Use GetLastError(); y me da error 14210. Ando buscando a ver si eso me ayuda en algo xD

Edit2: Era 1420 Control_ID_not_found.
Lo tengo definido y lo uso solo para ese EDIT. A seguir buscando xD

Edit3: Despues de 1hora y media encontré el problema xD. Tenía que pasarle el handler de la ventana principal y no el handler del EDIT control.

VueltasEnInt = GetDlgItemInt(hwnd, ID_STATIC2,NULL, false);

Por fin. Problemas solucionados.

Eternal Idol

Cita de: string Manolo en 13 Junio 2019, 23:48 PMMe gusta aprender rápido, y sé que si alguien sabe como hacerlo, con escribir 2 frases me puede resolver una busqueda de semanas. Por ese motivo precisamente estoy en el foro. Para que me ayuden y poder ayudar yo también para ahorrar mucho tiempo de busquedas a los usuarios.

Rapido tambien uno puede olvidarse de lo que aprendio, en lugar de hacer un programa en concreto te recomiendo que primero sientes las bases, aprende sobre la API de Windows leyendo, compilando y ejecutando todos los ejemplos. Una vez que tengas las bases estas preguntas, que soles responderte por tu propia cuenta, ya las tendras claras y podras avanzar sin bloquearte en cada paso.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

@XSStringManolo

Cita de: Eternal Idol en 14 Junio 2019, 08:49 AM
Rapido tambien uno puede olvidarse de lo que aprendio, en lugar de hacer un programa en concreto te recomiendo que primero sientes las bases, aprende sobre la API de Windows leyendo, compilando y ejecutando todos los ejemplos. Una vez que tengas las bases estas preguntas, que soles responderte por tu propia cuenta, ya las tendras claras y podras avanzar sin bloquearte en cada paso.
Muchas gracias por el consejo. Siempre me enfoco más en la teoría que en la práctica asique entiendo perfectamente por que me lo recomiendas. Para mi suele ser 80% teoría 20% practica. Con la Api de momento es 10% teoría 90% práctica. No me gusta entrar en la teoría sin ponerle imágenes mentales a cada cosa. Ya lo tengo intentado y se pierde el interés totalmente y no se asimilan bien los conceptos al hacerte ideas abstractas de cosas concretas.

Con el tiempo que tardo en resolver errores y del mal humor que me pongo me acuerdan las funciones para toda la vida. No es broma. A parte a base de escribir códigonuna y otra vez acabaré aprendiéndolo de memoria.

Me fastidia bastante el aún no ser capaz de escribir el esqueleto del programa de memoria. Tampoco me voy a poner a memorizarlo como un loco. Voy a usar la api practicamente a diario asique quiera o no quiera lo voy a aprender.

Acabaré el programa añadiendole un cifrado con algún operador bitwise o a mano, un menu desplegable para elegir cifrado, y ya más adelante le meteré más cifrados y opciones.

Tampoco busco conocer la api de arriba a abajo. Hay demasiadas cosas de muchos temas por aprender.
De momento con lo que más o menos ya doy hecho me sirve para hacerle una interfaz sencilla a programas de consola.  Puede que hoy me ponga ya con sockets. Principalmente quiero la api para eso. Programas cliente servidor con una interfaz más simple que la que hice en este propio programa.
Copia y pega de controles EDIT para pillar ips y puertos y poco más.

El siguiente programa puede que sea un chat simple cliente servidor. Poca interfaz necesito. Tendré que hacer lo mismo para Linux y ahí es donde veo que voy a llorar.

Becerra

Hola

Según leo, uno de los problemas es convertir un string a un int, eso lo puedes hacer muy fácil, no necesitas ninguna API:

Código (cpp) [Seleccionar]
   std::string cadena = "123";
   int numero;

   numero = std::stoi(cadena);

   // Tambien de esta otra forma

   numero = std::atoi(cadena.c_str());


Lo que desconozco es si la API de windows tiene algún método para obtener un int directamente de un control EDIT, nunca la he usado.

Un saludo
Buenas preguntas obtienen mejores respuestas