Форум » GUI » Цветной ProgressBar » Ответить

Цветной ProgressBar

SkyNET: Здравствуйте ! У меня возник вопрос: как сделать цветной ProgressBar ? Наткнулся на статью по Delphi. Но ничего не пойму, как это реализовать в MiniGUI...

Ответов - 9

SkyNET: Подскажите тогда ссылку на английский форум, может там ответят...

Петр: Посмотрите в исходники - это уже давно реализовано

fil: может пригодится примерчик на FWH ?


Петр: fil пишет: может пригодится примерчик на FWH ? Так пример в MiniGUI тоже имеется, так кто ж туда смотреть хочет..

fil: Нет пророка...

SkyNET: Петр пишет: Посмотрите в исходники - это уже давно реализовано А какие исходники смотреть ? Подскажите пожалуйста.

gfilatov: SkyNET пишет: У меня возник вопрос: как сделать цветной ProgressBar ? Я догадываюсь, чем вызван этот вопрос Дело в том, что использовать цветной ProgressBar на WinXP и выше не получится, если включена поддержка тем. Решение было предложено на официальном форуме HMG - надо использовать пользовательский "нарисованный" ProgressBar. Рабочий пример см. ниже: #include "minigui.ch" function main define window sample at 0,0 width 1000 height 600 title "Custom progressbar test" main define button pressme row 10 col 10 width 80 caption "Press Me!" action (sample.t1.value := 2) end button define tab t1 at 50,5 width 900 height 520 on change checkgraph() define page "Page 1" define button b1 row 40 col 20 caption "Test!" action msgbox("Click!") end button define button b2 row 40 col 140 caption "Test 2!" action msgbox("Click 2!") end button end page define page "Page 2" end page end tab end window sample.center sample.activate return nil function docustomprogressbars if sample.t1.value == 2 custom_progress_bar("sample",100,100,300,25,{255,0,0},10,100) custom_progress_bar("sample",150,100,300,25,{255,255,0},40,100) custom_progress_bar("sample",200,100,300,25,{0,255,0},60,100) custom_progress_bar("sample",250,100,300,25,{0,0,255},80,100) custom_progress_bar("sample",300,150,25,250,{255,0,0},10,100) custom_progress_bar("sample",300,200,25,250,{255,255,0},40,100) custom_progress_bar("sample",300,250,25,250,{0,255,0},60,100) custom_progress_bar("sample",300,300,25,250,{0,0,255},80,100) endif return nil function checkgraph if sample.t1.value == 2 do events docustomprogressbars() else erase window sample endif return nil function custom_progress_bar(cWindowName,nRow,nCol,nWidth,nHeight,aColor,nValue,nMax) local nStartRow, nStartCol, nFinishRow, nFinishCol := 0 // borders DRAW RECTANGLE IN WINDOW &cWindowName AT nRow,nCol TO nRow+nHeight,nCol+nWidth PENCOLOR {255,255,255} FILLCOLOR {255,255,255} DRAW LINE IN WINDOW &cWindowName At nRow,nCol to nRow+nHeight,nCol PENCOLOR {0,0,0} PENWIDTH 1 DRAW LINE IN WINDOW &cWindowName At nRow,nCol to nRow,nCol+nWidth PENCOLOR {0,0,0} PENWIDTH 1 // progress bar if nWidth > nHeight // Horizontal Progress Bar nStartRow := nRow + 1 nStartCol := nCol + 1 nFinishRow := nRow + nHeight - 1 nFinishCol := nCol + 1 + ((nWidth - 2) * nValue / nMax) else // Vertical Progress Bar nStartRow := nRow + nHeight - 1 nStartCol := nCol + 1 nFinishRow := nStartRow - ((nHeight - 2) * nValue / nMax) nFinishCol := nCol + nWidth - 1 endif DRAW RECTANGLE IN WINDOW &cWindowName AT nStartRow,nStartCol TO nFinishRow,nFinishCol PENCOLOR aColor FILLCOLOR aColor return nil

SkyNET: Спасибо большое, всё работает Но есть ещё один вопрос - как убрать мелькание ? Счётчик большой, проблему пока решил с помощью условия IF MOD(nI,17)==0. Но мелькание при прорисовке остаётся...

gfilatov: SkyNET пишет: как убрать мелькание ? Попробуйте использовать идеи из следующего примера: #include "minigui.ch" function main define window sample at 0,0 width 500 height 200 title "Custom progressbar test" main ; on init docustomprogressbars() define button pressme row 10 col 10 width 80 caption "Press Me!" action runprogressbars() end button end window sample.center sample.activate return nil function docustomprogressbars custom_progress_bar("sample",100,100,300,25,{255,0,0},0,100) return nil function runprogressbars local i for i:=0 to 100 step 10 erase window sample custom_progress_bar("sample",100,100,300,25,{255,0,0},i,100) inkey(.2) next return nil function custom_progress_bar(cWindowName,nRow,nCol,nWidth,nHeight,aColor,nValue,nMax) local nStartRow, nStartCol, nFinishRow, nFinishCol := 0 // borders DRAW RECTANGLE IN WINDOW &cWindowName AT nRow,nCol TO nRow+nHeight,nCol+nWidth PENCOLOR {128,128,128} FILLCOLOR {255,255,255} DRAW LINE IN WINDOW &cWindowName At nRow,nCol to nRow+nHeight,nCol PENCOLOR {64,64,64} PENWIDTH 1 DRAW LINE IN WINDOW &cWindowName At nRow,nCol to nRow,nCol+nWidth PENCOLOR {64,64,64} PENWIDTH 1 // progress bar if nWidth > nHeight // Horizontal Progress Bar nStartRow := nRow + 1 nStartCol := nCol + 1 nFinishRow := nRow + nHeight - 1 nFinishCol := nCol + 1 + ((nWidth - 2) * nValue / nMax) else // Vertical Progress Bar nStartRow := nRow + nHeight - 1 nStartCol := nCol + 1 nFinishRow := nStartRow - ((nHeight - 2) * nValue / nMax) nFinishCol := nCol + nWidth - 1 endif DRAW RECTANGLE IN WINDOW &cWindowName AT nStartRow,nStartCol TO nFinishRow,nFinishCol PENCOLOR aColor FILLCOLOR aColor DRAW TEXT IN WINDOW &cWindowName AT nRow+5,nCol+nWidth/2-10 ; VALUE ltrim(str(int(nValue/nMax*100)))+"%" ; FONT "MS Sans Serif" SIZE 9 ; FONTCOLOR if(nValue<50,BLACK,WHITE) TRANSPARENT return nil



полная версия страницы