Тема: AHK: Работа с GDI+. Линия диаметра круга без остатка
#NoEnv
#SingleInstance FORCE
SetWinDelay,0
SetBatchLines,-1
#Include gdip.ahk ;https://www.dropbox.com/s/0e9gdfetbfa8v0o/Gdip_All.ahk?dl=1
Global XPos,YPos,layer1,layer2
; запуск gdi+. ширина\длина,
Gdip_Startup() , Width := Height := 400
; Первый слой
Gui, 1: -Caption +E0x80000 +LastFound +ToolWindow +OwnDialogs +HWNDlayer1
Gui, 1: Show,
; отслеживание сообщений.
OnMessage(0x201, "WM_LBUTTONDOWN") ; нажатие левой кнопки мыши для переноса
;Сообщения
WM_LBUTTONDOWN()
{
PostMessage, 0xA1, 2
}
; увеличить рамки картинки под радиус разворота, и развернуть
Angle := 23
Gdip_GetRotatedDimensions(Width, Height, Angle, RWidth, RHeight)
Gdip_GetRotatedTranslation(Width, Height, Angle, xTranslation, yTranslation)
;первый слой
hbm := CreateDIBSection(RWidth, RHeight) , hdc := CreateCompatibleDC() , obm := SelectObject(hdc, hbm) , G := Gdip_GraphicsFromHDC(hdc) , Gdip_SetInterpolationMode(G, 7)
Gdip_TranslateWorldTransform(G, xTranslation, yTranslation)
Gdip_RotateWorldTransform(G, Angle)
Gdip_SetSmoothingMode(G, 5) ; сглаживание на 5
;первый слой
; рисуем основной круг
pBrush := Gdip_BrushCreateSolid(0xe69900CC) , Gdip_FillEllipse(G, pBrush, 0, 0, Width, Height) , Gdip_DeleteBrush(pBrush)
;разметка
pPen := Gdip_CreatePen(0xfff000000, 1)
Gdip_DrawLines(G, pPen , 0 "," 0 "|" Width "," Height )
Gdip_DeletePen(pPen)
; обводка
pPen := Gdip_CreatePen(0xfff000000, 2) , Gdip_DrawEllipse(G, pPen, 0, 0, Width, Height) , Gdip_DeletePen(pPen)
; показать нарисованное
UpdateLayeredWindow(layer1, hdc, (A_ScreenWidth-RWidth)//2, (A_ScreenHeight-RHeight)//2, RWidth, RHeight)
return
~1::
;убрать лишние линии которые зашли за границу
pPen := Gdip_CreatePen(0x00000000, 100) , Gdip_SetCompositingMode(G, 1) , Gdip_DrawEllipse(G, pPen, -50, -50, Width+100, Height+100) , Gdip_SetCompositingMode(G, 0) , Gdip_DeletePen(pPen)
; обводка
pPen := Gdip_CreatePen(0xfff000000, 2) , Gdip_DrawEllipse(G, pPen, 0, 0, Width, Height) , Gdip_DeletePen(pPen)
UpdateLayeredWindow(layer1, hdc, (A_ScreenWidth-RWidth)//2, (A_ScreenHeight-RHeight)//2, RWidth, RHeight)
return
Этот скрипт рисует круг, а на круге линию диаметра. Проблема в том что линия выходит за круг:
Приходится отдельно вырезать линии. На кнопку 1 отрезает лишнее.(можно и автоматом, просто для наглядности)
Эта линия рисуется от левого верхнего угла рабочей области до правого нижнего + разворот на 23 градуса
Задача: что бы линия сразу же на рисовалась нужного размера под круг, как это сделать?