ColorText
Позволяет получить вот такой текст
Код:
; AZJIO 21.05.2025 ;- TOP EnableExplicit Define UserIntLang, *Lang If OpenLibrary(0, "kernel32.dll") *Lang = GetFunction(0, "GetUserDefaultUILanguage") If *Lang UserIntLang = CallFunctionFast(*Lang) EndIf CloseLibrary(0) EndIf #CountStrLang = 10 Global Dim Lng.s(#CountStrLang) Lng(1) = "BBcode to clipboard" Lng(2) = "Number of loops" Lng(3) = "Spectrum Range" Lng(4) = "Tone Shift" Lng(5) = "Bold" Lng(6) = "Italic" Lng(7) = "Back" Lng(8) = "Correction" Lng(9) = "Happy Birthday!!!" Lng(10) = "Done" If UserIntLang = 1049 ; ru Lng(1) = "BBcode в буфер обмена" Lng(2) = "Количество циклов" Lng(3) = "Диапазон спектра" Lng(4) = "Сдвиг тона" Lng(5) = "Жирный" Lng(6) = "Курсив" Lng(7) = "Обратно" Lng(8) = "Коррекция" Lng(9) = "Поздравляю с днём рождения!!!" Lng(10) = "Готово" EndIf ;- # Constants #Window = 0 ;- ● Enumeration Enumeration #txt1 #cbx #btn1 #tbg1 #tbg2 #tbg3 #EditorRTF #bold #italic #Reverse #correction #txtLoop #txtNumLoop #txtRange #txtNumRange #txtShift #txtNumShift EndEnumeration ;- ● Global Global tmp Global loops0 = 1, Range0 = 360, Shift0 Global hTrackBar1, hTrackBar2, hTrackBar3 Global RTFtext$, text$, RTFColorTable$, Len1, Len2 Global Bold$, italic$, Font$, correction, Reverse Global RTFHeaderPart1$ = "{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset204 Arial;}}{\colortbl;" Global RTFHeaderPart2$ = "}{\*\generator Riched20 10.0.16299}\viewkind4\uc1\pard\f0\fs" Global Dim arr_rgb(2) Global Dim arr_hsb(2) arr_hsb(1) = 100 arr_hsb(2) = 100 Define CharFormat.CHARFORMAT ;- ● Declare Declare hsb_to_rgb() Declare ToBBcode() Declare SizeHandler() Declare Start() Declare WindowCallback(WindowId, Message, wParam, lParam) Declare SetTextRTF() ;-┌──GUI──┐ If OpenWindow(#Window, 0, 0, 560, 315, "ColorText", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget) WindowBounds(#Window, 560, 200, #PB_Ignore, #PB_Ignore) ; TextGadget(#txt1, 10, 12, 60, 20, "Образцы:") ; ComboBoxGadget(#cbx, 70, 10, 110, 25) ButtonGadget(#btn1, 200, 10, 240, 25, Lng(1)) hTrackBar1 = TrackBarGadget(#tbg1, 185, 40, 270, 30, 1, 10) hTrackBar2 = TrackBarGadget(#tbg2, 185, 70, 270, 30, 0, 360) SetGadgetState(#tbg2, Range0) hTrackBar3 = TrackBarGadget(#tbg3, 185, 100, 270, 30, 0, 360) EditorGadget(#EditorRTF , 10, 145, 540, 160) SendMessage_(GadgetID(#EditorRTF), #EM_SETTEXTMODE, #TM_RICHTEXT, 0) TextGadget(#txtLoop, 10, 45, 145, 30, Lng(2)) TextGadget(#txtNumLoop, 155, 45, 30, 30, "1") TextGadget(#txtRange, 10, 75, 145, 30, Lng(3)) TextGadget(#txtNumRange, 155, 75, 30, 30, "360") TextGadget(#txtShift, 10, 105, 145, 30, Lng(4)) TextGadget(#txtNumShift, 155, 105, 30, 30, "0") CheckBoxGadget(#bold, 460, 45, 95, 20, Lng(5)) CheckBoxGadget(#italic, 460, 65, 95, 20, Lng(6)) CheckBoxGadget(#Reverse, 460, 85, 95, 20, Lng(7)) CheckBoxGadget(#correction, 460, 105, 95, 20, Lng(8)) SetGadgetState(#bold, #PB_Checkbox_Checked) SetGadgetState(#italic, #PB_Checkbox_Checked) SetGadgetState(#correction, #PB_Checkbox_Checked) text$ = Lng(9) Len1 = Len(text$) Len2 = Len(ReplaceString(text$, " ", "")) ; text$ = "Happy Birthday!!!" SetTextRTF() SetWindowCallback(@WindowCallback()) BindEvent(#PB_Event_SizeWindow, @SizeHandler()) ;-┌──Loop──┐ Repeat Select WaitWindowEvent() ;- ├ Gadget Case #PB_Event_Gadget Select EventGadget() Case #btn1 ; text$ = GetGadgetText(#EditorRTF) ToBBcode() Case #Reverse Reverse = GetGadgetState(#Reverse) & #PB_Checkbox_Checked Start() Case #correction correction = GetGadgetState(#correction) & #PB_Checkbox_Checked Start() Case #bold If GetGadgetState(#bold) & #PB_Checkbox_Checked Bold$ = "\b" Else Bold$ = "" EndIf SetGadgetText(#EditorRTF, RTFHeaderPart1$ + RTFColorTable$ + RTFHeaderPart2$ + Font$ + Bold$ + italic$ + RTFtext$ + "}") Case #italic If GetGadgetState(#italic) & #PB_Checkbox_Checked italic$ = "\i" Else italic$ = "" EndIf SetGadgetText(#EditorRTF, RTFHeaderPart1$ + RTFColorTable$ + RTFHeaderPart2$ + Font$ + Bold$ + italic$ + RTFtext$ + "}") ; Debug 1 Case #EditorRTF Select EventType() Case #PB_EventType_Change SendMessage_(GadgetID(#EditorRTF), #EM_GETSEL, @tmp, 0) text$ = GetGadgetText(#EditorRTF) Len1 = Len(text$) Len2 = Len(ReplaceString(text$, " ", "")) SetTextRTF() SendMessage_(GadgetID(#EditorRTF), #EM_SETSEL, tmp, tmp) EndSelect EndSelect Case #PB_Event_CloseWindow CloseWindow(#Window) End EndSelect ForEver ;-└──Loop──┘ EndIf Procedure WindowCallback(WindowId, Message, wParam, lParam) Protected Result = #PB_ProcessPureBasicEvents, nScrollCode, value Select Message Case #WM_HSCROLL ; Это (LoWord и HiWord) должно быть в Protected процедуры а не под #WM_HSCROLL, если используется другие WM_Сообщения nScrollCode = wParam & $FFFF ; LoWord value = wParam >> 16 ; HiWord Select nScrollCode Case #SB_THUMBTRACK, #SB_THUMBPOSITION;, #SB_PAGELEFT, #SB_PAGERIGHT, #SB_LINELEFT, #SB_LINERIGHT Select lParam Case hTrackBar1 loops0 = value Start() SetGadgetText(#txtNumLoop, Str(value)) Case hTrackBar2 Range0 = value Start() SetGadgetText(#txtNumRange, Str(value)) Case hTrackBar3 Shift0 = value Start() SetGadgetText(#txtNumShift, Str(value)) EndSelect EndSelect EndSelect ProcedureReturn Result EndProcedure Procedure ToBBcode() Protected *c.Character = @text$ Protected Brightness = 100, *m, *p Protected delta, tmp$ If Len2 < 2 ProcedureReturn EndIf delta = Range0 * loops0 / (Len2 - 1) If Reverse arr_hsb(0) = 359 - Shift0 Else arr_hsb(0) = Shift0 EndIf correction = GetGadgetState(#correction) & #PB_Checkbox_Checked *m = AllocateMemory(Len1 * 48 + 2) If Not *m ProcedureReturn 0 EndIf *p = *m While *c\c If correction Select arr_hsb(0) Case 39 To 43 Brightness = 96 Case 44 To 48 Brightness = 93 Case 49 To 53 Brightness = 86 Case 54 To 180 Brightness = 82 Case 181 To 190 Brightness = 86 Case 191 To 200 Brightness = 90 Default Brightness = 100 EndSelect EndIf arr_hsb(2) = Brightness hsb_to_rgb() Select *c\c Case ' ' CopyMemoryString(" ", @*p) Default CopyMemoryString("[color=#", @*p) CopyMemoryString(LSet(Hex(arr_rgb(0)), 2, "0"), @*p) CopyMemoryString(LSet(Hex(arr_rgb(1)), 2, "0"), @*p) CopyMemoryString(LSet(Hex(arr_rgb(2)), 2, "0"), @*p) CopyMemoryString("]", @*p) CopyMemoryString(Chr(*c\c), @*p) CopyMemoryString("[/color]", @*p) EndSelect *c + 2 If Reverse arr_hsb(0) - delta If arr_hsb(0) < 0 arr_hsb(0) + 360 EndIf Else arr_hsb(0) + delta EndIf Wend tmp$ = PeekS(*m) ; Debug MemorySize(*m) ; выделено ; Debug StringByteLength(tmp$) ; требуется FreeMemory(*m) If Asc(italic$) tmp$ = "[i]" + tmp$ + "[/i]" EndIf If Asc(Bold$) tmp$ = "[b]" + tmp$ + "[/b]" EndIf SetClipboardText(tmp$) MessageRequester("BBcode", Lng(10)) EndProcedure Procedure Start() Protected i, Brightness = 100 Protected delta If Len2 < 2 ProcedureReturn EndIf If Reverse arr_hsb(0) = 359 - Shift0 Else arr_hsb(0) = Shift0 EndIf RTFColorTable$ = "" delta = Range0 * loops0 / (Len2 - 1) correction = GetGadgetState(#correction) & #PB_Checkbox_Checked For i = 1 To Len2 If correction Select arr_hsb(0) Case 39 To 43 Brightness = 96 Case 44 To 48 Brightness = 93 Case 49 To 53 Brightness = 86 Case 54 To 180 Brightness = 82 Case 181 To 190 Brightness = 86 Case 191 To 200 Brightness = 90 Default Brightness = 100 EndSelect EndIf arr_hsb(2) = Brightness hsb_to_rgb() ; наполняем таблицу цветами ; Debug arr_hsb(0) RTFColorTable$ + "\red" + arr_rgb(0) + "\green" + arr_rgb(1) + "\blue" + arr_rgb(2) + ";" If Reverse arr_hsb(0) - delta If arr_hsb(0) < 0 arr_hsb(0) + 360 EndIf Else arr_hsb(0) + delta EndIf Next SetGadgetText(#EditorRTF, RTFHeaderPart1$ + RTFColorTable$ + RTFHeaderPart2$ + Font$ + Bold$ + italic$ + RTFtext$ + "}") EndProcedure Procedure SetTextRTF() Protected *c.Character = @text$ Protected i, Brightness = 100, *m, *p Protected delta If Len2 < 2 ProcedureReturn EndIf delta = 360 / (Len2 - 1) If Reverse arr_hsb(0) = 359 Else arr_hsb(0) = 0 EndIf *m = AllocateMemory(Len1 * 16 + 2) If Not *m ProcedureReturn EndIf *p = *m RTFColorTable$ = "" correction = GetGadgetState(#correction) & #PB_Checkbox_Checked While *c\c Select *c\c Case ' ' CopyMemoryString("\", @*p) CopyMemoryString(" ", @*p) *c + 2 Continue Case '\', '}', '{' i + 1 CopyMemoryString("\cf", @*p) CopyMemoryString(Str(i), @*p) CopyMemoryString("\", @*p) CopyMemoryString(Chr(*c\c), @*p) Default i + 1 CopyMemoryString("\cf", @*p) CopyMemoryString(Str(i), @*p) CopyMemoryString(Chr(*c\c), @*p) EndSelect *c + 2 ; arr_hsb(0) + delta If correction Select arr_hsb(0) Case 39 To 43 Brightness = 96 Case 44 To 48 Brightness = 93 Case 49 To 53 Brightness = 86 Case 54 To 180 Brightness = 82 Case 181 To 190 Brightness = 86 Case 191 To 200 Brightness = 90 Default Brightness = 100 EndSelect EndIf arr_hsb(2) = Brightness hsb_to_rgb() ; наполняем таблицу цветами ; Debug arr_hsb(0) RTFColorTable$ + "\red" + arr_rgb(0) + "\green" + arr_rgb(1) + "\blue" + arr_rgb(2) + ";" If Reverse arr_hsb(0) - delta If arr_hsb(0) < 0 arr_hsb(0) + 360 EndIf Else arr_hsb(0) + delta EndIf Wend RTFtext$ = PeekS(*m) ; уже добавлены экранирование ; Debug MemorySize(*m) ; выделено ; Debug StringByteLength(RTFtext$) ; требуется FreeMemory(*m) ; If iniFontSize ; Font = iniFontSize * 2 ; Else ; Font = 35 ; EndIf Font$ = "35" Bold$ = "\b" italic$ = "\i" SetGadgetText(#EditorRTF, RTFHeaderPart1$ + RTFColorTable$ + RTFHeaderPart2$ + Font$ + Bold$ + italic$ + RTFtext$ + "}") EndProcedure Procedure SizeHandler() ResizeGadget(#EditorRTF, #PB_Ignore, #PB_Ignore, WindowWidth(0) - 20, WindowHeight(0) - 155) EndProcedure ; Procedure hsb_to_rgb(arr_hsb) Procedure hsb_to_rgb() Protected sector Protected.f ff, pp, qq, tt Protected.f Dim af_rgb(2) ; создаём массивы в которых числа будут в диапазоне 0-1 Protected.f Dim af_hsb(2) ; Protected Dim arr_rgb(2) af_hsb(2) = arr_hsb(2) / 100 If arr_hsb(1) = 0 ; если серый, то одно значение всем arr_rgb(0) = Round(af_hsb(2) * 255, #PB_Round_Nearest) arr_rgb(1) = arr_rgb(0) arr_rgb(2) = arr_rgb(0) ; ProcedureReturn arr_rgb EndIf While arr_hsb(0) >= 360 ; если тон задан большим запредельным числом, то arr_hsb(0) - 360 Wend af_hsb(1) = arr_hsb(1) / 100 af_hsb(0) = arr_hsb(0) / 60 ; sector = Int(arr_hsb(0)) sector = Round(af_hsb(0), #PB_Round_Down) ff = af_hsb(0) - sector pp = af_hsb(2) * (1 - af_hsb(1)) qq = af_hsb(2) * (1 - af_hsb(1) * ff) tt = af_hsb(2) * (1 - af_hsb(1) * (1 - ff)) Select sector Case 0 af_rgb(0) = af_hsb(2) af_rgb(1) = tt af_rgb(2) = pp Case 1 af_rgb(0) = qq af_rgb(1) = af_hsb(2) af_rgb(2) = pp Case 2 af_rgb(0) = pp af_rgb(1) = af_hsb(2) af_rgb(2) = tt Case 3 af_rgb(0) = pp af_rgb(1) = qq af_rgb(2) = af_hsb(2) Case 4 af_rgb(0) = tt af_rgb(1) = pp af_rgb(2) = af_hsb(2) Default af_rgb(0) = af_hsb(2) af_rgb(1) = pp af_rgb(2) = qq EndSelect ; RGB arr_rgb(0) = Round(af_rgb(0) * 255, #PB_Round_Nearest) arr_rgb(1) = Round(af_rgb(1) * 255, #PB_Round_Nearest) arr_rgb(2) = Round(af_rgb(2) * 255, #PB_Round_Nearest) ; BGR ; arr_rgb(2)=Round(af_rgb(0)*255, #PB_Round_Nearest) ; arr_rgb(1)=Round(af_rgb(1)*255, #PB_Round_Nearest) ; arr_rgb(0)=Round(af_rgb(2)*255, #PB_Round_Nearest) ; ProcedureReturn arr_rgb EndProcedure
Отредактировано AZJIO (22.05.2025 22:27:33)