remove all borders
without specific error messages or behaviors described, troubleshooting can be a bit generic
any else information?
---
//+------------------------------------------------------------------+ //| RemoveBorders.mq5 | //| Copyright 2024, MetaQuotes Ltd. | //+------------------------------------------------------------------+ #property copyright "Copyright 2024, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs //--- Importação da DLL User32 para 64-bits (MT5) #import "user32.dll" long GetParent(long hWnd); long GetWindowLongPtrW(long hWnd, int nIndex); long SetWindowLongPtrW(long hWnd, int nIndex, long dwNewLong); bool SetWindowPos(long hWnd, long hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); #import //--- Constantes de Estilo de Janela (Win32 API) #define GWL_STYLE -16 #define WS_CAPTION 0x00C00000 // Barra de título #define WS_THICKFRAME 0x00040000 // Borda redimensionável #define WS_SYSMENU 0x00080000 // Botões X, min, max #define WS_MINIMIZEBOX 0x00020000 #define WS_MAXIMIZEBOX 0x00010000 #define WS_BORDER 0x00800000 #define WS_DLGFRAME 0x00400000 //--- Flags para SetWindowPos #define SWP_NOSIZE 0x0001 #define SWP_NOMOVE 0x0002 #define SWP_NOZORDER 0x0004 #define SWP_NOACTIVATE 0x0010 #define SWP_FRAMECHANGED 0x0020 // Força o recálculo da área do cliente //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { // 1. Obtém o Handle do gráfico atual (Area de desenho) long hChart = ChartGetInteger(0, CHART_WINDOW_HANDLE); if(hChart == 0) { Print("Erro: Não foi possível obter o handle do gráfico."); return; } // 2. No MT5, a borda pertence ao PAI do gráfico. // Obtemos o "container" que segura o gráfico. long hParent = GetParent(hChart); if(hParent == 0) { Print("Erro: Não foi possível encontrar a janela pai."); return; } // 3. Remove a borda da janela PAI RemoveWindowBorder(hParent); // Atualiza o gráfico para redesenhar ChartRedraw(); } //+------------------------------------------------------------------+ //| Função para remover estilos de borda e título | //+------------------------------------------------------------------+ void RemoveWindowBorder(long hWnd) { // Obtém o estilo atual da janela (Use PtrW para 64-bits) long currentStyle = GetWindowLongPtrW(hWnd, GWL_STYLE); // Define o que queremos remover (Título, Borda Grossa, Botões de sistema, Borda simples) long toRemove = WS_CAPTION | WS_THICKFRAME | WS_SYSMENU | WS_BORDER | WS_DLGFRAME; // Remove os bits usando operação bitwise long newStyle = currentStyle & ~toRemove; // Aplica o novo estilo SetWindowLongPtrW(hWnd, GWL_STYLE, newStyle); // Força o Windows a atualizar a janela (FrameChanged é crucial aqui) SetWindowPos(hWnd, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); }
- 2025.11.27
- www.mql5.com
I tried many things to remove borders for tile window charts, nothing work. BUT, guess what? I found a way using UNDOCKED CHARTS. (ALT+D) Works amazing if you use 2 monitors.
Intructions:
1 - Open MT5 and move to monitor 01 (as example)... undock all charts and move all to Another monitor.
2 - Arrange the charts in monitor by hand or using win + arrows clicking chart by chart.
3 - attach the script to any chart and fill the input section with the monitor where you moved the charts + this monitor resolution
4 - choose also the number of lines and columns do you want. (as example for 2 charts tile vertically it's 1 line and 2 columns)
5 - Press OK and see the magic happening.
6 - if you need to close the MT5, please, Dock back all charts one by one by click the each chart and apply ALT + D. DO THIS BEFORE CLOSE MT5 to avoid losing the chart with all indicators and customizations.
---
//+------------------------------------------------------------------+ //| AutoWall_MultiMonitor.mq5 | //| Copyright 2024, MetaQuotes Ltd. | //+------------------------------------------------------------------+ #property script_show_inputs #property description "Organiza Gráficos Flutuantes em Grade no Monitor 1 ou 2" //--- ENUMS PARA FACILITAR A ESCOLHA enum ENUM_TARGET_MONITOR { MONITOR_1_PRINCIPAL = 0, // Monitor 1 (Principal) MONITOR_2_DIREITA = 1, // Monitor 2 (Fica à Direita do Principal) MONITOR_2_ESQUERDA = 2 // Monitor 2 (Fica à Esquerda do Principal) }; //--- INPUTS DO USUÁRIO input ENUM_TARGET_MONITOR InpMonitor = MONITOR_2_DIREITA; // Qual Monitor usar? input int InpRows = 2; // Numero de Linhas input int InpCols = 2; // Numero de Colunas input string separator = "--- Configuração do Monitor 2 ---"; // . input int InpMon2_Width = 1920; // Largura do Monitor 2 (px) input int InpMon2_Height = 1080; // Altura do Monitor 2 (px) //--- IMPORTAÇÕES DLL #import "user32.dll" long GetParent(long hWnd); long GetWindowLongPtrW(long hWnd, int nIndex); long SetWindowLongPtrW(long hWnd, int nIndex, long dwNewLong); bool SetWindowPos(long hWnd, long hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); int GetSystemMetrics(int nIndex); bool MoveWindow(long hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); #import //--- CONSTANTES E FLAGS #define SM_CXSCREEN 0 #define SM_CYSCREEN 1 #define GWL_STYLE -16 #define WS_CAPTION 0x00C00000 #define WS_THICKFRAME 0x00040000 #define WS_SYSMENU 0x00080000 #define WS_BORDER 0x00800000 #define WS_DLGFRAME 0x00400000 #define WS_POPUP 0x80000000 #define SWP_NOZORDER 0x0004 #define SWP_NOACTIVATE 0x0010 #define SWP_FRAMECHANGED 0x0020 //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { // 1. Obtém dados do Monitor Principal (Referência Zero) int primaryW = GetSystemMetrics(SM_CXSCREEN); int primaryH = GetSystemMetrics(SM_CYSCREEN); // 2. Define a Área de Trabalho Alvo (Offset e Tamanho) int targetX = 0; int targetY = 0; int targetW = primaryW; int targetH = primaryH; // Lógica de posicionamento baseada na escolha do usuário switch(InpMonitor) { case MONITOR_1_PRINCIPAL: targetX = 0; targetY = 0; targetW = primaryW; targetH = primaryH; break; case MONITOR_2_DIREITA: // Começa onde o monitor 1 termina targetX = primaryW; targetY = 0; // Assume alinhamento pelo topo targetW = InpMon2_Width; targetH = InpMon2_Height; break; case MONITOR_2_ESQUERDA: // Começa antes do zero targetX = -InpMon2_Width; targetY = 0; targetW = InpMon2_Width; targetH = InpMon2_Height; break; } // 3. Calcula tamanho de cada célula na grade int cellW = targetW / InpCols; int cellH = targetH / InpRows; int currentIdx = 0; long currChartID = ChartFirst(); // 4. Loop para aplicar nas janelas flutuantes while(currChartID != -1) { // Só processa se estiver DESACOPLADO (Floating) if(!ChartGetInteger(currChartID, CHART_IS_DOCKED)) { long hChart = ChartGetInteger(currChartID, CHART_WINDOW_HANDLE); long hFrame = GetParent(hChart); if(hFrame > 0) { // A. Remove Bordas RemoveBorder(hFrame); // B. Calcula Posição na Grade int row = currentIdx / InpCols; int col = currentIdx % InpCols; // A coordenada X final é: Onde começa o monitor + (coluna * largura) int finalX = targetX + (col * cellW); int finalY = targetY + (row * cellH); // C. Move para o Monitor 2 (ou 1) MoveWindow(hFrame, finalX, finalY, cellW, cellH, true); currentIdx++; // Reinicia o indice se tiver mais gráficos que espaços (sobrepõe do inicio) if(currentIdx >= InpRows * InpCols) currentIdx = 0; } ChartRedraw(currChartID); } currChartID = ChartNext(currChartID); } } //+------------------------------------------------------------------+ //| Remove bordas e prepara para janela flutuante | //+------------------------------------------------------------------+ void RemoveBorder(long hWnd) { long currentStyle = GetWindowLongPtrW(hWnd, GWL_STYLE); long toRemove = WS_CAPTION | WS_THICKFRAME | WS_SYSMENU | WS_BORDER | WS_DLGFRAME; // Adiciona WS_POPUP para garantir comportamento correto fora da MDI long newStyle = (currentStyle & ~toRemove) | WS_POPUP; if(newStyle != currentStyle) { SetWindowLongPtrW(hWnd, GWL_STYLE, newStyle); SetWindowPos(hWnd, 0, 0, 0, 0, 0, 0x0001 | 0x0002 | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); } }
```cpp
//+------------------------------------------------------------------+ //| AutoWall_Final_EN.mq5 | //| Copyright 2024, MetaQuotes Ltd. | //+------------------------------------------------------------------+ #property script_show_inputs #property description "Organizes Undocked Charts into a Grid on Monitor 1 or 2 (Borderless)" //--- ENUMS FOR MONITOR SELECTION enum ENUM_TARGET_MONITOR { MONITOR_1_MAIN = 0, // Monitor 1 (Primary) MONITOR_2_RIGHT = 1, // Monitor 2 (Located to the Right of Primary) MONITOR_2_LEFT = 2 // Monitor 2 (Located to the Left of Primary) }; //--- USER INPUTS input ENUM_TARGET_MONITOR InpMonitor = MONITOR_2_RIGHT; // Which Monitor to use? input int InpRows = 2; // Number of Rows input int InpCols = 2; // Number of Columns input string separator = "--- Monitor 2 Configuration ---"; // . input int InpMon2_Width = 1920; // Monitor 2 Width (px) input int InpMon2_Height = 1080; // Monitor 2 Height (px) //--- DLL IMPORTS (Windows API) #import "user32.dll" long GetParent(long hWnd); long GetWindowLongPtrW(long hWnd, int nIndex); long SetWindowLongPtrW(long hWnd, int nIndex, long dwNewLong); bool SetWindowPos(long hWnd, long hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); int GetSystemMetrics(int nIndex); bool MoveWindow(long hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); #import //--- CONSTANTS AND FLAGS #define SM_CXSCREEN 0 #define SM_CYSCREEN 1 #define GWL_STYLE -16 #define WS_CAPTION 0x00C00000 #define WS_THICKFRAME 0x00040000 #define WS_SYSMENU 0x00080000 #define WS_BORDER 0x00800000 #define WS_DLGFRAME 0x00400000 #define WS_POPUP 0x80000000 #define SWP_NOZORDER 0x0004 #define SWP_NOACTIVATE 0x0010 #define SWP_FRAMECHANGED 0x0020 //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { // 1. Get Main Monitor metrics (Zero Reference) int primaryW = GetSystemMetrics(SM_CXSCREEN); int primaryH = GetSystemMetrics(SM_CYSCREEN); // 2. Define Target Workspace (Offset and Size) int targetX = 0; int targetY = 0; int targetW = primaryW; int targetH = primaryH; // Positioning logic based on user selection switch(InpMonitor) { case MONITOR_1_MAIN: targetX = 0; targetY = 0; targetW = primaryW; targetH = primaryH; break; case MONITOR_2_RIGHT: // Starts exactly where Monitor 1 ends targetX = primaryW; targetY = 0; // Assumes top alignment targetW = InpMon2_Width; targetH = InpMon2_Height; break; case MONITOR_2_LEFT: // Starts before zero (Negative coordinates) targetX = -InpMon2_Width; targetY = 0; targetW = InpMon2_Width; targetH = InpMon2_Height; break; } // 3. Calculate cell size for the grid int cellW = targetW / InpCols; int cellH = targetH / InpRows; int currentIdx = 0; long currChartID = ChartFirst(); // 4. Loop to apply logic to floating windows while(currChartID != -1) { // Only process if the chart is UNDOCKED (Floating) if(!ChartGetInteger(currChartID, CHART_IS_DOCKED)) { long hChart = ChartGetInteger(currChartID, CHART_WINDOW_HANDLE); long hFrame = GetParent(hChart); if(hFrame > 0) { // A. Remove Borders RemoveBorder(hFrame); // B. Calculate Grid Position int row = currentIdx / InpCols; int col = currentIdx % InpCols; // Final X coordinate: Monitor Start Position + (Column * Width) int finalX = targetX + (col * cellW); int finalY = targetY + (row * cellH); // C. Move to Target Monitor MoveWindow(hFrame, finalX, finalY, cellW, cellH, true); currentIdx++; // Reset index if there are more charts than slots (Overlap from start) if(currentIdx >= InpRows * InpCols) currentIdx = 0; } ChartRedraw(currChartID); } currChartID = ChartNext(currChartID); } Print("AutoWall Finished. Charts organized."); } //+------------------------------------------------------------------+ //| Remove borders and prepare floating window | //+------------------------------------------------------------------+ void RemoveBorder(long hWnd) { long currentStyle = GetWindowLongPtrW(hWnd, GWL_STYLE); long toRemove = WS_CAPTION | WS_THICKFRAME | WS_SYSMENU | WS_BORDER | WS_DLGFRAME; // Add WS_POPUP to ensure correct behavior outside MDI (Flat look) long newStyle = (currentStyle & ~toRemove) | WS_POPUP; if(newStyle != currentStyle) { SetWindowLongPtrW(hWnd, GWL_STYLE, newStyle); SetWindowPos(hWnd, 0, 0, 0, 0, 0, 0x0001 | 0x0002 | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); } }
But infortunately, it does not work.
Can you please help me (or fix it for the community) ?
Regards