Рисование на окне AkelPad

Russian main discussion
Post Reply
  • Author
  • Message
Offline
Posts: 5
Joined: Sat Nov 09, 2019 2:53 pm

Рисование на окне AkelPad

Post by hexep »

Код из скрипта рисует на ScrollBar AkelPad. Почему рисуемый прямоугольник пропадает после наведения на ScrollBar, после нажатия на стрелки ScrollBar, после прокрутки его до конца.

Code: Select all

* Используемые константы */
SH_FINDSCRIPT			= 3;
SH_CLOSESCRIPT		= 33;
SH_GETMESSAGELOOP	= 13;
WM_PAINT = 15;
WSC_EDITPROC = 2;
OBJID_HSCROLL = -5;


/* Объявление переменных */
var hEditWnd = AkelPad.GetEditWnd();
var hMainWnd = AkelPad.GetMainWnd();
var hScript = AkelPad.ScriptHandle(WScript.ScriptName, SH_FINDSCRIPT);
var oSys        = AkelPad.SystemFunction();

if (hScript && AkelPad.ScriptHandle(hScript, SH_GETMESSAGELOOP))
{
	AkelPad.ScriptHandle(hScript, SH_CLOSESCRIPT);
}
else
{
	var sSubClass = AkelPad.WindowSubClass(WSC_EDITPROC, sCallback);
	AkelPad.ScriptNoMutex();
	AkelPad.WindowGetMessage();
	AkelPad.WindowUnsubClass(WSC_EDITPROC);
}


function sCallback(hWnd, uMsg, wParam, lParam)
{
	if ((uMsg == WM_PAINT))
	{
		var hDC = oSys.Call("User32::GetDC", hMainWnd);
		var hpenOld = oSys.Call("Gdi32::SelectObject", hDC, oSys.Call("Gdi32::GetStockObject", 19 /*DC_PEN*/));
		var hbrushOld = oSys.Call("Gdi32::SelectObject", hDC, oSys.Call("Gdi32::GetStockObject", 5 /*NULL_BRUSH*/));
		
		var psbi = AkelPad.MemAlloc(60 /*sizeof(SCROLLBARINFO)*/);
		AkelPad.MemCopy(psbi, 60, 3 /*DT_DWORD*/);

		oSys.Call("User32::GetScrollBarInfo", hEditWnd, OBJID_HSCROLL, psbi);

		var left = AkelPad.MemRead(psbi + 4, 3 /*DT_DWORD*/);
		var top = AkelPad.MemRead(psbi + 8, 3 /*DT_DWORD*/);
		var right = AkelPad.MemRead(psbi + 12, 3 /*DT_DWORD*/);
		var bottom = AkelPad.MemRead(psbi + 16, 3 /*DT_DWORD*/);

		AkelPad.MemFree(psbi);

		oSys.Call("Gdi32::SetDCPenColor", hDC, HexToRGB("#CCAA00"));

		oSys.Call("Gdi32::Rectangle", hDC, left, top + 100, right, top + 105);

		oSys.Call("Gdi32::SelectObject", hDC, hpenOld);
		oSys.Call("Gdi32::SelectObject", hDC, hbrushOld);

		oSys.Call("User32::ReleaseDC", hMainWnd, hDC);
		return 0;	
	}
}


function HexToRGB(sHex)
{
  if (/^#[\da-f]{6}$/i.test(sHex))
    return parseInt(sHex.substr(5, 2) + sHex.substr(3, 2) + sHex.substr(1, 2), 16);

  return oSys.Call("User32::GetSysColor", 15 /*COLOR_BTNFACE*/);
}
Post Reply