• No se han encontrado resultados

TARJETA PARA ADQUISICIÓN DE SEÑALES BIOMEDICAS

N/A
N/A
Protected

Academic year: 2018

Share "TARJETA PARA ADQUISICIÓN DE SEÑALES BIOMEDICAS"

Copied!
51
0
0

Texto completo

(1)

UNIVERSIDAD AUTóNOMA METROPOLITANA

UNIDAD IZTAPALALA

c,

&!"

%O

REPORTE DE PROYECTO

TERMINAL

1-4

fir's

-1

G"$-

5

-

TARJETA PARA ADQUISICIÓN DE SEÑALES

BIOMEDICAS

PROFESOR :GONZÁLEZ VELES VIRGINIA

(2)

OBJETIVOS GENERALES

INTRODUCCI~N

ANTECEDENTES

CAPITULO I DESCRIPCI~N DEL SISTEMA

l . 1 OBJETIVOS PARTICULARES

1.2 DESCRIPCI~N GENERAL DE LOS MÓDULOS HARDWARE DEL SISTEMA

1.3 DESCRIPCIóN GENERAL DE LOS MóDULOS SOFTWARE DEL SISTEMA

CAPITULO I1 : MóDULOS HARDWARE DEL SISTEMA

2.1 OBJETIVOS PARTICULARES

2.2 CARACTERÍSTICAS DEL HARDWARE

2.3 DIAGRAMA DE LA TARJETA DE ADQUISICIÓN

2.4 DESCRIPCIóN DE LA TARJETA DE ADQUISICIóN

CAPITULO 111 : MÓDULOS SOFTWARE DEL SISTEMA

3.1 OBJETIVOS PARTICULARES

3.2 CARACTERÍSTICAS DEL SOFTWARE

3.3 DIAGRAMA JERÁRQUICO DEL SISTEMA DE SOFTWARE

3.4 IMPLANTACI~N DEL SISTEMA BAJO EL SISTEMA OPERATIVOS

MS-DOS

3.4.1 RUTINAS DE ADQUISICIóN BAJO DOS.

3.5 TRANSFERENCIA DEL SISTEMA AL SISTEMA OPERATIVO WINDOWS

(3)

OBJETIVOS GENERALES

*

Diseñar y construir un sistema de adquisición de señales Biomédicas, de 8 canales desplegados en tiempo real

*

Construir el hadware necesario para convertir las señales analógicas a

digitales. Permitiendo tomar las muestras necesarias para poder reconstruir las señales y además para presentar los datos digitalizados de los 8 canales

simultáneamente.

*

Desarrollar el software necesario para procesar la información proveniente de las muestras tomadas por la tarjeta con la finalidad de irlterpolarlas y

(4)

Dentro de las múltiples aplicaciones que se pueden encontrar a los sistemas que son auxiliados por la PC, puede decirse que uno de los más útiles son los sistemas que presentan la información proveniente de la naturaleza en la pantalla de una computadora. Para lograrlo se realizaun sencillo proceso que consiste en tomar muestras de la señal, transormarla a una presentación digital, seleccionar las muestras tomadas, unirlas y posteriormente desplegarlas. Todo este proceso debe ser lo suficientemente rápido como para poder engañar al usuario de que las señales son desplegadas "instantáneamente", es decir, el proceso debe realizarse en tiempo real.

A tales sistemas se les denomina con el nombre genérico de sistemas de adquisición. En el presente caso atenderemos al diseño y desarrollo de un sistema para captar señales biológicas de baja frecuencia (con aplicaciones en

medicina), cuyas frecuencias jamas rebasan por ejemplo los; 1000 Hz., por lo que es justo designarlo con el nombre de "SISTEMA DE ADQUISICIóN DE SEÑALES

BIOMEDICAS"

.

El sistema, está constituido por una tarjeta que emplea un convertidor cuyo funcionamiento se basa en la aproximación de registros y por un programa que controla todo el proceso. Dicho programa indica al convertidor el momento en que debe empezar a convertir, y en un lapso no mayor a 1 O0

microsegundos, la tarjeta avisa a la computadora que ha determinado el valor de la muestra, mediante una interrupción, activa la rutina de atención a la interrupción

correspondiente y la computadora se encarga de seleccionar los datos que se encuentran fuera de rango y los "suaviza", posteriormente los presenta en pantalla unidos por líneas.

(5)

Para el software se realizaron dos pro:gramas, uno que funciona bajo el sistema operativo MS-DOS y otro para el sistema operativo WINDOWS, la complejidad asociada al segundo es notablemente superior y además tiene problemas con la velocidad con la que se despliegan los datos a pesar de que las rutinas críticas están totalmente optimadas. Este es principalmente el precio que hay que pagar por tener semejante interfaz con el usuario y por tener la calidad de los objetos que son desplegados, sin embargo se puede subsanar fácilmente si se emplea alguna

computadora de la serie 486 DX o superior.

El sistema fue desarrollado para cubrir los dos PROYECTOS DE INVESTIGACIóN que corresponden a la carrera de Ing. Electrónica, y fueron

(6)

ANTECEDENTES

*

La idea de construir un sistema de adquisición surgió a partir de las necesidades que existen dentro del ámbito hospitalario de disponer de equipo necesario para poder analizar la información que usualmente sirve corno referencia para poder realizar diagnósticos. Dicha información proveniente de los enfermos, generalmente consiste en señales de muy baja frecuencia por lo que se facilita el problema de diseñar una tarjeta capaz de manipularla. Es decir la tarjeta con la que se trabaja fácilmente podría construirse en cualquier laboratorio de ingeniería biomédica, ya que además los componentes que emplea son de fácil adquisicih y de bajo precio.

*

Una razón adicional consistió en la necesidad de proponer un sistema de muy bajo precio, sin perder de vista la importancia que implica trabajar con señales que serán empleadas para facilitar el diagnostico de un enfermo, ya que

comparativamente las tarjetas que pueden conseguirse a nivel comercial son

considerablemente mas caras y difícilmente pueden modificarse en el supuesto caso de que surgiesen nuevas necesidades.

*

