Всем здравствуйте.
Я нарисовал свой прогресс, на котором помимо шкалы отображаются проценты. При чём, текст с процентами меняет цвет при наползании на него шкалы. В этом фишка, мне это нравится, я доволен.
Но есть проблема. На пурике реализовать это получилось достаточно просто встроенными функциями.
Но мне нужно на С++. И дело не в самом конвертировании как такового кода в си, с этим проблем нет.
Дело в самой графике. Т.е., это дело нужно отрисовать на 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