Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

_windows.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= _windows.cc                                              Agosto de 1998 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definicion de elementos GUI especificos a i386_WIN32_VC                      =
00005 /*
00006 NOTAS DEL SISTEMA DE CREACION DE VENTANAS EN WIN32:
00007   - Toda ventana tiene una "clase" (wclass) y la aplicacion debe 
00008     crear la clase antes de crear la ventana.
00009   - La funcion callback de recepcion de mensajes de la ventana
00010     se especifica en su clase.
00011   - El "estilo de ventana" se usa para especificar modo de
00012     visualizacion/comportamiento.  Util para crear nuevos tipos
00013     de ventanas
00014 */
00015 
00016 /*
00017 NOTAS RELEVANTES AL DISENNO DEL SISTEMA GUI DE AQUYNZA
00018   - Toca decidir si cada ventana tendra su callback de 
00019     recepcion de mensajes, o si abra un solo callback global
00020     VENTANA {
00021         callback(EVENTO mensaje);
00022         char nombre[];  // Usualmente un titulo
00023         VENTANA *padre;
00024         int id;  // Unico
00025     }
00026 */
00027 //=-------------------------------------------------------------------------=
00028 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00029 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00030 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00031 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00032 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00033 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00034 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00035 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00036 //=-------------------------------------------------------------------------=
00037 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00038 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00039 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00040 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00041 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00042 //===========================================================================
00043 
00044 #include "jed_defs.h"
00045 #include "framework/gui/_windows.h"
00046 
00047 //===========================================================================
00048 //= Chequeo de activacion de esta interfaz                                  =
00049 //===========================================================================
00050 
00051 #if PLATAFORMA != i386_WIN32_VC
00052 
00053 JED_GUI_CLASE_NULA(JED_MSWIN32SDK_INTERFACE, "JED_MSWIN32SDK_INTERFACE",
00054     "Win-SDK", "Microsoft SDK, que suele estar disponi-\n  ble,"
00055     "unicamente en sistemas operacionales de Microsoft",
00056     "i386_WIN32_VC");
00057 
00058 #endif
00059 
00060 #if PLATAFORMA == i386_WIN32_VC
00061 
00062 #include <stdio.h>
00063 #include <string.h>
00064 #include <winuser.h>
00065 #include "lista.cc"
00066 
00067 //===========================================================================
00068 //= Variables globales y macros                                             =
00069 //===========================================================================
00070 
00071 JED_MSWIN32SDK_INTERFACE *KIMBARA_Kimbara_kimba_kimbaba = NULL;
00072 HGLRC CONTEXTO_glw = NULL;
00073 BOOLEAN SINGLETON_listo = FALSE;
00074 HMENU EL_popup = 0;  // OJO: Esto es un machete
00075 WIDGET VENTANA_principal;
00076 char *EL_Titulo = NULL;
00077 
00078 static LONG QUIERO_pintarme = 0; // Candado de visualizacion
00079 
00080 // Apuntadores a funcion
00081 static int  (*WIN32SDK_keyboard_callback)(EVENTO_GUI *e, int context_id);
00082 static int  (*WIN32SDK_mouse_callback)(EVENTO_GUI *e, int context_id);
00083 static int  (*WIN32SDK_ejecutor)(int idc, int context_id);
00084 static int  (*WIN32SDK_tick)(int context_id);
00085 static void (*WIN32SDK_draw_callback)(int context_id);
00086 static void (*WIN32SDK_resize_callback)(int x_tam, int y_tam, int context_id);
00087 static void (*WIN32SDK_multiview_callback)(int operacion, int id_vista, 
00088                      char *detalles, char *menu, char *botonera);
00089 
00090 #define GET_X_LPARAM(lp)   ((int)(short)LOWORD(lp))
00091 #define GET_Y_LPARAM(lp)   ((int)(short)HIWORD(lp)) 
00092 
00093 
00094 #define MANEJAR_MOUSE_WINDOWS() \
00095     mi_evento.mouse_old_x = mi_evento.mouse_x;                                  \
00096     mi_evento.mouse_old_y = mi_evento.mouse_y;                                  \
00097     mi_evento.mouse_x = GET_X_LPARAM(lParam);                                   \
00098     mi_evento.mouse_y = GET_Y_LPARAM(lParam);                                   \
00099     mi_evento.mouse_delta_x = mi_evento.mouse_x - mi_evento.mouse_old_x;        \
00100     mi_evento.mouse_delta_y = mi_evento.mouse_y - mi_evento.mouse_old_y;        \
00101     WIN32SDK_mouse_callback(&mi_evento, 0); QUIERO_pintarme = 1;
00102 
00103 //===========================================================================
00104 //= Callbacks que establecen el comportamiento por defecto de la GUI        =
00105 //===========================================================================
00106 
00107 static void pintar_nulo(int) {    ;    }
00108 static void resize_nulo(int /*x*/, int /*y*/, int) {    ;    }
00109 static int tick_nulo(int) { return 0; }
00110 static int evento_nulo(EVENTO_GUI * /*e*/, int) {    return 0;    }
00111 static int MSWIN32SDK_ejecutor_nulo(int /*idc*/, int /*context_id*/)
00112     {    return 0;    }
00113 
00114 //===========================================================================
00115 //= Funciones utilitarias especificas de MSWIN32SDK                         =
00116 //===========================================================================
00117 
00118 LONG WINAPI
00119 win32sdk_eventhandler_callback(WIDGET w, UINT tipo_mensaje, UINT uParam, LONG lParam)
00124 {
00125     if ( !KIMBARA_Kimbara_kimba_kimbaba ) {
00126         return DefWindowProc (w, tipo_mensaje, uParam, lParam);
00127     }
00128     return KIMBARA_Kimbara_kimba_kimbaba->ejecutor(w, tipo_mensaje, uParam, lParam);
00129 }
00130 
00131 static WIDGET WINAPI
00132 cree_interface_win32(HINSTANCE hInstance, int /*nCmdShow*/, HMENU menubar)
00133 {
00134     //- CREE LA CLASE DE VENTANA PARA LA VENTANA PRINCIPAL -----
00135     // OJO: Jugar con lo siguiente en el STYLE: CS_BYTEALIGNCLIENT,
00136     // CS_BYTEALIGNWINDOW, CS_DBLCLKS, CS_NOCLOSE
00137     WNDCLASS atributos_de_ventana;
00138 
00139     atributos_de_ventana.style = CS_OWNDC;                         // UINT
00140     atributos_de_ventana.lpfnWndProc = 
00141         (WNDPROC)win32sdk_eventhandler_callback;                   // WNDPROC
00142     atributos_de_ventana.cbClsExtra = 0;                           // int
00143     atributos_de_ventana.cbWndExtra = 0;                           // int 
00144     atributos_de_ventana.hInstance = hInstance;                    // HANDLE
00145     atributos_de_ventana.hIcon = LoadIcon (hInstance, IDI_APPLICATION); //HICON
00146     atributos_de_ventana.hCursor = LoadCursor (NULL,IDC_ARROW);    //HCURSOR
00147     atributos_de_ventana.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //HBRUSH 
00148     atributos_de_ventana.lpszClassName = "";            // Sin menu por defecto
00149     atributos_de_ventana.lpszClassName = "JEDILINK_class";         // LPCTSTR
00150 
00151     if ( !RegisterClass(&atributos_de_ventana) ) {
00152         return NULL;
00153     }
00154 
00155     //- CREE LA VENTANA PRINCIPAL ------------------------------
00156     WIDGET VENTANA_principal;
00157     int x = 10, y = 10, x_tam = 640, y_tam = 480;
00158 
00159     VENTANA_principal = CreateWindowEx( 
00160         0, // OJO: Revisar los "extended windows styles" (WS_*)
00161         "JEDILINK_class", // Nombre de la clase de ventana
00162         EL_Titulo,  // Nombre de la ventana
00163         WS_POPUPWINDOW | WS_THICKFRAME | // Estilo de borde
00164         WS_CAPTION | WS_MINIMIZEBOX |WS_MAXIMIZEBOX | // Estilo de barra
00165         WS_CLIPSIBLINGS | WS_CLIPCHILDREN,  // Siempre activos!
00166         x, y, x_tam, y_tam,  // Geometria de la ventana
00167         NULL, // Ventana padre: en este caso es la root-window
00168         menubar, // handle to menu (en este caso sin menu por defecto)
00169         hInstance, // handle to application instance (ver parametro)
00170         (LPVOID)NULL // Apuntador a datos de mi aplicacion
00171     );
00172 
00173     if ( !VENTANA_principal ) {
00174         fprintf(stderr, "<JED_MSWIN32SDK_INTERFACE> - ERROR creando la ventana principal.\n");
00175         fflush(stderr);
00176         return NULL;
00177     }
00178 
00179     if ( !SetWindowText(VENTANA_principal, EL_Titulo) ) {
00180         fprintf(stderr, "<GUI> ERROR nombrando a una ventana!\n");
00181         // Falta usar GetLastError para dar mas informacion
00182     }
00183 
00184     return VENTANA_principal;
00185 }
00186 
00187 static BOOLEAN
00188 cuadre_formato_de_pixel(HDC gc)
00189 {
00190     PIXELFORMATDESCRIPTOR pfd, *ppfd;
00191     int pixelformat;
00192 
00193     ppfd = &pfd;
00194 
00195     ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
00196     ppfd->nVersion = 1;
00197     ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
00198     ppfd->dwLayerMask = PFD_MAIN_PLANE;
00199     ppfd->iPixelType = PFD_TYPE_RGBA;
00200     ppfd->cColorBits = 24;
00201     ppfd->cDepthBits = 16;                      //GLX_DEPTH_SIZE
00202     ppfd->cRedBits = 1;                         //GLX_RED_SIZE
00203     ppfd->cRedShift = 0;
00204     ppfd->cGreenBits = 1;                       //GLX_GREEN_SIZE
00205     ppfd->cGreenShift = 0;
00206     ppfd->cBlueBits = 1;                        //GLX_BLUE_SIZE
00207     ppfd->cBlueShift = 0;
00208     ppfd->cAlphaBits = 0;
00209     ppfd->cAlphaShift = 0;
00210     ppfd->cAccumBits = 0;                       //ACCUM NOT SUPPORTED
00211     ppfd->cAccumRedBits = 0;            //GLX_ACCUM_RED_SIZE
00212     ppfd->cAccumGreenBits = 0;          //GLX_ACCUM_GREEN_SIZE
00213     ppfd->cAccumBlueBits = 0;           //GLX_ACCUM_BLUE_SIZE
00214     ppfd->cAccumAlphaBits = 0;          //GLX_ACCUM_ALPHA_SIZE
00215     ppfd->cStencilBits = 4;                     //GLX_STENCIL_SIZE
00216     ppfd->cAuxBuffers = 0;
00217     ppfd->bReserved = 0;
00218     ppfd->dwVisibleMask =
00219     ppfd->dwDamageMask = 0;
00220 
00221     pixelformat = ChoosePixelFormat(gc, ppfd);
00222 
00223     if ( !pixelformat ) {
00224         MessageBox(NULL, "Ha fallado ChoosePixelFormat!", "Error", MB_OK);
00225         return FALSE;
00226     }
00227 
00228     if ( SetPixelFormat(gc, pixelformat, ppfd) == FALSE ) {
00229         MessageBox(NULL, "Ha fallado SetPixelFormat!", "Error", MB_OK);
00230         return FALSE;
00231     }
00232 
00233     //CreateRGBPalette(gc);
00234 
00235     return TRUE;
00236 }
00237 
00238 BOOL WINAPI
00239 OnContextMenu(HWND hwnd, int x, int y) 
00240 { 
00241     RECT rc;                    // client area of window 
00242     POINT pt = { x, y };        // location of mouse click 
00243 
00244 
00245     if ( !EL_popup ) return FALSE;
00246  
00247     // Get the bounding rectangle of the client area.  
00248     GetClientRect(hwnd, &rc); 
00249  
00250     // Convert the mouse position to client coordinates. 
00251     ScreenToClient(hwnd, &pt); 
00252  
00253     // If the position is in the client area, display a shortcut menu.  
00254     if ( PtInRect(&rc, pt) ) { 
00255         ClientToScreen(hwnd, &pt); 
00256 
00257         TrackPopupMenu(EL_popup, 
00258             TPM_LEFTALIGN | TPM_RIGHTBUTTON, 
00259             pt.x, pt.y, 0, hwnd, NULL);
00260 
00261         return TRUE; 
00262     } 
00263  
00264     // Return FALSE if no menu is displayed.  
00265     return FALSE; 
00266 } 
00267 
00268 //===========================================================================
00269 //= Clase JED_MSWIN32SDK_INTERFACE                                          =
00270 //===========================================================================
00271 
00272 JED_MSWIN32SDK_INTERFACE::JED_MSWIN32SDK_INTERFACE()
00273 {
00274     if ( SINGLETON_listo ) {
00275         fprintf(stderr, 
00276         "<JED_MSWIN32SDK_INTERFASE> - ERROR FATAL: Intento de reinstanciar.\n");
00277         fflush(stderr);
00278         exit(1);
00279     }
00280     SINGLETON_listo = TRUE;
00281     VENTANA_principal = NULL;
00282     WIN32SDK_draw_callback = pintar_nulo;
00283     WIN32SDK_keyboard_callback = evento_nulo;
00284     WIN32SDK_mouse_callback = evento_nulo;
00285     WIN32SDK_resize_callback = resize_nulo;
00286     WIN32SDK_tick = tick_nulo;
00287     WIN32SDK_ejecutor = MSWIN32SDK_ejecutor_nulo;
00288 
00289     KIMBARA_Kimbara_kimba_kimbaba = this;
00290 }
00291 
00292 JED_MSWIN32SDK_INTERFACE::~JED_MSWIN32SDK_INTERFACE()
00293 {
00294     ;
00295 }
00296 
00297 void JED_MSWIN32SDK_INTERFACE::solicitar_repintado(void){;}
00298 
00299 void
00300 JED_MSWIN32SDK_INTERFACE::set_draw_callback( void (*p)(int context_id) )
00301 {
00302     WIN32SDK_draw_callback = p;
00303 }
00304 
00305 void
00306 JED_MSWIN32SDK_INTERFACE::set_tick_callback( int (*p)(int context_id) )
00307 {
00308     WIN32SDK_tick = p;
00309 }
00310 
00311 void
00312 JED_MSWIN32SDK_INTERFACE::set_keyboard_callback(
00313  int (*p)(EVENTO_GUI *e, int context_id) )
00314 {
00315     WIN32SDK_keyboard_callback = p;
00316 }
00317 
00318 void
00319 JED_MSWIN32SDK_INTERFACE::set_mouse_callback(
00320     int (*p)(EVENTO_GUI *e, int context_id) )
00321 {
00322     WIN32SDK_mouse_callback = p;
00323 }
00324 
00325 void
00326 JED_MSWIN32SDK_INTERFACE::set_ejecutor( int (*p)(int idc, int context_id) )
00327 {
00328     WIN32SDK_ejecutor = p;
00329 }
00330 
00331 void
00332 JED_MSWIN32SDK_INTERFACE::set_multiview_callback
00333 ( void (*p)(int operacion, int id_vista, char *detalles,
00334                     char *menu, char *botonera) )
00335 {
00336     WIN32SDK_multiview_callback = p;
00337 }
00338 
00339 void
00340 JED_MSWIN32SDK_INTERFACE::set_resize_callback(
00341  void (*p)(int x_tam, int y_tam, int context_id) )
00342 {
00343     WIN32SDK_resize_callback = p;
00344 }
00345 
00346 void
00347 JED_MSWIN32SDK_INTERFACE::finalizar(void)
00348 {
00349     if ( VENTANA_principal ) {
00350         SendMessage(VENTANA_principal, WM_CLOSE, 0, 0);
00351         SendMessage(VENTANA_principal, WM_DESTROY, 0, 0);
00352     }
00353     exit(0); // OJO: Esto es machete!
00354 }
00355 
00356 void
00357 MSWIN32keycode2JEDkeycode2( EVENTO_GUI *e, unsigned int /*code*/, LONG lParam )
00358 {
00359     LONG scancode =  (lParam >> 16) & 0x00FF;
00360 
00361     e->key_mask = 0;
00362     e->key_code = JK_VOID;
00363 
00364     //- No procese los que procesa la version 1 - (codigo temporal)
00365     if ( scancode <= 0x0B ||                   // <ESC>, 1234567890, !@#$%^&*()
00366          scancode == 0x01C ||                            // <ENTER>, <KP_ENTER>
00367          (scancode >= 0x10 && scancode <= 0x19) ||             // QWERTYUIOP
00368          (scancode >= 0x1E && scancode <= 0x28) ||             // ASDFGHJKL:;'"
00369          (scancode >= 0x2B && scancode <= 0x35) ||             // \ZXCVBNM,.<>/?
00370          scancode <= 0x1B ||
00371          scancode <= 0x39 // <SPACE>
00372         ) {
00373         return;
00374     }
00375     //
00376 
00377     switch( scancode ) {
00378       case 0x37: e->key_code = JK_KP_MULTIPLY; break;
00379       case 0x48: e->key_code = JK_UP; break;
00380       case 0x4B: e->key_code = JK_LEFT; break;
00381       case 0x4D: e->key_code = JK_RIGHT; break;
00382       case 0x50: e->key_code = JK_DOWN; break;
00383       default: break;
00384     }
00385 
00386 }
00387 
00388 void
00389 MSWIN32keycode2JEDkeycode1( EVENTO_GUI *e, unsigned int code, LONG lParam )
00390 /*
00391 Mapea solo caracteres representables en ASCII
00392 */
00393 {
00394     LONG scancode =  (lParam >> 16) & 0x00FF;
00395     LONG extendido = (lParam) & (1 << 24);
00396 
00397     switch ( code ) {
00398       // Caracteres especiales
00399       case 13:
00400         if ( extendido ) e->key_code = JK_KP_ENTER; else e->key_code = JK_ENTER;
00401         break;
00402       case 8:   e->key_code = JK_BACKSPACE; break;
00403       case 9:   e->key_code = JK_TAB; break;
00404       case 27:  e->key_code = JK_ESC; break;
00405       case ' ': e->key_code = JK_SPACE; break;
00406       case '!': e->key_code = JK_EXCLAM; break;
00407       case '#': e->key_code = JK_NUMBERSIGN; break;
00408       case '$': e->key_code = JK_DOLLAR; break;
00409       case '%': e->key_code = JK_PERCENT; break;
00410       case '&': e->key_code = JK_AMPERSAND; break;
00411       case '*': e->key_code = JK_ASTERISK; break;
00412       case '(': e->key_code = JK_PARENLEFT; break;
00413       case ')': e->key_code = JK_PARENRIGHT; break;
00414       case '@': e->key_code = JK_AT; break;
00415       case '+': e->key_code = JK_PLUS; break;
00416       case '-': e->key_code = JK_MINUS; break;
00417       case '/': e->key_code = JK_SLASH; break;
00418       case '\"': e->key_code = JK_QUOTEDBL; break;
00419       case ',': e->key_code = JK_COMMA; break;
00420       case '.': e->key_code = JK_PERIOD; break;
00421       case ':': e->key_code = JK_COLON; break;
00422       case ';': e->key_code = JK_SEMICOLON; break;
00423       case '<': e->key_code = JK_LESS; break;
00424       case '=': e->key_code = JK_EQUAL; break;
00425       case '>': e->key_code = JK_GREATER; break;
00426       case '?': e->key_code = JK_QUESTION; break;
00427       case '[': e->key_code = JK_BRACKETLEFT; break;
00428       case '\\': e->key_code = JK_BACKSLASH; break;
00429       case ']': e->key_code = JK_BRACKETRIGHT; break;
00430       case '_': e->key_code = JK_UNDERSCORE; break;
00431       case '{': e->key_code = JK_BRACELEFT; break;
00432       case '|': e->key_code = JK_BAR; break;
00433       case '}': e->key_code = JK_BRACERIGHT; break;
00434       case '\'': e->key_code = JK_APOSTROPHE; break;
00435       case '^': e->key_code = JK_GRAVE; break;
00436 
00437 
00438       // NUMEROS
00439       case '0':  
00440         if ( scancode <= 0x0B ) e->key_code = JK_0; else e->key_code = JK_KP_0;
00441         break;
00442       case '1':
00443         if ( scancode <= 0x0B ) e->key_code = JK_1; else e->key_code = JK_KP_1;
00444         break;
00445       case '2':
00446         if ( scancode <= 0x0B ) e->key_code = JK_2; else e->key_code = JK_KP_2;
00447         break;
00448       case '3':
00449         if ( scancode <= 0x0B ) e->key_code = JK_3; else e->key_code = JK_KP_3;
00450         break;
00451       case '4':
00452         if ( scancode <= 0x0B ) e->key_code = JK_4; else e->key_code = JK_KP_4;
00453         break;
00454       case '5':
00455         if ( scancode <= 0x0B ) e->key_code = JK_5; else e->key_code = JK_KP_5;
00456         break;
00457       case '6':
00458         if ( scancode <= 0x0B ) e->key_code = JK_6; else e->key_code = JK_KP_6;
00459         break;
00460       case '7':
00461         if ( scancode <= 0x0B ) e->key_code = JK_7; else e->key_code = JK_KP_7;
00462         break;
00463       case '8':
00464         if ( scancode <= 0x0B ) e->key_code = JK_8; else e->key_code = JK_KP_8;
00465         break;
00466       case '9':
00467         if ( scancode <= 0x0B ) e->key_code = JK_9; else e->key_code = JK_KP_9;
00468         break;
00469 
00470       case 'A': e->key_code = JK_A; break;  // Mayusculas
00471       case 'B': e->key_code = JK_B; break;
00472       case 'C': e->key_code = JK_C; break;
00473       case 'D': e->key_code = JK_D; break;
00474       case 'E': e->key_code = JK_E; break;
00475       case 'F': e->key_code = JK_F; break;
00476       case 'G': e->key_code = JK_G; break;
00477       case 'H': e->key_code = JK_H; break;
00478       case 'I': e->key_code = JK_I; break;
00479       case 'J': e->key_code = JK_J; break;
00480       case 'K': e->key_code = JK_K; break;
00481       case 'L': e->key_code = JK_L; break;
00482       case 'M': e->key_code = JK_M; break;
00483       case 'N': e->key_code = JK_N; break;
00484       case 'O': e->key_code = JK_O; break;
00485       case 'P': e->key_code = JK_P; break;
00486       case 'Q': e->key_code = JK_Q; break;
00487       case 'R': e->key_code = JK_R; break;
00488       case 'S': e->key_code = JK_S; break;
00489       case 'T': e->key_code = JK_T; break;
00490       case 'U': e->key_code = JK_U; break;
00491       case 'V': e->key_code = JK_V; break;
00492       case 'W': e->key_code = JK_W; break;
00493       case 'X': e->key_code = JK_X; break;
00494       case 'Y': e->key_code = JK_Y; break;
00495       case 'Z': e->key_code = JK_Z; break;
00496       case 'a': e->key_code = JK_a; break;  // Minusculas
00497       case 'b': e->key_code = JK_b; break;
00498       case 'c': e->key_code = JK_c; break;
00499       case 'd': e->key_code = JK_d; break;
00500       case 'e': e->key_code = JK_e; break;
00501       case 'f': e->key_code = JK_f; break;
00502       case 'g': e->key_code = JK_g; break;
00503       case 'h': e->key_code = JK_h; break;
00504       case 'i': e->key_code = JK_i; break;
00505       case 'j': e->key_code = JK_j; break;
00506       case 'k': e->key_code = JK_k; break;
00507       case 'l': e->key_code = JK_l; break;
00508       case 'm': e->key_code = JK_m; break;
00509       case 'n': e->key_code = JK_n; break;
00510       case 'o': e->key_code = JK_o; break;
00511       case 'p': e->key_code = JK_p; break;
00512       case 'q': e->key_code = JK_q; break;
00513       case 'r': e->key_code = JK_r; break;
00514       case 's': e->key_code = JK_s; break;
00515       case 't': e->key_code = JK_t; break;
00516       case 'u': e->key_code = JK_u; break;
00517       case 'v': e->key_code = JK_v; break;
00518       case 'w': e->key_code = JK_w; break;
00519       case 'x': e->key_code = JK_x; break;
00520       case 'y': e->key_code = JK_y; break;
00521       case 'z': e->key_code = JK_z; break;
00522 
00523       default: 
00524         e->key_code = JK_VOID; 
00525         break;
00526     }
00527 }
00528 
00529 LONG WINAPI
00530 JED_MSWIN32SDK_INTERFACE::ejecutor(WIDGET w, UINT tipo_mensaje, UINT uParam, LONG lParam)
00534 {
00535     LONG retorno = 0;
00536     static EVENTO_GUI mi_evento;
00537     int comando;
00538     static BOOLEAN muerto = FALSE;
00539     static LONG old_mask = 0xFF;
00540     static BOOLEAN primiparo = TRUE;
00541 //      char cad[2048];
00542 
00543 switch ( tipo_mensaje ) {
00544 //- TECLADO -----------------------------------------------------------------
00545   case WM_CHAR:
00546     mi_evento.tipo_de_evento = ETYPE_KEY_DOWN;
00547     MSWIN32keycode2JEDkeycode1(&mi_evento, (int)uParam, lParam);
00548     if ( mi_evento.key_code != JK_VOID && WIN32SDK_keyboard_callback(&mi_evento, 0) ) 
00549         QUIERO_pintarme = 1;
00550     break;
00551   case WM_KEYDOWN:
00552     mi_evento.tipo_de_evento = ETYPE_KEY_DOWN;
00553     MSWIN32keycode2JEDkeycode2(&mi_evento, (int)uParam, lParam);
00554     if ( mi_evento.key_code != JK_VOID && WIN32SDK_keyboard_callback(&mi_evento, 0) )
00555         QUIERO_pintarme = 1;
00556     retorno = 0;
00557     break;
00558   case WM_KEYUP:
00559 /*
00560     mi_evento.tipo_de_evento = ETYPE_KEY_UP;
00561     MSWIN32keycode2JEDkeycode2(&mi_evento, (int)uParam, lParam);
00562     if ( mi_evento.key_code != JK_VOID && WIN32SDK_keyboard_callback(&mi_evento, 0) )
00563         QUIERO_pintarme = 1;
00564 */
00565     break;
00566 //- Redibujado --------------------------------------------------------------
00567   case WM_PAINT: // ESTO EN REALIDAD SE COMPORTA COMO TICK!
00568     {
00569     HDC gc;
00570     
00571     if ( WIN32SDK_tick(0) ) QUIERO_pintarme = 1;
00572 
00573     if ( !muerto && QUIERO_pintarme ) {
00574         if ( primiparo ) {
00575 
00576             primiparo = FALSE;
00577         }
00578         //printf("*"); fflush(stdout);
00579         gc = GetDC(w);
00580         wglMakeCurrent(gc, CONTEXTO_glw);
00581         WIN32SDK_draw_callback(0);
00582         glFlush(); glFinish();    
00583         wglSwapLayerBuffers(gc, WGL_SWAP_MAIN_PLANE);
00584         QUIERO_pintarme = 0;
00585     }
00586     }
00587     break;
00588 
00589   case WM_SIZE:
00590     WIN32SDK_resize_callback((int)LOWORD(lParam), (int)HIWORD(lParam), 0);
00591     QUIERO_pintarme = 1;
00592 
00593 //      sprintf(cad, "Size (%d, %d).\n", (int)LOWORD(lParam), (int)HIWORD(lParam));
00594 //      WINlog(cad);
00595 
00596         break;
00597 
00598         /*
00599   case WM_NCCALCSIZE:
00600     {
00601     LPNCCALCSIZE_PARAMS p = (LPNCCALCSIZE_PARAMS) lParam;
00602     RECT r = p->rgrc[0];
00603 
00604     WIN32SDK_resize_callback(r.right - r.left, r.top - r.bottom, 0);
00605     QUIERO_pintarme = 1;
00606     retorno = DefWindowProc(w, tipo_mensaje, uParam, lParam);
00607 
00608         sprintf(cad, "SizeNCAL (%d, %d).\n", r.right - r.left, r.top - r.bottom);
00609         WINlog(cad);
00610 
00611     }
00612     break;
00613         */
00614 
00615   case WM_ENABLE:
00616     if ( uParam ) QUIERO_pintarme = 1;
00617     break;
00618 
00619   case WM_MOVE:
00620     QUIERO_pintarme = 1;
00621     break;
00622 
00623 //- Rutinas de control del mouse --------------------------------------------
00624   case WM_MOUSEMOVE:
00625         mi_evento.tipo_de_evento = ETYPE_MOUSE_MOVE;
00626         MANEJAR_MOUSE_WINDOWS();
00627     break;
00628   case WM_LBUTTONUP:    
00629     ReleaseCapture();
00630     mi_evento.mouse_button_mask = 0;
00631         mi_evento.tipo_de_evento = ETYPE_BUTTON_UP;
00632         MANEJAR_MOUSE_WINDOWS();
00633     break;
00634   case WM_LBUTTONDOWN:
00635         SetCapture(w);
00636         mi_evento.mouse_button_mask |= 0x01;
00637         mi_evento.tipo_de_evento = ETYPE_BUTTON_DOWN;
00638         MANEJAR_MOUSE_WINDOWS();
00639     break;
00640   case WM_MBUTTONUP:    
00641         ReleaseCapture();
00642     mi_evento.mouse_button_mask = 0;
00643         mi_evento.tipo_de_evento = ETYPE_BUTTON_UP;
00644         MANEJAR_MOUSE_WINDOWS();
00645     break;
00646   case WM_MBUTTONDOWN:
00647         SetCapture(w);
00648         mi_evento.mouse_button_mask |= 0x02;
00649         mi_evento.tipo_de_evento = ETYPE_BUTTON_DOWN;
00650         MANEJAR_MOUSE_WINDOWS();
00651     break;
00652   case WM_RBUTTONUP:    
00653         ReleaseCapture();
00654         mi_evento.mouse_button_mask = 0;
00655         mi_evento.tipo_de_evento = ETYPE_BUTTON_UP;
00656         MANEJAR_MOUSE_WINDOWS();
00657     break;
00658   case WM_RBUTTONDOWN:
00659         SetCapture(w);
00660         mi_evento.mouse_button_mask |= 0x04;
00661         mi_evento.tipo_de_evento = ETYPE_BUTTON_DOWN;
00662         MANEJAR_MOUSE_WINDOWS();
00663     break;
00664 
00665   case WM_NCMOUSEMOVE:  case WM_NCHITTEST:      //case WM_NCMOUSEHOVER:
00666   case WM_NCLBUTTONUP:  case WM_NCLBUTTONDOWN:  case WM_NCLBUTTONDBLCLK:
00667   case WM_NCMBUTTONUP:  case WM_NCMBUTTONDOWN:  case WM_NCMBUTTONDBLCLK:
00668   case WM_NCRBUTTONUP:  case WM_NCRBUTTONDOWN:  case WM_NCRBUTTONDBLCLK:
00669     // Esto es importante para que funcione el sistema de menus!
00670     //reportar_evento_WM(tipo_mensaje);
00671         retorno = DefWindowProc(w, tipo_mensaje, uParam, lParam);
00672     break;
00673 
00674 
00675   //case WM_MOUSELEAVE:    printf("<WM_MOUSELEAVE>\n"); fflush(stdout);    break;
00676 
00677 //- Rutinas de inicializacion de aplicacion ---------------------------------
00678   case WM_CREATE:
00679     {
00680         HDC gc;
00681 
00682 //printf("\n<WM_CREATE>\n"); fflush(stdout);
00683 
00684         VENTANA_principal = w;
00685         gc = GetDC(w);
00686         cuadre_formato_de_pixel(gc);
00687         CONTEXTO_glw = wglCreateContext(gc);
00688         wglMakeCurrent(gc, CONTEXTO_glw);
00689         ReleaseDC(w, gc);
00690     }
00691     break;
00692 
00693 //- Rutinas de finalizacion de aplicacion -----------------------------------
00694   case WM_CLOSE:
00695     if ( CONTEXTO_glw ) {
00696         wglDeleteContext(CONTEXTO_glw);
00697         CONTEXTO_glw = NULL;
00698     }
00699     DestroyWindow(VENTANA_principal);
00700     retorno = DefWindowProc(w, tipo_mensaje, uParam, lParam);
00701     break;
00702   case WM_DESTROY:
00703     if ( CONTEXTO_glw ) {
00704         wglDeleteContext(CONTEXTO_glw);
00705         CONTEXTO_glw = NULL;
00706     }
00707     PostQuitMessage(0);
00708     muerto = TRUE;
00709     retorno = DefWindowProc(w, tipo_mensaje, uParam, lParam);
00710     exit(0); // OJO: Esto es machete!
00711     break;
00712 //- Procesamiento de comandos lanzados desde menus --------------------------
00713   case WM_COMMAND:
00714     comando = LOWORD(uParam);
00715     WIN32SDK_ejecutor(comando, 0);
00716     QUIERO_pintarme = TRUE;
00717 
00718     // OJO: Para salir:
00719     //SendMessage(VENTANA_principal, WM_DESTROY, NULL, NULL);
00720     break;
00721 //- Activacion de menus de contexto -----------------------------------------
00722   case WM_CONTEXTMENU: 
00723     if ( OnContextMenu(w, LOWORD(lParam), HIWORD(lParam)) ) QUIERO_pintarme = 1;
00724     break;
00725 //- Mensajes por programar: no estan haciendo nada pero eso debe cambiar ----
00726   case WM_SHOWWINDOW:
00727     //printf("<WM_SHOWWINDOW>\n"); fflush(stdout);
00728     retorno = DefWindowProc(w, tipo_mensaje, uParam, lParam);
00729     break;
00730 
00731 //- Mensajes no procesados: comportamiento por defecto del sistema ----------
00732   case WM_SETTEXT:
00733   case WM_NCCREATE:
00734   case WM_GETMINMAXINFO:
00735   case WM_SETCURSOR: 
00736   case WM_MOVING:
00737   case WM_SIZING:
00738   case WM_WINDOWPOSCHANGED:
00739         {       
00740 /*
00741                 WINDOWPOS *p;
00742 
00743         p = (WINDOWPOS*)(lParam);
00744 
00745         WIN32SDK_resize_callback(p->cx, p->cy, 0);
00746     QUIERO_pintarme = 1;
00747 
00748         sprintf(cad, "WPC (%d, %d).\n", p->cx, p->cy);
00749         WINlog(cad);
00750 */
00751     retorno = DefWindowProc(w, tipo_mensaje, uParam, lParam);
00752         }
00753     break;
00754   default: // Mensajes desconocidos: ademas de no procesarlos, se reportan
00755     //reportar_evento_WM(tipo_mensaje);
00756     retorno = DefWindowProc(w, tipo_mensaje, uParam, lParam);
00757     break;
00758 //---------------------------------------------------------------------------
00759 }
00760     return retorno;
00761 }
00762 
00763 BOOLEAN
00764 JED_MSWIN32SDK_INTERFACE::crear(int * /*Argc*/, char * /*argv*/ [],
00765                               int /*x_tam*/, int /*y_tam*/, char *nombre)
00766 {
00767     //- Carga del modelo generico GUI AQUYNZA en memoria ---------------------
00768     leer_gui("etc/spanish.gui");
00769 
00770     //- Creacion de las jerarquias de menus ----------------------------------
00771     GUI_MENU *Global = resolver_menu("GLOBAL");
00772     HMENU menubar = CreateMenu();
00773     char nomenu_cad[200] = "[&salir] (sin menu)";
00774 
00775     //Global->imprimir();
00776 
00777     if ( !menubar ) return FALSE;
00778 
00779     if ( lista_menus.tam() > 0 && Global ) {
00780         if ( !Global->crear_mswin32sdk(menubar, TM_MENUBAR) ) return FALSE;
00781       }
00782       else {
00783         MENUITEMINFO opcion = {
00784             sizeof(MENUITEMINFO), // Siempre es esto!
00785             // Identifica los valores a cuadrar aqui
00786             MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_TYPE, 
00787             MFT_STRING, // Tipo de opcion
00788             MFS_ENABLED, // Atributos de la opcion
00789             666, // Identificador de comando 
00790             NULL, // HMENU   hSubMenu; 
00791             NULL, // HBITMAP hbmpChecked; 
00792             NULL, // HBITMAP hbmpUnchecked; 
00793             666, // DWORD   dwItemData; (puede ser usado por la aplicacion)
00794             nomenu_cad, // Datos de opcion (dependiente de su tipo)
00795             strlen(nomenu_cad) // Datos de opcion (dependiente de su tipo)
00796         };
00797         if ( !InsertMenuItem(menubar, 0, TRUE, &opcion) ) {
00798             return FALSE;
00799         }
00800     }
00801 
00802     //-- Creacion del menu de contexto para esta vista -----------------------
00803 #ifdef NONONO
00804     char nombre_menu[MAX_CAD] = "ESCENA";
00805 
00806     if ( strcmp(nombre_menu, UNDEFINED_CAD) != 0 ) {
00807         MENU *Contexto = resolver_menu(nombre_menu);
00808         EL_popup = CreatePopupMenu();
00809 
00810         if ( !EL_popup ) return FALSE;
00811         if ( !Contexto ) {
00812             //OJO! Aqui falta hacer algo mejorcito!
00813                         fprintf(stderr, "<JED_MSWIN32SDK_INTERFACE> - Warning: No se especifico el menu [%s] en el archivo de GUI.\n", nombre_menu);
00814                         fflush(stderr);
00815             return FALSE;
00816           }
00817           else {
00818             if ( !Contexto->insertar_mswin32sdk(EL_popup) )
00819                 return FALSE;
00820         }
00821     }
00822 #endif
00823 
00824     //- Cree la ventana principal --------------------------------------------
00825         char titulo_nulo[] = "AQUYNZA PROGRAM";
00826 
00827         EL_Titulo = titulo_nulo;
00828         if ( nombre ) {
00829                 EL_Titulo = nombre;
00830         }
00831     VENTANA_principal =
00832         cree_interface_win32(i386_WIN32_VC_instancia_actual, i386_WIN32_VC_modo_visual,
00833         menubar);
00834     if ( !VENTANA_principal ) return FALSE;
00835 
00836     //SetMenu(VENTANA_principal, menubar);    
00837 
00838     //- MUESTRE LA VENTANA PRINCIPAL ----------------------------
00839     ShowWindow(VENTANA_principal, SW_SHOWDEFAULT);
00840 
00841     return TRUE;
00842 }
00843 
00844 void
00845 JED_MSWIN32SDK_INTERFACE::ejecutar(void)
00846 {
00847     MSG        msg;
00848     RECT       rect;
00849 
00850     char menu[1024], botonera[1024];
00851 
00852     if ( WIN32SDK_multiview_callback ) {
00853         WIN32SDK_multiview_callback(GUI_CREAR_VISTA, 0,
00854             "default", menu, botonera);
00855     }
00856 
00857 
00858     //SendMessage(VENTANA_principal, WM_SIZE, NULL, NULL);
00859     GetClientRect(VENTANA_principal, &rect);
00860     WIN32SDK_resize_callback(rect.left - rect.right, rect.top - rect.bottom, 0);
00861 
00862     // Ciclo principal de captura de eventos
00863     for ( ;; ) {
00864         if ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) {
00865             if ( msg.message == WM_QUIT ) break;
00866             TranslateMessage (&msg);
00867             DispatchMessage (&msg);
00868           //}
00869           //else {
00870           //  PostMessage(VENTANA_principal, WM_PAINT, NULL, NULL);
00871         }
00872     }
00873 }
00874 
00875 BOOLEAN
00876 JED_MSWIN32SDK_INTERFACE::anexar_controles(LISTA <CONTROL_GUI *> * 
00877                                /*Controles*/, 
00878                            REPOSITORIO_DE_ENTIDADES * /*Repositorio*/)
00879 {
00880     fprintf(stderr, "<JED_MSWIN32SDK_INTERFACE> ERROR: Los controles GUI no estan\n"
00881         "    implemetados en la interface actual.  Intente Motif.\n");
00882     fflush(stderr);
00883     return FALSE;
00884 }
00885 
00886 #endif // PLATAFORMA == i386_WIN32_VC
00887 
00888 //===========================================================================
00889 //= EOF                                                                     =
00890 //===========================================================================
00891 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.