Windows Guia de Plataforma
El backend de Windows usa la API nativa Win32 y GDI/GDI+ para todo el dibujo. Esta escrito en C++ y compilado con MSVC o BCC. Este es el backend mas maduro y completo en HarbourBuilder.
| Lenguaje | C++ |
|---|---|
| Lineas de codigo | ~7,100 |
| Funciones HB_FUNC | ~135 |
| API Nativa | Win32 API (CreateWindowEx, GDI) |
| Scintilla | 5.6.1 (DLL dinamica) |
| SO Soportado | Windows 10, Windows 11 |
Vision General de la Arquitectura
Cada ventana y control de HarbourBuilder es una ventana Win32 nativa creada mediante CreateWindowEx().
El backend registra clases de ventana personalizadas al inicio. Los controles son controles comunes Win32 estandar:
BUTTON, EDIT, STATIC, COMBOBOX, LISTBOX,
msctls_progress32, msctls_trackbar32, SysTreeView32, SysListView32
y RichEdit.
Manejo de Eventos (WndProc)
El backend de Windows usa un WndProc central (procedimiento de ventana) que recibe todos los mensajes
del SO. Los despacha a los manejadores de eventos de Harbour:
// win32_backend.cpp - Despacho de mensajes LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_COMMAND: FireEvent( hWnd, EVENT_CLICK, CT_BUTTON ); break; case WM_LBUTTONDOWN: FireEvent( hWnd, EVENT_MOUSEDOWN ); break; case WM_KEYDOWN: FireEvent( hWnd, EVENT_KEYDOWN, (int) wParam ); break; case WM_PAINT: FireEvent( hWnd, EVENT_PAINT ); break; case WM_CLOSE: if( !FireCloseQuery( hWnd ) ) return 0; // Cancelar cierre break; } return DefWindowProc( hWnd, msg, wParam, lParam ); }
Soporte de Modo Oscuro
HarbourBuilder en Windows sigue el tema del sistema. El modo oscuro se implementa usando:
DwmSetWindowAttribute()— Habilita barras de titulo oscuras en Windows 10/11 estableciendoDWMWA_USE_IMMERSIVE_DARK_MODE.- Estilos de clase de ventana oscuros — Cuando el sistema esta en modo oscuro, el backend registra clases de ventana con pinceles de fondo oscuros.
- Colores oscuros GDI — Los colores de los controles usan valores de paleta oscura (fondos casi negros, texto claro).
- Tema oscuro de Scintilla — El editor de codigo usa un estilo de lexer oscuro que coincide con el tema del IDE.
HarbourBuilder lee la configuracion del tema de Windows desde el registro
(HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme)
al inicio y configura todos los controles en consecuencia.
Integracion de Scintilla
El backend de Windows usa Scintilla 5.6.1 como biblioteca dinamica:
| Archivo | Ubicacion | Proposito |
|---|---|---|
Scintilla.dll | bin/ | Componente principal de edicion Scintilla |
Lexilla.dll | bin/ | Biblioteca de lexer (resaltado de sintaxis) |
Scintilla se carga en tiempo de ejecucion mediante LoadLibrary() y GetProcAddress().
Opciones del Compilador
Compiladores Soportados
| Compilador | Version | Notas |
|---|---|---|
| MSVC 2022 | 19.3x | Recomendado. Soporte completo C++17, mejor optimizacion. |
| MSVC 2019 | 19.2x | Totalmente soportado. Disponible via Visual Studio 2019 o Build Tools. |
| MSVC Community | Ultima | Edicion gratuita, compilador identico a Pro/Enterprise. |
| MSVC BuildTools | Ultima | Solo linea de comandos. Bueno para pipelines CI/CD. |
| BCC | 7.7 | Embarcadero Borland C++ Compiler. Alternativa a MSVC. |
Script de Construccion
El script build_win.bat maneja todo el proceso de construccion:
- Deteccion del compilador — Busca instalaciones de MSVC (2019, 2022, Community, BuildTools) y BCC.
- Configuracion del entorno — Llama a
vcvarsall.batpara configurar el entorno del compilador. - Compilacion de Harbour — Construye Harbour desde el codigo fuente si aun no esta presente.
- Construccion de Scintilla — Compila las DLLs de Scintilla y Lexilla.
- Compilacion del IDE — Compila el codigo fuente de HarbourBuilder.
- Enlazado — Enlaza contra
user32.lib,gdi32.lib,comctl32.lib,dwmapi.liby el runtime de Harbour.
Caracteristicas Especificas de la Plataforma
| Caracteristica | Implementacion en Windows |
|---|---|
| Control Rich Edit | RichEdit20W / RichEdit50W (msftedit.dll) |
| Dialogos comunes | GetOpenFileName(), GetSaveFileName(), ChooseFont(), ChooseColor() |
| Bandeja del sistema | Shell_NotifyIcon() con NOTIFYICONDATA |
| Acceso al registro | RegOpenKeyEx(), RegQueryValueEx() |
| Asociaciones de archivo | Basado en registro bajo HKEY_CLASSES_ROOT |
| Arrastrar y soltar | DragAcceptFiles() / WM_DROPFILES |
| Portapapeles | OpenClipboard(), SetClipboardData() |
| Impresion | API Win32 Print (PrintDlg(), StartDoc()) |
| Barras de titulo oscuras | DwmSetWindowAttribute() con DWMWA_USE_IMMERSIVE_DARK_MODE |
Limitaciones Conocidas
- Requisito de manifiesto — Las aplicaciones de Windows necesitan un manifiesto incrustado para estilos visuales (ComCtl32 v6) y consciencia DPI.
- Escalado DPI — El backend tiene consciencia DPI pero el posicionamiento de controles usa coordenadas de pixeles. Las pantallas de alto DPI pueden requerir ajustes de tamano manuales.
- Version de RichEdit — El control RichEdit depende de
msftedit.dllque puede no estar disponible en versiones muy antiguas de Windows (anteriores a Windows 8). - Windows XP/Vista/7/8 — No soportados oficialmente. El backend apunta a APIs de Windows 10+.
Dependencias
| Biblioteca | Proposito |
|---|---|
user32.lib | Gestion de ventanas, mensajes, controles |
gdi32.lib | Dibujo, fuentes, mapas de bits |
comctl32.lib | Controles comunes (TreeView, ListView, ProgressBar, etc.) |
comdlg32.lib | Dialogos comunes (Abrir, Guardar, Fuente, Color) |
dwmapi.lib | Desktop Window Manager (barras de titulo oscuras) |
gdiplus.lib | GDI+ para graficos avanzados |
ole32.lib | Inicializacion COM, portapapeles |
shell32.lib | Funciones del shell, arrastrar y soltar |