1 // Written by Christopher E. Miller 2 // See the included license.txt for copyright and license details. 3 4 5 6 module dfl.picturebox; 7 8 private import dfl.control, dfl.base, dfl.drawing, dfl.event; 9 private import dfl.internal.winapi; 10 11 12 13 enum PictureBoxSizeMode: ubyte { 14 15 NORMAL, // Image at upper left of control. 16 /// ditto 17 AUTO_SIZE, // Control sizes to fit image size. 18 /// ditto 19 CENTER_IMAGE, // Image at center of control. 20 /// ditto 21 STRETCH_IMAGE, // Image stretched to fit control. 22 } 23 24 25 26 class PictureBox: Control { // docmain 27 this() { 28 //resizeRedraw = true; // Redrawn manually in onResize() when necessary. 29 } 30 31 32 33 final @property void image(Image img) { // setter 34 if(this.img is img) { 35 return; 36 } 37 38 if(_mode == PictureBoxSizeMode.AUTO_SIZE) { 39 if(img) { 40 clientSize = img.size; 41 } else { 42 clientSize = Size(0, 0); 43 } 44 } 45 46 this.img = img; 47 48 if(created) { 49 invalidate(); 50 } 51 52 onImageChanged(EventArgs.empty); 53 } 54 55 /// ditto 56 final @property Image image() { // getter 57 return img; 58 } 59 60 61 62 final @property void sizeMode(PictureBoxSizeMode sm) { // setter 63 if(_mode == sm) { 64 return; 65 } 66 67 final switch(sm) { 68 case PictureBoxSizeMode.AUTO_SIZE: 69 if(img) { 70 clientSize = img.size; 71 } else { 72 clientSize = Size(0, 0); 73 } 74 break; 75 76 case PictureBoxSizeMode.NORMAL: 77 break; 78 79 case PictureBoxSizeMode.CENTER_IMAGE: 80 break; 81 82 case PictureBoxSizeMode.STRETCH_IMAGE: 83 break; 84 } 85 86 _mode = sm; 87 88 if(created) { 89 invalidate(); 90 } 91 92 onSizeModeChanged(EventArgs.empty); 93 } 94 95 /// ditto 96 final @property PictureBoxSizeMode sizeMode() { // getter 97 return _mode; 98 } 99 100 101 102 @property void borderStyle(BorderStyle bs) { // setter 103 final switch(bs) { 104 case BorderStyle.FIXED_3D: 105 _style(_style() & ~WS_BORDER); 106 _exStyle(_exStyle() | WS_EX_CLIENTEDGE); 107 break; 108 109 case BorderStyle.FIXED_SINGLE: 110 _exStyle(_exStyle() & ~WS_EX_CLIENTEDGE); 111 _style(_style() | WS_BORDER); 112 break; 113 114 case BorderStyle.NONE: 115 _style(_style() & ~WS_BORDER); 116 _exStyle(_exStyle() & ~WS_EX_CLIENTEDGE); 117 break; 118 } 119 120 if(created) { 121 redrawEntire(); 122 } 123 } 124 125 /// ditto 126 @property BorderStyle borderStyle() { // getter 127 if(_exStyle() & WS_EX_CLIENTEDGE) { 128 return BorderStyle.FIXED_3D; 129 } else if(_style() & WS_BORDER) { 130 return BorderStyle.FIXED_SINGLE; 131 } 132 return BorderStyle.NONE; 133 } 134 135 136 //EventHandler sizeModeChanged; 137 Event!(PictureBox, EventArgs) sizeModeChanged; /// 138 //EventHandler imageChanged; 139 Event!(PictureBox, EventArgs) imageChanged; /// 140 141 142 protected: 143 144 145 void onSizeModeChanged(EventArgs ea) { 146 sizeModeChanged(this, ea); 147 } 148 149 150 151 void onImageChanged(EventArgs ea) { 152 imageChanged(this, ea); 153 } 154 155 156 override void onPaint(PaintEventArgs ea) { 157 if(img) { 158 final switch(_mode) { 159 case PictureBoxSizeMode.NORMAL: 160 case PictureBoxSizeMode.AUTO_SIZE: // Drawn the same as normal. 161 img.draw(ea.graphics, Point(0, 0)); 162 break; 163 164 case PictureBoxSizeMode.CENTER_IMAGE: { 165 Size isz; 166 isz = img.size; 167 img.draw(ea.graphics, Point((clientSize.width - isz.width) / 2, 168 (clientSize.height - isz.height) / 2)); 169 } 170 break; 171 172 case PictureBoxSizeMode.STRETCH_IMAGE: 173 img.drawStretched(ea.graphics, Rect(0, 0, clientSize.width, clientSize.height)); 174 break; 175 } 176 } 177 178 super.onPaint(ea); 179 } 180 181 182 override void onResize(EventArgs ea) { 183 if(PictureBoxSizeMode.CENTER_IMAGE == _mode || PictureBoxSizeMode.STRETCH_IMAGE == _mode) { 184 invalidate(); 185 } 186 187 super.onResize(ea); 188 } 189 190 191 private: 192 PictureBoxSizeMode _mode = PictureBoxSizeMode.NORMAL; 193 Image img = null; 194 } 195