using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; namespace CSharpFormLibrary { /// /// Summary description for IMECompForm. /// public class IMECompForm : System.Windows.Forms.Form { private System.Windows.Forms.TextBox textBox1; /// /// Required designer variable. /// private System.ComponentModel.Container components = null; private const int WM_MOUSEACTIVATE = 0x0021; private const int MA_NOACTIVATE=0x0003; private System.Windows.Forms.Label label1; private const int MA_NOACTIVATEANDEAT = 0x0004; //private int caretWidth = 0; //just give the caret a small point; private int caretWidth = 2; private int CurrentAll = 0; //現在input字數的大小 private int currentAllCompStrLength = 0; private Label label2;//composition window那塊圖的大小 private int singleCaretHightlight = 0; public IMECompForm() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // } protected override void WndProc(ref Message m) { if (m.Msg == WM_MOUSEACTIVATE) { m.Result = (IntPtr)MA_NOACTIVATEANDEAT; return; } base.WndProc(ref m); } /// /// Clean up any resources being used. /// protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.textBox1 = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.SuspendLayout(); // // textBox1 // this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill; this.textBox1.Font = new System.Drawing.Font("PMingLiU", 12F); this.textBox1.Location = new System.Drawing.Point(0, 0); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(312, 29); this.textBox1.TabIndex = 0; this.textBox1.WordWrap = false; // // label1 // this.label1.Anchor = System.Windows.Forms.AnchorStyles.None; this.label1.BackColor = System.Drawing.SystemColors.InfoText; this.label1.Location = new System.Drawing.Point(18, 23); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(10, 6); this.label1.TabIndex = 1; // // label2 // this.label2.BackColor = System.Drawing.Color.Transparent; this.label2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.label2.Location = new System.Drawing.Point(38, 2); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(22, 18); this.label2.TabIndex = 2; // // IMECompForm // this.AutoScaleBaseSize = new System.Drawing.Size(8, 22); this.BackColor = System.Drawing.SystemColors.Info; this.ClientSize = new System.Drawing.Size(312, 32); this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.Controls.Add(this.textBox1); this.Font = new System.Drawing.Font("PMingLiU", 12F); this.ForeColor = System.Drawing.SystemColors.InfoText; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.Name = "IMECompForm"; this.Opacity = 0.75; this.ShowInTaskbar = false; this.ResumeLayout(false); this.PerformLayout(); } #endregion public void ShowNoActive() { UtilFuncs.SetVisibleNoActivate(this, true); // true to show. } public void HideNoActive() { UtilFuncs.SetVisibleNoActivate(this, false); // false to hide. } public void ClearComp() { this.textBox1.Clear(); } public void SetLocation(int x, int y) { this.Location = new Point(x,y); } public void SetComp(string inputs) { if(inputs==null) return; //if (inputs == null || this.textBox1.Text == inputs) return; /* *** Comments due to OVIME.VC8.sln *************/ /* *** postpone this merge until fully upgrade to VC8 *****/ Graphics g = this.textBox1.CreateGraphics(); Size s; Size proposedSize1 = new Size(); TextFormatFlags tff1; //1st method for get the exact composition length #if true System.Drawing.StringFormat format = new System.Drawing.StringFormat (); System.Drawing.RectangleF rect = new System.Drawing.RectangleF(0, 0, 1000, 1000); System.Drawing.CharacterRange[] ranges = { new System.Drawing.CharacterRange(0, inputs.Length) }; System.Drawing.Region[] regions = new System.Drawing.Region[1]; format.SetMeasurableCharacterRanges (ranges); regions = g.MeasureCharacterRanges (inputs, this.textBox1.Font, rect, format); rect = regions[0].GetBounds (g); //mark the next line for dynamic composition window length setting. //this.Width = (int)(rect.Right + 1.0f); currentAllCompStrLength = (int)(rect.Right + 1.0f); #endif //2nd method for getting the exact comp string length #if false const int width = 32; System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(width, 1, g); System.Drawing.SizeF size = g.MeasureString(inputs, this.textBox1.Font); System.Drawing.Graphics anagra = System.Drawing.Graphics.FromImage(bitmap); int measured_width = (int)size.Width; if (anagra != null) { anagra.Clear(Color.White); anagra.DrawString(inputs+"|", this.textBox1.Font, Brushes.Black, width - measured_width, -this.textBox1.Font.Height / 2); for (int i = width - 1; i >= 0; i--) { measured_width--; if (bitmap.GetPixel(i, 0).R != 255) // found a non-white pixel ? break; } } this.Width = measured_width; #endif //3rd method to set textFormatFlags.NoPadding #if false tff1 = TextFormatFlags.NoPadding; //proposedSize1.Height = this.textBox1.Height; //proposedSize1.Height = this.textBox1.Font.Height; //proposedSize1.Width = this.textBox1.Width; //int width = (int)g.MeasureString(inputs, this.textBox1.Font).Width; s = TextRenderer.MeasureText(g, inputs, this.textBox1.Font, proposedSize1, tff1); //this.Width = s.Width; #endif if (inputs.Length == 1) { //caretWidth = this.Size.Width; //caretWidth = measured_width / (inputs.Length); singleCaretHightlight = (int) rect.Right; } CurrentAll = inputs.Length; g.Dispose(); /* ********************************************************/ //string[] a_inputs = inputs.Split(' '); this.textBox1.Text = inputs; } public void SetCaretX(int x) { //caretWidth = this.textBox1.Width; /* *** Comments due to OVIME.VC8.sln *************/ /* *** postpone this merge until fully upgrade to VC8 *****/ //this.label1.Width = this.Width / CurrentAll; caretWidth = 2; this.label1.Width = caretWidth; //總長度要除以不同字數的長度 this.label1.Left = ((currentAllCompStrLength) * (x) / CurrentAll); this.label2.Left = ((currentAllCompStrLength) * (x) / CurrentAll); //this.label2.Left = (currentAllCompStrLength); this.label2.Width = singleCaretHightlight; /* ********************************************************/ this.label1.Height = 2; } } }