Ver Mensaje Individual
  #3 (permalink)  
Antiguo 29/05/2011, 20:19
nostromos
 
Fecha de Ingreso: agosto-2009
Mensajes: 23
Antigüedad: 15 años, 3 meses
Puntos: 2
De acuerdo Respuesta: Programcion de graficos..

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 (HWNDUINTWPARAMLPARAM);

char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hinstHINSTANCE hPrevInstanceLPSTR lpszArgumentint CmdShow)
{
    
MSG msg;
    
//
    
if(!InitApp(hinst,(WNDPROCWindowProcedure,(LPCTSTRszClassName));
    
//
    
if(!InitInstance(hinst,CmdShow,(LPCTSTR)szClassName,650,550));
    
//
    
while (GetMessage (&msgNULL00)) { TranslateMessage(&msg); DispatchMessage(&msg); }
    
//
    
return msg.wParam
}
//-------------------------------------------------------------------------------------------
LRESULT CALLBACK WindowProcedure (HWND hwndUINT messageWPARAM wParamLPARAM 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, &rTRUE);
                    
//graficar(hdc,hwnd);
                    
break;
                case 
110:
                    
RECT r1;
                    
wnTexto true;
                    
GetClientRect(hwnd, &r1);
                    
InvalidateRect(hwnd, &r1TRUE);
                    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 (hwndmessagewParamlParam);
    }

    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 hdcHWND 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(136106106));
    
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, &rTRUE);
                    
//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.....