La última razón por la que se propuso tal ,sistema fue para poder cumplir con el requisito que se especifica dentro del reglamento de la UAM, para poder acceder al titulo a nivel de licenciatura dentro de la carrera de Ing. Electrónica. Aunque ciertamente el sistema parece a simple vista estar mas relacionado con la carrera de Ing. Biomédica que también puede cursarse dentro de la misma universidad, los principales problemas que tienen que sortearse son de diseño de Hardware y Programación por lo que en realidad se ajusta perfectamente a las actividades que se consideran propias de un Ing. en Electrónica

(7)

7

(8)

CAPITULO I : DESCRIPCI~N DEL SISTEMA

1.1 OBJETIVOS PARTICULARES

*

Describir a grandes rasgos las partes de las que se compone el SASB, desde el punto de el punto de vista HARDWARE y desde el punto de vista SOFTWARE

*

Proporcionar una descripción

microscópica del funcionamiento de los componentes empleados en el Hardware

que requirió el SASB

*

Proporcionar una descripción

(9)

9

1.2 DESCRIPCI~N GENERAL DE LOS MÓDULOS HARDWARE

DEL SISTEMA

El diagrama del hardware empleado aparece en la Tabla 1, básicamente emplea un convertidor analógico digital (ADC0809). La forma en la que determina el valor de las muestras la realiza mediante aproximación de registros, su rapidez de conversión es no menor de 1 O0 microsegundos por muestra, y tiene ocho entradas analógicas, lo cual permite manejar ocho señales analógicas simultáneamente siempre y cuando éstas en conjunto no sumen una frecuencia mayor a 5 Khz (según el teorema del muestreo) de donde se obtiene que si todos los canales se muestrean a una misma velocidad, se podrán manipular señales de hasta 625 Hz, lo cual es una excelente frecuencia de muestreo si se pretenden manejar señales que difícilmente exceden los 500 Hz. Sin embargo el teorema del muestreo también predice que para poder

reconstruir la señal que es muestreada se requiere de un filtro de orden infinito, en el presente caso se emplea una filtro de orden lineal de tipo digital para reconstruir la señal y un filtro adicional de tipo analógico para eliminar las componentes de alta frecuencia que pudieran mezclarse con la señal que pretende ser muestreada (a la entrada del convertidor).

1.3 DESCRIPCI~N GENERAL DE LOS MÓDULOS SOFTWARE DEL SISTEMA

Los módulos Software básicamente constan de :

1) Rutina para desenmascarar la interrupción IRQ5

2) Rutina para indicar el inicio de conversión del convertidor

3) Rutina de atención a la interrupción

4) Rutina para seleccionar los datos obtenidos

5) Rutina para desplegar los datos en pantalla

El proceso que se sigue consiste en la secuencia 1=>.2=>3=>4=>5.

Evidentemente se requieren mucho más rutinas que las aquí: indicadas sin embrago, éstas son las rutinas esenciales de las cuales ésta constituido el sistema

La única estructura de datos empleada es una estructura de datos de tipo FIFO la cual almacena la información en forma dinámica (COLA DINÁMICA).

(10)

CAPITULO I1 : MóDULOS HARDWARE DEL SISTEMA

(11)

2.3 DESCRIPCIóN DE LA TARJETA RE ADQUISICIóN

El convertidor proporciona muestras con una resolución de 8 bits y puede manipular señales con una amplitud de hasta 5 Vpp, lo cual proporciona una precisión capaz de detectar variaciones de hasta de 19 mV. El convertidor permite seleccionar la conversión de alguno de sus ocho canales mediante tres líneas de control las cuales son asociadas a ocho direcciones mediante un decodificador de las 32 direcciones destinadas para tarjetas prototipo (prototype cards, que van de la 300 a la 3 1F). Y además la línea del reloj del convertidor fue conectado a uno de los relojes de la PC, cuidando que esta estuviera en el rango 10-1280 Khz, la cual es exigida en sus especificaciones.

Las direcciones empleadas para recibir los datos provenientes de la tarjeta se localizan de las líneas A2-A9 del menos al mas significat.ivo respectivamente. y las líneas sobre las que se direcciona el canal que se pretende activar para ser convertido van de la A12-A3 l . Además son empleadas también las líneas IOR, IOW,BALE,AEN y la de RESET.

El sistema trabaja de la siguiente manera: Se: tienen una rutina la cual se encarga de enviar una orden de escritura a alguna de las direcciones que van de la 300 a la 301, esto provoca que se inicie el proceso de conversión en el convertidor. 100 microsegundos más tarde ( a lo mucho). El convertidor avisa mediante su línea de EOC (End of Convertion) que ya se tiene lista la muestra. Esta línea se encuentra conectada a la interrupción Hardware IRQ5, (la cual previamente fue debidamente desenmascarada). Esta interrupción activa una rutina de atención a la interrupción cuya función consiste en guardar el dato en una Estructura de datos de tipo COLA.. Al terminar la rutina de interrupción con su tarea, se envía nuevamente una orden de escritura a alguna otra dirección para obtener el dato correspondiente del subsecuente canal. El proceso de desplegado el cual será explicado más tarde se realiza mientras el convertidor “trabaja determinando el valor de su siguiente muestra”. El sistema debe estar perfectamente sincronizado como para terminar de desplegar el dato proveniente de la anterior muestra y estar listo para recibir el siguiente dato para evitar que los datos se vayan acumulando y puedan desbordar la memoria de la computadora.

(12)

CAPITULO I11 : MóDULOS SOFTWARE DEL SISTEMA

3.1 OBJETIVOS PARTICULARES

*

Presentar la información contenida en las muestras obtenidas en forma de señales continuas en pantalla para su fácil

análisis y manejo.

*

Desplegar las 8 señales en tiempo real y filtrar las muestras obtenidas para obtener la mejor representación posible

de la señal muestreada

*

Presentar al usuario la posibilidad de seleccionar algún fragmento de la señal con el objeto de tener disponible tal fragmento en floopy para su posterior análisis.

*

Presentar al usuario las posibilidades de “Congelar “ la señal que es desplegada en

pantalla. Guardar en disco la información que el considere

conveniente. Cargar la información en pantalla de al información que

(13)

3.2 DIAGRAMA DEL SISTEMA DE SOFTWARE

