Holas;
Algo importante, en que lenguaje estas programando visual basic, c++, delphi, cual????.
Si quieres graficos del tipo medico, estos se obtienen mediante algoritmos matematicos bastantes complejos para obtener este tipo de imagen, mostrarlas en el form, el imprimir es algo mas facil, ya que solo lees los puntos su color y de ahi a un archivo de imagen.
Si es en WINAPI, debes manejar las separaciones de ecritorios, definir tamaño, ubicación, todo eso en el procedimiento paint WM_PAINT.
En el otro tipo de graficos de tipo barras, puntos, etc. es el mismo principio que el anterior caso, con la salvedad, que este es más facil de realizar, los ejes, tipo de puntos, crus estrellas, color, etc. Es programado en el evento WM_PAINT, escoger el tipo de brocha, colores, inicio y fin de punto, los numeros de klos ejes, titulos de ejes en sentido vertival u horizontal, todo se programa desde codigo.
En este sentido al realizarlo en WINAPI o Win32 en C ó C++, es más facil que en visual basic que necesitas de activeX, en winapi solo utilizas el kernel del windows para realizarlo en cuanto al personalizarlo.
Este es un ejemplo de graficar con WinApi y utilizando funciones de C y C++:
Código PHP:
#include <windows.h>
#include <cmath>
#include <cstdlib>
#include "app.h"
#include "win.h"
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
char szClassName[ ] = "WindowsApp";
int WINAPI WinMain (HINSTANCE hinst, HINSTANCE hPrevInstance, LPSTR lpszArgument, int CmdShow)
{
MSG msg;
//
if(!InitApp(hinst,(WNDPROC) WindowProcedure,(LPCTSTR) szClassName));
//
if(!InitInstance(hinst,CmdShow,(LPCTSTR)szClassName,650,550));
//
while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
//
return msg.wParam;
}
//-------------------------------------------------------------------------------------------
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
//-- Etiquetas
lbl[0] = MakeControl(3,"Grafico ScattertPlot",5,10,130,18,0,hwnd);
//-- Comandos
cmd[0] = MakeControl(1,"Graficar",5,100,80,20,100,hwnd);
//wnTexto = true;
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case 100:
RECT r;
grafActivo = true;
GetClientRect(hwnd, &r);
InvalidateRect(hwnd, &r, TRUE);
//graficar(hdc,hwnd);
break;
case 110:
RECT r1;
wnTexto = true;
GetClientRect(hwnd, &r1);
InvalidateRect(hwnd, &r1, TRUE);
break;
}
break;
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
if(wnTexto)
{
texto(hwnd,hdc);
}
if(grafActivo)
{
graficar(hdc,hwnd);
//texto(hwnd,hdc);
}
EndPaint(hwnd,&ps);
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
En WM_PAINT, es donde dibujas sobre cualquier control o ventana, se un boton, label, textbox, lo que sea, en visual basic es batsnate mas engorroso tienes que llamar a a las api, etccccc.
Con esto dibujas en una zona determinada de tu form o ventana principal y el resto lo llenas de controles, tal como aparece en la foto de medicina:
Código PHP:
if(grafActivo)
{
graficar(hdc,hwnd);
//texto(hwnd,hdc);
}
A continuacion el codigo para dibujar el grafico y las coordenas del dispositivo de contexto en donde dibujaras:
Código PHP:
/*--- Graficar Datos ---*/
void graficar(HDC hdc, HWND hwnd)
{
//hdc = GetDC(hwnd);
//COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);
SetMapMode(hdc,MM_ISOTROPIC);
SetWindowExtEx(hdc,640,400,NULL);
SetViewportExtEx(hdc,550,450,NULL);
SetViewportOrgEx(hdc,150,0,NULL);
//-eje x / y
hCPp = CreatePen(PS_SOLID,1,RGB(0,0,255));
SelectObject(hdc,hCPp);
MoveToEx(hdc,100,50,NULL);
LineTo(hdc,100,350);
LineTo(hdc,500,350);
//-- título gráfico
/* 1. Fuente Coordenadas X*/
hFuente = CreateFont(16,12,0,0,FW_BOLD,FALSE,FALSE,FALSE,OEM_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH,"Verdana");
SetTextColor(hdc,RGB(136, 106, 106));
TextOut(hdc,(300-(strlen(titulo)*10/2)),15,titulo,strlen(titulo));
//-- etiqueta eje X
TextOut(hdc,(300-(strlen(label_x)*10/2)),365,label_x,strlen(label_x));
//-- marca eje X
TextOut(hdc,(500-(2*12/2)),355,"100",3);
//-- marca eje Y
TextOut(hdc,(90-3*12),45,"100",3);
/* 2. Fuente Coordenadas X*/
hFuente = CreateFont(16,10,900,900,FW_BOLD,FALSE,FALSE,FALSE,OEM_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH,"Verdana");
SelectObject(hdc,hFuente);
TextOut(hdc,50,200+(strlen(label_y)*10/2),label_y,strlen(label_y));
//-eje x
xDat = 140;
for(i=0;i<10;i++)
{
yDat = 350;
MoveToEx(hdc,xDat,yDat,NULL);
yDat = 356;
LineTo(hdc,xDat,yDat);
xDat+=40;
}
//- eje y
yDat = 50;
for(i=0;i<10;i++)
{
xDat = 100;
MoveToEx(hdc,xDat,yDat,NULL);
xDat = 94;
LineTo(hdc,xDat,yDat);
yDat += 30;
}
//--- Desarrollo Ecuación --------
/* Colocar puntos */
/*for(i=10;i < 340;i++)
{
SetPixel(hdc,100+i,350-(int)(0.0023*(i*i)),RGB(0,0,0));
}*/
/*SetPixel(hdc,100+40,350-50,RGB(0,0,0));
SetPixel(hdc,100+80,350-108,RGB(0,0,0));
SetPixel(hdc,100+120,350-23,RGB(0,0,0));*/
SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,RGB(220,147,0));
TextOut(hdc,(int)(100+40*400/100)-5,(int)(350-10*300/100)+7,"x",1); //
TextOut(hdc,(int)(100+45*400/100)-5,(int)(350-55*300/100)+7,"x",1); //
TextOut(hdc,(int)(100+70*400/100)-5,(int)350-(25*300/100)+7,"x",1);
//TextOut(hdc,140+162,350-153,"x",1);
//--------------------------------
DeleteObject(hCPp);
DeleteObject(hFuente);
//ValidateRect(hwnd,NULL);
//ReleaseDC(hwnd,hdc);
}
Con esta funcion dibujas el grafico y estas instrucciones, será donde coloques tu grafico con coordenadas dentro de tu ventana:
Código PHP:
SetMapMode(hdc,MM_ISOTROPIC);
SetWindowExtEx(hdc,640,400,NULL);
SetViewportExtEx(hdc,550,450,NULL);
SetViewportOrgEx(hdc,150,0,NULL);
SetMapMode= tipo de unidades logicas a manejar, cm, [pulgadas, pixel, etc.
SetWindowExtEx y SetViewportExtEx= corresponden al tamaño que tendra tu grafico y las coordenas donde se dibujará tu gráfico.
Debes saber el uso de las siguientes funciones:
CreatePen
SelectObject
MoveToEx
LineTo
CreateFont
SetTextColor
TextOut
SetPixel
SetBkMode
SetTextColor
DeleteObject
ReleaseDC
BeginPaint
EndPaint
GetClientRect
InvalidateRect
RECT
Aqui tengo el codigo que van en commandbutton y cuando se activa, tira el valor del grafico a True y este dibuja donde le indique:
Código PHP:
case 100:
RECT r;
grafActivo = true;
GetClientRect(hwnd, &r);
InvalidateRect(hwnd, &r, TRUE);
//graficar(hdc,hwnd);
break;
grafactivo si te fijas esta en WM_PAINT, de esta manera se dibuja, ahora, lo interesante es que puedes tener varios graficos mostrando datos diferentes y todos actualizandose en tiempo real, si llegan los datos por puerto serial, webcam, etc, con esto llegas fácilmente a ,lo que quieres tal como se muestra en el primer link de lo que quieres.
Suerte.....