Всем здравствуйте.
Я нарисовал свой прогресс, на котором помимо шкалы отображаются проценты. При чём, текст с процентами меняет цвет при наползании на него шкалы. В этом фишка, мне это нравится, я доволен.
Но есть проблема. На пурике реализовать это получилось достаточно просто встроенными функциями.
Но мне нужно на С++. И дело не в самом конвертировании как такового кода в си, с этим проблем нет.
Дело в самой графике. Т.е., это дело нужно отрисовать на WINAPI.
И тут у меня большая проблема, я никак не могу вникнуть. Может кто разбирается в WINAPI - рисовании и поможет? Не на с++, на пурике, но что бы через WINAPI.
EnableExplicit
Enumeration
#MAIN_WIN
#G_IMG_1
#IMG_PR_1
#IMG_PR_2
#IMG_PR_GR
#PER_FONT
#TIMER_1
EndEnumeration
#PR_BKG_CL=$FFFFFF; цвет фона прогресса (белый)
#PR_FRT_CL=$0000FF; цвет заливки прогресса
#PR_TXT_BKG=0; цвет текста на фоне
#PR_TXT_FRT=$FFFFFF; цвет текста на заливке
#PR_FONT_NAME$="Courier"; шрифт
#PR_FONT_SIZE=12; размер шрифта
#PR_FONT_FLAGS=0;#PB_Font_Bold
#PR_X=120; координаты и размеры прогресса
#PR_Y=80
#PR_WIDTH=150
#PR_HEIGHT=30
#COUNTER_FR=100; скорость счётчика
#TIMER_FR=25; частота проверки счётчика и обновления прогресса
#PERCENT_FR=1; выводить (показывать) проценты кратно этому значению
Global GL_COUNTER_1=0
Define event, ex_res, mutex_1, thread_1
Macro macro_errorend (val_a, val_b)
ex_res=creat_img_progress (val_a, val_b)
If ex_res
MessageRequester("ERROR", "Errorcode: "+Str(ex_res), #PB_MessageRequester_Ok)
End
EndIf
EndMacro
Procedure th_counter (mutex)
Repeat
LockMutex(Mutex)
If GL_COUNTER_1=100
; GL_COUNTER_1=0; обнулить счётчик
Else
GL_COUNTER_1+1
EndIf
UnlockMutex(Mutex)
Delay (#COUNTER_FR)
ForEver
EndProcedure
Procedure creat_img_progress (pr_percent, text_out$)
Protected w, h, p.f
p=#PR_WIDTH/100*pr_percent
pr_percent=p
If Not IsGadget (#G_IMG_1)
If Not CreateImage(#IMG_PR_1, #PR_WIDTH, #PR_HEIGHT)
ProcedureReturn 11
EndIf
If Not CreateImage(#IMG_PR_2, #PR_WIDTH, #PR_HEIGHT)
ProcedureReturn 12
EndIf
If Not ImageGadget(#G_IMG_1, #PR_X, #PR_Y, #PR_WIDTH, #PR_HEIGHT, ImageID(#IMG_PR_1));, #PB_Image_Border)
ProcedureReturn 13
EndIf
EndIf
If Not StartDrawing(ImageOutput(#IMG_PR_1))
ProcedureReturn 21
EndIf
DrawingFont(FontID(#PER_FONT))
w=TextWidth(text_out$); вычислить длину текста
h=TextHeight(text_out$);вычислить высоту текста
DrawingMode(#PB_2DDrawing_Transparent)
Box(0, 0, #PR_WIDTH, #PR_HEIGHT, #PR_FRT_CL)
DrawText(#PR_WIDTH/2-w/2, #PR_HEIGHT/2-h/2, text_out$, #PR_TXT_FRT)
StopDrawing()
If Not StartDrawing(ImageOutput(#IMG_PR_2))
ProcedureReturn 22
EndIf
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(FontID(#PER_FONT))
Box(0, 0, #PR_WIDTH, #PR_HEIGHT, #PR_BKG_CL)
DrawText(#PR_WIDTH/2-w/2, #PR_HEIGHT/2-h/2, text_out$, #PR_TXT_BKG)
If GrabImage (#IMG_PR_1, #IMG_PR_GR, 0, 0, pr_percent, #PR_HEIGHT)
DrawImage (ImageID (#IMG_PR_GR), 0, 0)
EndIf
StopDrawing()
SetGadgetState (#G_IMG_1, ImageID (#IMG_PR_2))
ProcedureReturn 0
EndProcedure
Procedure WinCallback(hWnd, uMsg, wParam, lParam)
Static old_percent_val=0
Protected ex_res, hdc, hbr
Protected ps.PAINTSTRUCT, rec.RECT
Select uMsg
Case #WM_PAINT
hdc=BeginPaint_(hWnd, @ps);обведём рамкой прогресс средствами WINAPI
rec\left=#PR_X-1
rec\top=#PR_Y-1
rec\right=#PR_X+#PR_WIDTH+2
rec\bottom=#PR_Y+#PR_HEIGHT+2
hbr=CreateSolidBrush_(RGB(0, 128, 128))
FrameRect_(hdc, @rec, hbr);
rec\left=#PR_X-2
rec\top=#PR_Y-2
rec\right=#PR_X+#PR_WIDTH+1
rec\bottom=#PR_Y+#PR_HEIGHT+1
hbr=CreateSolidBrush_(RGB(0, 0, 0))
FrameRect_(hdc, @rec, hbr);
ValidateRect_(hWnd, #Null);
EndPaint_(hWnd, @ps);
DeleteObject_(hbr)
Case #WM_TIMER;
Select wParam
Case #TIMER_1; проверим изменение счётчика и обновим прогресс если требуется
If GL_COUNTER_1<>old_percent_val
If Not GL_COUNTER_1%#PERCENT_FR Or GL_COUNTER_1=100
macro_errorend (GL_COUNTER_1, Str(GL_COUNTER_1)+"%")
EndIf
old_percent_val=GL_COUNTER_1
EndIf
EndSelect
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
If OpenWindow(#MAIN_WIN, 0, 0, 400, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SetWindowCallback(@WinCallback())
AddWindowTimer(#MAIN_WIN, #TIMER_1, #TIMER_FR)
mutex_1=CreateMutex()
thread_1=CreateThread(@th_counter(), mutex_1); оздадим трид для счётчика
LoadFont(#PER_FONT, #PR_FONT_NAME$, #PR_FONT_SIZE, #PR_FONT_FLAGS)
macro_errorend (0, "0%")
Repeat
event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
EndIf