Experiencia de programación del joystick 2: cómo determinar si el botón se presiona efectivamente
En la programación del joystick, generalmente es necesario obtener el estado del botón para ejecutar eventos específicos. Por ejemplo, si se presiona el botón 1 una vez, la variable num se incrementará en 100. Sin embargo, esta situación ocurre a menudo. al depurar el sistema: presionar claramente Presione el botón una vez, pero el número de variable se ha incrementado en cientos. ¿Qué está sucediendo? Al principio estaba un poco desconcertado. Pero después de mirar el programa y pensarlo, encontré la razón. Resulta que usé eventos de reloj en el programa y configuré un reloj. Este reloj significa que el sistema obtiene el estado del botón del joystick cada 50 milisegundos. El código específico es el siguiente: SetTimer(hDlg, 0, 50, NULL); Al mismo tiempo, el botón se juzga en la función Ontimer. Cuando lo presiono, utilicé la siguiente declaración de juicio: // js.rgbButtons[0] significa el botón 1, js.rgbButtons[0] y 0x80 significa que el botón 1 está presionado. ( js.rgbButtons[0] & 0x80 ) {num = num +100;} Más tarde pensé que había algún problema con esta condición de juicio. ¿Cuál es el problema? La razón principal es que no se considera la actualización del estado en tiempo real. ¿Por qué la variable número se incrementa en cientos cuando se presiona el botón una vez? Esto se debe a que el tiempo que tarda una persona en presionar un botón (es decir, el intervalo de tiempo desde que se presiona el botón hasta que aparece) es incierto y puede ser de decenas de milisegundos o unos pocos segundos, pero el tiempo que tarda una persona en presionar un botón (es decir, el intervalo de tiempo desde que se presiona el botón hasta que aparece). El sistema para obtener el estado del botón es seguro (al sistema no le importa cuántos segundos se ha presionado el botón. En resumen, el sistema obtiene el estado del botón cada 50 milisegundos. Entonces habrá una situación: cuando presione el botón durante). más de 100 milisegundos, entonces el sistema cree que ya ha presionado el botón 2 veces. Una solución sencilla es cambiar el tiempo de respuesta del evento del reloj de 50 milisegundos a unos pocos segundos. Ahora, cualquier pulsación de botón inferior a este tiempo se considerará válida. Pero creo que esta no es una solución eficaz porque no hay forma de demostrar cuánto tiempo de respuesta al evento del reloj es apropiado. Pensé en una forma más efectiva, que es redefinir la presión efectiva: la presión efectiva significa que el botón ahora está en el estado emergente, pero su estado anterior fue presionado. El código específico es: /*!/botón breve. lista de estados Levante las variables, Abajo es el estado presionado, Arriba es el estado emergente */enum Estado{Abajo = 0,Arriba} y luego defina un miembro de datos privados en la clase de diálogo para obtener el estado del joystick: Estado m_Btn1PreStatus; // usado Guarda el estado anterior del botón e inicializa m_Btn1PreStatus al estado arriba en el constructor de la clase de diálogo: m_Btn1PreStatus = Up; modifica la parte de juicio del código para incrementar la variable num en 100: // Si el botón actual se presiona y su estado anterior es arriba, luego modifique su estado anterior para presionar if((js.rgbButtons[0] & 0x80)&&( m_Btn1PreStatus==Up)){m_Btn1PreStatus = Down;}//Si el estado actual del botón está arriba y es anterior. Si se presiona el estado, se incrementará num y su estado anterior se modificará para que aparezca. else if((js.rgbButtons[0] & 0x80)==0)&&( m_Btn1PreStatus ==Down) {num = num +100; this La primera experiencia es que la obtención del estado del hardware debe considerar su naturaleza en tiempo real.