Es desenmascarada la interrupción

que será empleada para comunicar la tarjeta con la PC.

v

Se activa la rutina de atención a interrupción que controlara los procesos de Congelado, Salvado y Cargado

v

Se activa la rutina de atención a interrupción que controlara el proceso de adquisición de datos y que enviara la señal de

inicio de conversión a la tarjeta

t

-7

de que debe empezar a convertir

1

La tarjeta genera su interrupción para

que ha terminado de determinar el valor de la muestra

La interrupción activa una rutina de atención la cual carga el valor de la muestra en la última posición de

una estructura de datos de tipo FIFO

I

1

I

El sistema toma el valor de la muestra en turno ( la que se encuentra al frente de la cola) para ser desplegada y

determina si tal dato debe ser gráficado y si debe ser suavizado. De ser así lo transforma para que su

representación sea coherente en pantalla

(14)

3.3 IMPLANTACIóN DEL SISTEMA BAJO EL SISTEMA OPERATIVOS MS-DOS

3.3.1 RUTINAS DE ADQUISICI~N BAJO DOS.

#include <dos.h> #include <graphics.h> #include <stdlib.h> #include <conio.h> #include <stdio.h>

void interrupt(* MIRUT)(); int contador, global;

struct cola {

int info;

struct cola *liga;

1;

struct cola "frentel, *frente& "frente3, *frente4, *frente5, *frente6 *frente7, *frente&

"frente15, *frente16,

*

frente9, *frente 1 O, *frente 1 1, *frente 12, :*frente 1 3, *frente 14,

*finall, *final2, *final3, *final4, *final5, Yinal6, *final7, *finals, *final9, *finallo, *finall 1, *final12, "finall3, "final14, *final15, *final 1 6;

init colas()

{

frente 1 =frente2=frente3=frente4=frente5=frente6=fr.ente7=frente8= final1=final2=final3=final4=final5=final6=final7=final8=frente9= frente 1 O=frente 1 1 =frente 12=frente 1 3=frente 14=frente 1 5=frente 16=

final9=finall O=final 1 1 =final 12=final13=final14=final15=final16=NULL;

1

-

void inserta(int x, int opcion)

switch(opcion) {

{

case 1;

{

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(final1 == NULL)

(15)

else

final 1 =new; break;

}

final 1 ->liga=new;

case 2:

{

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(final2 == NULL)

else

final2=new;

I

frente2 = new;

final2->liga=new;

break;

case 3:

{

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(final3 == NULL)

frente3 = new;

else

final3->liga=new; final3=new;

break;

case 4:

{

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(final4 == NULL)

else

final4=new; frente4 = new;

final4->liga=new;

break;

}

case 5:

(16)

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(final5 == NULL)

frente5 = new;

else

finals->liga=new; final5=new;

break;

}

case 6: {

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(final6 == NULL)

else

final6=new; frente6 = new;

final6->liga=new;

break;

1

case 7:

{

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(final7 == NULL)

frente7 = new;

else

final7->liga=new; final7=new;

break;

}

case 8:

{

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(final8 == NULL)

else

frente8 = new;

(17)

final8=new; break;

}

case 9;

{

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(final9 == NULL)

else

final9=new; break;

}

frente9 = new;

final9->liga=new;

case 10:

{

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(final1 O == NULL)

frente 1 O = new;

else

final 1 O->liga=new; final 1 O=new;

1

break;

case 1 1 : {

struct cola "new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(finall1 == NULL)

frente1 1 = new;

else

final 1 1 ->liga=new; final 1 1 =new;

break;

}

case 12:

{

struct cola *new;

(18)

new->info=x; new->liga=NULL; if(finall2 == NULL)

frente 12 = new;

else

final 12->liga=new; final 12=new;

break;

I

case 13:

i

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(final13 == NULL)

frente 13 = new; else

final 1 3->liga=new; final 13=new; break;

1

case 14:

1

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(finall4 == NULL)

frente14 = new;

else

final 14->liga=new; final 14=new;

break;

1

case 15:

{

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(finall5 == NULL)

frente1 5 = new;

else

final 15->liga=new; final 1 5=new;

(19)

I

case 16:

{

struct cola *new;

new=(struct cola *)malloc(sizeof(struct cola)); new->info=x;

new->liga=NULL; if(finall6 == NULL)

frente 16 = new; else

final 16->liga=new; final 16=new;

break;

elimina1 ()

struct cola *old; old = frente 1 ;

frente 1 =frente 1 ->liga; if(frente 1 == NULL)

{

final 1 =NULL; free(o1d);

I

elimina20

{

struct cola *old; old = frente2;

frente2=frente2->liga; if(frente2 == NULL)

final2 = NULL;

free(o1d);

}

elimina30

{

struct cola *old; old = frente3;

frente3=frente3->liga; if(frente3 == NULL)

fina13 =NULL; free(o1d);

I

(20)

{

struct cola *old; old = frente4;

frente4=frente4->liga; if(frente4 == NULL)

final4 = NULL;

free(o1d);

1

elimina50

{

struct cola *old; old = frente5;

frente5=frente5->liga; if(frente5 == NULL)

fina15 =NULL; free(o1d);

elimina60

struct cola *old; old = frente6;

frente6=frente6->liga; if(frente6 == NULL)

{

final6 = NULL;

free(o1d);

1

elimina70

{

struct cola *old; old = frente7;

frente7=frente7->liga; if(frente7 == NULL)

fina17 =NULL; free(o1d);

1

elimina80

{

struct cola *old; old = frentes;

frenteS=frenteS->liga; if(frente8 == NULL)

(21)

free(o1d);

}

void InicializaPic()

{

unsigned char a; a = inport(OxO21);

a = a & OxDF; outport(OxO2 1 ,a);

}

void inicializa(int a)

{

int b; b=O; switch(a) {

case 1:

InicializaPic(); outport(OxO3 18,b); break;

case 2:

InicializaPic(); outport(OxO3 19,b); break;

case 3:

InicializaPic(); outport(Ox3 1 A,b); break;

case 4:

InicializaPic(); outport(Ox3 1B,b); break;

case 5:

InicializaPic(); 0utport(Ox3 1 C,b); break;

case 6:

InicializaPic(); outport(Ox3 1 D,b); break;

case 7:

InicializaPic(); outport(Ox3 1 E,b); break;

case 8:

(22)

outport(Ox3 1 F,b); break;

1

}

void interrupt MIRUTINA (void)

int d,f,g,h,j,k,l,z;

unsigned char r,t, y ,u,i,o,p,a; float x,c,v,b,n,m,xx,cc; if (contador < 3000)

{

switch(global){ case 1:

{

{

r = inport(Ox3 1 S);

d = (int) r ;

d = (int) x;

inserta1 (d); break;

1

case 2:

{

t = inport(Ox3 19);

f = (int) t ;

f = (int) c;

inserta2(f); break;

1

case 3:

{

X = (((255

-

d)* 30) / 255)

+

20;

c = (((255

-

f)* 30) / 255)

+

60;

y = inport(Ox3 1A);

g = (int) y ;

g = (int) v;

inserta3(g); break;

1

case 4:

{

u = inport(Ox3 1 B);

h = (int) u ;

h = (int) b;

inserta4(h); break;

v = (((255 - g)* 30) / 255) + 100; f

b = (((255

-

h)* 30) 1 2 5 5 )

+

140;

1

(23)

{

i = inport(Ox3 1 C);

j = (int) i ;

n = (((255

-

j)* 30) / 255)

+

180; j = (int) n;

inserta56); break;

I

{

o = inport(Ox3 1D);

k = (int) o ;

m = (((255 - k)* 30) / 255)

+

220; k = (int) m;

inserta6(k); break; case 6:

I

{

p = inport(Ox3 1E);

1 = (int) p ;

1 = (int) xx; inserta7(1); break;

I

{

a = inport(Ox3 1 F);

z = (int) a ;

z = (int) cc;

insertaS(z); break;

1

case 7:

xx = (((255

-

1)* 30) / 255)

+

260;

case 8:

cc = (((255 - z)* 30) / 255)

+

300;

contador++;

I

1

(* MIRUT)();

}

void PonVector()

disable(); InicializaPic();

MIRUT= getvect(0xOD); setvect(OxOD,MIRUTINA); enable();

{

(24)

void DriveADC()

int a; a=O;

for(a=50;a<3000; a++)

c

InicializaPic(); MULTIPLEXAO; plano2();

I

} {

void AdquiereDatoO

{

init cola1 ();

initcola20; PonVectorO; plano 1 ();

DriveADCO; plano3(); Driveprint();

1

void plan04()

setcolor(DARKGFL4Y); rectangle(0,0,639,349);

setfillstyle(SOL1D-FILL,DARKGRAY);

floodfill( 1 50,150,LIGHTGRAY);

{

}

imprime(int S)

struct cola *p 1 ,*p2;

char opcion;

a=50;

c=o; switch(s)

{

case 1: p 1 =frente 1 ;

break; case 2:

p 1 =frente:!; break; case 3: p 1 =frente3 ;

break;

{

(25)

case 4 :

p 1 =frente4; break; case 5: p I =frente5; break; case 6:

p 1 =frente6; break; case 7: p 1 =frente7; break; case 8: p 1 =frentes; break;

}

while(p1 ->liga != NULL)

{

b = a+5;

setcolor(BLACK); x = p l ->info ;

y = p 1 ->liga->info ;

f = (int) x;

g = (int) y;

line(a, f,b,g); p 1 =p 1 ->liga; a+=5;

c++;

} }

main()

{

int d,i,j;

int controlador, modo; contador =O;

PonVector(); InicializaPic(); controlador = VGA;

modo = VGAMED;

initgraph(&controlador, &modo, 'I 'I);

global = 1;

plano4();

for(i=O; i<500; i++)

{

{

(26)

inicializa(globa1); setcolor(DARKGRAY); line(0,0,0,15);

imprime(globa1);

1

1

restorecrtmode(); return O;

1

3.5 TRANSFERENCIA DEL SISTEMA A WINDOWS

3.5.1 RUTINAS DE ADQUISICIóN BAJO WINDOWS.

#define WIN3 1 #include <owl.h> #include <windows.h> #include <dos.h> #include <math.h> #include <time.h> #include <stdlib.h> #include "digita.h" #include "co8diag2.h" #include "string,h"

LONG FAR PASCAL WndProc(HWND,UINT, WPARAh4,LPARAM);

BOOL FAR PASCAL

AboutDiaProc(HWND,UINT,WPARAM,LPARAM);

BOOL FAR PASCAL

ShapeDiaProc(HWND,UINT,WPAIIAM,LPARAM);

BOOL FAR PASCAL

TextDiaProc(HWND7UINT,WPAR4M,LPARAM);

char szProgName[]="ProgName"; char szApplName[]="AboutMenu"; char myscreen[80]="Sin Nombre"; int myshape,scrolltam;

int indice; 11 Variable asociada a int global; //

#pragma argsused

int PASCAL WinMain(HINSTANCE hInst,HINSTANCE hPreInst, LPSTR lpszCmdLine,int nCmdShow)

{

(27)

WNDCLASS wcApp; if (! hPreInst) {

wcApp.lpszClassName=szProgName; wcApp.hInstance =hInst;

wcApp.lpfnWndProc =WndProc; // Se activa ejecutor de procesos

wcApp.hCursor

=LoadCursor(NULL,IDC_ARROW);

// flecha del mouse wcApp.hIcon =LoadIcon(hInst, // Icono Asociado

wcApp.lpszMenuName =szApplName;

wcApp.hbrBackground=GetStockObject(WHITE~BRUSH);

// Color del fondo wcApp.style =CS HREDRAWICSVREDRAW; // de la ventana wcApp.cbClsExtra =O;

wcApp.cbWndExtra =O; if (!Registerclass (&wcApp))

"ICONO");

-

return FALSE;

1

hWnd=CreateWindow(szProgName,"ADQUISICION", /I' Se crea la ventana de WS-OVERLAPPEDWINDOW,CWUSEDEFAULT, // trabajo CW USEDEFAULT,CW-USEDEFAULT,

(HAkDLE)hInst,(LPSTR)NULL);

CW~SEDEFAULT,(HWND)NULL,(HMENU)NULL,

ShowWindow(hWnd,SW-SHOWMAXIMIZED);

// AI l.lamar al programa se UpdateWindow(hWnd); // mostrará la ventana con tamaño máximo

while

(GetMessage(&lpMsg,NULL,NULL,NULL))

{

TranslateMessage(&lpMsg); // Se monitorea si DispatchMessage(&lpMsg); // alguna opción del

1

// menú fue elejida

return(lpMsg.wParam);

1

#pragma argsused

BOOL FAR PASCAL AboutDiaProc(HWND hdlg,UINT rnessg, WPARAM wParam,LPARAM 1Param)

{

switch (messg)

{

case WM-INITDIALOG:

case WM COMMAND: break;

switch (&Param)

{

case IDOK:

EndDialog(hdlg,TRUE); break;

default:

return FALSE;

1

(28)

default:

1

return FALSE;

return TRUE;

1

// Este proceso determina que opción fue

// elegida dentro del cuadro de dialogo

// y le proporciona al proceso paint el

// identificador necesario para elegir

// el objeto que será desplegado en pantalla

#pragma argsused

BOOL FAR PASCAL ShapeDiaProc(HWND hdlg,UINT messg, WPARAM wParam,LPARAM 1Param)

c

switch (messg)

c

return FALSE;

switch (&Param)

case WM INITDIALOG:

case WM COMMAND:

c

case IDOK:

EndDialog(hdlg,TRUE); break;

myshape= 1 ;

CheckRadioButton(hdlg,IDD LINE,

break;

myshape=2; case IDD - LINE:

IDD TRIANGLE,wParam); -

case IDDBOX:

scrolltam = GetScrollPos(hdlg,SB HORZ);

// IDD LINE,

-

// IfD-TRIANGLE,wParam); break;

myshape=3;

CheckRadioButton(hdlg,IDD LINE, case IDD CIRCLE: -

IDD - T R I A N G L E , ~ P ~ ~ ~ ) ;

break;

myshape=4;

CheckRadioButton(hdlg,IDD LINE, case IDD TRIANGLE: -

(29)

29

break; default:

return FALSE;

1

break; default:

return FALSE;

1

return TRUE;

1

// Este proceso es llamado cuando se

// desea introducir el nombre del paciente

// Regresa una cadena de longitud 80

// el cual sirve para ser desplegado

// en pantalla

#pragma argsused

BOOL FAR PASCAL TextDiaProc(HWND hdlg,UINT messg, WPARAM wParam,LPARAM 1Param)

{

switch (messg)

{

return FALSE;

switch (wparam)

case WM INITDIALOG:

case m-COMMAND:

{

case IDOK:

GetD1g1temText(hd1g,1DD~ED1T,myscreen780); EndDialog(hdlg,TRUE);

break;

EndDialog(hdlg,FALSE); break;

default:

return FALSE; case IDCANCEL:

1

break; default:

return FALSE;

l

return TRUE;

l

struct cola {

int info;

struct cola "liga;

(30)

struct cola "frentel, *frente2, "frente3, *frente4, *frente5, *frente6, *frente7, *frentes,

*frente15, *frente16,

"frente9, *frentelo, *frente1 1, *fiente12, +:frente13, *frente14,

*finall, *final2, *final3, *final4, *final5, "final6, *final7, *finals, *final9, "finallo, *finall 1, *final12, *final13, *final14, *final15, "final16 ;

/I Salidas : Nada /I Entradas : Nada

// Acción : Las referencias de inicio y fin para I/ cada cola son enviadas a NULL

void init - colas(void)

frente1 =frente2=frente3=frente4=frente5=frente6=frente7=frenteS= final 1 =final2=final3=final4=final5=final6=final7=fir~alS=frente9= frente 1 O=frente 1 1 =frente 12=frente 1 3=frente 14=frente 1 5=frente 1 6=

final9=finall O=finall 1 =final 12=final13=final14=final15=final16=NULL;

} {

. . .

#ifdef cplusplus

#else

#endif

#define CPPARGS

.. .

#define - CPPARGS -

void interrupt(* MIRUT)(CPPARGS);

I/ Desenmsascara la interrupción I / Hardware 021 poniendo a O el /I quinto bit

void InicializaPic()

{

unsigned char register a; a = inport(OxO2 1);

a = a & OxDF; outport(OxO2 1 ,a);

1

11 Entradas: El nuevo dato y el número de cola 11 donde será insertado

(31)

struct cola *frentel, "frente2, *fiente3, *frente4, *frente5, "frente6, *fiente7, *frentes,

*frente 1 5, *frente 1 6,

*frente9, *frentelo, *frente1 1, *fiente12, ,"frente13, "frente14,

"finall, *final2, *final3, *final4, "final.5, "final6, *final7, *finals, *final9, "finallo, *finall 1, "final12, "final13, *finall4, *finall5, "final 16 ;

/I Salidas : Nada

11 Entradas : Nada

I/ Acción : Las referencias de inicio y fin para

11 cada cola son enviadas a NULL void init-colas(void)

{

frente 1 =frente2=frente3=frente4=frente5=frente6=frente7=frenteS= final1 =final2=final3=final4=final5=final6=final7=fir~a18=frente9= frente 1 O=frente 1 1 =frente 12=frente 13=frente 14=frente 1 5=frente 16=

final9=finall O=final 1 1 =final 12=final13=final14=final15=final16=NULL;

. . .

#ifdef -cplusplus

#else

#endif

#define "CPPARGS . . .

#define -CPPARGS

void interrupt(* MIRUT)(CPPARGS);

11 Desenmsascara la interrupción I/ Hardware 021 poniendo a O el 11 quinto bit

void InicializaPic()

1

unsigned char register a; a = inport(OxO2 1);

a = a & OxDF; outport(OxO2 1 ,a);

}

/I Entradas: El nuevo dato y el número de cola /I donde será insertado

(32)

// Acción : Le asigna un nodo al dato y lo

// forma dentro de la cola

void inserta(int x, int opcion)

{

switch(opcion) {

case 1:

{

struct cola "nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(final1 == NULL)

frente1 = nuevo;

else

final 1 ->liga=nuevo; final 1 =nuevo;

break;

I

case 2:

{

struct cola *nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(final2 == NULL)

frente2 = nuevo;

else

final2->liga=nuevo; final2=nuevo;

break;

I

case 3:

{

struct cola *nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(final3 == NULL)

frente3 = nuevo;

else

final3->liga=nuevo; final3=nuevo;

break;

I

(33)

{

struct cola *nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(final4 == NULL)

frente4 = nuevo;

else

final4->liga=nuevo; final4=nuevo;

break;

1

case 5:

struct cola "nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(final5 == NULL)

frente5 = nuevo;

else

final5->liga=nuevo; final5=nuevo;

break;

1

{

case 6:

{

struct cola "nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(final6 == NULL)

frente6 = nuevo;

else

final6->liga=nuevo; final6=nuevo;

break;

1

case 7:

{

struct cola *nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(final7 == NULL)

frente7 = nuevo;

(34)

final7->liga=nuevo; final7=nuevo;

1

break;

case 8:

struct cola *nuevo;

nuevo=(stmct cola *)malloc(sizeof(stmct cola)); nuevo->info=x;

nuevo->liga=NULL; if(final8 == NULL)

frente8 = nuevo;

else

finalS->liga=nuevo; finalS=nuevo;

}

i

break;

case 9:

struct cola *nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(final9 == NULL)

frente9 = nuevo;

else

final9->liga=nuevo; final9=nuevo;

}

break;

case 10:

{

struct cola *nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(final1 O == NULL)

frente 1 O = nuevo; else

final 1 O->liga=nuevo; final 1 O=nuevo;

break;

1

case 1 1 : {

(35)

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(finall1 == NULL)

frente1 1 = nuevo;

else

final 1 1 ->liga=nuevo; final 1 1 =nuevo;

break;

1

case 12:

{

struct cola *nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(finall2 == NULL)

frente12 = nuevo;

else

final 12->liga=nuevo; final 12=nuevo;

break;

1

case 13:

struct cola *nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(finall3 == NULL)

frente 13 = nuevo;

else

final 13->liga=nuevo; final 13=nuevo;

break;

I

{

case 14:

{

struct cola *nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(finall4 == NULL)

frente 14 = nuevo;

else

(36)

break;

1

case 15:

{

struct cola *nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(finall5 == NULL)

frente 15 = nuevo; else

final 15->liga=nuevo; final 15=nuevo;

I

break;

case 16:

struct cola *nuevo;

nuevo=(struct cola *)malloc(sizeof(struct cola)); nuevo->info=x;

nuevo->liga=NULL; if(finall6 == NULL)

frente 16 = nuevo;

else

final 16->liga=nuevo; final 16=nuevo;

{

break;

I

I

1

// Simula los datos provenientes

// de la tarjeta, para el caso en

// que no se cuente con una tarjeta

// instalada

void inicia(int opcion)

{

int calculado; switch(opcion)(

case 1:

calculado=randorn((int)((5-myshape)/4*25))-t20; inserta(calculado,l);

break;

}

case 2: {

(37)

36

break;

1

case 3: {

calculado=random((int)((5-myshape)/4*25))+70;

break;

1

calculado=random((int)((5-myshape)/4*25))+95;

break;

1

case 5 : {

calculado=random((int)((5-rnyshape)/4*25))+120;

break;

1

inserta(calculado,3);

case 4: {

inserta(calculado,4);

inserta(calculado,5);

case 6: {

calculado=random((int)((5-rnyshape)/4*25))+145;

break;

1

calculado=random((int)((5-myshape)/4*25)')+170;

break;

1

calculado=random((int)((5-rnyshape)/4*25)~)+195; inserta(calculado,S);

break;

1

calculado=random((int)((5-rnyshape)/4*25)~1+220;

break;

1

inserta(calculad0~6);

case 7: {

inserta(calculad0~7);

case 8: {

case 9: {

inserta(calculado,9);

case IO:{

calculado=random((int)((5-myshape)/4*25)~+245;

break;

inserta(calculado, 1 O);

1

calculado=randorn((int)((5-myshape)/4*25))+270; inserta(calculado, 1 1);

break;

1

calculado=random((int)((5-myshape)/4*25))+295; case I ] : {

case 12: {

(38)

break;

1

case 13:{

calculado=random((int)((5-myshape)/4*25))+320;

break;

inserta(calculado, 13);

1

case 14: {

calculado=random((int)((5-myshape)/4*25))+345;

break;

1

inserta(calculado, 14);

case 15:{

calculado=random((int)((5-myshape)/4*25))+370;

break;

1

calculado=random((int)((5-myshape)/4*25))+395;

break;

1

inserta(calculado, 15);

case 16:{

inserta(calculado, 16);

1

1

// Elimina el nodo que se encuentra

// al frente de la cola, recorre la referencia

// "frente" a su sucesor en caso de que no

// exista es mandado a "NULL"

void elimina(int opcion)

switch(opcion) {

case 1:

{

struct cola *old; old = frente 1 ;

frente 1 =frente 1 ->liga; if(frente 1 == NULL)

{

final 1 =NULL; free(o1d); break;

case 2:

1

{

struct cola *old; old = frente2;

(39)

38

fina12 = NULL;

free(o1d); break;

I

case 3:

{

struct cola *old; old = frente3;

frente3=frente3->liga; if(frente3 == NULL)

fina13 =NULL; free(o1d); break;

case 4:

I

{

struct cola *old; old = frente4;

frente4=fiente4->liga; if(frente4 == NULL)

fina14 = NULL; free(o1d); break;

case 5:

I

{

struct cola *old; old = frente5;

frente5=frente5->liga; if(frente5 == NULL)

fina15 =NULL; free(o1d); break;

I

case 6:

{

struct cola *old; old = frente6;

frente6=frente6->liga; if(frente6 == NULL)

final6 = NULL;

free(o1d); break;

I

{

struct cola *old; old = frente7;

frente7=frente7->liga; if(frente7 == NULL)

(40)

fina17 =NULL; free(o1d); break;

case 8:

}

{

struct cola "old; old = frentes;

frenteS=frenteS->liga; if(frente8 == NULL)

final8 = NULL;

free(o1d); break;

1

case 9:

{

struct cola *old; old = frente9;

frente9=fiente9->liga; if(frente9 == NULL)

final9 =NULL; free(o1d); break;

case 10:

1

{

struct cola "old; old = frentelo;

frente 1 O=frente 1 O->liga; if(frente 1 O == NULL)

final 1 O = NULL;

free(o1d); break;

case 1 1 :

1

{

struct cola *old; old = frente 1 1 ;

frente 1 1 =frente 1 1 ->liga; if(frente 1 1 == NULL)

final 1 1 =NULL; free(o1d); break;

case 12:

{

struct cola *old; old = frente 12;

(41)

final 12 = NULL;

free(o1d); break;

case 13 : }

{

struct cola *old; old = frente 13;

frente 1 3=frente 13->liga; if(frente 13 == NULL)

final 13 =NULL; free(o1d); break;

1

case 14:

{

struct cola *old; old = frente 14;

frente 14=frente 14->liga; if(frente 14 == NULL)

final 14 = NULL;

free(o1d); break;

}

case 15:

{

struct cola *old; old = frente 15;

frente 15=frente 15->liga; if(frente15 == NULL)

final 1 5 =NULL; free(o1d);

break;

1

case 16:

{

struct cola *old; old = frente1 6;

frente 16=frente 16->liga; if(frente 16 == NULL)

final 16 = NULL;

free(o1d);

// Esta rutiona sólo puede usarse cuando se cuenta con

// una tarjeta de adquisición, su función es

(42)

// a convertir

void inicializa(int a)

{

int b; b=O; switch(a) {

case 1:

{

InicializaPicO; outport(OxO3 18,b); break;

1

{

case 2:

InicializaPic(); outport(OxO3 19,b); break;

1

{

InicializaPic(); outport(Ox3 lA,b); break;

1

{

InicializaPic(); outport(Ox3 1B,b); break;

1

{

InicializaPic(); outport(Ox3 1 C,b); break;

1

{

case 3:

case 4:

case 5:

case 6:

InicializaPic(); outport(Ox3 1 D,b); break;

1

{

case 7:

InicializaPic(); outport(Ox3 1 E,b); break;

(43)

case 8:

1

InicializaPic(); outport(Ox3 lF,b); break;

I

{

InicializaPic(); outport(OxO3 18,b); break;

1

{

InicializaPic(); outport(OxO3 19,b); break;

I

{

InicializaPic(); outport(Ox3 1 A,b); break;

case 9:

case 10:

case 1 1 :

I

{

InicializaPic(); outport(Ox3 lB,b); break;

I

{

InicializaPic(); outport(Ox3 1 C,b); break;

case 12:

case 13:

I

{

InicializaPic(); outport(Ox3 lD,b); break;

case 14:

I

{

case 15:

InicializaPic(); outport(Ox3 lE,b); break;

I

{

(44)

InicializaPic(); outport(Ox3 lF,b); break;

1

} }

// Rutina de atención a la interrupción 02 1, su fucnión

// es orientar el flujo de datos provenientes

// de la tarjeta a las colas de almacenamiento

// para su posterior despliege en pantalla

void interrupt MIRUTINA(. . .)

{

int a,d; int u;

unsigned char b; float c;

b = inport(Ox3 1 S);

d = (int) b ;

a = (int) c;

c = (350

-

d)/2;

inserta(a, 1); inserta(a,2); inserta(a,3); inserta(a,4); inserta(a,5); inserta(a,6); inserta(a,7); inserta(a,S); inserta(a,9); inserta(a, 1 O);

inserta(a, 1 1); inserta(a, 12); inserta(a, 13); inserta(a, 14); inserta(a, 15); inserta(a, 16);

(* MIRUT)();

}

// Esta rutina es el "cerebro" del programa,

// manda llamar todas las demás rutinas de

// acuerdo con las necesidades que le van surgiendo

(45)

LONG FAR PASCAL WndProc(HWND hWnd,UINT messg, WPARAM wParam,LPARAM 1Param)

{

HDC hdc; int tam;

static LOGFONT lf; HFONT hNFont; HMENU hMenu; HPEN hPen;

PAINTSTRUCT ps; RECT rect;

#define RED OxOOOOFFL #define BLACK OxOOOOOOL

static FARPROC fpfnAboutDiaProc; static FARPROC fpfnShapeDiaProc; static FARPROC fpfnTextDiaProc; static HWND hInstl ,hInst2,hInst3;

switch (messg)

{

case WM-CREATE:

hInstl=((LPCREATESTRUCT)

1Param)->hInstance; hInst2=((LPCREATESTRUCT) 1Param)->hInstance;

hInst3=((LPCREATESTRUCT)

1Param)-%Instance;

fpfnAboutDiaProc=MakeProcInstance((FARPROC)Abl~utDiaProc, hInstl);

fpfnShapeDiaProc=MakeProcInstance((FARPROC)ShalpeDiaProc, hInst2);

fpfnTextDiaProc=MakeProcInstance((FARPROC)TextDiaProc, hInst3);

break;

switch (wParam) case WM-COMMAND:

{

case IDM-PAUS:

DialogBox(hInst1 ,"AboutDiaBox",hWn(

break;

fpfnAboutDiaProc);

case IDM - INI:

DialogBox(hInst2,"ShapeDiaBox",hWnd,

InvalidateRect(hWnd,NULL,TRUE); UpdateWindow(hWnd);

fpfnShapeDiaProc);

break;

(46)

case IDM-PALT: case IDM-PABAJ:

{

MessageBox(hWnd, "Opciones no Implementadas",

"UAM-IZTAPALAPA", MB-ICONSTOP

I

MB-OK); break;

}

case IDM-NOM:

DialogBox(hInst3,"TextInputDiaBox",hWnd, fpfnTextDiaProc);

InvalidateRect(hWnd,NULL,TRUE);

UpdateWindow(hWnd); break;

case IDM SAL:

SendMessage(hWnd,WM-CLOSE,O,OL);

break; default: break;

-

}

break;

case WM PAINT:

hdc=BeginPaint(hWnd,&ps);

-

//--- comienzo de sus rutinas ---

#define WHITE OxFFFFFFL

hPen=CreatePen(O, 1 ,RED); SelectObject(hdc,hPen);

// Pone el nuevo modo de mapeo GetClientRect(hWnd, &rect);

SetMapMode(hdc, MM ANISOTROPIC); SetWindowExt(hdc, 646,450);

SetViewportExt(hdc, rect.right, rect.bottom);

if (myshape==l) {

struct cola *pl,*p2; int a,b,c,x,y,f,g,i,s; char opcion; a=50; c=o;

(47)

hPen=CreatePen(O, 1 ,RED); SelectObject(hdc,hPen); MoveTo(hdc,49,1 S);

LineTo(hdc,49,425); MoveTo(hdc, 1 88,l S);

LineTo(hdc,lSS,425); MoveTo(hdc,326,1 S);

LineTo(hdc,326,425); MoveTo(hdc,464,1 S);

LineTo(hdc,464,425); MoveTo(hdc,464,1 S);

LineTo(hdc,464,425); MoveTo(hdc,600,1 S);

LineTo(hdc,600,425); MoveTo(hdc,49,1 S);

LineTo(hdc,600,18); MoveTo(hdc,49,425); LineTo(hdc,600,425);

1f.lfWeight = FW-SEMIBOLD;

1f.lfCharSet = DEFAULT CHARSET;

1f.lfPitchAndFamily = FFROMAN;

1f.lfHeight = tam;

hNFont = CreateFontIndirect(&lQ;

SelectObject(hdc,hNFont);

TextOut(hdc,250,0,myscreen,strlen(myscreen));

tam = rect.bottod25;

1f.lfHeight = tam;

hNFont = CreateFontIndirect(&lQ;

(48)

TextOut(hdc,25,1 03,11C411,2); TextOut(hdc,25,128,"C5",2); TextOut(hdc,25,153,"C6",2); TextOut(hdc,25,178,"C7",2); TextOut(hdc,25,203,"C8",2); TextOut(hdc,25,228,"C9",2); TextOut(hdc,l6,253,"C10",3); TextOut(hdc,l6,278,"C11",3); TextOut(hdc,16,303,"C12",3); TextOut(hdc, 16,328,"C 13",3); TextOut(hdc,l6,353,"C14",3); TextOut(hdc,l6,378,"C15",3); TextOut(hdc, 16,403,"C 16",3);

SelectObject(hdc,hNFont); DeleteObject(hNFont);

SelectObject(hdc,GetStockObject(WHITE-PEN)); DeleteObject(hPen);

for(s=l;s<17;s++) inicia(s);

for(i=l;i<275;i++)

b = a+2; {

for(s=l;s<l7;s++)

{

inicia(s); switch(s)

{

case 1:

p 1 =frente 1 ;

break; case 2:

p 1 =frente2; break; case 3:

p 1 =frente3; break; case 4 :

p 1 =frente4; break; case 5 : p 1 =frente5; break; case 6:

(49)

p 1 =frente7; break; case 8:

p 1 =frentes; break;

p 1 =frente9; break; case 10: p 1 =frente 1 O; break;

case 11: p 1 =frente 1 1 ;

break; case 12 :

p 1 =frente 12; break;

case 13 :

p 1 =frente 1 3 ;

break; case 14: p 1 =frente 14; break;

case 15:

p 1 =frente 1 5; break;

case 16: p 1 =frente 16; break;

while@ 1 ->liga->liga != NULL)

p 1 =p 1 ->liga;

x = p l ->info ;

y = p l ->liga->info ;

f = (int) x;

g = (int) y;

hPen=CreatePen(O, 1 ,BLACK);

MoveTo(hdc,a,f); LineTo(hdc,b,g);

SelectObject(hdc,GetStockObject(WHITE PEN)); DeleteObject(hPen);

elimina(s); c++;

1

a+=2; case 9:

1

{

1

SelectObject(hdc,hPen);

-

(50)

else

if (myshape==2) {

I

else

if (myshape==3) {

Rectangle(hdq50, 100,300,300);

Ellipse(hdc,50,50,400,400);

I

else

if (myshape==4) {

MoveToEx(hdc,SO, 1 O0,NULL); LineTo(hdc,300,300);

LineTo(hdc,50,300); LineTo(hdc,SO,lOO);

I

SelectObject(hdc,GetStockObject(WHITE-PEN));

DeleteObject(hPen);

// -"""" final de sus rutinas ---

ValidateRect(hWnd,NULL); EndPaint(hWnd,&ps); break;

case WM DESTROY: PostQuikessage(0); break;

default:

return(DefWindowProc(hWnd,messg,wParam,lParam)),;

I

return(0L);

Bibliografía:

PC Interno Michael Tisher

Editorial DATA BECKER España

Programación en Windows 3.1 William H. Murray

Chris H. Pappas

Editorial Mc Graw Hill

Borland C++

(51)

Editorial SAMs Publishing

Borland C++

Programación Orientada a Objetos Ted Faison

Referencias

Documento similar

Pero antes hay que responder a una encuesta (puedes intentar saltarte este paso, a veces funciona). ¡Haz clic aquí!.. En el segundo punto, hay que seleccionar “Sección de titulaciones

Primeros ecos de la Revolución griega en España: Alberto Lista y el filohelenismo liberal conservador español 369 Dimitris Miguel Morfakidis Motos.. Palabras de clausura

los hombres. Porque la insigne ohl';] de la encarnaciOll del Hijo y de la redencion del mundo, no podia darse á entender sino por unos hombres ilustrados por el Espíritu Santo. En

2.- Aunque, para elaborar un comentario completo, debemos formular varias preguntas, en los ejercicios pedagógicos es preferible que reduzcamos, sobre todo al principio,

&#34;No porque las dos, que vinieron de Valencia, no merecieran ese favor, pues eran entrambas de tan grande espíritu […] La razón porque no vió Coronas para ellas, sería

Cedulario se inicia a mediados del siglo XVIL, por sus propias cédulas puede advertirse que no estaba totalmente conquistada la Nueva Gali- cia, ya que a fines del siglo xvn y en

Esto viene a corroborar el hecho de que perviva aún hoy en el leonés occidental este diptongo, apesardel gran empuje sufrido porparte de /ue/ que empezó a desplazar a /uo/ a