Problema de control de la barra de progreso de MFC
Hablemos brevemente sobre el proceso de implementación:
Usamos un temporizador para controlar el progreso de la barra de progreso. La primera es que la interfaz no se atascará. Y el segundo es la conveniencia. Controla el inicio y la parada de la barra de progreso. Porque si controlas el progreso de la barra de progreso en un bucle simple, es probable que se atasque.
Aquí diseñamos las acciones en ejecución de las tres barras de progreso: si se hace clic en el botón A, se detendrá cuando llegue al final de la barra de progreso, y si es el botón B o el botón C, si la barra de progreso llega al final. Luego continúa corriendo desde el principio.
Por tanto, definimos los siguientes miembros: //Asociar variables de control a las tres barras de progreso
CProgressCtrl?m_prcThree;
CProgressCtrl?m_prcTwo;
CProgressCtrl?m_prcOne;
int?m_Counter;//Contador, utilizado para controlar la posición de la barra de progreso
bool?m_bIsButtonA;//Si se presiona el botón A ?
bool?m_bButtonBFlag;// Ya sea que se presione el botón B
// Agregue una función miembro, su implementación es la siguiente, suponiendo que la clase del cuadro de diálogo se llama CMFCTestDlg:
//La función es cambiar la posición de la barra de progreso. Si se presiona el botón A, se detendrá al final del progreso.
void?CMFCTestDlg::ChangeProcVal( )
{ ++m_Counter; si?(m_Counter?>?50) { m_Counter?=?0; si?(m_bIsButtonA) {
KillTimer(TIMER_1);
regresar?; función de controlador para el evento WM_INITDIALOG de la clase del cuadro de diálogo, realice alguna inicialización
//Establezca el rango de la barra de progreso
m_prcOne.SetRange(0,?50); p>
m_prcTwo.SetRange(0,?50);
m_prcThree.SetRange(0,?50);
//¿Inicializar variables miembro?
m_Counter?=?0;
m_bButtonBFlag?=?false;?
//Definir una macro para indicar el evento del temporizador
#define?TIMER_1 ?1?
//Agregar La función de manejo de eventos WM_TIMER de la clase del cuadro de diálogo maneja eventos del temporizador
void?CMFCTestDlg::OnTimer(UINT?nIDEvent)?
{ //?TODO:?Agregar?su?mensaje?handler?código?aquí?y/o?llamar?default switch(nIDEvent) { case?TIMER_1:
ChangeProcVal(); p>
break; default:
break; } CDialog::OnTimer(nIDEvent);
}
//OK, la preparación está completa, ¿Cuál es la función del siguiente botón?
/ /El código del botón A es el siguiente:
m_bIsButtonA?=?true;
SetTimer(TIMER_1 ,?10,?NULL);?
//El código para el botón B es el siguiente:
m_bIsButtonA?=?false;
m_bButtonBFlag?=? !m_bButtonBFlag;
si?(m_bButtonBFlag)
{ SetTimer (TIMER_1,?10,?NULL);
}
else
{ KillTimer(TIMER_1);?
} p>
//El botón C necesita capturar la presión y liberación del mouse
Abra el evento, por lo tanto, reescriba la función virtual PreTranslateMessage de la clase del cuadro de diálogo. Entre ellos, IDC_BUTTON3 es el ID de control del botón C. ¿No es necesario escribir el evento del botón?
BOOL?CMFCTestDlg: :PreTranslateMessage(MSG*?pMsg) ?
{ //?TODO:?Agregar?su?código?especializado?aquí?y/o?llamar?la?clase?base?si(pMsg->mensaje) ?==?WM_LBUTTONDOWN?&&? pMsg->hwnd?==?((CButton*)GetDlgItem(IDC_BUTTON3))->GetSafeHwnd()) { m_bIsButtonA?=?false; } else?if(pMsg-> mensaje?==?WM_LBUTTONUP?&&?pMsg->hwnd?==?((CButton*)GetDlgItem(IDC_BUTTON3))->GetSafeHwnd()) { KillTimer(TIMER_1 } return? CDialog::PreTranslateMessage(pMsg);
} Todo el código está completo y se puede probar. La captura de pantalla de prueba puede no ser muy clara:
Si tiene alguna pregunta, pregunte. otra vez jaja