Windows Guia da Plataforma
O backend Windows usa a API Win32 nativa e GDI/GDI+ para todos os desenhos. Ele e escrito em C++ e compilado com MSVC ou BCC. Este e o backend mais maduro e completo em recursos do HarbourBuilder.
| Linguagem | C++ |
|---|---|
| Linhas de codigo | ~7.100 |
| Funcoes HB_FUNC | ~135 |
| API Nativa | Win32 API (CreateWindowEx, GDI) |
| Scintilla | 5.6.1 (DLL dinamica) |
| SO Suportado | Windows 10, Windows 11 |
Visao Geral da Arquitetura
preprocessador #xcommand"] B --> C["TForm, TControl
classes OOP Harbour"] C --> D["Bridge HB_FUNC
~135 funcoes"] D --> E["Backend Win32
C++ / CreateWindowEx"] E --> F["GDI / GDI+
Desenho"] E --> G["Scintilla 5.6.1
DLL (editor de codigo)"] style A fill:#58a6ff,stroke:#388bfd,color:#0d1117 style B fill:#8b5cf6,stroke:#7c3aed,color:#fff style C fill:#f59e0b,stroke:#d97706,color:#0d1117 style D fill:#f59e0b,stroke:#d97706,color:#0d1117 style E fill:#0078d4,stroke:#005a9e,color:#fff style F fill:#0078d4,stroke:#005a9e,color:#fff style G fill:#555,stroke:#333,color:#fff
Criacao de Janelas Nativas
Cada janela e controle do HarbourBuilder e uma janela Win32 nativa criada via CreateWindowEx().
O backend registra classes de janela customizadas na inicializacao:
// win32_backend.cpp - Registro de classes de janela void RegisterClasses( HINSTANCE hInstance ) { WNDCLASSEX wc = { sizeof( WNDCLASSEX ) }; wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 ); wc.lpszClassName = "HBBUILDER_FORM"; RegisterClassEx( &wc ); wc.lpszClassName = "HBBUILDER_BUTTON"; RegisterClassEx( &wc ); // ... classes adicionais para EDIT, STATIC, etc. }
Controles sao controles comuns Win32 padrao: BUTTON, EDIT, STATIC,
COMBOBOX, LISTBOX, msctls_progress32, msctls_trackbar32,
SysTreeView32, SysListView32 e RichEdit.
Tratamento de Eventos (WndProc)
O backend Windows usa um WndProc central (procedimento de janela) que recebe todas as mensagens
do SO. Ele as despacha para manipuladores de eventos Harbour:
// win32_backend.cpp - Despacho de mensagens 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, (int) LOWORD( lParam ), (int) HIWORD( lParam ) ); 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 fechamento break; // ... tratamento adicional de mensagens } return DefWindowProc( hWnd, msg, wParam, lParam ); }
Suporte ao Modo Escuro
O HarbourBuilder no Windows segue o tema do sistema. O modo escuro e implementado usando:
DwmSetWindowAttribute()— Habilita barras de titulo escuras no Windows 10/11 definindoDWMWA_USE_IMMERSIVE_DARK_MODE.- Estilos de classe de janela escura — Quando o sistema esta em modo escuro, o backend registra classes de janela com pinceis de fundo escuros.
- Cores escuras GDI — Cores dos controles usam valores de paleta escura (fundos quase pretos, texto claro).
- Tema escuro Scintilla — O editor de codigo usa um estilo de lexer escuro que corresponde ao tema do IDE.
// win32_backend.cpp - Barra de titulo escura void EnableDarkTitleBar( HWND hWnd ) { BOOL dark = TRUE; DwmSetWindowAttribute( hWnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &dark, sizeof( dark ) ); }
O HarbourBuilder le a configuracao de tema do Windows do registro
(HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme)
na inicializacao e configura todos os controles conforme necessario.
Integracao Scintilla
O backend Windows usa Scintilla 5.6.1 como biblioteca dinamica:
| Arquivo | Localizacao | Proposito |
|---|---|---|
Scintilla.dll | bin/ | Componente principal de edicao Scintilla |
Lexilla.dll | bin/ | Biblioteca de lexer (destaque de sintaxe) |
O Scintilla e carregado em tempo de execucao via LoadLibrary() e GetProcAddress(). O
backend cria uma janela Scintilla como filha da aba do editor de codigo e comunica-se com ela
via SendMessage().
Opcoes de Compilador
Compiladores Suportados
| Compilador | Versao | Notas |
|---|---|---|
| MSVC 2022 | 19.3x | Recomendado. Suporte completo C++17, melhor otimizacao. |
| MSVC 2019 | 19.2x | Totalmente suportado. Disponivel via Visual Studio 2019 ou Build Tools. |
| MSVC Community | Mais recente | Edicao gratuita, compilador identico ao Pro/Enterprise. |
| MSVC BuildTools | Mais recente | Apenas linha de comando. Bom para pipelines CI/CD. |
| BCC | 7.7 | Embarcadero Borland C++ Compiler. Alternativa ao MSVC. |
Script de Build
O script build_win.bat cuida de todo o processo de build:
- Deteccao de compilador — Procura instalacoes MSVC (2019, 2022, Community, BuildTools) e BCC.
- Configuracao do ambiente — Chama
vcvarsall.batpara configurar o ambiente do compilador. - Compilacao do Harbour — Compila o Harbour a partir do fonte se ainda nao estiver presente.
- Build do Scintilla — Compila as DLLs Scintilla e Lexilla.
- Compilacao do IDE — Compila o fonte do HarbourBuilder IDE.
- Linkagem — Linka com
user32.lib,gdi32.lib,comctl32.lib,dwmapi.libe o runtime Harbour.
Recursos Especificos da Plataforma
| Recurso | Implementacao Windows |
|---|---|
| Controle Rich Edit | RichEdit20W / RichEdit50W (msftedit.dll) |
| Dialogos comuns | GetOpenFileName(), GetSaveFileName(), ChooseFont(), ChooseColor() |
| Bandeja do sistema | Shell_NotifyIcon() com NOTIFYICONDATA |
| Acesso ao registro | RegOpenKeyEx(), RegQueryValueEx() |
| Associacoes de arquivo | Baseado em registro sob HKEY_CLASSES_ROOT |
| Arrastar e soltar | DragAcceptFiles() / WM_DROPFILES |
| Area de transferencia | OpenClipboard(), SetClipboardData() |
| Impressao | API Win32 Print (PrintDlg(), StartDoc()) |
| Barras de titulo escuras | DwmSetWindowAttribute() com DWMWA_USE_IMMERSIVE_DARK_MODE |
Limitacoes Conhecidas
- Manifest necessario — Aplicacoes Windows precisam de um manifest incorporado para estilos visuais (ComCtl32 v6) e conscientizacao DPI. O HarbourBuilder inclui isso no build.
- Escala DPI — O backend e consciente de DPI mas o posicionamento de controles usa coordenadas em pixels. Telas de alto DPI podem exigir ajustes manuais de tamanho.
- Versao do RichEdit — O controle RichEdit depende de
msftedit.dllque pode nao estar disponivel em versoes muito antigas do Windows (pre-Windows 8). - Windows XP/Vista/7/8 — Nao suportados oficialmente. O backend tem como alvo APIs Windows 10+. Alguns recursos (barras de titulo escuras via DWM) requerem Windows 10 build 18985+.
Dependencias
| Biblioteca | Proposito |
|---|---|
user32.lib | Gerenciamento de janelas, mensagens, controles |
gdi32.lib | Desenho, fontes, bitmaps |
comctl32.lib | Controles comuns (TreeView, ListView, ProgressBar, etc.) |
comdlg32.lib | Dialogos comuns (Abrir, Salvar, Fonte, Cor) |
dwmapi.lib | Desktop Window Manager (barras de titulo escuras) |
gdiplus.lib | GDI+ para graficos avancados |
ole32.lib | Inicializacao COM, area de transferencia |
shell32.lib | Funcoes shell, arrastar-e-soltar |