Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Alinear texto [Win API]

Estas en el tema de Alinear texto [Win API] en el foro de C/C++ en Foros del Web. Buenas: He estado mirando en 9283982 sitios pero no encuentro cómo hacer para alinear el texto en un edit, static, etc. conforme se vaya ingresando. ...
  #1 (permalink)  
Antiguo 03/09/2011, 15:37
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 15 años
Puntos: 3
Alinear texto [Win API]

Buenas:

He estado mirando en 9283982 sitios pero no encuentro cómo hacer para alinear el texto en un edit, static, etc. conforme se vaya ingresando. Por ejemplo, teniendo este código:

Código C++:
Ver original
  1. #include <windows.h>
  2.  
  3. //ID´s
  4. enum {ID_EDIT, ID_BOTON1};
  5.  
  6.  
  7. LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
  8.  
  9. HINSTANCE estancia;
  10. HWND edit;
  11. HWND boton1;
  12.  
  13. /*  Make the class name into a global variable  */
  14. char szClassName[ ] = "CodeBlocksWindowsApp";
  15.  
  16. int WINAPI WinMain (HINSTANCE hThisInstance,
  17.                      HINSTANCE hPrevInstance,
  18.                      LPSTR lpszArgument,
  19.                      int nCmdShow)
  20. {
  21.     HWND hwnd;               /* This is the handle for our window */
  22.     MSG messages;            /* Here messages to the application are saved */
  23.     WNDCLASSEX wincl;        /* Data structure for the windowclass */
  24.  
  25.     estancia = hThisInstance;
  26.  
  27.     /* The Window structure */
  28.     wincl.hInstance = hThisInstance;
  29.     wincl.lpszClassName = szClassName;
  30.     wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
  31.     wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
  32.     wincl.cbSize = sizeof (WNDCLASSEX);
  33.  
  34.     /* Use default icon and mouse-pointer */
  35.     wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  36.     wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  37.     wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  38.     wincl.lpszMenuName = NULL;                 /* No menu */
  39.     wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
  40.     wincl.cbWndExtra = 0;                      /* structure or the window instance */
  41.     /* Use Windows's default colour as the background of the window */
  42.     wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
  43.  
  44.     /* Register the window class, and if it fails quit the program */
  45.     if (!RegisterClassEx (&wincl))
  46.         return 0;
  47.  
  48.     /* The class is registered, let's create the program*/
  49.     hwnd = CreateWindowEx (
  50.            0,                   /* Extended possibilites for variation */
  51.            szClassName,         /* Classname */
  52.            "Titulo",       /* Title Text */
  53.            WS_OVERLAPPEDWINDOW, /* default window */
  54.            CW_USEDEFAULT,       /* Windows decides the position */
  55.            CW_USEDEFAULT,       /* where the window ends up on the screen */
  56.            544,                 /* The programs width */
  57.            375,                 /* and height in pixels */
  58.            HWND_DESKTOP,        /* The window is a child-window to desktop */
  59.            NULL,                /* No menu */
  60.            hThisInstance,       /* Program Instance handler */
  61.            NULL                 /* No Window Creation data */
  62.            );
  63.  
  64.     /* Make the window visible on the screen */
  65.     ShowWindow (hwnd, nCmdShow);
  66.  
  67.     /* Run the message loop. It will run until GetMessage() returns 0 */
  68.     while (GetMessage (&messages, NULL, 0, 0))
  69.     {
  70.         /* Translate virtual-key messages into character messages */
  71.         TranslateMessage(&messages);
  72.         /* Send message to WindowProcedure */
  73.         DispatchMessage(&messages);
  74.     }
  75.  
  76.     /* The program return-value is 0 - The value that PostQuitMessage() gave */
  77.     return messages.wParam;
  78. }
  79.  
  80.  
  81. /*  This function is called by the Windows function DispatchMessage()  */
  82.  
  83. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  84. {
  85.     PAINTSTRUCT ps;
  86.     HDC hdc;
  87.  
  88.  
  89.     switch (message)                  /* handle the messages */
  90.     {
  91.         case WM_CREATE:
  92.         {
  93.             edit = CreateWindow ("edit", NULL, ES_RIGHT | ES_NUMBER | WS_BORDER | WS_CHILD | WS_VISIBLE, 20, 50, 175, 25, hwnd, (HMENU)ID_EDIT, estancia, 0);
  94.             boton1 = CreateWindow ("Button", "1", BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 90, 40, 25, hwnd, (HMENU) ID_BOTON1, estancia, 0);
  95.         }
  96.  
  97.         case WM_PAINT:
  98.         {
  99.             hdc = BeginPaint(hwnd, &ps);
  100.             EndPaint(hwnd, &ps);
  101.             return 0;
  102.         }
  103.  
  104.         case WM_COMMAND:
  105.         {
  106.             switch (wParam)
  107.             {
  108.                 case ID_BOTON1:
  109.                     SetWindowText (edit, "1");
  110.                     break;
  111.             }
  112.         }
  113.         break;
  114.  
  115.         case WM_DESTROY:
  116.             PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
  117.             break;
  118.         default:                      /* for messages that we don't deal with */
  119.             return DefWindowProc (hwnd, message, wParam, lParam);
  120.     }
  121.  
  122.     return 0;
  123. }

