1 // Written by Christopher E. Miller 2 // See the included license.txt for copyright and license details. 3 4 5 6 module dfl.progressbar; 7 8 private import dfl.base, dfl.control, dfl.drawing, dfl.application, 9 dfl.event; 10 private import dfl.internal.winapi; 11 12 13 private extern(Windows) void _initProgressbar(); 14 15 16 17 class ProgressBar: ControlSuperClass { // docmain 18 this() { 19 _initProgressbar(); 20 21 wexstyle |= WS_EX_CLIENTEDGE; 22 wclassStyle = progressbarClassStyle; 23 } 24 25 26 27 final @property void maximum(int max) { // setter 28 if(max <= 0 /+ || max < _min +/) { 29 //bad_max: 30 //throw new DflException("Unable to set progress bar maximum value"); 31 if(max) { 32 return; 33 } 34 } 35 36 if(created) { 37 prevwproc(PBM_SETRANGE, 0, MAKELPARAM(_min, max)); 38 } 39 40 _max = max; 41 42 if(_val > max) { 43 _val = max; // ? 44 } 45 } 46 47 /// ditto 48 final @property int maximum() { // getter 49 return _max; 50 } 51 52 53 54 final @property void minimum(int min) { // setter 55 if(min < 0 /+ || min > _max +/) { 56 //bad_min: 57 //throw new DflException("Unable to set progress bar minimum value"); 58 return; 59 } 60 61 if(created) { 62 prevwproc(PBM_SETRANGE, 0, MAKELPARAM(min, _max)); 63 } 64 65 _min = min; 66 67 if(_val < min) { 68 _val = min; // ? 69 } 70 } 71 72 /// ditto 73 final @property int minimum() { // getter 74 return _min; 75 } 76 77 78 79 final @property void step(int stepby) { // setter 80 if(stepby <= 0 /+ || stepby > _max +/) { 81 //bad_max: 82 //throw new DflException("Unable to set progress bar step value"); 83 if(stepby) { 84 return; 85 } 86 } 87 88 if(created) { 89 prevwproc(PBM_SETSTEP, stepby, 0); 90 } 91 92 _step = stepby; 93 } 94 95 /// ditto 96 final @property int step() { // getter 97 return _step; 98 } 99 100 101 102 final @property void value(int setval) { // setter 103 if(setval < _min || setval > _max) { 104 //throw new DflException("Progress bar value out of minimum/maximum range"); 105 //return; 106 if(setval > _max) { 107 setval = _max; 108 } else { 109 setval = _min; 110 } 111 } 112 113 if(created) { 114 prevwproc(PBM_SETPOS, setval, 0); 115 } 116 117 _val = setval; 118 } 119 120 /// ditto 121 final @property int value() { // getter 122 return _val; 123 } 124 125 126 127 final void increment(int incby) { 128 int newpos = _val + incby; 129 if(newpos < _min) { 130 newpos = _min; 131 } 132 if(newpos > _max) { 133 newpos = _max; 134 } 135 136 if(created) { 137 prevwproc(PBM_SETPOS, newpos, 0); 138 } 139 140 _val = newpos; 141 } 142 143 144 145 final void performStep() { 146 increment(_step); 147 } 148 149 150 protected override void onHandleCreated(EventArgs ea) { 151 super.onHandleCreated(ea); 152 153 if(_min != MIN_INIT || _max != MAX_INIT) { 154 prevwproc(PBM_SETRANGE, 0, MAKELPARAM(_min, _max)); 155 } 156 157 if(_step != STEP_INIT) { 158 prevwproc(PBM_SETSTEP, _step, 0); 159 } 160 161 if(_val != VAL_INIT) { 162 prevwproc(PBM_SETPOS, _val, 0); 163 } 164 } 165 166 167 protected override @property Size defaultSize() { // getter 168 return Size(100, 23); 169 } 170 171 172 static @property Color defaultForeColor() { // getter 173 return SystemColors.highlight; 174 } 175 176 177 protected override void createParams(ref CreateParams cp) { 178 super.createParams(cp); 179 180 cp.className = PROGRESSBAR_CLASSNAME; 181 } 182 183 184 protected override void prevWndProc(ref Message msg) { 185 //msg.result = CallWindowProcA(progressbarPrevWndProc, msg.hWnd, msg.msg, msg.wParam, msg.lParam); 186 msg.result = dfl.internal.utf.callWindowProc(progressbarPrevWndProc, msg.hWnd, msg.msg, msg.wParam, msg.lParam); 187 } 188 189 190 private: 191 192 enum MIN_INIT = 0; 193 enum MAX_INIT = 100; 194 enum STEP_INIT = 10; 195 enum VAL_INIT = 0; 196 197 int _min = MIN_INIT, _max = MAX_INIT, _step = STEP_INIT, _val = VAL_INIT; 198 199 200 package: 201 final: 202 LRESULT prevwproc(UINT msg, WPARAM wparam, LPARAM lparam) { 203 //return CallWindowProcA(progressbarPrevWndProc, hwnd, msg, wparam, lparam); 204 return dfl.internal.utf.callWindowProc(progressbarPrevWndProc, hwnd, msg, wparam, lparam); 205 } 206 } 207