Code: Select all
// https://akelpad.sourceforge.net/forum/viewtopic.php?p=36527#p36527
// Version: 1.1 (2024.11.09)
// Author: dothen
//
//
// Description(1033): Shows the vertical markup.
// Description(1049): Показывает вертикальную разметку.
//
// Usage:
// "VMarkup1" Call("Scripts::Main", 1, "VerticalMarkup.js") Icon(37)
// "VMarkup2" Call("Scripts::Main", 1, "VerticalMarkup.js", `-skip=10 -fill=1 -color=0x00C4CFCF`) Icon(37)
// "ClearVMarkup" Call("Scripts::Main", 1, "VerticalMarkup.js", `-clear=true`) Icon(37)
// Аргументы:
// -skip Число символов между линиями > 0 (по умолчанию 8).
// -fill Ширина линии в символах >= 0, если 0 то ширина = 1px (по умолчанию 0).
// -color Цвет линии в hex виде: 0x00BBGGRR (по умолчанию 0x00676767).
// -clear Если true то восстановить изначальный фон и левый отступ (по умолчанию false).
//
// Описание:
// Скрипт устанавливает фоновое изображение в виде вертикальных линий.
// Левый отступ автоматически устанавливается равным нулю.
// Имеет смысл применять с моноширинным шрифтом.
var hWndEdit = AkelPad.GetEditWnd();
if (!hWndEdit) WScript.Quit();
var nSkip = AkelPad.GetArgValue("skip", 8);
var nFill = AkelPad.GetArgValue("fill", 0);
var nColor = AkelPad.GetArgValue("color", 0x00676767);
var ClearBk = AkelPad.GetArgValue("clear", false);
if (nSkip < 1 || nFill < 0)
{
WScript.Echo("Warning: -skip=" + nSkip + " -fill=" + nFill);
WScript.Quit();
}
var oSys = AkelPad.SystemFunction();
var hMainWnd = AkelPad.GetMainWnd();
if (ClearBk)
{
RestoreBackground();
RestoreMarginLeft();
WScript.Quit();
}
SetMarginLeft(0);
SetBackgroundImage();
function SetBackgroundImage()
{
var nHeight = AkelPad.SendMessage(hWndEdit, 3188 /*AEM_GETCHARSIZE*/, 0 /*AECS_HEIGHT*/, null);
var nWidth = AkelPad.SendMessage(hWndEdit, 3188 /*AEM_GETCHARSIZE*/, 1 /*AECS_AVEWIDTH*/, null);
var lpaecolors = AkelPad.MemAlloc(68);
AkelPad.MemCopy(lpaecolors, 0x00000008 /*AECLR_BASICBK*/, 3 /*DT_DWORD*/);
AkelPad.SendMessage(hWndEdit, 3231 /*AEM_GETCOLORS*/, 0, lpaecolors);
var BasicBk = AkelPad.MemRead(_PtrAdd(lpaecolors, 12), 3 /*DT_DWORD*/);
var hDC = oSys.Call("Gdi32::CreateCompatibleDC", 0);
var hBitmap = oSys.Call("Gdi32::CreateBitmap", nWidth * (nSkip + nFill), nHeight, 1, 32, 0);
var hBmOld = oSys.Call("Gdi32::SelectObject", hDC, hBitmap);
oSys.Call("Gdi32::SelectObject", hDC, oSys.Call("Gdi32::GetStockObject", 18 /*DC_BRUSH*/));
oSys.Call("Gdi32::SelectObject", hDC, oSys.Call("Gdi32::GetStockObject", 19 /*DC_PEN*/));
oSys.Call("Gdi32::SetDCPenColor", hDC, BasicBk);
oSys.Call("Gdi32::SetDCBrushColor", hDC,BasicBk);
oSys.Call("Gdi32::Rectangle", hDC, 0, 0, nWidth * nSkip, nHeight);
if (nFill == 0)
{
oSys.Call("Gdi32::SetDCPenColor", hDC, nColor);
oSys.Call("Gdi32::MoveToEx", hDC, nWidth * nSkip - 1, 0, null);
oSys.Call("Gdi32::LineTo", hDC, nWidth * nSkip - 1, nHeight);
}
else
{
oSys.Call("Gdi32::SetDCPenColor", hDC, nColor);
oSys.Call("Gdi32::SetDCBrushColor", hDC, nColor);
oSys.Call("Gdi32::Rectangle", hDC, nWidth * nSkip, 0, nWidth * (nSkip + nFill), nHeight);
}
oSys.Call("Gdi32::SelectObject", hDC, hBmOld);
oSys.Call("Gdi32::DeleteDC", hDC);
AkelPad.MemFree(lpaecolors);
AkelPad.SendMessage(hWndEdit, 3391 /*AEM_SETBACKGROUNDIMAGE*/, hBitmap, 128);
}
function RestoreBackground()
{
var pBkImageFile = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 140 /*FI_BKIMAGEFILE*/, 0);
var hBkImageBitmapCur = AkelPad.SendMessage(hWndEdit, 3390 /*AEM_GETBACKGROUNDIMAGE*/, 0, 0);
var hBkImageBitmapOld = AkelPad.MemRead(_PtrAdd(pBkImageFile, 524 /*MAX_PATH * 2 + sizeof(int)*/), 2 /*DT_QWORD*/);
if (hBkImageBitmapCur != hBkImageBitmapOld)
AkelPad.SendMessage(hWndEdit, 3391 /*AEM_SETBACKGROUNDIMAGE*/, hBkImageBitmapOld, 128);
}
function RestoreMarginLeft()
{
var oSet = AkelPad.ScriptSettings();
var lpBuffer;
var nMarginLeftFromIni = 0;
if (oSet.Begin("", 0x41 /*POB_READ|POB_PROGRAM*/))
{
lpBuffer = oSet.Read("MarginsEditRect", 2 /*PO_BINARY*/);
nMarginLeftFromIni = AkelPad.MemRead(lpBuffer, 3 /*DT_DWORD*/);
AkelPad.MemFree(lpBuffer);
oSet.End();
}
SetMarginLeft(nMarginLeftFromIni);
}
// Based on Instructor's code
function SetMarginLeft(nMarginLeft)
{
//Get margins
var lpMargins = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 79 /*FI_RECTMARGINS*/, 0);
var nMarginLeftCur = AkelPad.MemRead(_PtrAdd(lpMargins, 0), 3 /*DT_DWORD*/);
var lpRect;
var lpFrameInfo;
if (nMarginLeftCur != nMarginLeft)
{
if (lpRect = AkelPad.MemAlloc(16 /*sizeof(RECT)*/))
{
oSys.Call("kernel32::RtlMoveMemory", lpRect, lpMargins, 16 /*sizeof(RECT)*/);
//New left margin
AkelPad.MemCopy(_PtrAdd(lpRect, 0) /*offsetof(RECT, left)*/, nMarginLeft, 3 /*DT_DWORD*/);
//Set margins
lpFrameInfo = AkelPad.MemAlloc(_X64?16:8 /*sizeof(FRAMEINFO)*/);
AkelPad.MemCopy(_PtrAdd(lpFrameInfo, 0) /*offsetof(FRAMEINFO, nType)*/, 26 /*FIS_RECTMARGINS*/, 3 /*DT_DWORD*/);
AkelPad.MemCopy(_PtrAdd(lpFrameInfo, _X64?8:4) /*offsetof(FRAMEINFO, dwData)*/, lpRect, 2 /*DT_QWORD*/);
AkelPad.SendMessage(hMainWnd, 1220 /*AKD_SETFRAMEINFO*/, lpFrameInfo, 0);
AkelPad.MemFree(lpRect);
}
}
}