Página 1 de 1

Ayuda con RichEdit

Publicado: 22 Sep 2009, 14:38
por Jonny
Hola

Necesito poner en el programa que estoy haciendo dos controles, que quisiera, fueran como los de éste programa:
http://www.sendspace.com/file/nkitig

Es un cliente para jugar a Muds (Juegos online basados en texto) Sí, desfasados hoy en día jeje.

No se como lo tendreis para probarlo, pues te obliga a estar conectado a un mud para ver los controles que necesito.
Por si os animais, podeis ponerle para probar éste:
Host: sidonia.noweb.es
Puerto: 4000

En principio solo teneis que conectar, no es necesario crear ningún personaje. Al conectar, aparecen dos cuadros de edición (Los que me interesan) "Enviados" y "Recibidos".
En el primero, aparecen conforme se van escribiendo, los comandos que enviamos al juego. En el segundo, lo que el juego nos envía.
He estado mirando con AutoIt Window Info los controles y parece que son RichEdit. Así pues, fuí al foro inglés de AutoIt y busqué RichEdit (Ya había leído por aquí que son complicados de programar) y no tardé mucho en dar con una UDF para éste control que se llama GuiRichEdit, que incluye un buen montón de ejemplos, pero que me temo que ninguno hace lo que quiero, almenos en uno de los casos.

Lo más complicado, parece ser el primer control del programa anterior (Omnimud "Enviados"), pues te permite en primer lugar, seleccionar con cursores (imagino que también con el ratón) una línea y pulsando intro sobre ella, envía el texto que haya en esa línea al juego (yo quiero hacer algo igual)
Además, al escribir algo, si el foco está sobre una línea en la que hay texto lo que escribimos, se pone siempre en una línea aparte y en caso de pulsar intro sin haber escrito nada, en el caso de Omnimud, envía una cadena vacía al juego (que también me gustaría hacer algo así)

No se si todo esto´habrá que programarlo a mano, capturando la tecla intro, o se hará dando determinadas propiedades al control...

En el otro cuadro de edición ("Recibidos") que parece que también es un RichEdit, Me interesa que sea ReadOnly (Esto lo ví en uno de los ejemplos que incluye GuiRichEdit) y también poder controlar el foco en éste control.
En el programa de ejemplo que os puse, lo controlan de manera que según configuremos el programa, el foco se irá siempre al final del control o se quedará siempre en la misma posición aunque se le añada texto nuevo
¿Sabeis como hacer ésto?

Gracias de antemano,

Salu2!

Re: Ayuda con RichEdit

Publicado: 28 Sep 2009, 04:23
por Chefito
Jejejeje....que tiempos aquellos cuando estaba picado al juego Medina (mod) el cual se conectaba por telnet :smt005 . El win casi no existía jajajaja (win 3.11 :smt005 ). Yo le he hechado muchas horas a este juego en la Universidad :smt005 :smt005 . Era mago :smt003 .

Eso que pides no creo que sea muy dificil. Solamente tienes que ver un poco las funciones que trae la udf del richedit. Y para controlar los eventos, viendo los códigos de mensajes de windows, los cuales puedes capturar por ejemplo con wm_command, puedes controlar cualquier cambio en el control, y la pérdida y ganancia del foco.
Jonny escribió:pues te permite en primer lugar, seleccionar con cursores (imagino que también con el ratón) una línea y pulsando intro sobre ella, envía el texto que haya en esa línea al juego (yo quiero hacer algo igual)
Con esto quieres decir que si, por ejemplo, tengo 3 lineas, y situo el cursor en la segunda, al pulsar intro, se envíe solamente la segunda linea completa?
Jonny escribió:Además, al escribir algo, si el foco está sobre una línea en la que hay texto lo que escribimos, se pone siempre en una línea aparte y en caso de pulsar intro sin haber escrito nada, en el caso de Omnimud, envía una cadena vacía al juego (que también me gustaría hacer algo así)
Con esto otro, que si el cursor está sobre una línea donde hay texto, justo al escribir, lo va a hacer en otra línea nueva? la inmediatamente inferior a la que estaba el cursor o una nueva línea al final del texto?

