La Red de Conocimientos Pedagógicos - Currículum vitae - Cómo mostrar la escala en el control de la barra de desplazamiento de la columna en wincc

Cómo mostrar la escala en el control de la barra de desplazamiento de la columna en wincc

Al diseñar programas, elegir un control ActiveX adecuado a veces puede reducir en gran medida la carga de trabajo de programación. El control ActiveX (también conocido como OCX) se basa en la tecnología COM. Como módulo de software independiente, se puede insertar en cualquier lenguaje de programación. Este artículo solo utiliza VC++ como ejemplo para ilustrar el uso del control Gráfico. El control Gráfico se refiere a Mschart.ocx (versión 5.0) o Mschrt20.ocx (versión 6.0). Es uno de los controles ActiveX que viene con Visual Studio. Tiene muchas propiedades y eventos y es muy poderoso. , gráficos de curvas, gráficos de proporciones circulares, etc., pueden incluso ser gráficos híbridos, pueden ser gráficos bidimensionales o tridimensionales, con o sin sistemas de coordenadas, y pueden configurar libremente el color, fuente, etc. de cada elemento. Una vez que el control Chart esté instalado y utilizado, instale el control en el proyecto que usa el control Chart: Desde Proyecto->Agregar al proyecto->Componentes y controles->Controles Active X registrados, seleccione el control Chart y ClassWizard generará el control Chart. Clase C ++, donde la clase CMSChart se deriva de CWnd. Es la clase principal del control Chart. Todas las demás clases se derivan de COleDispatchDriver. Controlan los objetos correspondientes en el control y completan las funciones relacionadas de cada parte. la clase CvcAxis implementa funciones relacionadas con el eje de coordenadas. Al mismo tiempo, aparecerá un botón que representa el control Gráfico en la caja de herramientas de control del proyecto. Cuando lo use, arrastre el botón de control Gráfico desde la caja de herramientas al cuadro de diálogo y ajuste el tamaño. El control Gráfico tiene al menos 45 propiedades, 9 métodos y 49 eventos, que no se enumeran aquí. En el diseño, podemos modificar los valores de atributo de cada atributo en la página de propiedades principal: haga clic con el botón derecho en el control Gráfico en la ventana de diálogo, seleccione el elemento del menú "Propiedades" y aparecerá el cuadro de diálogo de la página de propiedades principal. , en el que se puede modificar el valor de cada atributo. Algunas propiedades no aparecen en la página de propiedades principal y solo se pueden modificar mediante programación. Además, para dibujar gráficos dinámicamente, debes dominar el control de programación de controles. Primero, defina las variables de control en la clase de diálogo para que pueda manipular los controles durante la programación. Por ejemplo, la clase del cuadro de diálogo se define de la siguiente manera: class CAbcDlg: public CDialog{public: CAbcDlg(CWnd* pParent = NULL); //{{AFX_DATA(CAbcDlg) enum { IDD = IDD_ABC_DIALOG }; AFX_DATA }; control ActiveX Las propiedades y métodos del control corresponden a un valor de índice entero único dentro del control. Puede establecer u obtener el valor de propiedad del control a través del índice durante la programación, o puede establecer u obtener el valor de propiedad del control. llamando a la función miembro de la clase C++ del control (en este caso, CMSChart Valores de propiedad y métodos para llamar a los controles).

Por ejemplo: existe el siguiente código en la implementación de la clase CMSChart: CString CMSChart::GetData(){ CString result;InvokeHelper(0x9, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL return result;}void CMSChart:: SetData(LPCTSTR lpszNewValue){ parms BYTE estático[] =VTS_BSTR; ;} Este fragmento de código muestra que el valor de índice del atributo "Datos" es 0x9, y podemos llamar a la función SetData para establecer el valor de un determinado punto en el gráfico. Se llama al método "Actualizar" cuyo valor de índice es DISPID_REFRESH para actualizar.

Por ejemplo: CString str="34.5";m_Chart.SetData(str);m_Chart.Refresh(); Al leer la implementación de la clase CMSChart, encontrará que los valores de algunos atributos no son BOOL, CString ordinarios. y otros tipos de datos, pero otro controlador controla las variables de clase de la clase, como: CVcPlot CMSChart::GetPlot(){ LPDISPATCH pDispatch;InvokeHelper(0x28, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&pDispatch, NULL return CVcPlot(pDispatch); );} La implementación de la clase CVcPlot es la siguiente Código: CVcAxis CVcPlot::GetAxis (longaxisID, const VARIANT& Index){ LPDISPATCH pDispatch static BYTE parms[] =VTS_I4 VTS_VARIANT;InvokeHelper(0x1f, DISPATCH_PROPERTYGET,VT_DISPATCH, (void) *)&pDispatch, parms, axisID, &Index); return CVcAxis(pDispatch);} La implementación de la clase CVcAxis tiene el siguiente código: CVcValueScale CVcAxis::GetValueScale(){ LPDISPATCH pDispatch;InvokeHelper(0x9, DISPATCH_PROPERTYGET, VT_DISPATCH, (void *)&pDispatch, NULL); return CVcValueScale(pDispatch); } La implementación de la clase CVcValueScale tiene el siguiente código: void CVcValueScale::SetMaximum(double newValue){ static BYTE parms[] =VTS_R8;InvokeHelper(0x3, DISPATCH_PROPERTYPUT, VT_EMPTY , NULL, parms,newValue);} Esto es exactamente Chart La flexibilidad del control radica en el código anterior La siguiente llamada: VARIANT var;m_Chart.GetPlot().GetAxis(1, var).GetValueScale().SetMaximum(. 50,0); puede establecer la escala máxima de ordenadas en 50,0. Si es necesario procesar eventos desencadenados por controles, como Click, MouseDown, etc., puede definir las funciones de procesamiento correspondientes en la clase de diálogo a través de ClassWizard para implementar funciones de procesamiento relacionadas. 2. Ejemplo de dibujo de gráfico dinámico En un sistema de recopilación de temperatura, si desea mostrar los valores de temperatura recopilados en tiempo real, use el control Gráfico para dibujar un gráfico de curva: cada elemento de temperatura está representado por una curva de un color diferente; la abscisa es el tiempo y la ordenada es. Los valores de temperatura deben mostrarse de forma desplazable después de que se completa cada muestreo y la pantalla se actualiza; Idea de diseño A medida que pasa el tiempo, los datos recopilados continúan aumentando y no necesariamente se muestran en una pantalla, por lo que el sistema abre una base de datos en tiempo real para almacenar los datos recopilados en tiempo real. Al mostrar, los datos para el período de tiempo requerido se leen de la base de datos. Al editar recursos de diálogo, agregue barras de desplazamiento horizontales y barras de desplazamiento verticales para coordinar con el control Gráfico para la visualización con desplazamiento. Inicia un temporizador para el cuadro de diálogo, toma muestras en el intervalo de muestreo y actualiza la visualización de la pantalla.

Los principales códigos relacionados son los siguientes: BOOL CAbcDlg::OnInitDialog(){ CDialog::OnInitDialog();pDataDB = new dbase;//Biblioteca de registro de datos en tiempo real, la clase base de la clase dbase es CDaoRecordset pDataDB->Open( dbOpenDynaset, “select* from data"); VARIANT var;m_Chart.GetPlot().GetAxis(1,var).GetValueScale(). SetAuto(FALSE);// No marcar automáticamente la escala del eje y m_Chart.GetPlot( ).GetAxis(1, var). GetValueScale().SetMaximum(37);// La escala máxima del eje y m_Chart.GetPlot().GetAxis(1, var).GetValueScale(). //La escala mínima del eje y m_Chart.GetPlot().GetAxis (1,var).GetValueScale().SetMajorDivision(5);//La escala del eje y se divide en 5 partes iguales m_Chart.GetPlot() .GetAxis(1,var).GetValueScale(). SetMinorDivision(1);//Uno para cada escala Marca de escala m_Chart.SetColumnCount(3); //3 elementos de temperatura, 3 curvas m_Chart.GetPlot().GetSeriesCollection(). GetItem(1). GetPen().GetVtColor().Set(0, 0, 255);//Color de línea m_Chart.GetPlot().GetSeriesCollection().GetItem(2). (255, 0, 0); m_Chart.GetPlot().GetSeriesCollection().GetItem(3). GetVtColor().Set(0, 255, 0); GetItem(1).GetPen().SetWidth(2);//Ancho de línea m_Chart.GetPlot ().GetSeriesCollection(). GetItem(2).GetPen().SetWidth(2); ). GetItem(3).GetPen().SetWidth(2); m_Chart.SetRowCount(10); //Muestra 10 tiempos de muestreo en una pantalla m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale(). (FALSE); //No marcar automáticamente la escala del eje x m_Chart.GetPlot().GetAxis(0 ,var).GetCategoryScale().SetDivisionsPerLabel(1);//Una etiqueta cada vez m_Chart.GetPlot(). GetAxis(0,var).GetCategoryScale(). SetDivisionsPerTick(1);//Una marca de verificación cada vez m_ScrLeft. SetScrollRange(0,45); //Rango desplazable de la barra de desplazamiento vertical (rango de valores de temperatura 0-50), cada desplazamiento 1 grado, una pantalla muestra 5 grados) m_

ScrLeft.SetScrollPos(45-32);//La posición actual de la barra de desplazamiento vertical m_ScrBottom.SetScrollRange(0, 0);//El rango de desplazamiento de la barra de desplazamiento horizontal m_ScrBottom.SetScrollPos(0);//La posición actual de la barra de desplazamiento horizontal SetTimer(23, 300000, NULL);//Inicia el temporizador con un intervalo de tiempo de 5 minutos Sample();//Llama a la función de muestreo para el primer muestreo y registra los datos en la base de datos return TRUE; }void CAbcDlg::OnTimer( UINT nIDEvent) { Sample();//Muestreo y registro de datos en la base de datos if (pDataDB->GetRecordCount()>10) theApp.nBottomRange = pDataDB->GetRecordCount()-elsetheApp. nBottomRange = 0; // Utilice variables globales para guardar el valor del rango de la barra de desplazamiento horizontal m_ScrBottom.SetScrollRange(0,theApp.nBottomPos); //Correcto; la visualización de la barra de desplazamiento horizontal DrawPic() //Llame a la función y actualice la visualización de la curva CDialog::OnTimer(nIDEvent);}void CAbcDlg::DrawPic() {char s[10]; ->MoveFirst();pDataDB->Move(theApp. nBottomPos);//Solo toma los datos de un cierto período de tiempo de la base de datos para mostrarlos mientras ((!pDataDB->IsEOF()) && (row m_date_time.Format( "%H:%M"));//Tiempo de muestreo Marcar el eje x m_Chart.SetColumn(1); sprintf(s, “%6.2f”, pDataDB->m_No1); ); ", pDataDB->m_No3); m_Chart.SetData((LPCSTR )s); pDataDB->MoveNext(); fila++; } while ((fila GetRecordCount()>10) theApp.nBottomRange = pDataDB->GetRecordCount()-10 ; si no, theApp.nBottomRange = 0; m_ScrBottom.SetScrollRange(0, theApp.nBottomRange); switch (nSBCode){ case SB_LINERIGHT: if (theApp.nBottomPos 0){ theApp.nBottomPos = theApp.nBottomPos - 1; .nBottomPo

s); DrawPic(); } break; } CDialog::OnHScroll(nSBCode, nPos, pScrollBar);}void CAbcDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar*pScrollBar) { VARIANT double max1,min1,f ; switch (nSBCode){ case SB_LINEDOWN:f = m_Chart.GetPlot().GetAxis(1, var). GetValueScale().GetMinimum() - 1 si (f>=0) {//La escala mínima es mayor que; o igual a 0, luego puede desplazarse m_Chart.GetPlot().GetAxis(1, var).GetValueScale() SetMinimum(f);f = m_Chart.GetPlot().GetAxis (1, var).GetValueScale(). GetMaximum() - 1; m_Chart.GetPlot().GetAxis(1, var).GetValueScale().SetMaximum(f); pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() + 1); romper; caso SB_LINEUP:f = m_Chart.GetPlot().GetAxis(1, var).GetValueScale().GetMaximum() + 1 if (f SetScrollPos(pScrollBar->GetScrollPos() - 1); m_Chart.Refresh() ; } break; } CDialog ::OnVScroll(nSBCode, nPos, pScrollBar);} Preste especial atención a las clases de control utilizadas en el programa, como CVcAxis, etc., que deben indicarse al principio de AbcDlg.cpp. archivo: #include "VcAxis.h" Debido a limitaciones de espacio, el artículo es solo una parte del código de un ejemplo simple. En aplicaciones prácticas, generalmente existen requisitos como: escalar y mostrar la visualización de los ejes de coordenadas. puede ser discontinuo cuando no se obtiene el valor de muestreo, etc. El código correspondiente debe escribirse de acuerdo con los requisitos.