00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #include "jed_defs.h"
00045 #include "framework/gui/_windows.h"
00046
00047
00048
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
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;
00075 WIDGET VENTANA_principal;
00076 char *EL_Titulo = NULL;
00077
00078 static LONG QUIERO_pintarme = 0;
00079
00080
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
00105
00106
00107 static void pintar_nulo(int) { ; }
00108 static void resize_nulo(int , int , int) { ; }
00109 static int tick_nulo(int) { return 0; }
00110 static int evento_nulo(EVENTO_GUI * , int) { return 0; }
00111 static int MSWIN32SDK_ejecutor_nulo(int , int )
00112 { return 0; }
00113
00114
00115
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 , HMENU menubar)
00133 {
00134
00135
00136
00137 WNDCLASS atributos_de_ventana;
00138
00139 atributos_de_ventana.style = CS_OWNDC;
00140 atributos_de_ventana.lpfnWndProc =
00141 (WNDPROC)win32sdk_eventhandler_callback;
00142 atributos_de_ventana.cbClsExtra = 0;
00143 atributos_de_ventana.cbWndExtra = 0;
00144 atributos_de_ventana.hInstance = hInstance;
00145 atributos_de_ventana.hIcon = LoadIcon (hInstance, IDI_APPLICATION);
00146 atributos_de_ventana.hCursor = LoadCursor (NULL,IDC_ARROW);
00147 atributos_de_ventana.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
00148 atributos_de_ventana.lpszClassName = "";
00149 atributos_de_ventana.lpszClassName = "JEDILINK_class";
00150
00151 if ( !RegisterClass(&atributos_de_ventana) ) {
00152 return NULL;
00153 }
00154
00155
00156 WIDGET VENTANA_principal;
00157 int x = 10, y = 10, x_tam = 640, y_tam = 480;
00158
00159 VENTANA_principal = CreateWindowEx(
00160 0,
00161 "JEDILINK_class",
00162 EL_Titulo,
00163 WS_POPUPWINDOW | WS_THICKFRAME |
00164 WS_CAPTION | WS_MINIMIZEBOX |WS_MAXIMIZEBOX |
00165 WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
00166 x, y, x_tam, y_tam,
00167 NULL,
00168 menubar,
00169 hInstance,
00170 (LPVOID)NULL
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
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;
00202 ppfd->cRedBits = 1;
00203 ppfd->cRedShift = 0;
00204 ppfd->cGreenBits = 1;
00205 ppfd->cGreenShift = 0;
00206 ppfd->cBlueBits = 1;
00207 ppfd->cBlueShift = 0;
00208 ppfd->cAlphaBits = 0;
00209 ppfd->cAlphaShift = 0;
00210 ppfd->cAccumBits = 0;
00211 ppfd->cAccumRedBits = 0;
00212 ppfd->cAccumGreenBits = 0;
00213 ppfd->cAccumBlueBits = 0;
00214 ppfd->cAccumAlphaBits = 0;
00215 ppfd->cStencilBits = 4;
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
00234
00235 return TRUE;
00236 }
00237
00238 BOOL WINAPI
00239 OnContextMenu(HWND hwnd, int x, int y)
00240 {
00241 RECT rc;
00242 POINT pt = { x, y };
00243
00244
00245 if ( !EL_popup ) return FALSE;
00246
00247
00248 GetClientRect(hwnd, &rc);
00249
00250
00251 ScreenToClient(hwnd, &pt);
00252
00253
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
00265 return FALSE;
00266 }
00267
00268
00269
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);
00354 }
00355
00356 void
00357 MSWIN32keycode2JEDkeycode2( EVENTO_GUI *e, unsigned int , LONG lParam )
00358 {
00359 LONG scancode = (lParam >> 16) & 0x00FF;
00360
00361 e->key_mask = 0;
00362 e->key_code = JK_VOID;
00363
00364
00365 if ( scancode <= 0x0B ||
00366 scancode == 0x01C ||
00367 (scancode >= 0x10 && scancode <= 0x19) ||
00368 (scancode >= 0x1E && scancode <= 0x28) ||
00369 (scancode >= 0x2B && scancode <= 0x35) ||
00370 scancode <= 0x1B ||
00371 scancode <= 0x39
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
00392
00393 {
00394 LONG scancode = (lParam >> 16) & 0x00FF;
00395 LONG extendido = (lParam) & (1 << 24);
00396
00397 switch ( code ) {
00398
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
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;
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;
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
00542
00543 switch ( tipo_mensaje ) {
00544
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
00561
00562
00563
00564
00565 break;
00566
00567 case WM_PAINT:
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
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
00594
00595
00596 break;
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
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
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:
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
00670
00671 retorno = DefWindowProc(w, tipo_mensaje, uParam, lParam);
00672 break;
00673
00674
00675
00676
00677
00678 case WM_CREATE:
00679 {
00680 HDC gc;
00681
00682
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
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);
00711 break;
00712
00713 case WM_COMMAND:
00714 comando = LOWORD(uParam);
00715 WIN32SDK_ejecutor(comando, 0);
00716 QUIERO_pintarme = TRUE;
00717
00718
00719
00720 break;
00721
00722 case WM_CONTEXTMENU:
00723 if ( OnContextMenu(w, LOWORD(lParam), HIWORD(lParam)) ) QUIERO_pintarme = 1;
00724 break;
00725
00726 case WM_SHOWWINDOW:
00727
00728 retorno = DefWindowProc(w, tipo_mensaje, uParam, lParam);
00729 break;
00730
00731
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
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751 retorno = DefWindowProc(w, tipo_mensaje, uParam, lParam);
00752 }
00753 break;
00754 default:
00755
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 * , char * [],
00765 int , int , char *nombre)
00766 {
00767
00768 leer_gui("etc/spanish.gui");
00769
00770
00771 GUI_MENU *Global = resolver_menu("GLOBAL");
00772 HMENU menubar = CreateMenu();
00773 char nomenu_cad[200] = "[&salir] (sin menu)";
00774
00775
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),
00785
00786 MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_TYPE,
00787 MFT_STRING,
00788 MFS_ENABLED,
00789 666,
00790 NULL,
00791 NULL,
00792 NULL,
00793 666,
00794 nomenu_cad,
00795 strlen(nomenu_cad)
00796 };
00797 if ( !InsertMenuItem(menubar, 0, TRUE, &opcion) ) {
00798 return FALSE;
00799 }
00800 }
00801
00802
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
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
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
00837
00838
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
00859 GetClientRect(VENTANA_principal, &rect);
00860 WIN32SDK_resize_callback(rect.left - rect.right, rect.top - rect.bottom, 0);
00861
00862
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
00870
00871 }
00872 }
00873 }
00874
00875 BOOLEAN
00876 JED_MSWIN32SDK_INTERFACE::anexar_controles(LISTA <CONTROL_GUI *> *
00877 ,
00878 REPOSITORIO_DE_ENTIDADES * )
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
00890
00891