Saludos.

Re: Ayuda con RichEdit

Publicado: 28 Sep 2009, 06:44
por Jonny
Hola

Jejeje...
Vaya, pues precisamente el mud que puse de ejemplo (Sidonia) que es al que he echado muchas muchas muchas horas (y aún sigo echando alguna que otra) es el sucesor de medina, por lo que cuentan. De hecho ahí juega gente de medina (aunque no tanta como antes) y por lo visto se parece mucho (quisieron que fuera una réplica).
Así, que posiblemente conozcas ha gente de por allí jeje.

Sí, la idea es esa.
Escribimos en el richEdit algo como esto:

Mira
Bebe
Norte

Quisiera, que al situar el foco sobre norte, se enviara efectivamente Norte.
Si lo situáramos sobre Mira, enviara Mira y así. Respecto a lo de que se cree una nueva línea cuando se empieza a escribir, quisiera que fuera al final del richedit, para que conforme se va escribiendo, lo más reciente que se escribió quede al final del control.

Salu2!

Re: Ayuda con RichEdit

Publicado: 28 Sep 2009, 23:00
por Chefito
Aun no lo acabo de entender del todo :smt017 . Supongo que cuando quieres decir foco....quieras decir cursor, o quieres decir un texto seleccionado?
Además, en la primera cuestión, si pones el cursor encima del texto y le das al enter para enviar una línea, se va a partir la línea (se va a meter un retorno de carro). Ejemplo:
Norte
Sur
Si metes un enter en norte se podría quedar así:
Nor
te
Sur
Y si anulo el retorno de carro para que no parta las líneas, entonces no voy a poder cambiar de línea nunca :smt017 .
O te has equivocado y salen estas consultas en el otro richedit? en el de recibir??? En el que está bloqueado??? eso sería más lógico.
Quería ver el funcionamiento de este programa, pero ya no me conecta.

Saludos.

Re: Ayuda con RichEdit

Publicado: 29 Sep 2009, 06:50
por Jonny
Hola

Yo no lo veía tan sencillo... Pero efectivamente, el programa que subí lo hace.
Siguiendo el ejemplo, si tenemos:
Norte
Sur
Al pulsar intro sobre Norte, la palabra no se parte, sinó que se envía al mud (es en el cuadro enviados).
Tienes razón, el mud que puse de ejemplo no funciona, y esque se calló el domingo y hasta la semana que viene no lo levantarán jejejeje

Aquí tienes otro, que ahora mismo está funcionando para que veas como funciona ese programa:
cfmud.genesismuds.com:4100

Salu2!

Re: Ayuda con RichEdit

Publicado: 30 Sep 2009, 04:41
por Chefito
No se no se.......no parece que se comporte como tu dices. En el cuadro "Texto a enviar" no aparecen filas. Escribes lo que sea, le das al enter y se queda totalmente en blanco. Donde aparecen las cosas (direcciones, explicaciones, objetos, etc) es en el otro cuadro (Recibido), el que esta en modo solo lectura. Por eso pienso que lo estás diciendo al revés (con los cuadros cambiados).
Pero bueno.....puede que esté equivocado y quieras lo que tu dices.

Igualmente prefiero indicarte algunos pasos para hacer estas cosas que ponerte el código.
Lo primero es bajarte la última colección de funciones y ejemplos para el control RichEdit del foro de habla inglesa:
http://www.autoitscript.com/forum/index ... ntry716705
Por cierto, esta colección es bueniiiiiiiiiiisiiiiiimaaa :smt005 . Tendría que estar incluida en los udfs de AutoIt.

Teniendo esto, tienes que dedicarle un poco de tiempo a mirarte las funciones y sus ejemplo para ver que hacen.

Para saber cuando pierde o gana el foco un control richedit, he descubierto que se puede hacer viendo los mensajes que genera WM_COMMAND. Utiliza la función GUIRegisterMsg para recibir estos mensajes.
Pues bien, te envia tres tipos de mensajes. 256 y 512 son la perdida y ganancia del foco (no recuerdo cual es cual pero haciendo una prueba se sabe en un sg. :smt005 ). Y si por casualidad se puede necesitar para algo, siempre que se hace algo en el control, salta el 1024. Con esto acabamos esta parte.