Cuando presionas el botón 1 llama a la función SetWindowText e imprime en el edit el número "1", sin embargo cada vez que le das al botón borra lo que hay en el edit antes de escribir un "1". Lo que yo busco es que por ejemplo, si pulsas tres veces 1, en el edit debería aparecer "111".

He probado con la librería string pero no consigo que se ejecute con las funciones de Win API.

Gracias por adelantado. Saludos.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...
  #2 (permalink)  
Antiguo 03/09/2011, 16:48
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Alinear texto [Win API]

EL SetWindowsText reemplaza el texto anterior por el nuevo. Deberias obtener el texto, concatenarlo con "1" y luego setear ese texto.

Saludos
  #3 (permalink)  
Antiguo 04/09/2011, 09:19
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 15 años
Puntos: 3
Respuesta: Alinear texto [Win API]

¿Seguro que no hay ninguna forma?, si no la hay ¿me podríais indicar qué función usar para concatenar int o duble?, con String solo puedo con tipo char.

Saludos.

Edito: He conseguido concatenar números con cadenas de char de esta forma:

Código C++:
Ver original
  1. char numero1 [10];
  2.  
  3.         case WM_COMMAND:
  4.         {
  5.             switch (wParam)
  6.             {
  7.  
  8.                 case ID_BOTON1:
  9.                 {
  10.                 GetWindowText (edit, numero1, 7);
  11.                 strcat (numero1, "1");
  12.                 SetWindowText (edit, numero1);
  13.                 break;
  14.                 }

Pero no consigo unir int, float o double; a ver si alguien puede decirme cómo. Gracias por adelantado.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...

Última edición por Anonimo12; 04/09/2011 a las 10:04
  #4 (permalink)  
Antiguo 05/09/2011, 02:47
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: Alinear texto [Win API]

creo que no hay una función. pero si piensas un poco te puedes hacer una:


numero 123

pulsamos 1

1

pulsamos 2

1*10+2=12

pulsamos 3

12*10+3=123
  #5 (permalink)  
Antiguo 05/09/2011, 09:14
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 15 años
Puntos: 3
Respuesta: Alinear texto [Win API]

Ya había pensado en eso pero creía que usando Win API esa clase de funciones estarían pre-definidas; gracias por la aclaración.

Aprovecho para preguntar otra cosilla, pues para imprimir un mensaje en un edit, botón, etc. uso esto:

Código C++:
Ver original
  1. SetWindowText (edit, texto);

Sin embargo como su nombre indica solo sirve para textos (tipo char), y cuando quiero imprimir los datos que hay en una variable tipo int, float o double me da error. He probado con otras funciones como SendMessage pero no me ha funcionado. Asi que a ver si alguien puede decirme cómo imprimir en un edit por ejemplo, los datos de una variable que no sea tipo char (un número con decimales, una potencia, etc. que suelen ser float o double).

Siento estas preguntas tan básicas pero aun soy un iniciado en la API de windows. Gracias y saludos.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...
  #6 (permalink)  
Antiguo 05/09/2011, 09:33
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Alinear texto [Win API]

Tenes que transformarlo a cadena y despues llamar a SetWindowText.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 05/09/2011, 09:46
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 15 años
Puntos: 3
Respuesta: Alinear texto [Win API]

Cita:
Iniciado por Eternal Idol Ver Mensaje
Tenes que transformarlo a cadena y despues llamar a SetWindowText.
Es lo que he hecho, mi pregunta no era esa sino cómo imprimir en un edit una variable tipo int, float o double; con SetWindowText solo se puede enviar al edit variables tipo Char; pongo un ejemplo por si no me he explicado bien:

Esto es correcto:

Código C++:
Ver original
  1. char texto [] = "hola";
  2. SetWindowText (edit, texto);

Pero esto me da error:

Código C++:
Ver original
  1. double numero = 120,3540;
  2. SetWindowText (edit, numero);

Me pone: Cannot convert 'double' to 'const *CHAR' for argument '2' debido a que SetWindowText solo sirve para variables tipo char, entonces para int, float o double ¿qué función debería usar?.

Gracias por responder.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...

Última edición por Anonimo12; 05/09/2011 a las 09:53
  #8 (permalink)  
Antiguo 05/09/2011, 10:01
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Alinear texto [Win API]

Ta da error por pasarle una variable que no es una cadena, como te dije antes tenes que transformarlo a cadena y despues llamar a SetWindowText.

Ejemplo:
Código:
double numero = 120.3540;
char num[16];
sprintf(num, "%f", numero);
SetWindowText (edit, num);
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #9 (permalink)  
Antiguo 05/09/2011, 11:29
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 15 años
Puntos: 3
Respuesta: Alinear texto [Win API]

Vale ya te entendí, pero lo he probado añadiendo lo que me ha comentado Munire para concatenar numeros y no me los suma, es decir, al presionar tres veces le botón "1" en este ejemplo, se imprime siempre "1.00000".

Código C++:
Ver original
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. //ID´s
  5. enum {ID_EDIT, ID_BOTON1};
  6.  
  7.  
  8. LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
  9.  
  10. HINSTANCE estancia;
  11.  
  12. HWND edit;
  13. HWND boton1;
  14.  
  15.  
  16.  
  17. /*  Make the class name into a global variable  */
  18. char szClassName[ ] = "CodeBlocksWindowsApp";
  19.  
  20. int WINAPI WinMain (HINSTANCE hThisInstance,
  21.                      HINSTANCE hPrevInstance,
  22.                      LPSTR lpszArgument,
  23.                      int nCmdShow)
  24. {
  25.     HWND hwnd;               /* This is the handle for our window */
  26.     MSG messages;            /* Here messages to the application are saved */
  27.     WNDCLASSEX wincl;        /* Data structure for the windowclass */
  28.  
  29.     estancia = hThisInstance;
  30.  
  31.     /* The Window structure */
  32.     wincl.hInstance = hThisInstance;
  33.     wincl.lpszClassName = szClassName;
  34.     wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
  35.     wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
  36.     wincl.cbSize = sizeof (WNDCLASSEX);
  37.  
  38.     /* Use default icon and mouse-pointer */
  39.     wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  40.     wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  41.     wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  42.     wincl.lpszMenuName = NULL;                 /* No menu */
  43.     wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
  44.     wincl.cbWndExtra = 0;                      /* structure or the window instance */
  45.     /* Use Windows's default colour as the background of the window */
  46.     wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
  47.  
  48.     /* Register the window class, and if it fails quit the program */
  49.     if (!RegisterClassEx (&wincl))
  50.         return 0;
  51.  
  52.     /* The class is registered, let's create the program*/
  53.     hwnd = CreateWindowEx (
  54.            0,                   /* Extended possibilites for variation */
  55.            szClassName,         /* Classname */
  56.            "Titulo",       /* Title Text */
  57.            WS_OVERLAPPEDWINDOW, /* default window */
  58.            CW_USEDEFAULT,       /* Windows decides the position */
  59.            CW_USEDEFAULT,       /* where the window ends up on the screen */
  60.            544,                 /* The programs width */
  61.            375,                 /* and height in pixels */
  62.            HWND_DESKTOP,        /* The window is a child-window to desktop */
  63.            NULL,                /* No menu */
  64.            hThisInstance,       /* Program Instance handler */
  65.            NULL                 /* No Window Creation data */
  66.            );
  67.  
  68.     /* Make the window visible on the screen */
  69.     ShowWindow (hwnd, nCmdShow);
  70.  
  71.     /* Run the message loop. It will run until GetMessage() returns 0 */
  72.     while (GetMessage (&messages, NULL, 0, 0))
  73.     {
  74.         /* Translate virtual-key messages into character messages */
  75.         TranslateMessage(&messages);
  76.         /* Send message to WindowProcedure */
  77.         DispatchMessage(&messages);
  78.     }
  79.  
  80.     /* The program return-value is 0 - The value that PostQuitMessage() gave */
  81.     return messages.wParam;
  82. }
  83.  
  84.  
  85. /*  This function is called by the Windows function DispatchMessage()  */
  86.  
  87. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  88. {
  89.  
  90.     double variable;
  91.     char cadena[50];
  92.  
  93.     PAINTSTRUCT ps;
  94.     HDC hdc;
  95.  
  96.  
  97.     switch (message)                  /* handle the messages */
  98.     {
  99.         case WM_CREATE:
  100.         {
  101.             edit = CreateWindowEx (WS_EX_CLIENTEDGE, "edit", "0", ES_RIGHT | ES_NUMBER | WS_BORDER | WS_CHILD | WS_VISIBLE, 20, 50, 175, 25, hwnd, (HMENU)ID_EDIT, estancia, 0);
  102.             boton1 = CreateWindow ("Button", "1", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 20, 90, 40, 25, hwnd, (HMENU) ID_BOTON1, estancia, 0);
  103.         }
  104.  
  105.         case WM_PAINT:
  106.         {
  107.             hdc = BeginPaint(hwnd, &ps);
  108.             EndPaint(hwnd, &ps);
  109.             return 0;
  110.         }
  111.  
  112.         case WM_COMMAND:
  113.         {
  114.             switch (wParam)
  115.             {
  116.                 case ID_BOTON1:
  117.                 {
  118.                     GetWindow (edit, variable);
  119.                     variable = variable * 10 + 1;
  120.                     sprintf(cadena, "%f", variable);
  121.                     SetWindowText (edit, cadena);
  122.                     break;
  123.                 }
  124.             }
  125.         }
  126.         break;
  127.  
  128.         case WM_DESTROY:
  129.             PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
  130.             break;
  131.         default:                      /* for messages that we don't deal with */
  132.             return DefWindowProc (hwnd, message, wParam, lParam);
  133.     }
  134.  
  135.     return 0;
  136. }

Diculpad las molestias.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...
  #10 (permalink)  
Antiguo 05/09/2011, 11:46
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Alinear texto [Win API]

¿Que? Esto no tiene pies ni cabeza:

Código:
GetWindow (edit, variable);
¿Para que tenes que transformar un entero a cadena si lo que queres hacer es agregar otro caracter ('1')? ¿No tenias eso ya funcionando antes con strcat?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #11 (permalink)  
Antiguo 05/09/2011, 12:25
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 15 años
Puntos: 3
Respuesta: Alinear texto [Win API]

No amigo, strcat solo me funciona para unir variables tipo Char, pero cuando quiero unir los datos que hay por ejemplo en dos variables tipo double, strcat no funciona, se me para el programa y tengo que cerrarlo. Por eso pregunté cómo era posible unir números de tipo int, float o double y Munire me comentó que debía concatenarlos; después de concatenarlos no podía imprimir en pantalla con SetWindowText variables tipo int, float o double y me dijiste que lo pasara a cadena, ahora después de pasarlo a cadena no funciona la línea para concatenar números (variable = variable*10 + 1).

¿Qué tal si me dais un ejemplo y asi miro cómo se hace? porque llevo 2 días con lo mismo no hay manera :S. Para que nos entendamos lo que busco es:

Al presionar una vez el botón 1 que se guarde en "double variable" y se imprima en el edit, al darle al botón 1 y 2 que se imprima "12" y al darle a 1, 2 y 3 que se imprima "123".

No es nada del otro mundo, es una tontería como una casa, el probelma es que las funciones solo funcionan (valga la redundancia) con un tipo de variable. Si puedes mostrarme un ejemplo se agradecería. Saludos.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...
  #12 (permalink)  
Antiguo 05/09/2011, 12:41
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Alinear texto [Win API]

El problema es intentar clavar un clavo con un martillo, con el strcat te sobra para ir modificando el Edit correctamente. ¿Para que necesitas usar una variable double para guardar un valor temporal? Usa el Edit y listo, para eso esta y si lo que haces es una calculadora cuando se clickee en la operacion (suma, resta, etc.) ahi si obtenes el numero cuando ya esta completo y operas con ese y el segundo (dos variables de tipo double que no tendras que concatenar - ese termino solo se utiliza para cadenas de caracteres - en ningun momento).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #13 (permalink)  
Antiguo 05/09/2011, 12:57
 
Fecha de Ingreso: abril-2009
Ubicación: En foros del web, normalmente en Web general, HTML y CSS.
Mensajes: 258
Antigüedad: 15 años
Puntos: 3
Respuesta: Alinear texto [Win API]

Ahora si he entendido lo que has querido decir, osea que de cara al usuario use una cadena y la función strcat, y que cuando quiera operar lo pase a variables de otro tipo.

Gracias por la aclaración y siento tantas preguntas. Saludos.
__________________
¿Por qué Anónimo?, porque como está el mundo no podemos considerarnos humanos...
  #14 (permalink)  
Antiguo 05/09/2011, 13:09
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Alinear texto [Win API]

Te doy un recomendacion, antes de hacer cosas graficas deberias de aprender sobre los diferentes tipos que hay.

Segundo creo que le estas errando a la funcion para obtener el texto. Creo que deberias usar GetWindowText.

Código C++:
Ver original
  1. GetWindowText (edit, cadena,50);
  2. strcat(cadena, "1");            
  3. SetWindowText (edit, cadena);
  4. break;

Ahora pensemos un poco sobre tipos. En pantalla solo se puede mostrar cadenas de caracteres. Para mostrar un numero u otra cosa hay que transfornarla a cadena de caracteres. Uno se acostumbra a usar prinf o cout para mostrar directamente el numero. Pero este es transformado internamente a cadena.

En este ejemplo, obtenemos la cadena del edit. La concatenamos con la cadena "1". Y luego modificamos el edit.

Otro ejemplo podria haber sido:

Código C++:
Ver original
  1. GetWindowText (edit, cadena,50);
  2. sscanf(cadena,"%f",&variable );
  3. variable = variable* 10 + 1;
  4. sprintf(cadena,"%f",variable);            
  5. SetWindowText (edit, cadena);
  6. break;
  #15 (permalink)  
Antiguo 05/09/2011, 13:27
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 19 años, 11 meses
Puntos: 74
Respuesta: Alinear texto [Win API]

Anonimo12 : de nada. Y lo de * 10 + 1 no lo uses salvo que solo trabajes con numeros enteros (y en ese caso olvida double y usa int).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Etiquetas: alinear, código, funcion, struct, win7
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:49.