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.

Estatisticas do Backend
LinguagemC++
Linhas de codigo~7.100
Funcoes HB_FUNC~135
API NativaWin32 API (CreateWindowEx, GDI)
Scintilla5.6.1 (DLL dinamica)
SO SuportadoWindows 10, Windows 11

Visao Geral da Arquitetura

graph TB A["Harbour .prg"] --> B["hbbuilder.ch
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:

// win32_backend.cpp - Barra de titulo escura
void EnableDarkTitleBar( HWND hWnd )
{
   BOOL dark = TRUE;
   DwmSetWindowAttribute(
      hWnd,
      DWMWA_USE_IMMERSIVE_DARK_MODE,
      &dark,
      sizeof( dark )
   );
}
Deteccao de tema do sistema

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:

ArquivoLocalizacaoProposito
Scintilla.dllbin/Componente principal de edicao Scintilla
Lexilla.dllbin/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

CompiladorVersaoNotas
MSVC 202219.3xRecomendado. Suporte completo C++17, melhor otimizacao.
MSVC 201919.2xTotalmente suportado. Disponivel via Visual Studio 2019 ou Build Tools.
MSVC CommunityMais recenteEdicao gratuita, compilador identico ao Pro/Enterprise.
MSVC BuildToolsMais recenteApenas linha de comando. Bom para pipelines CI/CD.
BCC7.7Embarcadero Borland C++ Compiler. Alternativa ao MSVC.

Script de Build

O script build_win.bat cuida de todo o processo de build:

  1. Deteccao de compilador — Procura instalacoes MSVC (2019, 2022, Community, BuildTools) e BCC.
  2. Configuracao do ambiente — Chama vcvarsall.bat para configurar o ambiente do compilador.
  3. Compilacao do Harbour — Compila o Harbour a partir do fonte se ainda nao estiver presente.
  4. Build do Scintilla — Compila as DLLs Scintilla e Lexilla.
  5. Compilacao do IDE — Compila o fonte do HarbourBuilder IDE.
  6. Linkagem — Linka com user32.lib, gdi32.lib, comctl32.lib, dwmapi.lib e o runtime Harbour.

Recursos Especificos da Plataforma

RecursoImplementacao Windows
Controle Rich EditRichEdit20W / RichEdit50W (msftedit.dll)
Dialogos comunsGetOpenFileName(), GetSaveFileName(), ChooseFont(), ChooseColor()
Bandeja do sistemaShell_NotifyIcon() com NOTIFYICONDATA
Acesso ao registroRegOpenKeyEx(), RegQueryValueEx()
Associacoes de arquivoBaseado em registro sob HKEY_CLASSES_ROOT
Arrastar e soltarDragAcceptFiles() / WM_DROPFILES
Area de transferenciaOpenClipboard(), SetClipboardData()
ImpressaoAPI Win32 Print (PrintDlg(), StartDoc())
Barras de titulo escurasDwmSetWindowAttribute() com DWMWA_USE_IMMERSIVE_DARK_MODE

Limitacoes Conhecidas

Dependencias

BibliotecaProposito
user32.libGerenciamento de janelas, mensagens, controles
gdi32.libDesenho, fontes, bitmaps
comctl32.libControles comuns (TreeView, ListView, ProgressBar, etc.)
comdlg32.libDialogos comuns (Abrir, Salvar, Fonte, Cor)
dwmapi.libDesktop Window Manager (barras de titulo escuras)
gdiplus.libGDI+ para graficos avancados
ole32.libInicializacao COM, area de transferencia
shell32.libFuncoes shell, arrastar-e-soltar