Para hacer las otras cosas que te interesan, vas a necesitar capturar mensajes del teclado (por ejemplo para capturar enter). Esto lo vas ha hacer con el codigo de mensaje WM_NOTIFY. Pero antes, debes llamar a una función del udf (_GUICtrlRichEdit_SetEventMask), y los mensajes que más te van a interesar son los tratados por la constante $ENM_KEYEVENTS (eventos del teclado). Aunque hay muchas muy interesantes que puedes agregar junto a esta. Mira el ejemplo de esta función que trae la udf y lo comprenderás mejor.
Para detectar el enter (código ascii 13), tendrás me utilizar esta condición (o una estructura parecida) en la función WN_NOTIFY:

Código: Seleccionar todo

If DllStructGetData($tMsgFilter, "msg") = $WM_KEYDOWN And DllStructGetData($tMsgFilter, "wparam")=13 Then
Mira en la udf la estructura $tagEN_MSGFILTER para comprender mejor esto. Las estructuras las han definido bastante bien. No debes de tener problemas de comprenderlas.
Si quieres que se haga algo al apretar el enter, debes meterlo dentro de la condición anterior.
Si quieres anular el enter después de hacer la acción anterior, debes acabar el interior de esa condición con por ejemplo Return 1.

Que más que más....

Para enviar la fila donde se encuentra el cursor situado al pulsar enter (lo del enter ya está solucionado arriba) debes saber en que fila está ese cursor. Se me ocurre una forma: Puedes variar un poquito una de las funciones para que te de la posición del cursor. La función a variar es _GUICtrlRichEdit_GetSel. Te la varío:

Código: Seleccionar todo

; Author ........: Prog@ndy

; Modified.......: Chris Haslam (c.haslam) and chefito

Func _GUICtrlRichEdit_GetPosCursor($hWnd)

    Local $tCharRange

    If Not IsHWnd($hWnd) Then Return SetError(101, 0, False)

    $tCharRange = DllStructCreate($tagCHARRANGE)

    __GCR_SendMessage($hWnd, $EM_EXGETSEL, 0, DllStructGetPtr($tCharRange))

    Return DllStructGetData($tCharRange, 1)

EndFunc   ;==>_GUICtrlRichEdit_GetPosCursor

 
Solo nos interesa que nos devuelva la primera posición, no?.
Ahora que tenemos la posición del cursor, podemos conseguir la línea con la función _GUICtrlRichEdit_GetTextinLine, para luego enviarla donde quieras.

Incluso puedes conseguir solamente la palabra donde esté situado. Con las funciones _GuiCtrlRichEdit_GetCharPosOfPreviousWord y _GuiCtrlRichEdit_GetCharPosOfNextWord consigues las posiciones 1º y última de la palabra respectivamente......sabiendo eso conseguir la palabra esta mamado.....no te digo más :smt002 .

Para ir al final del texto utiliza esto: _GuiCtrlRichEdit_GotoCharPos($hRichEdit2, -1).

Y para dejar el cursor donde estaba después de pegar texto, supongo que podría ser recuperando la posición del cursor con _GUICtrlRichEdit_GetPosCursor antes de pegar el texto, y inmediatamente después de pegarlo, posicionarlo con la función _GuiCtrlRichEdit_GotoCharPos.

Con todo esto, te dejo el script comido y masticado......solamente te falta tragarlo :smt003 .
Intenta hacer algo de código (si es todo mejor :smt002 ). Cuando tengas algo, cuelgalo. Si tienes alguna duda pregunta.

Saludos.

Re: Ayuda con RichEdit

Publicado: 30 Sep 2009, 06:44
por Jonny
Hola

Buf, quizá si lo expresé al revés? En cualquier caso, quería hacerlo igual que ese programa.

Con todo esto, iré haciendo cosillas, a ver que pasa y os cuento.
Gracias,

Salu2!