PictureBox.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. // Permission is hereby granted, free of charge, to any person obtaining
  2. // a copy of this software and associated documentation files (the
  3. // "Software"), to deal in the Software without restriction, including
  4. // without limitation the rights to use, copy, modify, merge, publish,
  5. // distribute, sublicense, and/or sell copies of the Software, and to
  6. // permit persons to whom the Software is furnished to do so, subject to
  7. // the following conditions:
  8. //
  9. // The above copyright notice and this permission notice shall be
  10. // included in all copies or substantial portions of the Software.
  11. //
  12. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  13. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  14. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  15. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  16. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  17. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  18. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  19. //
  20. // Copyright (c) 2004-2005 Novell, Inc.
  21. //
  22. // Authors:
  23. // Jackson Harper ([email protected])
  24. //
  25. // COMPLETE
  26. using System;
  27. using System.ComponentModel;
  28. using System.ComponentModel.Design;
  29. using System.Drawing;
  30. using System.Drawing.Imaging;
  31. using System.Runtime.InteropServices;
  32. namespace System.Windows.Forms {
  33. [DefaultProperty("Image")]
  34. [Designer("System.Windows.Forms.Design.PictureBoxDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
  35. public class PictureBox : Control {
  36. private Image image;
  37. private PictureBoxSizeMode size_mode;
  38. private bool redraw;
  39. private bool recalc;
  40. private bool allow_drop;
  41. private EventHandler frame_handler;
  42. public PictureBox ()
  43. {
  44. redraw = true;
  45. recalc = true;
  46. allow_drop = false;
  47. SetStyle (ControlStyles.Selectable, false);
  48. SetStyle (ControlStyles.DoubleBuffer | ControlStyles.SupportsTransparentBackColor, true);
  49. }
  50. [DefaultValue(PictureBoxSizeMode.Normal)]
  51. [Localizable(true)]
  52. [RefreshProperties(RefreshProperties.Repaint)]
  53. public PictureBoxSizeMode SizeMode {
  54. get { return size_mode; }
  55. set {
  56. if (size_mode == value)
  57. return;
  58. size_mode = value;
  59. UpdateSize ();
  60. Redraw (true);
  61. Invalidate ();
  62. OnSizeModeChanged (EventArgs.Empty);
  63. }
  64. }
  65. [DefaultValue(null)]
  66. [Localizable(true)]
  67. public Image Image {
  68. get { return image; }
  69. set {
  70. StopAnimation ();
  71. image = value;
  72. UpdateSize ();
  73. if (image != null && ImageAnimator.CanAnimate (image)) {
  74. frame_handler = new EventHandler (OnAnimateImage);
  75. ImageAnimator.Animate (image, frame_handler);
  76. }
  77. Redraw (true);
  78. Invalidate ();
  79. }
  80. }
  81. [DefaultValue(BorderStyle.None)]
  82. [DispId(-504)]
  83. public BorderStyle BorderStyle {
  84. get { return InternalBorderStyle; }
  85. set { InternalBorderStyle = value; }
  86. }
  87. [Browsable(false)]
  88. [EditorBrowsable(EditorBrowsableState.Never)]
  89. public new bool CausesValidation {
  90. get { return base.CausesValidation; }
  91. set { base.CausesValidation = value; }
  92. }
  93. [Browsable(false)]
  94. [EditorBrowsable(EditorBrowsableState.Never)]
  95. public new ImeMode ImeMode {
  96. get { return base.ImeMode; }
  97. set { base.ImeMode = value; }
  98. }
  99. [Browsable(false)]
  100. [EditorBrowsable(EditorBrowsableState.Never)]
  101. public override RightToLeft RightToLeft {
  102. get { return base.RightToLeft; }
  103. set { base.RightToLeft = value; }
  104. }
  105. [Browsable(false)]
  106. [EditorBrowsable(EditorBrowsableState.Never)]
  107. public new int TabIndex {
  108. get { return base.TabIndex; }
  109. set { base.TabIndex = value; }
  110. }
  111. [Browsable(false)]
  112. [EditorBrowsable(EditorBrowsableState.Never)]
  113. public new bool TabStop {
  114. get { return base.TabStop; }
  115. set { base.TabStop = value; }
  116. }
  117. [Bindable(false)]
  118. [Browsable(false)]
  119. [EditorBrowsable(EditorBrowsableState.Never)]
  120. public override string Text {
  121. get { return base.Text; }
  122. set { base.Text = value; }
  123. }
  124. protected override CreateParams CreateParams {
  125. get {
  126. return base.CreateParams;
  127. }
  128. }
  129. protected override ImeMode DefaultImeMode {
  130. get { return base.DefaultImeMode; }
  131. }
  132. [Browsable(false)]
  133. [EditorBrowsable(EditorBrowsableState.Never)]
  134. public override Font Font {
  135. get { return base.Font; }
  136. set { base.Font = value; }
  137. }
  138. [Browsable(false)]
  139. [EditorBrowsable(EditorBrowsableState.Never)]
  140. public override Color ForeColor {
  141. get { return base.ForeColor; }
  142. set { base.ForeColor = value; }
  143. }
  144. [Browsable(false)]
  145. [EditorBrowsable(EditorBrowsableState.Never)]
  146. public override bool AllowDrop {
  147. get {
  148. return allow_drop;
  149. }
  150. set {
  151. if (allow_drop != value) {
  152. allow_drop = value;
  153. }
  154. }
  155. }
  156. #region Protected Instance Methods
  157. protected override Size DefaultSize {
  158. get { return ThemeEngine.Current.PictureBoxDefaultSize; }
  159. }
  160. protected override void Dispose (bool disposing)
  161. {
  162. if (image != null) {
  163. StopAnimation ();
  164. image.Dispose ();
  165. image = null;
  166. }
  167. base.Dispose (disposing);
  168. }
  169. protected override void OnPaint (PaintEventArgs pe)
  170. {
  171. ThemeEngine.Current.DrawPictureBox (pe.Graphics, pe.ClipRectangle, this);
  172. base.OnPaint (pe);
  173. }
  174. protected override void OnVisibleChanged (EventArgs e)
  175. {
  176. base.OnVisibleChanged (e);
  177. Redraw (true);
  178. }
  179. protected virtual void OnSizeModeChanged (EventArgs e)
  180. {
  181. if (SizeModeChanged != null)
  182. SizeModeChanged (this, e);
  183. }
  184. protected override void OnEnabledChanged (EventArgs e)
  185. {
  186. base.OnEnabledChanged (e);
  187. }
  188. protected override void OnParentChanged (EventArgs e)
  189. {
  190. base.OnParentChanged (e);
  191. }
  192. protected override void OnResize (EventArgs e)
  193. {
  194. base.OnResize (e);
  195. redraw = true;
  196. if (size_mode == PictureBoxSizeMode.CenterImage || size_mode == PictureBoxSizeMode.StretchImage)
  197. Refresh ();
  198. }
  199. protected override void SetBoundsCore (int x, int y, int width, int height, BoundsSpecified specified)
  200. {
  201. if (size_mode == PictureBoxSizeMode.AutoSize && image != null) {
  202. width = image.Width;
  203. height = image.Height;
  204. }
  205. base.SetBoundsCore (x, y, width, height, specified);
  206. }
  207. #endregion // Protected Instance Methods
  208. #region Private Methods
  209. private void StopAnimation ()
  210. {
  211. if (frame_handler == null)
  212. return;
  213. ImageAnimator.StopAnimate (image, frame_handler);
  214. frame_handler = null;
  215. }
  216. private void UpdateSize ()
  217. {
  218. if (image == null)
  219. return;
  220. if (size_mode == PictureBoxSizeMode.AutoSize)
  221. ClientSize = image.Size;
  222. }
  223. private void Redraw (bool recalc)
  224. {
  225. redraw = true;
  226. this.recalc = recalc;
  227. }
  228. private void OnAnimateImage (object sender, EventArgs e)
  229. {
  230. // This is called from a worker thread,BeginInvoke is used
  231. // so the control is updated from the correct thread
  232. BeginInvoke (new EventHandler (UpdateAnimatedImage), new object [] { this, e });
  233. }
  234. private void UpdateAnimatedImage (object sender, EventArgs e)
  235. {
  236. ImageAnimator.UpdateFrames (image);
  237. Redraw (false);
  238. Refresh ();
  239. }
  240. #endregion // Private Methods
  241. #region Public Instance Methods
  242. public override string ToString() {
  243. return base.ToString ();
  244. }
  245. #endregion
  246. #region Events
  247. [Browsable(false)]
  248. [EditorBrowsable(EditorBrowsableState.Never)]
  249. public new event EventHandler CausesValidationChanged {
  250. add { base.CausesValidationChanged += value; }
  251. remove { base.CausesValidationChanged -= value; }
  252. }
  253. [Browsable(false)]
  254. [EditorBrowsable(EditorBrowsableState.Never)]
  255. public new event EventHandler Enter {
  256. add { base.Enter += value; }
  257. remove { base.Enter -= value; }
  258. }
  259. [Browsable(false)]
  260. [EditorBrowsable(EditorBrowsableState.Never)]
  261. public new event EventHandler FontChanged {
  262. add { base.FontChanged += value; }
  263. remove { base.FontChanged -= value; }
  264. }
  265. [Browsable(false)]
  266. [EditorBrowsable(EditorBrowsableState.Never)]
  267. public new event EventHandler ForeColorChanged {
  268. add { base.ForeColorChanged += value; }
  269. remove { base.ForeColorChanged -= value; }
  270. }
  271. [Browsable(false)]
  272. [EditorBrowsable(EditorBrowsableState.Never)]
  273. public new event EventHandler ImeModeChanged {
  274. add { base.ImeModeChanged += value; }
  275. remove { base.ImeModeChanged -= value; }
  276. }
  277. [Browsable(false)]
  278. [EditorBrowsable(EditorBrowsableState.Never)]
  279. public new event KeyEventHandler KeyDown {
  280. add { base.KeyDown += value; }
  281. remove { base.KeyDown -= value; }
  282. }
  283. [Browsable(false)]
  284. [EditorBrowsable(EditorBrowsableState.Never)]
  285. public new event KeyPressEventHandler KeyPress {
  286. add { base.KeyPress += value; }
  287. remove { base.KeyPress -= value; }
  288. }
  289. [Browsable(false)]
  290. [EditorBrowsable(EditorBrowsableState.Never)]
  291. public new event KeyEventHandler KeyUp {
  292. add { base.KeyUp += value; }
  293. remove { base.KeyUp -= value; }
  294. }
  295. [Browsable(false)]
  296. [EditorBrowsable(EditorBrowsableState.Never)]
  297. public new event EventHandler Leave {
  298. add { base.Leave += value; }
  299. remove { base.Leave -= value; }
  300. }
  301. [Browsable(false)]
  302. [EditorBrowsable(EditorBrowsableState.Never)]
  303. public new event EventHandler RightToLeftChanged {
  304. add { base.RightToLeftChanged += value; }
  305. remove { base.RightToLeftChanged -= value; }
  306. }
  307. [Browsable(false)]
  308. [EditorBrowsable(EditorBrowsableState.Never)]
  309. public new event EventHandler TabIndexChanged {
  310. add { base.TabIndexChanged += value; }
  311. remove { base.TabIndexChanged -= value; }
  312. }
  313. [Browsable(false)]
  314. [EditorBrowsable(EditorBrowsableState.Never)]
  315. public new event EventHandler TabStopChanged {
  316. add { base.TabStopChanged += value; }
  317. remove { base.TabStopChanged -= value; }
  318. }
  319. [Browsable(false)]
  320. [EditorBrowsable(EditorBrowsableState.Never)]
  321. public new event EventHandler TextChanged {
  322. add { base.TextChanged += value; }
  323. remove { base.TextChanged -= value; }
  324. }
  325. public event EventHandler SizeModeChanged;
  326. #endregion // Events
  327. }
  328. }