/// <summary> /// This is called when the game should draw itself. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); Vector2 len = font1.MeasureString(content); spriteBatch.DrawString(font1, "按下 F12 啟用 / 停用 IME", new Vector2(10, 10), Color.White); spriteBatch.DrawString(font1, content, new Vector2(10, 30), Color.White); Vector2 drawPos = new Vector2(15 + len.X, 30); Vector2 measStr = new Vector2(0, 15); Color compColor = Color.White; if (handler.CompositionCursorPos == 0) { spriteBatch.Draw(whitePixel, new Rectangle((int)drawPos.X, (int)drawPos.Y, 1, (int)measStr.Y), Color.White); } for (int i = 0; i < handler.Composition.Length; i++) { string val = handler.Composition[i].ToString(); switch (handler.GetCompositionAttr(i)) { case CompositionAttributes.Converted: compColor = Color.LightGreen; break; case CompositionAttributes.FixedConverted: compColor = Color.Gray; break; case CompositionAttributes.Input: compColor = Color.Orange; break; case CompositionAttributes.InputError: compColor = Color.Red; break; case CompositionAttributes.TargetConverted: compColor = Color.Yellow; break; case CompositionAttributes.TargetNotConverted: compColor = Color.SkyBlue; break; } spriteBatch.DrawString(font1, val, drawPos, compColor); measStr = font1.MeasureString(val); drawPos += new Vector2(measStr.X, 0); if ((i + 1) == handler.CompositionCursorPos) { spriteBatch.Draw(whitePixel, new Rectangle((int)drawPos.X, (int)drawPos.Y, 1, (int)measStr.Y), Color.White); } } for (uint i = handler.CandidatesPageStart; i < Math.Min(handler.CandidatesPageStart + handler.CandidatesPageSize, handler.Candidates.Length); i++) { spriteBatch.DrawString(font1, String.Format("{0}.{1}", i + 1 - handler.CandidatesPageStart, handler.Candidates[i]), new Vector2(15 + len.X, 50 + (i - handler.CandidatesPageStart) * 20), i == handler.CandidatesSelection ? Color.Yellow : Color.White); } spriteBatch.End(); base.Draw(gameTime); }
private void FakeDraw() { Color compColor = Color.White; var compString = string.Empty; for (int i = 0; i < imeHandler.Composition.Length; i++) { string val = imeHandler.Composition[i].ToString(); switch (imeHandler.GetCompositionAttr(i)) { case CompositionAttributes.Converted: compColor = Color.LightGreen; break; case CompositionAttributes.FixedConverted: compColor = Color.Gray; break; case CompositionAttributes.Input: compColor = Color.Orange; break; case CompositionAttributes.InputError: compColor = Color.Red; break; case CompositionAttributes.TargetConverted: compColor = Color.Yellow; break; case CompositionAttributes.TargetNotConverted: compColor = Color.SkyBlue; break; } if (val[0] > UnicodeSimplifiedChineseMax) { val = DefaultChar; } compString += val; } labelComp.Text = compString; var candidatesList = string.Empty; for (uint i = imeHandler.CandidatesPageStart; i < Math.Min(imeHandler.CandidatesPageStart + imeHandler.CandidatesPageSize, imeHandler.Candidates.Length); i++) { if (imeHandler.Candidates[i][0] > UnicodeSimplifiedChineseMax) { imeHandler.Candidates[i] = DefaultChar; } candidatesList += string.Format("{0}.{1}\r\n", i + 1 - imeHandler.CandidatesPageStart, imeHandler.Candidates[i]); } textBoxCandidates.Text = candidatesList; }
/// <summary> /// This is called when the game should draw itself. /// </summary> /// <param name="gameTime">Provides a snapshot of timing values.</param> protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); Vector2 len = font1.MeasureString(inputContent); spriteBatch.DrawString(font1, "按下 F1 启用 / 停用 IME", new Vector2(10, 10), Color.White); spriteBatch.DrawString(font1, inputContent, new Vector2(10, 50), Color.White); Vector2 drawPos = new Vector2(15 + len.X, 50); Vector2 measStr = new Vector2(0, font1.MeasureString("|").Y); Color compColor = Color.White; if (imeHandler.CompositionCursorPos == 0) { spriteBatch.Draw(whitePixel, new Rectangle((int)drawPos.X, (int)drawPos.Y, 1, (int)measStr.Y), Color.White); } for (int i = 0; i < imeHandler.Composition.Length; i++) { string val = imeHandler.Composition[i].ToString(); switch (imeHandler.GetCompositionAttr(i)) { case CompositionAttributes.Converted: compColor = Color.LightGreen; break; case CompositionAttributes.FixedConverted: compColor = Color.Gray; break; case CompositionAttributes.Input: compColor = Color.Orange; break; case CompositionAttributes.InputError: compColor = Color.Red; break; case CompositionAttributes.TargetConverted: compColor = Color.Yellow; break; case CompositionAttributes.TargetNotConverted: compColor = Color.SkyBlue; break; } if (val[0] > UnicodeSimplifiedChineseMax) { val = DefaultChar; } spriteBatch.DrawString(font1, val, drawPos, compColor); measStr = font1.MeasureString(val); drawPos += new Vector2(measStr.X, 0); if ((i + 1) == imeHandler.CompositionCursorPos) { spriteBatch.Draw(whitePixel, new Rectangle((int)drawPos.X, (int)drawPos.Y, 1, (int)measStr.Y), Color.White); } } for (uint i = imeHandler.CandidatesPageStart; i < Math.Min(imeHandler.CandidatesPageStart + imeHandler.CandidatesPageSize, imeHandler.Candidates.Length); i++) { if (imeHandler.Candidates[i][0] > UnicodeSimplifiedChineseMax) { imeHandler.Candidates[i] = DefaultChar; } try { spriteBatch.DrawString(font1, String.Format("{0}.{1}", i + 1 - imeHandler.CandidatesPageStart, imeHandler.Candidates[i]), new Vector2(15 + len.X, 25 + 50 + (i - imeHandler.CandidatesPageStart) * 20), i == imeHandler.CandidatesSelection ? Color.Yellow : Color.White); } catch { Trace.WriteLine($"Candidate string {imeHandler.Candidates[i]} has invalid codepoint in current font."); } } spriteBatch.End(); base.Draw(gameTime); }