From b4a71943584c76b8ba48f9234f6ad7523369ebac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?= <50486086+DarkCat09@users.noreply.github.com> Date: Mon, 5 Oct 2020 15:15:51 +0400 Subject: [PATCH 1/4] Improved design, optimized code, replaced gitignore, and program is working now! --- README.md | 10 +- .../MainForm.Designer.cs | 196 ++++++++---------- .../WindowsFormsApplication1/MainForm.cs | 159 +++++++------- .../WindowsFormsApplication1/MainForm.resx | 2 +- 4 files changed, 168 insertions(+), 199 deletions(-) diff --git a/README.md b/README.md index 2dad5cf..ff5b162 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# MultRedactor -Редактор мультиков - -Задачи -https://docs.google.com/spreadsheets/d/1ka-DjMCEskMYwHZOzJRvlgEZpGA5g-WNFh_pH3sF3y4/edit#gid=1972460334 +# MultRedactor +Редактор мультиков + +Задачи +https://docs.google.com/spreadsheets/d/1ka-DjMCEskMYwHZOzJRvlgEZpGA5g-WNFh_pH3sF3y4/edit#gid=1972460334 diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.Designer.cs b/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.Designer.cs index ed3620b..aaf87fa 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.Designer.cs +++ b/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.Designer.cs @@ -48,7 +48,6 @@ namespace WindowsFormsApplication1 this.charNameLabel = new System.Windows.Forms.Label(); this.openSpace = new System.Windows.Forms.PictureBox(); this.SpriteNumberLabel = new System.Windows.Forms.Label(); - this.SpriteNumberTextBox = new System.Windows.Forms.TextBox(); this.OpenButton = new System.Windows.Forms.Button(); this.LabelPic = new System.Windows.Forms.Label(); this.LabelTime = new System.Windows.Forms.Label(); @@ -65,50 +64,48 @@ namespace WindowsFormsApplication1 this.ButtonAddChar = new System.Windows.Forms.Button(); this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.SpriteNumberTextBox = new System.Windows.Forms.NumericUpDown(); this.leftPanel.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.PictureBoxBackground)).BeginInit(); this.rightPanel.SuspendLayout(); this.personPanel.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.openSpace)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.SpriteNumberTextBox)).BeginInit(); this.SuspendLayout(); // // LabelData // this.LabelData.AutoSize = true; this.LabelData.Font = new System.Drawing.Font("Arial Black", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204))); - this.LabelData.Location = new System.Drawing.Point(0, 11); - this.LabelData.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.LabelData.Location = new System.Drawing.Point(3, 3); this.LabelData.Name = "LabelData"; - this.LabelData.Size = new System.Drawing.Size(290, 28); + this.LabelData.Size = new System.Drawing.Size(234, 23); this.LabelData.TabIndex = 0; this.LabelData.Text = "Данные о мультфильме:"; // // LabelLengh // this.LabelLengh.AutoSize = true; - this.LabelLengh.Location = new System.Drawing.Point(19, 74); - this.LabelLengh.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.LabelLengh.Location = new System.Drawing.Point(4, 32); this.LabelLengh.Name = "LabelLengh"; - this.LabelLengh.Size = new System.Drawing.Size(167, 17); + this.LabelLengh.Size = new System.Drawing.Size(130, 13); this.LabelLengh.TabIndex = 1; this.LabelLengh.Text = "Длительность: 0 секунд"; // // LabelName // this.LabelName.AutoSize = true; - this.LabelName.Location = new System.Drawing.Point(19, 106); - this.LabelName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.LabelName.Location = new System.Drawing.Point(4, 58); this.LabelName.Name = "LabelName"; - this.LabelName.Size = new System.Drawing.Size(76, 17); + this.LabelName.Size = new System.Drawing.Size(60, 13); this.LabelName.TabIndex = 2; this.LabelName.Text = "Название:"; // // nazvanieTextBox // - this.nazvanieTextBox.Location = new System.Drawing.Point(107, 106); - this.nazvanieTextBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.nazvanieTextBox.Location = new System.Drawing.Point(86, 55); this.nazvanieTextBox.Name = "nazvanieTextBox"; - this.nazvanieTextBox.Size = new System.Drawing.Size(183, 22); + this.nazvanieTextBox.Size = new System.Drawing.Size(138, 20); this.nazvanieTextBox.TabIndex = 3; // // leftPanel @@ -124,38 +121,34 @@ namespace WindowsFormsApplication1 this.leftPanel.Controls.Add(this.LabelName); this.leftPanel.Dock = System.Windows.Forms.DockStyle.Left; this.leftPanel.Location = new System.Drawing.Point(0, 0); - this.leftPanel.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); this.leftPanel.Name = "leftPanel"; - this.leftPanel.Size = new System.Drawing.Size(396, 468); + this.leftPanel.Size = new System.Drawing.Size(297, 380); this.leftPanel.TabIndex = 4; // // Char_Stats // this.Char_Stats.AutoSize = true; - this.Char_Stats.Location = new System.Drawing.Point(19, 337); - this.Char_Stats.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.Char_Stats.Location = new System.Drawing.Point(12, 219); this.Char_Stats.Name = "Char_Stats"; - this.Char_Stats.Size = new System.Drawing.Size(344, 17); + this.Char_Stats.Size = new System.Drawing.Size(259, 13); this.Char_Stats.TabIndex = 24; this.Char_Stats.Text = "number name state view delete"; // // Char_Info // this.Char_Info.AutoSize = true; - this.Char_Info.Location = new System.Drawing.Point(59, 286); - this.Char_Info.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.Char_Info.Location = new System.Drawing.Point(48, 200); this.Char_Info.Name = "Char_Info"; - this.Char_Info.Size = new System.Drawing.Size(229, 17); + this.Char_Info.Size = new System.Drawing.Size(180, 13); this.Char_Info.TabIndex = 23; this.Char_Info.Text = "ИНФОРМАЦИЯ О ПЕРСОНАЖАХ"; this.Char_Info.Click += new System.EventHandler(this.Char_Info_Click); // // PictureBoxBackground // - this.PictureBoxBackground.Location = new System.Drawing.Point(21, 194); - this.PictureBoxBackground.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.PictureBoxBackground.Location = new System.Drawing.Point(84, 111); this.PictureBoxBackground.Name = "PictureBoxBackground"; - this.PictureBoxBackground.Size = new System.Drawing.Size(156, 89); + this.PictureBoxBackground.Size = new System.Drawing.Size(117, 72); this.PictureBoxBackground.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.PictureBoxBackground.TabIndex = 12; this.PictureBoxBackground.TabStop = false; @@ -163,19 +156,17 @@ namespace WindowsFormsApplication1 // LabelBackground // this.LabelBackground.AutoSize = true; - this.LabelBackground.Location = new System.Drawing.Point(19, 140); - this.LabelBackground.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.LabelBackground.Location = new System.Drawing.Point(4, 87); this.LabelBackground.Name = "LabelBackground"; - this.LabelBackground.Size = new System.Drawing.Size(100, 17); + this.LabelBackground.Size = new System.Drawing.Size(77, 13); this.LabelBackground.TabIndex = 11; this.LabelBackground.Text = "Выбрать фон:"; // // dobavitFonButton // - this.dobavitFonButton.Location = new System.Drawing.Point(23, 160); - this.dobavitFonButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.dobavitFonButton.Location = new System.Drawing.Point(85, 81); this.dobavitFonButton.Name = "dobavitFonButton"; - this.dobavitFonButton.Size = new System.Drawing.Size(155, 30); + this.dobavitFonButton.Size = new System.Drawing.Size(116, 24); this.dobavitFonButton.TabIndex = 10; this.dobavitFonButton.Text = "Добавить"; this.dobavitFonButton.UseVisualStyleBackColor = true; @@ -183,10 +174,9 @@ namespace WindowsFormsApplication1 // // splitter1 // - this.splitter1.Location = new System.Drawing.Point(396, 0); - this.splitter1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.splitter1.Location = new System.Drawing.Point(297, 0); this.splitter1.Name = "splitter1"; - this.splitter1.Size = new System.Drawing.Size(4, 468); + this.splitter1.Size = new System.Drawing.Size(3, 380); this.splitter1.TabIndex = 5; this.splitter1.TabStop = false; // @@ -197,19 +187,17 @@ namespace WindowsFormsApplication1 this.rightPanel.Controls.Add(this.SaveMultButton); this.rightPanel.Controls.Add(this.ButtonAddChar); this.rightPanel.Dock = System.Windows.Forms.DockStyle.Fill; - this.rightPanel.Location = new System.Drawing.Point(400, 0); - this.rightPanel.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.rightPanel.Location = new System.Drawing.Point(300, 0); this.rightPanel.Name = "rightPanel"; - this.rightPanel.Size = new System.Drawing.Size(503, 468); + this.rightPanel.Size = new System.Drawing.Size(377, 380); this.rightPanel.TabIndex = 6; // // SaveCharButton // this.SaveCharButton.Dock = System.Windows.Forms.DockStyle.Bottom; - this.SaveCharButton.Location = new System.Drawing.Point(0, 394); - this.SaveCharButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.SaveCharButton.Location = new System.Drawing.Point(0, 320); this.SaveCharButton.Name = "SaveCharButton"; - this.SaveCharButton.Size = new System.Drawing.Size(503, 37); + this.SaveCharButton.Size = new System.Drawing.Size(377, 30); this.SaveCharButton.TabIndex = 3; this.SaveCharButton.Text = "Сохранить персонажа"; this.SaveCharButton.UseVisualStyleBackColor = true; @@ -217,13 +205,13 @@ namespace WindowsFormsApplication1 // // personPanel // + this.personPanel.Controls.Add(this.SpriteNumberTextBox); this.personPanel.Controls.Add(this.charNameBox); this.personPanel.Controls.Add(this.circlesTextBox); this.personPanel.Controls.Add(this.circlesLabel); this.personPanel.Controls.Add(this.charNameLabel); this.personPanel.Controls.Add(this.openSpace); this.personPanel.Controls.Add(this.SpriteNumberLabel); - this.personPanel.Controls.Add(this.SpriteNumberTextBox); this.personPanel.Controls.Add(this.OpenButton); this.personPanel.Controls.Add(this.LabelPic); this.personPanel.Controls.Add(this.LabelTime); @@ -237,55 +225,49 @@ namespace WindowsFormsApplication1 this.personPanel.Controls.Add(this.ComboBoxMove); this.personPanel.Controls.Add(this.LabelMoveType); this.personPanel.Dock = System.Windows.Forms.DockStyle.Fill; - this.personPanel.Location = new System.Drawing.Point(0, 32); - this.personPanel.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.personPanel.Location = new System.Drawing.Point(0, 26); this.personPanel.Name = "personPanel"; - this.personPanel.Size = new System.Drawing.Size(503, 399); + this.personPanel.Size = new System.Drawing.Size(377, 324); this.personPanel.TabIndex = 2; this.personPanel.Visible = false; // // charNameBox // - this.charNameBox.Location = new System.Drawing.Point(113, 108); - this.charNameBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.charNameBox.Location = new System.Drawing.Point(115, 84); this.charNameBox.Name = "charNameBox"; - this.charNameBox.Size = new System.Drawing.Size(183, 22); + this.charNameBox.Size = new System.Drawing.Size(138, 20); this.charNameBox.TabIndex = 19; // // circlesTextBox // - this.circlesTextBox.Location = new System.Drawing.Point(113, 140); - this.circlesTextBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.circlesTextBox.Location = new System.Drawing.Point(115, 110); this.circlesTextBox.Name = "circlesTextBox"; - this.circlesTextBox.Size = new System.Drawing.Size(183, 22); + this.circlesTextBox.Size = new System.Drawing.Size(138, 20); this.circlesTextBox.TabIndex = 21; // // circlesLabel // this.circlesLabel.AutoSize = true; - this.circlesLabel.Location = new System.Drawing.Point(5, 140); - this.circlesLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.circlesLabel.Location = new System.Drawing.Point(3, 113); this.circlesLabel.Name = "circlesLabel"; - this.circlesLabel.Size = new System.Drawing.Size(103, 17); + this.circlesLabel.Size = new System.Drawing.Size(81, 13); this.circlesLabel.TabIndex = 20; this.circlesLabel.Text = "Кол-во кругов:"; // // charNameLabel // this.charNameLabel.AutoSize = true; - this.charNameLabel.Location = new System.Drawing.Point(25, 108); - this.charNameLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.charNameLabel.Location = new System.Drawing.Point(3, 87); this.charNameLabel.Name = "charNameLabel"; - this.charNameLabel.Size = new System.Drawing.Size(76, 17); + this.charNameLabel.Size = new System.Drawing.Size(60, 13); this.charNameLabel.TabIndex = 18; this.charNameLabel.Text = "Название:"; // // openSpace // - this.openSpace.Location = new System.Drawing.Point(247, 238); - this.openSpace.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.openSpace.Location = new System.Drawing.Point(72, 203); this.openSpace.Name = "openSpace"; - this.openSpace.Size = new System.Drawing.Size(248, 89); + this.openSpace.Size = new System.Drawing.Size(186, 72); this.openSpace.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.openSpace.TabIndex = 17; this.openSpace.TabStop = false; @@ -293,27 +275,17 @@ namespace WindowsFormsApplication1 // SpriteNumberLabel // this.SpriteNumberLabel.AutoSize = true; - this.SpriteNumberLabel.Location = new System.Drawing.Point(5, 193); - this.SpriteNumberLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.SpriteNumberLabel.Location = new System.Drawing.Point(3, 139); this.SpriteNumberLabel.Name = "SpriteNumberLabel"; - this.SpriteNumberLabel.Size = new System.Drawing.Size(155, 17); + this.SpriteNumberLabel.Size = new System.Drawing.Size(119, 13); this.SpriteNumberLabel.TabIndex = 16; this.SpriteNumberLabel.Text = "Количество спрайтов:"; // - // SpriteNumberTextBox - // - this.SpriteNumberTextBox.Location = new System.Drawing.Point(9, 213); - this.SpriteNumberTextBox.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); - this.SpriteNumberTextBox.Name = "SpriteNumberTextBox"; - this.SpriteNumberTextBox.Size = new System.Drawing.Size(109, 22); - this.SpriteNumberTextBox.TabIndex = 15; - // // OpenButton // - this.OpenButton.Location = new System.Drawing.Point(247, 193); - this.OpenButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.OpenButton.Location = new System.Drawing.Point(72, 167); this.OpenButton.Name = "OpenButton"; - this.OpenButton.Size = new System.Drawing.Size(256, 37); + this.OpenButton.Size = new System.Drawing.Size(192, 30); this.OpenButton.TabIndex = 14; this.OpenButton.Text = "Открыть персонажа"; this.OpenButton.UseVisualStyleBackColor = true; @@ -322,120 +294,108 @@ namespace WindowsFormsApplication1 // LabelPic // this.LabelPic.AutoSize = true; - this.LabelPic.Location = new System.Drawing.Point(168, 193); - this.LabelPic.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.LabelPic.Location = new System.Drawing.Point(3, 174); this.LabelPic.Name = "LabelPic"; - this.LabelPic.Size = new System.Drawing.Size(75, 17); + this.LabelPic.Size = new System.Drawing.Size(58, 13); this.LabelPic.TabIndex = 12; this.LabelPic.Text = "Картинка:"; // // LabelTime // this.LabelTime.AutoSize = true; - this.LabelTime.Location = new System.Drawing.Point(25, 79); - this.LabelTime.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.LabelTime.Location = new System.Drawing.Point(3, 61); this.LabelTime.Name = "LabelTime"; - this.LabelTime.Size = new System.Drawing.Size(67, 17); + this.LabelTime.Size = new System.Drawing.Size(54, 13); this.LabelTime.TabIndex = 11; this.LabelTime.Text = "Тайминг:"; // // LabelDef2 // this.LabelDef2.AutoSize = true; - this.LabelDef2.Location = new System.Drawing.Point(320, 79); - this.LabelDef2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.LabelDef2.Location = new System.Drawing.Point(223, 61); this.LabelDef2.Name = "LabelDef2"; - this.LabelDef2.Size = new System.Drawing.Size(18, 17); + this.LabelDef2.Size = new System.Drawing.Size(13, 13); this.LabelDef2.TabIndex = 10; this.LabelDef2.Text = "--"; // // LabelDef1 // this.LabelDef1.AutoSize = true; - this.LabelDef1.Location = new System.Drawing.Point(320, 43); - this.LabelDef1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.LabelDef1.Location = new System.Drawing.Point(223, 36); this.LabelDef1.Name = "LabelDef1"; - this.LabelDef1.Size = new System.Drawing.Size(18, 17); + this.LabelDef1.Size = new System.Drawing.Size(13, 13); this.LabelDef1.TabIndex = 9; this.LabelDef1.Text = "--"; // // LabelWalls // this.LabelWalls.AutoSize = true; - this.LabelWalls.Location = new System.Drawing.Point(25, 43); - this.LabelWalls.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.LabelWalls.Location = new System.Drawing.Point(3, 36); this.LabelWalls.Name = "LabelWalls"; - this.LabelWalls.Size = new System.Drawing.Size(138, 17); + this.LabelWalls.Size = new System.Drawing.Size(107, 13); this.LabelWalls.TabIndex = 8; this.LabelWalls.Text = "Границы движения:"; // // TextBoxTime1 // - this.TextBoxTime1.Location = new System.Drawing.Point(176, 75); - this.TextBoxTime1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.TextBoxTime1.Location = new System.Drawing.Point(116, 59); this.TextBoxTime1.Name = "TextBoxTime1"; - this.TextBoxTime1.Size = new System.Drawing.Size(132, 22); + this.TextBoxTime1.Size = new System.Drawing.Size(100, 20); this.TextBoxTime1.TabIndex = 5; // // TextBoxTime2 // - this.TextBoxTime2.Location = new System.Drawing.Point(345, 75); - this.TextBoxTime2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.TextBoxTime2.Location = new System.Drawing.Point(243, 59); this.TextBoxTime2.Name = "TextBoxTime2"; - this.TextBoxTime2.Size = new System.Drawing.Size(132, 22); + this.TextBoxTime2.Size = new System.Drawing.Size(100, 20); this.TextBoxTime2.TabIndex = 4; // // TextBoxWall2 // - this.TextBoxWall2.Location = new System.Drawing.Point(345, 39); - this.TextBoxWall2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.TextBoxWall2.Location = new System.Drawing.Point(243, 33); this.TextBoxWall2.Name = "TextBoxWall2"; - this.TextBoxWall2.Size = new System.Drawing.Size(132, 22); + this.TextBoxWall2.Size = new System.Drawing.Size(100, 20); this.TextBoxWall2.TabIndex = 3; this.TextBoxWall2.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextBoxWall1_KeyPress); // // TextBoxWall1 // - this.TextBoxWall1.Location = new System.Drawing.Point(176, 39); - this.TextBoxWall1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.TextBoxWall1.Location = new System.Drawing.Point(116, 33); this.TextBoxWall1.Name = "TextBoxWall1"; - this.TextBoxWall1.Size = new System.Drawing.Size(132, 22); + this.TextBoxWall1.Size = new System.Drawing.Size(100, 20); this.TextBoxWall1.TabIndex = 2; this.TextBoxWall1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextBoxWall1_KeyPress); // // ComboBoxMove // + this.ComboBoxMove.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.ComboBoxMove.FormattingEnabled = true; this.ComboBoxMove.Items.AddRange(new object[] { "Прямо", "Диагонально", "Волнами", "Кругами"}); - this.ComboBoxMove.Location = new System.Drawing.Point(148, 4); - this.ComboBoxMove.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.ComboBoxMove.Location = new System.Drawing.Point(115, 3); this.ComboBoxMove.Name = "ComboBoxMove"; - this.ComboBoxMove.Size = new System.Drawing.Size(160, 24); + this.ComboBoxMove.Size = new System.Drawing.Size(121, 21); this.ComboBoxMove.TabIndex = 1; - this.ComboBoxMove.Text = "Прямо"; this.ComboBoxMove.SelectedIndexChanged += new System.EventHandler(this.ComboBoxMove_SelectedIndexChanged); // // LabelMoveType // this.LabelMoveType.AutoSize = true; - this.LabelMoveType.Location = new System.Drawing.Point(31, 4); - this.LabelMoveType.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.LabelMoveType.Location = new System.Drawing.Point(3, 6); this.LabelMoveType.Name = "LabelMoveType"; - this.LabelMoveType.Size = new System.Drawing.Size(105, 17); + this.LabelMoveType.Size = new System.Drawing.Size(82, 13); this.LabelMoveType.TabIndex = 0; this.LabelMoveType.Text = "Вид движения:"; // // SaveMultButton // this.SaveMultButton.Dock = System.Windows.Forms.DockStyle.Bottom; - this.SaveMultButton.Location = new System.Drawing.Point(0, 431); - this.SaveMultButton.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.SaveMultButton.Location = new System.Drawing.Point(0, 350); this.SaveMultButton.Name = "SaveMultButton"; - this.SaveMultButton.Size = new System.Drawing.Size(503, 37); + this.SaveMultButton.Size = new System.Drawing.Size(377, 30); this.SaveMultButton.TabIndex = 1; this.SaveMultButton.Text = "Сохранить мульт"; this.SaveMultButton.UseVisualStyleBackColor = true; @@ -445,9 +405,8 @@ namespace WindowsFormsApplication1 // this.ButtonAddChar.Dock = System.Windows.Forms.DockStyle.Top; this.ButtonAddChar.Location = new System.Drawing.Point(0, 0); - this.ButtonAddChar.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); this.ButtonAddChar.Name = "ButtonAddChar"; - this.ButtonAddChar.Size = new System.Drawing.Size(503, 32); + this.ButtonAddChar.Size = new System.Drawing.Size(377, 26); this.ButtonAddChar.TabIndex = 0; this.ButtonAddChar.Text = "Добавить персонажа"; this.ButtonAddChar.UseVisualStyleBackColor = true; @@ -457,15 +416,21 @@ namespace WindowsFormsApplication1 // this.openFileDialog1.FileName = "openFileDialog1"; // + // SpriteNumberTextBox + // + this.SpriteNumberTextBox.Location = new System.Drawing.Point(128, 136); + this.SpriteNumberTextBox.Name = "SpriteNumberTextBox"; + this.SpriteNumberTextBox.Size = new System.Drawing.Size(43, 20); + this.SpriteNumberTextBox.TabIndex = 22; + // // MainForm // - this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(903, 468); + this.ClientSize = new System.Drawing.Size(677, 380); this.Controls.Add(this.rightPanel); this.Controls.Add(this.splitter1); this.Controls.Add(this.leftPanel); - this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); this.Name = "MainForm"; this.RightToLeftLayout = true; this.Text = "Свойства персонажа"; @@ -477,6 +442,7 @@ namespace WindowsFormsApplication1 this.personPanel.ResumeLayout(false); this.personPanel.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.openSpace)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.SpriteNumberTextBox)).EndInit(); this.ResumeLayout(false); } @@ -509,7 +475,6 @@ namespace WindowsFormsApplication1 private System.Windows.Forms.Button OpenButton; private System.Windows.Forms.OpenFileDialog openFileDialog1; private System.Windows.Forms.Label SpriteNumberLabel; - private System.Windows.Forms.TextBox SpriteNumberTextBox; private System.Windows.Forms.Label LabelBackground; private System.Windows.Forms.Button dobavitFonButton; private System.Windows.Forms.PictureBox PictureBoxBackground; @@ -520,5 +485,6 @@ namespace WindowsFormsApplication1 private System.Windows.Forms.Label charNameLabel; private System.Windows.Forms.TextBox circlesTextBox; private System.Windows.Forms.Label circlesLabel; + private System.Windows.Forms.NumericUpDown SpriteNumberTextBox; } } \ No newline at end of file diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.cs b/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.cs index da5184d..b99a819 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.cs +++ b/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.cs @@ -1,10 +1,6 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; using System.Drawing; using System.IO; -using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 @@ -23,9 +19,9 @@ namespace WindowsFormsApplication1 public MainForm() { InitializeComponent(); - - openFileDialog1.Filter = "Kartinki|*.bmp"; - saveFileDialog1.Filter = "cpp files|*.cpp"; + ComboBoxMove.SelectedIndex = 0; + openFileDialog1.Filter = "Bitmap Pictures|*.bmp"; + saveFileDialog1.Filter = "C++ Code Files|*.cpp"; } private void buttonAddCharClick(object sender, EventArgs e) @@ -48,70 +44,14 @@ namespace WindowsFormsApplication1 { if (personPanel.Visible == false) { - MessageBox.Show("Где параметры? Покажи мне, ткни мне в них!"); + MessageBox.Show("Где параметры? Покажи мне, ткни меня в них!"); return; } personPanel.Visible = true; if (pNomer == -120) { - persons[nomerPersa].l1 = new Label(); - persons[nomerPersa].l1.Top = yPersa; - persons[nomerPersa].l1.Left = 30; - persons[nomerPersa].l1.Width = 20; - persons[nomerPersa].l1.Visible = true; - persons[nomerPersa].l1.Text = (nomerPersa + 1).ToString(); - this.leftPanel.Controls.Add(persons[nomerPersa].l1); - - persons[nomerPersa].l2 = new Label(); - persons[nomerPersa].l2.Top = yPersa; - persons[nomerPersa].l2.Left = 60; - persons[nomerPersa].l2.Width = 60; - persons[nomerPersa].l2.Visible = true; - persons[nomerPersa].l2.Text = "Перс" + (nomerPersa + 1).ToString(); - this.leftPanel.Controls.Add(persons[nomerPersa].l2); - - persons[nomerPersa].l3 = new Label(); - persons[nomerPersa].l3.Top = yPersa; - persons[nomerPersa].l3.Left = 120; - persons[nomerPersa].l3.Width = 40; - persons[nomerPersa].l3.Visible = true; - persons[nomerPersa].l3.Text = "saved"; - this.leftPanel.Controls.Add(persons[nomerPersa].l3); - - persons[nomerPersa].b1 = new Button(); - persons[nomerPersa].b1.Top = yPersa; - persons[nomerPersa].b1.Left = 170; - persons[nomerPersa].b1.Width = 50; - persons[nomerPersa].b1.Visible = true; - persons[nomerPersa].b1.Text = "Edit"; - persons[nomerPersa].b1.MouseClick += - new MouseEventHandler(this.Char_Creator_Button_Click); - this.leftPanel.Controls.Add(persons[nomerPersa].b1); - - ToolTip tView = new ToolTip(); - tView.IsBalloon = true; - tView.InitialDelay = 0; - tView.ShowAlways = true; - tView.AutoPopDelay = 2000; - tView.SetToolTip(persons[nomerPersa].b1, "View/edit person"); - - persons[nomerPersa].b2 = new Button(); - persons[nomerPersa].b2.Top = yPersa; - persons[nomerPersa].b2.Left = 230; - persons[nomerPersa].b2.Width = 50; - persons[nomerPersa].b2.Visible = true; - persons[nomerPersa].b2.Text = "Del"; - persons[nomerPersa].b2.Click += - new System.EventHandler(this.Char_Info_Click); - this.leftPanel.Controls.Add(persons[nomerPersa].b2); - - ToolTip tDelete = new ToolTip(); - tDelete.IsBalloon = true; - tDelete.InitialDelay = 0; - tDelete.ShowAlways = true; - tDelete.AutoPopDelay = 2000; - tDelete.SetToolTip(persons[nomerPersa].b2, "Delete this person"); + persons[nomerPersa] = AddRowToPersList(persons[nomerPersa]); persons[nomerPersa].coord = TextBoxWall1.Text; persons[nomerPersa].coord2 = TextBoxWall2.Text; @@ -139,7 +79,7 @@ namespace WindowsFormsApplication1 } nomerPersa++; - yPersa = yPersa + 30; + yPersa += 30; openSpace.Image = null; } else @@ -181,6 +121,69 @@ namespace WindowsFormsApplication1 LabelLengh.Text = "Длительность: " + maxTime.ToString() + " секунд"; } + private Person AddRowToPersList(Person p) + { + p.l1 = new Label(); + p.l1.Top = yPersa; + p.l1.Left = 30; + p.l1.Width = 20; + p.l1.Visible = true; + p.l1.Text = (nomerPersa + 1).ToString(); + leftPanel.Controls.Add(p.l1); + + p.l2 = new Label(); + p.l2.Top = yPersa; + p.l2.Left = 60; + p.l2.Width = 60; + p.l2.Visible = true; + p.l2.Text = "Перс" + (nomerPersa + 1).ToString(); + leftPanel.Controls.Add(p.l2); + + p.l3 = new Label(); + p.l3.Top = yPersa; + p.l3.Left = 120; + p.l3.Width = 40; + p.l3.Visible = true; + p.l3.Text = "saved"; + leftPanel.Controls.Add(p.l3); + + p.b1 = new Button(); + p.b1.Top = yPersa; + p.b1.Left = 170; + p.b1.Width = 50; + p.b1.Visible = true; + p.b1.Text = "Edit"; + p.b1.MouseClick += + new MouseEventHandler(this.Char_Creator_Button_Click); + leftPanel.Controls.Add(p.b1); + + ToolTip tView = new ToolTip(); + tView.IsBalloon = true; + tView.InitialDelay = 0; + tView.ShowAlways = true; + tView.AutoPopDelay = 2000; + tView.SetToolTip(p.b1, "View/edit person"); + + p.b2 = new Button(); + p.b2.Top = yPersa; + p.b2.Left = 230; + p.b2.Width = 50; + p.b2.Visible = true; + p.b2.Text = "Del"; + p.b2.Click += + new System.EventHandler(this.Char_Info_Click); + leftPanel.Controls.Add(p.b2); + + ToolTip tDelete = new ToolTip(); + tDelete.IsBalloon = true; + tDelete.InitialDelay = 0; + tDelete.ShowAlways = true; + tDelete.AutoPopDelay = 2000; + tDelete.SetToolTip(p.b2, "Delete this person"); + + return p; + } + private void OpenAddCharClick(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.Cancel) @@ -212,7 +215,7 @@ namespace WindowsFormsApplication1 { if (PictureBoxBackground.Image == null) { - MessageBox.Show("Что ты собрался выводить то, поехавший (фон)?"); + MessageBox.Show("Что ты собрался выводить-то, поехавший (фон)?"); return; } @@ -259,17 +262,17 @@ namespace WindowsFormsApplication1 { string filename = saveFileDialog1.FileName; - //Add TXLib and pics - File.Copy(Path.Combine(Application.StartupPath, "TXLib.h"), filename.Replace(Path.GetFileName(filename), "TXLib.h"), true); - string adres_papki = filename.Replace(Path.GetFileName(filename), "Pictures"); - if (!Directory.Exists(adres_papki)) + //Adding TXLibrary and pictures + File.Copy("TXLib.h", Path.GetDirectoryName(filename) + "\\TXLib.h", true); + string dir_path = Path.GetDirectoryName(filename) + "\\Pictures"; + if (!Directory.Exists(dir_path)) { - Directory.CreateDirectory(adres_papki); + Directory.CreateDirectory(dir_path); } - if (adressBackground != adres_papki + "\\" + Path.GetFileName(adressBackground)) + if (adressBackground != dir_path + "\\" + Path.GetFileName(adressBackground)) { - File.Copy(adressBackground, adres_papki + "\\" + Path.GetFileName(adressBackground), true); + File.Copy(adressBackground, dir_path + "\\" + Path.GetFileName(adressBackground), true); } Files.CreateStruct(filename); @@ -277,11 +280,11 @@ namespace WindowsFormsApplication1 for (int nomer = 0; nomer < nomerPersa; nomer++) { - File.Copy(persons[nomer].adress, adres_papki + "\\" + Path.GetFileName(persons[nomer].adress), true); + File.Copy(persons[nomer].adress, dir_path + "\\" + Path.GetFileName(persons[nomer].adress), true); - if (adres_papki == adres_papki + "\\" + Path.GetFileName(persons[nomer].adress)) + if (dir_path == dir_path + "\\" + Path.GetFileName(persons[nomer].adress)) { - File.Copy(persons[nomer].adress, adres_papki + "\\" + Path.GetFileName(persons[nomer].adress), true); + File.Copy(persons[nomer].adress, dir_path + "\\" + Path.GetFileName(persons[nomer].adress), true); } if (persons[nomer].moveside == "Прямо") @@ -368,7 +371,7 @@ namespace WindowsFormsApplication1 this.leftPanel.Controls.Remove(persons[nomerPersa - 1].b1); this.leftPanel.Controls.Remove(persons[nomerPersa - 1].b2); nomerPersa--; - yPersa = yPersa - 30; + yPersa -= 30; } private void TextBoxWall1_KeyPress(object sender, KeyPressEventArgs e) diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.resx b/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.resx index d2d8b5c..642c454 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.resx +++ b/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.resx @@ -124,6 +124,6 @@ 153, 17 - 39 + 25 \ No newline at end of file From 4d22e9dbbc55eea0d340705521b5ce9546dab23c Mon Sep 17 00:00:00 2001 From: DarkCat09 Date: Tue, 6 Oct 2020 13:32:17 +0400 Subject: [PATCH 2/4] Optimized code and Added compiling functionally! --- How to use.docx | Bin 380797 -> 0 bytes README.md | 22 +- .../.vs/WindowsFormsApplication1/v16/.suo | Bin 0 -> 32768 bytes .../WindowsFormsApplication1.v12.suo | Bin 15360 -> 0 bytes .../WindowsFormsApplication1/Circle.cs | 62 ++-- .../CompileForm.Designer.cs | 142 ++++++++++ .../WindowsFormsApplication1/CompileForm.cs | 91 ++++++ .../WindowsFormsApplication1/CompileForm.resx | 126 +++++++++ .../WindowsFormsApplication1/Files.cs | 106 ++++--- .../WindowsFormsApplication1/Line.cs | 57 ++-- .../MainForm.Designer.cs | 60 +++- .../WindowsFormsApplication1/MainForm.cs | 267 +++++++++--------- .../WindowsFormsApplication1/Person.cs | 8 +- .../WindowsFormsApplication1/Sinus.cs | 57 ++-- .../WindowsFormsApplication1.csproj | 9 + .../bin/Debug/WindowsFormsApplication1.exe | Bin 29696 -> 0 bytes .../Debug/WindowsFormsApplication1.exe.config | 3 - .../bin/Debug/WindowsFormsApplication1.pdb | Bin 40448 -> 0 bytes .../Debug/WindowsFormsApplication1.vshost.exe | Bin 24216 -> 0 bytes ...ndowsFormsApplication1.vshost.exe.manifest | 11 - .../DesignTimeResolveAssemblyReferences.cache | Bin 1164 -> 0 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 7431 -> 0 bytes .../Properties.Resources.Designer.cs.dll | Bin 3584 -> 0 bytes ...indowsFormsApplication1.MainForm.resources | Bin 180 -> 0 bytes ...pplication1.Properties.Resources.resources | Bin 180 -> 0 bytes ...pplication1.csproj.CoreCompileInputs.cache | 1 - ...msApplication1.csproj.FileListAbsolute.txt | 39 --- ...Application1.csproj.GenerateResource.Cache | Bin 1015 -> 0 bytes ...Application1.csproj.GenerateResource.cache | Bin 1015 -> 0 bytes ...tion1.csprojResolveAssemblyReference.cache | Bin 18041 -> 0 bytes .../obj/Debug/WindowsFormsApplication1.exe | Bin 29696 -> 0 bytes .../obj/Debug/WindowsFormsApplication1.pdb | Bin 40448 -> 0 bytes замечания.txt | 9 - инструкция.doc | Bin 443392 -> 0 bytes 34 files changed, 717 insertions(+), 353 deletions(-) delete mode 100644 How to use.docx create mode 100644 WindowsFormsApplication1/.vs/WindowsFormsApplication1/v16/.suo delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1.v12.suo create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/CompileForm.Designer.cs create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/CompileForm.cs create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/CompileForm.resx delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe.config delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.pdb delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.vshost.exe delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.vshost.exe.manifest delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/DesignTimeResolveAssemblyReferences.cache delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.MainForm.resources delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.Properties.Resources.resources delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.CoreCompileInputs.cache delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.FileListAbsolute.txt delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.GenerateResource.Cache delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.GenerateResource.cache delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csprojResolveAssemblyReference.cache delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.exe delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.pdb delete mode 100644 замечания.txt delete mode 100644 инструкция.doc diff --git a/How to use.docx b/How to use.docx deleted file mode 100644 index 8f55f8675f2436b7a50b1e29de852da1a1826725..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 380797 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%0AGRi+XldP+BABD#c+yEBe_ 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%0AXau0yE2++ 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 + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (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.label1 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.linkLabel1 = new System.Windows.Forms.LinkLabel(); + this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog(); + this.button2 = new System.Windows.Forms.Button(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(196, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Полный путь к каталогу MinGW"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(12, 25); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(196, 20); + this.textBox1.TabIndex = 1; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(214, 24); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(74, 22); + this.button1.TabIndex = 2; + this.button1.Text = "Обзор..."; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // linkLabel1 + // + this.linkLabel1.AutoSize = true; + this.linkLabel1.Location = new System.Drawing.Point(12, 48); + this.linkLabel1.Name = "linkLabel1"; + this.linkLabel1.Size = new System.Drawing.Size(257, 13); + this.linkLabel1.TabIndex = 3; + this.linkLabel1.TabStop = true; + this.linkLabel1.Text = "У меня нет установленного компилятора MinGW"; + this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); + // + // button2 + // + this.button2.Dock = System.Windows.Forms.DockStyle.Bottom; + this.button2.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.button2.Location = new System.Drawing.Point(0, 176); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(300, 28); + this.button2.TabIndex = 4; + this.button2.Text = "Старт!"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(12, 85); + this.textBox2.Multiline = true; + this.textBox2.Name = "textBox2"; + this.textBox2.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBox2.Size = new System.Drawing.Size(276, 82); + this.textBox2.TabIndex = 5; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.label2.Location = new System.Drawing.Point(12, 69); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(127, 13); + this.label2.TabIndex = 6; + this.label2.Text = "Вывод компилятора"; + // + // CompileForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(300, 204); + this.Controls.Add(this.label2); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.button2); + this.Controls.Add(this.linkLabel1); + this.Controls.Add(this.button1); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label1); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "CompileForm"; + this.Text = "Компилировать"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.LinkLabel linkLabel1; + private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label2; + } +} \ No newline at end of file diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/CompileForm.cs b/WindowsFormsApplication1/WindowsFormsApplication1/CompileForm.cs new file mode 100644 index 0000000..ec55bff --- /dev/null +++ b/WindowsFormsApplication1/WindowsFormsApplication1/CompileForm.cs @@ -0,0 +1,91 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Windows.Forms; + +namespace WindowsFormsApplication1 +{ + public partial class CompileForm : Form + { + private string codeFilename = ""; + private string mingwDir = ""; + public CompileForm(string _codeFilename) + { + InitializeComponent(); + codeFilename = _codeFilename; + } + + private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + if (MessageBox.Show("Для создания *.exe-файла мультфильма нужна специальная программа - компилятор.\n" + + "Мы используем компилятор MinGW. Чтобы его скачать, нажмите OK в этом диалоге,\n" + + "но учтите, что все нужные файлы весят ≈800МиБ!\n\n" + + "После загрузки Вам нужно распаковать архив в удобное Вам место,\n" + + "а затем, в этом окне, выбрать каталог mingw, который теперь лежит в \"удобном Вам месте\".", + "Скачать MinGW", MessageBoxButtons.OKCancel, MessageBoxIcon.Information).ToString() == "OK") + { + Process.Start("https://is.gd/Krp8r4"); + } + } + + private void button1_Click(object sender, EventArgs e) + { + if (folderBrowserDialog1.ShowDialog().ToString() == "OK") + { + mingwDir = folderBrowserDialog1.SelectedPath; + } + textBox1.Text = mingwDir; + } + + private void button2_Click(object sender, EventArgs e) + { + if (mingwDir != "") + { + try + { + textBox2.Text += ("Компиляция " + codeFilename + " в " + + Path.GetFileNameWithoutExtension(codeFilename) + ".exe с помощью " + + mingwDir + "\\bin\\mingw32-g++.exe:" + Environment.NewLine + Environment.NewLine); + + Process mingwp = new Process(); + mingwp.StartInfo = new ProcessStartInfo() + { + FileName = mingwDir + "\\bin\\mingw32-g++.exe", + Arguments = codeFilename + " -o " + Path.GetDirectoryName(codeFilename) + "\\" + + Path.GetFileNameWithoutExtension(codeFilename) + ".exe", + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden, + StandardOutputEncoding = Encoding.GetEncoding(866), + StandardErrorEncoding = Encoding.GetEncoding(866), + CreateNoWindow = true, + RedirectStandardOutput = true, + RedirectStandardError = true + }; + mingwp.OutputDataReceived += new DataReceivedEventHandler(CompilerOutputHandler); + mingwp.ErrorDataReceived += new DataReceivedEventHandler(CompilerOutputHandler); + mingwp.Start(); + mingwp.BeginOutputReadLine(); + mingwp.BeginErrorReadLine(); + mingwp.WaitForExit(10000); + + _ = MessageBox.Show("Готово!"); + } + catch (Exception ex) + { + _ = MessageBox.Show("Произошла ошибка!\n" + ex.Message); + } + } + else + { + _ = MessageBox.Show("Сначала укажите каталог с MinGW!", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void CompilerOutputHandler(object sendingProcess, DataReceivedEventArgs outputLine) + { + textBox2.Invoke(new Action(() => { textBox2.Text += (outputLine.Data + Environment.NewLine); })); + } + } +} diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/CompileForm.resx b/WindowsFormsApplication1/WindowsFormsApplication1/CompileForm.resx new file mode 100644 index 0000000..c3f254d --- /dev/null +++ b/WindowsFormsApplication1/WindowsFormsApplication1/CompileForm.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 25 + + \ No newline at end of file diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/Files.cs b/WindowsFormsApplication1/WindowsFormsApplication1/Files.cs index 95271d1..fed4b5f 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/Files.cs +++ b/WindowsFormsApplication1/WindowsFormsApplication1/Files.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 @@ -11,67 +9,81 @@ namespace WindowsFormsApplication1 public static void CreateStruct(string filename) { File.WriteAllText(filename, ""); - File.AppendAllText(filename, "#include \"TXLib.h\"" + Environment.NewLine); - File.AppendAllText(filename, Environment.NewLine); - File.AppendAllText(filename, "struct Person" + Environment.NewLine); - File.AppendAllText(filename, "{" + Environment.NewLine); - File.AppendAllText(filename, " double x;" + Environment.NewLine); - File.AppendAllText(filename, " double x2;" + Environment.NewLine); - File.AppendAllText(filename, " double y;" + Environment.NewLine); - File.AppendAllText(filename, " double y2;" + Environment.NewLine); - File.AppendAllText(filename, " double angle;" + Environment.NewLine); - File.AppendAllText(filename, " double nomer_kadra;" + Environment.NewLine); - File.AppendAllText(filename, " HDC texture;" + Environment.NewLine); - File.AppendAllText(filename, " int MID_x;" + Environment.NewLine); - File.AppendAllText(filename, " int MID_y;" + Environment.NewLine); - File.AppendAllText(filename, " int rad;" + Environment.NewLine); - File.AppendAllText(filename, " int skorost;" + Environment.NewLine); - File.AppendAllText(filename, " int gr_dvigx;" + Environment.NewLine); - File.AppendAllText(filename, " int gr_dvigy;" + Environment.NewLine); - File.AppendAllText(filename, " int nach_dv;" + Environment.NewLine); - File.AppendAllText(filename, " int ampl_y;" + Environment.NewLine); - File.AppendAllText(filename, " int ampl_x;" + Environment.NewLine); - File.AppendAllText(filename, " double BeginTime;" + Environment.NewLine); - File.AppendAllText(filename, " double EndTime;" + Environment.NewLine); - File.AppendAllText(filename, " double Time;" + Environment.NewLine); - File.AppendAllText(filename, "};" + Environment.NewLine); - File.AppendAllText(filename, Environment.NewLine); + StreamWriter sw = new StreamWriter(filename); + sw.Write("#include \"TXLib.h\"" + Environment.NewLine); + sw.Write( Environment.NewLine); + sw.Write("struct Person" + Environment.NewLine); + sw.Write("{" + Environment.NewLine); + sw.Write(" double x;" + Environment.NewLine); + sw.Write(" double x2;" + Environment.NewLine); + sw.Write(" double y;" + Environment.NewLine); + sw.Write(" double y2;" + Environment.NewLine); + sw.Write(" double angle;" + Environment.NewLine); + sw.Write(" double nomer_kadra;" + Environment.NewLine); + sw.Write(" HDC texture;" + Environment.NewLine); + sw.Write(" int MID_x;" + Environment.NewLine); + sw.Write(" int MID_y;" + Environment.NewLine); + sw.Write(" int rad;" + Environment.NewLine); + sw.Write(" int skorost;" + Environment.NewLine); + sw.Write(" int gr_dvigx;" + Environment.NewLine); + sw.Write(" int gr_dvigy;" + Environment.NewLine); + sw.Write(" int nach_dv;" + Environment.NewLine); + sw.Write(" int ampl_y;" + Environment.NewLine); + sw.Write(" int ampl_x;" + Environment.NewLine); + sw.Write(" double BeginTime;" + Environment.NewLine); + sw.Write(" double EndTime;" + Environment.NewLine); + sw.Write(" double Time;" + Environment.NewLine); + sw.Write("};" + Environment.NewLine); + sw.Write( Environment.NewLine); + sw.Close(); } - public static void OpenMain(string filename, PictureBox PictureBoxBackground, String adressBackground) + public static void OpenMain(string filename, PictureBox PictureBoxBackground, String addressBackground) { - File.AppendAllText(filename, "int main()" + Environment.NewLine); - File.AppendAllText(filename, "{" + Environment.NewLine); - File.AppendAllText(filename, " txCreateWindow(" + + StreamWriter sw = new StreamWriter(filename, true); + sw.Write("int main()" + Environment.NewLine); + sw.Write("{" + Environment.NewLine); + sw.Write(" txCreateWindow(" + PictureBoxBackground.Image.Width.ToString() + ", " + PictureBoxBackground.Image.Height.ToString() + ");" + Environment.NewLine); - File.AppendAllText(filename, " double myTime = 0;" + Environment.NewLine); - File.AppendAllText(filename, " HDC texture = txLoadImage(\"Pictures\\\\" + Path.GetFileName(adressBackground) + "\");" + Environment.NewLine); + sw.Write(" double myTime = 0;" + Environment.NewLine); + sw.Write(" HDC texture = txLoadImage(\"Pictures\\\\" + Path.GetFileName(addressBackground) + "\");" + + Environment.NewLine); + sw.Close(); } public static void CloseWhile(string filename) { - File.AppendAllText(filename, Environment.NewLine); - File.AppendAllText(filename, " myTime += 0.05;" + Environment.NewLine); - File.AppendAllText(filename, " txSleep(50);" + Environment.NewLine); - File.AppendAllText(filename, " }" + Environment.NewLine); + StreamWriter sw = new StreamWriter(filename, true); + sw.Write(Environment.NewLine); + sw.Write(" myTime += 0.05;" + Environment.NewLine); + sw.Write(" txSleep(50);" + Environment.NewLine); + sw.Write(" }" + Environment.NewLine); + sw.Close(); } public static void OpenWhile(string filename, int maxTime) { - File.AppendAllText(filename, Environment.NewLine); - File.AppendAllText(filename, " while (myTime <= " + maxTime + ")" + Environment.NewLine); - File.AppendAllText(filename, " {" + Environment.NewLine); - File.AppendAllText(filename, " txSetColor(TX_RED);" + Environment.NewLine); - File.AppendAllText(filename, " txSetFillColor(TX_RED);" + Environment.NewLine); - File.AppendAllText(filename, " txBitBlt(txDC(), 0, 0, txGetExtentX(), txGetExtentY(), texture, 0, 0);" + Environment.NewLine); + StreamWriter sw = new StreamWriter(filename, true); + sw.Write(Environment.NewLine); + sw.Write(" while (myTime <= " + maxTime + ")" + Environment.NewLine); + sw.Write(" {" + Environment.NewLine); + sw.Write(" txSetColor(TX_RED);" + Environment.NewLine); + sw.Write(" txSetFillColor(TX_RED);" + Environment.NewLine); + sw.Write(" txBitBlt(txDC(), 0, 0, txGetExtentX(), txGetExtentY(), texture, 0, 0);" + + Environment.NewLine); + sw.Close(); } - public static void Ending(string filename) + public static void Ending(string filename, bool autoexit = false) { - File.AppendAllText(filename, " txDeleteDC(texture);" + Environment.NewLine); - File.AppendAllText(filename, " return 0;" + Environment.NewLine); - File.AppendAllText(filename, "}" + Environment.NewLine); + StreamWriter sw = new StreamWriter(filename, true); + sw.Write(" txDeleteDC(texture);" + Environment.NewLine); + if (autoexit) + sw.Write(" txDisableAutoPause();"); + sw.Write(" return 0;" + Environment.NewLine); + sw.Write("}" + Environment.NewLine); + sw.Close(); } } } diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/Line.cs b/WindowsFormsApplication1/WindowsFormsApplication1/Line.cs index d769c27..7c13710 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/Line.cs +++ b/WindowsFormsApplication1/WindowsFormsApplication1/Line.cs @@ -1,9 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace WindowsFormsApplication1 { @@ -11,36 +7,45 @@ namespace WindowsFormsApplication1 { public static void CreatePerson(string filename, string name, Person p) { - File.AppendAllText(filename, Environment.NewLine); - File.AppendAllText(filename, " Person " + name + ";" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".x = " + p.x1 + "; " + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".y = " + p.y1 + "; " + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".x2 = " + p.x2 + "; " + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".y2 = " + p.y2 + "; " + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".nomer_kadra = 0; " + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".texture = txLoadImage(\"Pictures\\\\" + Path.GetFileName(p.adress) + "\"); " + Environment.NewLine); - File.AppendAllText(filename, Environment.NewLine); + StreamWriter sw = new StreamWriter(filename, true); + sw.Write(Environment.NewLine); + sw.Write(" Person " + name + ";" + Environment.NewLine); + sw.Write(" " + name + ".x = " + p.x1 + "; " + Environment.NewLine); + sw.Write(" " + name + ".y = " + p.y1 + "; " + Environment.NewLine); + sw.Write(" " + name + ".x2 = " + p.x2 + "; " + Environment.NewLine); + sw.Write(" " + name + ".y2 = " + p.y2 + "; " + Environment.NewLine); + sw.Write(" " + name + ".nomer_kadra = 0; " + Environment.NewLine); + sw.Write(" " + name + ".texture = txLoadImage(\"Pictures\\\\" + Path.GetFileName(p.address) + "\"); " + + Environment.NewLine); + sw.Write(Environment.NewLine); + sw.Close(); } public static void MovePerson(string filename, string name, Person p) { - File.AppendAllText(filename, " if ((myTime >= " + p.time1 + ") && (myTime <= " + p.time2 + ")) {" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".x+= (" + name + ".x2 - " + name + ".x) / (" + p.time2 + "-" + p.time1 + ");" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".y+= (" + name + ".y2 - " + name + ".y) / (" + p.time2 + "-" + p.time1 + ");" + Environment.NewLine); - File.AppendAllText(filename, " txTransparentBlt(txDC(), " + name + ".x, " + name + ".y, " + + StreamWriter sw = new StreamWriter(filename, true); + sw.Write(" if ((myTime >= " + p.time1 + ") && (myTime <= " + p.time2 + ")) {" + + Environment.NewLine); + sw.Write(" " + name + ".x+= (" + name + ".x2 - " + name + ".x) / (" + + p.time2 + "-" + p.time1 + ");" + Environment.NewLine); + sw.Write(" " + name + ".y+= (" + name + ".y2 - " + name + ".y) / (" + + p.time2 + "-" + p.time1 + ");" + Environment.NewLine); + sw.Write(" txTransparentBlt(txDC(), " + name + ".x, " + name + ".y, " + p.width + "/" + p.sprite + ", " + p.height + "," + name + ".texture, " + p.width + "/" + p.sprite + " * " + name + ".nomer_kadra, 0, RGB(255, 255, 255));" + Environment.NewLine); - File.AppendAllText(filename, Environment.NewLine); - File.AppendAllText(filename, " " + name + ".nomer_kadra++;" + Environment.NewLine); - File.AppendAllText(filename, Environment.NewLine); - File.AppendAllText(filename, " if (" + name + ".nomer_kadra >= " + p.sprite + ")" + Environment.NewLine); - File.AppendAllText(filename, " {" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".nomer_kadra = 0;" + Environment.NewLine); - File.AppendAllText(filename, " }" + Environment.NewLine); - File.AppendAllText(filename, " }" + Environment.NewLine); - File.AppendAllText(filename, Environment.NewLine); + sw.Write(Environment.NewLine); + sw.Write(" " + name + ".nomer_kadra++;" + Environment.NewLine); + sw.Write(Environment.NewLine); + sw.Write(" if (" + name + ".nomer_kadra >= " + p.sprite + ")" + + Environment.NewLine); + sw.Write(" {" + Environment.NewLine); + sw.Write(" " + name + ".nomer_kadra = 0;" + Environment.NewLine); + sw.Write(" }" + Environment.NewLine); + sw.Write(" }" + Environment.NewLine); + sw.Write(Environment.NewLine); + sw.Close(); } } } diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.Designer.cs b/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.Designer.cs index aaf87fa..af2c112 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.Designer.cs +++ b/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.Designer.cs @@ -33,6 +33,8 @@ namespace WindowsFormsApplication1 this.LabelName = new System.Windows.Forms.Label(); this.nazvanieTextBox = new System.Windows.Forms.TextBox(); this.leftPanel = new System.Windows.Forms.Panel(); + this.button1 = new System.Windows.Forms.Button(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); this.Char_Stats = new System.Windows.Forms.Label(); this.Char_Info = new System.Windows.Forms.Label(); this.PictureBoxBackground = new System.Windows.Forms.PictureBox(); @@ -42,6 +44,7 @@ namespace WindowsFormsApplication1 this.rightPanel = new System.Windows.Forms.Panel(); this.SaveCharButton = new System.Windows.Forms.Button(); this.personPanel = new System.Windows.Forms.Panel(); + this.SpriteNumberTextBox = new System.Windows.Forms.NumericUpDown(); this.charNameBox = new System.Windows.Forms.TextBox(); this.circlesTextBox = new System.Windows.Forms.TextBox(); this.circlesLabel = new System.Windows.Forms.Label(); @@ -64,13 +67,12 @@ namespace WindowsFormsApplication1 this.ButtonAddChar = new System.Windows.Forms.Button(); this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); - this.SpriteNumberTextBox = new System.Windows.Forms.NumericUpDown(); this.leftPanel.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.PictureBoxBackground)).BeginInit(); this.rightPanel.SuspendLayout(); this.personPanel.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.openSpace)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.SpriteNumberTextBox)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.openSpace)).BeginInit(); this.SuspendLayout(); // // LabelData @@ -110,6 +112,8 @@ namespace WindowsFormsApplication1 // // leftPanel // + this.leftPanel.Controls.Add(this.button1); + this.leftPanel.Controls.Add(this.checkBox1); this.leftPanel.Controls.Add(this.Char_Stats); this.leftPanel.Controls.Add(this.Char_Info); this.leftPanel.Controls.Add(this.PictureBoxBackground); @@ -125,10 +129,31 @@ namespace WindowsFormsApplication1 this.leftPanel.Size = new System.Drawing.Size(297, 380); this.leftPanel.TabIndex = 4; // + // button1 + // + this.button1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.button1.Location = new System.Drawing.Point(0, 350); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(297, 30); + this.button1.TabIndex = 26; + this.button1.Text = "Компилировать"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Location = new System.Drawing.Point(7, 193); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(245, 17); + this.checkBox1.TabIndex = 25; + this.checkBox1.Text = "Автозакрытие мультфильма по окончанию"; + this.checkBox1.UseVisualStyleBackColor = true; + // // Char_Stats // this.Char_Stats.AutoSize = true; - this.Char_Stats.Location = new System.Drawing.Point(12, 219); + this.Char_Stats.Location = new System.Drawing.Point(12, 240); this.Char_Stats.Name = "Char_Stats"; this.Char_Stats.Size = new System.Drawing.Size(259, 13); this.Char_Stats.TabIndex = 24; @@ -137,7 +162,7 @@ namespace WindowsFormsApplication1 // Char_Info // this.Char_Info.AutoSize = true; - this.Char_Info.Location = new System.Drawing.Point(48, 200); + this.Char_Info.Location = new System.Drawing.Point(44, 226); this.Char_Info.Name = "Char_Info"; this.Char_Info.Size = new System.Drawing.Size(180, 13); this.Char_Info.TabIndex = 23; @@ -146,6 +171,7 @@ namespace WindowsFormsApplication1 // // PictureBoxBackground // + this.PictureBoxBackground.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.PictureBoxBackground.Location = new System.Drawing.Point(84, 111); this.PictureBoxBackground.Name = "PictureBoxBackground"; this.PictureBoxBackground.Size = new System.Drawing.Size(117, 72); @@ -231,6 +257,18 @@ namespace WindowsFormsApplication1 this.personPanel.TabIndex = 2; this.personPanel.Visible = false; // + // SpriteNumberTextBox + // + this.SpriteNumberTextBox.Location = new System.Drawing.Point(128, 136); + this.SpriteNumberTextBox.Name = "SpriteNumberTextBox"; + this.SpriteNumberTextBox.Size = new System.Drawing.Size(43, 20); + this.SpriteNumberTextBox.TabIndex = 22; + this.SpriteNumberTextBox.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // // charNameBox // this.charNameBox.Location = new System.Drawing.Point(115, 84); @@ -265,9 +303,10 @@ namespace WindowsFormsApplication1 // // openSpace // + this.openSpace.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.openSpace.Location = new System.Drawing.Point(72, 203); this.openSpace.Name = "openSpace"; - this.openSpace.Size = new System.Drawing.Size(186, 72); + this.openSpace.Size = new System.Drawing.Size(192, 72); this.openSpace.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.openSpace.TabIndex = 17; this.openSpace.TabStop = false; @@ -416,13 +455,6 @@ namespace WindowsFormsApplication1 // this.openFileDialog1.FileName = "openFileDialog1"; // - // SpriteNumberTextBox - // - this.SpriteNumberTextBox.Location = new System.Drawing.Point(128, 136); - this.SpriteNumberTextBox.Name = "SpriteNumberTextBox"; - this.SpriteNumberTextBox.Size = new System.Drawing.Size(43, 20); - this.SpriteNumberTextBox.TabIndex = 22; - // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -441,8 +473,8 @@ namespace WindowsFormsApplication1 this.rightPanel.ResumeLayout(false); this.personPanel.ResumeLayout(false); this.personPanel.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.openSpace)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.SpriteNumberTextBox)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.openSpace)).EndInit(); this.ResumeLayout(false); } @@ -486,5 +518,7 @@ namespace WindowsFormsApplication1 private System.Windows.Forms.TextBox circlesTextBox; private System.Windows.Forms.Label circlesLabel; private System.Windows.Forms.NumericUpDown SpriteNumberTextBox; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.CheckBox checkBox1; } } \ No newline at end of file diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.cs b/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.cs index b99a819..73f8d48 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.cs +++ b/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.cs @@ -1,20 +1,20 @@ using System; -using System.Drawing; using System.IO; +using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class MainForm : Form { - Person[] persons = new Person[200]; - - int yPersa = 300; + Person[] persons = new Person[8]; + int yPersa = 263; int nomerPersa = 0; int pNomer = 0; int maxTime = 0; - PictureBox[] pic1 = new PictureBox[1000]; - String adressBackground = ""; + //PictureBox[] pic1 = new PictureBox[1000]; + String addressBackground = ""; + string mainFilename = ""; public MainForm() { @@ -51,63 +51,14 @@ namespace WindowsFormsApplication1 personPanel.Visible = true; if (pNomer == -120) { - persons[nomerPersa] = AddRowToPersList(persons[nomerPersa]); - - persons[nomerPersa].coord = TextBoxWall1.Text; - persons[nomerPersa].coord2 = TextBoxWall2.Text; - persons[nomerPersa].time1 = TextBoxTime1.Text; - persons[nomerPersa].time2 = TextBoxTime2.Text; - persons[nomerPersa].sprite = SpriteNumberTextBox.Text; - persons[nomerPersa].moveside = ComboBoxMove.Text; - persons[nomerPersa].nomer = nomerPersa; - persons[nomerPersa].charname = charNameBox.Text; - persons[nomerPersa].circles = circlesTextBox.Text; - persons[nomerPersa].l2.Text = charNameBox.Text; - - String[] coordinatyNachala = TextBoxWall1.Text.Split(new String[] { "," }, StringSplitOptions.None); - if (coordinatyNachala.Length > 1) - { - persons[nomerPersa].x1 = coordinatyNachala[0]; - persons[nomerPersa].y1 = coordinatyNachala[1]; - } - - String[] coordinatyKonza = TextBoxWall2.Text.Split(new String[] { "," }, StringSplitOptions.None); - if (coordinatyKonza.Length > 1) - { - persons[nomerPersa].x2 = coordinatyKonza[0]; - persons[nomerPersa].y2 = coordinatyKonza[1]; - } - + persons[nomerPersa] = AddRowToPersList(persons[nomerPersa], false); nomerPersa++; yPersa += 30; openSpace.Image = null; } else { - persons[pNomer].coord = TextBoxWall1.Text; - persons[pNomer].coord2 = TextBoxWall2.Text; - persons[pNomer].time1 = TextBoxTime1.Text; - persons[pNomer].time2 = TextBoxTime2.Text; - persons[pNomer].sprite = SpriteNumberTextBox.Text; - persons[pNomer].moveside = ComboBoxMove.Text; - persons[pNomer].nomer = pNomer; - - String[] coordinatyNachala = TextBoxWall1.Text.Split(new String[] { "," }, StringSplitOptions.None); - if (coordinatyNachala.Length > 1) - { - persons[pNomer].x1 = coordinatyNachala[0]; - persons[pNomer].y1 = coordinatyNachala[1]; - } - String[] coordinatyKonza = TextBoxWall2.Text.Split(new String[] { "," }, StringSplitOptions.None); - if (coordinatyKonza.Length > 1) - { - persons[pNomer].x2 = coordinatyKonza[0]; - persons[pNomer].y2 = coordinatyKonza[1]; - } - - persons[pNomer].charname = charNameBox.Text; - persons[pNomer].circles = circlesTextBox.Text; - persons[pNomer].l2.Text = charNameBox.Text; + persons[pNomer] = AddRowToPersList(persons[pNomer], true); } for (int nomer = 0; nomer < nomerPersa; nomer++) @@ -121,65 +72,93 @@ namespace WindowsFormsApplication1 LabelLengh.Text = "Длительность: " + maxTime.ToString() + " секунд"; } - private Person AddRowToPersList(Person p) + private Person AddRowToPersList(Person p, bool use_pnumber = false) { - p.l1 = new Label(); - p.l1.Top = yPersa; - p.l1.Left = 30; - p.l1.Width = 20; - p.l1.Visible = true; - p.l1.Text = (nomerPersa + 1).ToString(); - leftPanel.Controls.Add(p.l1); + if (!use_pnumber) + { + p.l1 = new Label(); + p.l1.Top = yPersa; + p.l1.Left = 30; + p.l1.Width = 20; + p.l1.Visible = true; + p.l1.Text = (nomerPersa + 1).ToString(); + leftPanel.Controls.Add(p.l1); - p.l2 = new Label(); - p.l2.Top = yPersa; - p.l2.Left = 60; - p.l2.Width = 60; - p.l2.Visible = true; - p.l2.Text = "Перс" + (nomerPersa + 1).ToString(); - leftPanel.Controls.Add(p.l2); + p.l2 = new Label(); + p.l2.Top = yPersa; + p.l2.Left = 60; + p.l2.Width = 60; + p.l2.Visible = true; + p.l2.Text = "Перс" + (nomerPersa + 1).ToString(); + leftPanel.Controls.Add(p.l2); - p.l3 = new Label(); - p.l3.Top = yPersa; - p.l3.Left = 120; - p.l3.Width = 40; - p.l3.Visible = true; - p.l3.Text = "saved"; - leftPanel.Controls.Add(p.l3); + p.l3 = new Label(); + p.l3.Top = yPersa; + p.l3.Left = 120; + p.l3.Width = 40; + p.l3.Visible = true; + p.l3.Text = "saved"; + leftPanel.Controls.Add(p.l3); - p.b1 = new Button(); - p.b1.Top = yPersa; - p.b1.Left = 170; - p.b1.Width = 50; - p.b1.Visible = true; - p.b1.Text = "Edit"; - p.b1.MouseClick += - new MouseEventHandler(this.Char_Creator_Button_Click); - leftPanel.Controls.Add(p.b1); + p.b1 = new Button(); + p.b1.Top = yPersa; + p.b1.Left = 170; + p.b1.Width = 50; + p.b1.Visible = true; + p.b1.Text = "Edit"; + p.b1.MouseClick += + new MouseEventHandler(Char_Creator_Button_Click); + leftPanel.Controls.Add(p.b1); - ToolTip tView = new ToolTip(); - tView.IsBalloon = true; - tView.InitialDelay = 0; - tView.ShowAlways = true; - tView.AutoPopDelay = 2000; - tView.SetToolTip(p.b1, "View/edit person"); + ToolTip tView = new ToolTip(); + tView.IsBalloon = true; + tView.InitialDelay = 0; + tView.ShowAlways = true; + tView.AutoPopDelay = 2000; + tView.SetToolTip(p.b1, "View/edit person"); - p.b2 = new Button(); - p.b2.Top = yPersa; - p.b2.Left = 230; - p.b2.Width = 50; - p.b2.Visible = true; - p.b2.Text = "Del"; - p.b2.Click += - new System.EventHandler(this.Char_Info_Click); - leftPanel.Controls.Add(p.b2); + p.b2 = new Button(); + p.b2.Top = yPersa; + p.b2.Left = 230; + p.b2.Width = 50; + p.b2.Visible = true; + p.b2.Text = "Del"; + p.b2.Click += + new EventHandler(Char_Info_Click); + leftPanel.Controls.Add(p.b2); - ToolTip tDelete = new ToolTip(); - tDelete.IsBalloon = true; - tDelete.InitialDelay = 0; - tDelete.ShowAlways = true; - tDelete.AutoPopDelay = 2000; - tDelete.SetToolTip(p.b2, "Delete this person"); + ToolTip tDelete = new ToolTip(); + tDelete.IsBalloon = true; + tDelete.InitialDelay = 0; + tDelete.ShowAlways = true; + tDelete.AutoPopDelay = 2000; + tDelete.SetToolTip(p.b2, "Delete this person"); + } + + p.coord = TextBoxWall1.Text; + p.coord2 = TextBoxWall2.Text; + p.time1 = TextBoxTime1.Text; + p.time2 = TextBoxTime2.Text; + p.sprite = SpriteNumberTextBox.Text; + p.moveside = ComboBoxMove.Text; + p.nomer = (use_pnumber) ? pNomer : nomerPersa; + p.charname = charNameBox.Text; + p.circles = circlesTextBox.Text; + p.l2.Text = charNameBox.Text; + + String[] coordinatyNachala = TextBoxWall1.Text.Split(new String[] { "," }, StringSplitOptions.None); + if (coordinatyNachala.Length > 1) + { + p.x1 = coordinatyNachala[0]; + p.y1 = coordinatyNachala[1]; + } + + String[] coordinatyKonza = TextBoxWall2.Text.Split(new String[] { "," }, StringSplitOptions.None); + if (coordinatyKonza.Length > 1) + { + p.x2 = coordinatyKonza[0]; + p.y2 = coordinatyKonza[1]; + } return p; } @@ -191,13 +170,13 @@ namespace WindowsFormsApplication1 openSpace.Image = Image.FromFile(openFileDialog1.FileName); if (pNomer == -120) { - persons[nomerPersa].adress = openFileDialog1.FileName; + persons[nomerPersa].address = openFileDialog1.FileName; persons[nomerPersa].width = openSpace.Image.Width.ToString(); persons[nomerPersa].height = openSpace.Image.Height.ToString(); } else { - persons[pNomer].adress = openFileDialog1.FileName; + persons[pNomer].address = openFileDialog1.FileName; persons[pNomer].width = openSpace.Image.Width.ToString(); persons[pNomer].height = openSpace.Image.Height.ToString(); } @@ -208,7 +187,7 @@ namespace WindowsFormsApplication1 if (openFileDialog1.ShowDialog() == DialogResult.Cancel) return; PictureBoxBackground.Image = Image.FromFile(openFileDialog1.FileName); - adressBackground = openFileDialog1.FileName; + addressBackground = openFileDialog1.FileName; } private void SaveMultButton_Click(object sender, EventArgs e) @@ -221,7 +200,7 @@ namespace WindowsFormsApplication1 for (int nomer = 0; nomer < nomerPersa; nomer++) { - if (String.IsNullOrEmpty(persons[nomer].adress)) + if (String.IsNullOrEmpty(persons[nomer].address)) { MessageBox.Show("Картинка №" + (nomer + 1).ToString() + " пустая"); return; @@ -260,78 +239,78 @@ namespace WindowsFormsApplication1 if (saveFileDialog1.ShowDialog() == DialogResult.OK) { - string filename = saveFileDialog1.FileName; + mainFilename = saveFileDialog1.FileName; //Adding TXLibrary and pictures - File.Copy("TXLib.h", Path.GetDirectoryName(filename) + "\\TXLib.h", true); - string dir_path = Path.GetDirectoryName(filename) + "\\Pictures"; + File.Copy("TXLib.h", Path.GetDirectoryName(mainFilename) + "\\TXLib.h", true); + string dir_path = Path.GetDirectoryName(mainFilename) + "\\Pictures"; if (!Directory.Exists(dir_path)) { Directory.CreateDirectory(dir_path); } - if (adressBackground != dir_path + "\\" + Path.GetFileName(adressBackground)) + if (addressBackground != dir_path + "\\" + Path.GetFileName(addressBackground)) { - File.Copy(adressBackground, dir_path + "\\" + Path.GetFileName(adressBackground), true); + File.Copy(addressBackground, dir_path + "\\" + Path.GetFileName(addressBackground), true); } - Files.CreateStruct(filename); - Files.OpenMain(filename, PictureBoxBackground, adressBackground); + Files.CreateStruct(mainFilename); + Files.OpenMain(mainFilename, PictureBoxBackground, addressBackground); for (int nomer = 0; nomer < nomerPersa; nomer++) { - File.Copy(persons[nomer].adress, dir_path + "\\" + Path.GetFileName(persons[nomer].adress), true); + File.Copy(persons[nomer].address, dir_path + "\\" + Path.GetFileName(persons[nomer].address), true); - if (dir_path == dir_path + "\\" + Path.GetFileName(persons[nomer].adress)) + if (dir_path == dir_path + "\\" + Path.GetFileName(persons[nomer].address)) { - File.Copy(persons[nomer].adress, dir_path + "\\" + Path.GetFileName(persons[nomer].adress), true); + File.Copy(persons[nomer].address, dir_path + "\\" + Path.GetFileName(persons[nomer].address), true); } if (persons[nomer].moveside == "Прямо") { - Line.CreatePerson(filename, Person.PersonName(nomer), persons[nomer]); + Line.CreatePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); } else if (persons[nomer].moveside == "Волнами") { - Sinus.CreatePerson(filename, Person.PersonName(nomer), persons[nomer]); + Sinus.CreatePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); } else if (persons[nomer].moveside == "Кругами") { - Circle.CreatePerson(filename, Person.PersonName(nomer), persons[nomer]); + Circle.CreatePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); } else if (persons[nomer].moveside == "Диагонально") { - Line.CreatePerson(filename, Person.PersonName(nomer), persons[nomer]); + Line.CreatePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); } } - Files.OpenWhile(filename, maxTime); + Files.OpenWhile(mainFilename, maxTime); for (int nomer = 0; nomer < nomerPersa; nomer++) { if (persons[nomer].moveside == "Прямо") { - Line.MovePerson(filename, Person.PersonName(nomer), persons[nomer]); + Line.MovePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); } else if (persons[nomer].moveside == "Волнами") { - Sinus.MovePerson(filename, Person.PersonName(nomer), persons[nomer]); + Sinus.MovePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); } else if (persons[nomer].moveside == "Кругами") { - Circle.MovePerson(filename, Person.PersonName(nomer), persons[nomer]); + Circle.MovePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); } else if (persons[nomer].moveside == "Диагонально") { - Line.MovePerson(filename, Person.PersonName(nomer), persons[nomer]); + Line.MovePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); } } - Files.CloseWhile(filename); - DeletePics(filename, nomerPersa); - Files.Ending(filename); + Files.CloseWhile(mainFilename); + DeletePics(mainFilename, nomerPersa); + Files.Ending(mainFilename, checkBox1.Checked); - MessageBox.Show("Successfully"); + MessageBox.Show("Готово!"); } } @@ -351,9 +330,9 @@ namespace WindowsFormsApplication1 charNameBox.Text = persons[nomer].charname; circlesTextBox.Text = persons[nomer].circles; - if (!String.IsNullOrEmpty(persons[nomer].adress)) + if (!String.IsNullOrEmpty(persons[nomer].address)) { - openSpace.Image = Image.FromFile(persons[nomer].adress); + openSpace.Image = Image.FromFile(persons[nomer].address); } else { @@ -416,5 +395,17 @@ namespace WindowsFormsApplication1 circlesLabel.Visible = false; } } + + private void button1_Click(object sender, EventArgs e) + { + if (!String.IsNullOrEmpty(mainFilename)) + { + new CompileForm(mainFilename).ShowDialog(); + } + else + { + _ = MessageBox.Show("Сначала сохраните мультфильм!"); + } + } } } \ No newline at end of file diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/Person.cs b/WindowsFormsApplication1/WindowsFormsApplication1/Person.cs index b646672..cb6612d 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/Person.cs +++ b/WindowsFormsApplication1/WindowsFormsApplication1/Person.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 @@ -18,12 +14,12 @@ namespace WindowsFormsApplication1 public int nomer; public String coord; public String coord2; - //Dobavit polya + // TODO: Add fields public String x1; public String y1; public String x2; public String y2; - public String adress; + public String address; public String time1; public String time2; public String sprite; diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/Sinus.cs b/WindowsFormsApplication1/WindowsFormsApplication1/Sinus.cs index 75061f0..0e63ea6 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/Sinus.cs +++ b/WindowsFormsApplication1/WindowsFormsApplication1/Sinus.cs @@ -1,8 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; namespace WindowsFormsApplication1 { @@ -10,37 +7,45 @@ namespace WindowsFormsApplication1 { public static void CreatePerson(string filename, string name, Person p) { - File.AppendAllText(filename, Environment.NewLine); - File.AppendAllText(filename, " Person " + name + ";" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".texture = txLoadImage(\"Pictures\\\\" + Path.GetFileName(p.adress) + "\"); " + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".x = " + p.x1 + ";" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".y = " + p.y1 + ";" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".x2 = " + p.x2 + "; " + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".y2 = " + p.y2 + "; " + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".nomer_kadra = 0;" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".nach_dv = (" + p.y1 + "+" + p.y2 + ")/2;" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".ampl_y = abs(" + p.y1 + "-" + name + ".nach_dv)/2;" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".ampl_x = 10;" + Environment.NewLine); + StreamWriter sw = new StreamWriter(filename, true); + sw.Write(Environment.NewLine); + sw.Write(" Person " + name + ";" + Environment.NewLine); + sw.Write(" " + name + ".texture = txLoadImage(\"Pictures\\\\" + Path.GetFileName(p.address) + "\"); " + + Environment.NewLine); + sw.Write(" " + name + ".x = " + p.x1 + ";" + Environment.NewLine); + sw.Write(" " + name + ".y = " + p.y1 + ";" + Environment.NewLine); + sw.Write(" " + name + ".x2 = " + p.x2 + "; " + Environment.NewLine); + sw.Write(" " + name + ".y2 = " + p.y2 + "; " + Environment.NewLine); + sw.Write(" " + name + ".nomer_kadra = 0;" + Environment.NewLine); + sw.Write(" " + name + ".nach_dv = (" + p.y1 + "+" + p.y2 + ")/2;" + Environment.NewLine); + sw.Write(" " + name + ".ampl_y = abs(" + p.y1 + "-" + name + ".nach_dv)/2;" + Environment.NewLine); + sw.Write(" " + name + ".ampl_x = 10;" + Environment.NewLine); + sw.Close(); } public static void MovePerson(string filename, string name, Person p) { - File.AppendAllText(filename, " if ((myTime >= " + p.time1 + ") && (myTime <= " + p.time2 + ")) {" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".x+= (" + name + ".x2 - " + name + ".x) / (" + p.time2 + "-" + p.time1 + ");" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".y+= (" + name + ".y2 - " + name + ".y) / (" + p.time2 + "-" + p.time1 + ");" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".y = " + name + ".nach_dv + " + name + ".ampl_y * sin(" + name + ".x / " + name + ".ampl_x);" + Environment.NewLine); - File.AppendAllText(filename, " txTransparentBlt(txDC(), " + name + ".x, " + name + ".y, " + + StreamWriter sw = new StreamWriter(filename, true); + sw.Write(" if ((myTime >= " + p.time1 + ") && (myTime <= " + p.time2 + ")) {" + Environment.NewLine); + sw.Write(" " + name + ".x+= (" + name + ".x2 - " + name + ".x) / (" + p.time2 + "-" + + p.time1 + ");" + Environment.NewLine); + sw.Write(" " + name + ".y+= (" + name + ".y2 - " + name + ".y) / (" + p.time2 + "-" + + p.time1 + ");" + Environment.NewLine); + sw.Write(" " + name + ".y = " + name + ".nach_dv + " + name + ".ampl_y * sin(" + name + + ".x / " + name + ".ampl_x);" + Environment.NewLine); + sw.Write(" txTransparentBlt(txDC(), " + name + ".x, " + name + ".y, " + p.width + "/" + p.sprite + ", " + p.height + "," + name + ".texture, " + p.width + "/" + p.sprite + " * " + name + ".nomer_kadra, 0, RGB(255, 255, 255));" + Environment.NewLine); - File.AppendAllText(filename, Environment.NewLine); - File.AppendAllText(filename, " " + name + ".nomer_kadra++;" + Environment.NewLine); - File.AppendAllText(filename, " if (" + name + ".nomer_kadra >= " + p.sprite + ")" + Environment.NewLine); - File.AppendAllText(filename, " {" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".nomer_kadra = 0;" + Environment.NewLine); - File.AppendAllText(filename, " }" + Environment.NewLine); - File.AppendAllText(filename, " }" + Environment.NewLine); + sw.Write(Environment.NewLine); + sw.Write(" " + name + ".nomer_kadra++;" + Environment.NewLine); + sw.Write(" if (" + name + ".nomer_kadra >= " + p.sprite + ")" + Environment.NewLine); + sw.Write(" {" + Environment.NewLine); + sw.Write(" " + name + ".nomer_kadra = 0;" + Environment.NewLine); + sw.Write(" }" + Environment.NewLine); + sw.Write(" }" + Environment.NewLine); + sw.Close(); } } } diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/WindowsFormsApplication1.csproj b/WindowsFormsApplication1/WindowsFormsApplication1/WindowsFormsApplication1.csproj index 455ac51..655406d 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/WindowsFormsApplication1.csproj +++ b/WindowsFormsApplication1/WindowsFormsApplication1/WindowsFormsApplication1.csproj @@ -49,6 +49,12 @@ + + Form + + + CompileForm.cs + @@ -61,6 +67,9 @@ + + CompileForm.cs + MainForm.cs diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe b/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe deleted file mode 100644 index cf047867948333db30890793f39958718435e364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29696 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 diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe.config b/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe.config deleted file mode 100644 index d405098..0000000 --- a/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.pdb b/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.pdb deleted file mode 100644 index c8c75c22e7a2360da1d58a2df7ace6e0763a8aa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40448 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 - - - - - - - - - - diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/DesignTimeResolveAssemblyReferences.cache deleted file mode 100644 index 223a82b63c6b9df7f09547f982f66ca60086a3f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1164 zcmcIj&u`N(6i$DxP1DicIRuFVXqAljGYGz!%wwrS96rwGZ7UpA|5JlW2m{2lyB zNL)B^<;;x(|H1G}y8&IriCM}Q+xha|_xwFO1;=r&?7%k;uV~@z5s#JBGBM{ESi=vV-%u9qy75&lVC zvjq20QZ}Hmk!o#GPpvPf7gT|2VbH#0aH8ZTXP|1hG2|bhY%9{$Qz|mhj#DZ*l}e+w zD%ZhvtcNQ!AKZ%nXK9|RW^=LsURSW9s`?#ex>ZvPoy#qB?WEp7@DQ37D!8|KW6oc@ap^5eb;rX>vrkdwg^Zk=!8$*0%}LWf0FJkld!g&^zG-?=Z|0VNUdcO M*1k;ISRyrk0b&_m_W%F@ diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache deleted file mode 100644 index e5531626a86854064c4c6e8073f76fc69e0cbd2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7431 zcmeHMTTdHD6t=-kFoYCSN(dyW)240GI$Jy3Bk_>hxJ3;SvI(h#Ei&F6n}OXOXJ!^~ z5mKM}8~Rf97gX&_`cSF=f&QZQob`=+``|@9c#)5nxtwp#nKQfRI}U|Iq0m2Y;Wu74 zdq7w#+>}CzvNqPa@~EBHp2dZc7LFs_<;+qdzRslL!d*}n=O^|hqcDw9Tz z%4N6eX>|uC-=VfG_L%itDdv>y+S0yeF0M)q!RWMb%e<21HXAdkYjKNe)*OkgYO?Iv zc2-h{?FqTl>{_EG=o>xJmld`J_TIPjg3o& zz=>F=w#QZ}mv5f7hUT^8ZY2?SlqsamOYJi@{lAac+#H=TXJ%6iQ`0OtzfeqEwvKDM z)FAv&?5ta_xw>$;8=^r(QR_4Xq5PW1REG~xH$a1kp>BY7>cv?MV;&ss1u+nf;B6lY zNC!gE8zA7TA4L?!0E$5n1LP*i5E%lIImk6Kr)POcr1z*~g;ug#FkUXLwQ|VB?zAy$ zq!P^(w2^Ku?H`g`py}su`dQ(Xf&{d1^wZH_M}Hi>1NrXnACCS!`n`~0YDbG|VFhx| z9J459c~2Y)35qPd=B_37R8~kwJ+D?F8>g79q%Q6drESny@+znoQq?s`r*cdQd$*N4 zw{s`Mq~;cjzK13cgSdOrswPFKTSsCrViZTjTZYGdyU7SDXpDLv?jw%kHW`Jx0ccGc zQ^~2+Li7XpKQs`-Ex`{NLt*T3*RjZLxQ`f?ZIf~Tj_tD;?i#v}AXU&;=R%+!hUs$; zG6BdxUg7RRA`2u*Ly}*}Gp!+=R0gmU|AtJ$VmP<~233Ic#C;AFf3!b8`?%2B(|98W zQAImiTN`#VZVUB2YY#Ni`7J7|{zlvdI2s6CGeP!Y?g5My2uv%3m&`}H4@kQ~B4wzi z1`61_HkI|UKMdMR9~;k49FVpHwUSkBQFEB9eajvI-rGR&8q606tlZ_m_x60GquG5oiQ5BUi|nn6N-=h!~brvS7SG|&s~zD2YM zzUjO9X*WOZXeFl8^v+L#HlYIMsJ>0bzi0iMyY-SR^!yfSy}Zs=sJi7REJj~gDGMU* zJH7cGCgU5${{HA^@YHKwG2}T|o+pn$yb9#W8$%l9V?2hNNES-#VWd<(&pN)CFmkLj ztuZ8Bc*T%-;d;pzAjS{U=hpfUNdkID4!+^8#_BGXeV5_z9Fix{K5?*iej&SdNDS!j z443;7Gz}f(=pJU?Sn56`Nocx4YEt5EgWbiDv?0YMDG3>uijs~55WKWHLm*rZ2d}79Q+r`snlHn diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll deleted file mode 100644 index 4cc615aab01032899c66a1be778a05e99e2a1f23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3584 zcmeHJU2IfE6h3pi-7ZUkc0mHs=!H_#7P)Cth!W9s`v*lTwOeS47`S_Py1nG?o#o!U zKrtcp2NTp7jfn~I#h{7Ch)+gQUwQF?gb-eg7cc*86&tCfy{CRY3-(#a>*QUIZR9-$Z=h(E1hpAHv; zEN+@(yQ+2bdP>0!{0M@QLx&&GM0!0XyVjC1$3j<4k2;1PG}ap(NK~4-c85u#WXBQ+ z5wyk}o4|2@ZhOCoBjuDH+GurKz1_V%ylLdZ1D(MNZO4c%VoYIPTP_M*zZkN`rA8bO z#(JY;TgAtoO>CHTl`Ui8w+YMxsm!nN*5z1|Tv zt4o4$%+orqak$hn(d&YF1V&wA)=1KJO|R3mv5Y>)lr;T7S>Ts}BfrmxTyXeWqmx;4FSEHl#dHgI04x?VM7E%cG`t+56eP|-p^L)wI0 zHsT0=6fb}tq+OsUP0^UivtL^^g;fRZ)zbT^4aQ55K8d9%%0v1-mLwG+oz>C@sXvVp zV*W`>Z)h(D{i>z+R_!waoex1X$m^6LuqLmw8Z=Fvpe@v+k`GdGN>#)zi zjrBAFq?=rgpP=Qi=%lA7V->1EKX#vC*TaPEz;Nr3X*Yof#)3~p(sk=~nc8#LQ=RosqUs2&Z^ z+%l>P6;D1(rO;7<=jJIl>pL@n^4+7dKm|E%SG;J%4%^ut-H2?Hj<%N+2m*zy~r^mB5iTUAA2IT*r=F<>zD+@m=Y+LrFsgH&Q`= zpbm$2-jlh=jwB7JQrY!nuvPjp08q$AxL)}RR5zgk{9@GML7A@l1EUx2~wJtv5O@J^P5}!n!`r44XlfcRe?nt!oe2UPU6cVI)fy+bCc95ppj*8Vgie z29Ya6Ydp?QXbsBHEh0+G39W+XasN+-@fuXi^Qi6Dm-VOJVg-pqvTNX0yf?Pz9=!z| zm(!kfv{`&kBmT6~XIk4K{MyKC%?&4ZP*p?Y6C%sO@qy|gj(gCxi@pjY*9mL$;;iYE z@VuN14!Mr3>uU+2>PezLIB6kGx_$w*F|2}8xS)o5ta>)7R#3Dve*od={SQ_PTJza3 zl%>2k%lF{LN!(_i3Z&>Tg*1#Ypc1$&mGS36>yS+mMg_Yb-0m@0DCi_c#!=`%$MvYF z0@TqwyT9_wiZ@?9@Ye8$S1+#>&aSF5{*Q9dTrtPk#dMz~NB9u1UWbSwX$=S=Q3NlFbY{D-k{_qa5pD97ljk->tLNy&(yWOy2d%37m zaFtcPesCAR1vjrj4alJaJUNV7iEq5p?)3ur$rX4Rxt)){Q<(pQd6T(2TkU(Ms@XT7 sfdg%N3$SS>RsaA1 diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.MainForm.resources b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.MainForm.resources deleted file mode 100644 index 6c05a9776bd7cbae976fdcec7e3a254e93018279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.Properties.Resources.resources b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.Properties.Resources.resources deleted file mode 100644 index 6c05a9776bd7cbae976fdcec7e3a254e93018279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.CoreCompileInputs.cache b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.CoreCompileInputs.cache deleted file mode 100644 index da85db4..0000000 --- a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -73847b4d68958f8c4cd5ae5795fc70cad0802088 diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.FileListAbsolute.txt b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.FileListAbsolute.txt deleted file mode 100644 index bb8eff1..0000000 --- a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,39 +0,0 @@ -C:\Users\user\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe -C:\Users\user\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.pdb -C:\Users\user\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csprojResolveAssemblyReference.cache -C:\Users\user\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.MainForm.resources -C:\Users\user\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.Properties.Resources.resources -C:\Users\user\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csproj.GenerateResource.Cache -C:\Users\user\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csproj.CoreCompileInputs.cache -C:\Users\user\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.exe -C:\Users\user\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.pdb -C:\Users\user\Desktop\Overnewing\vst\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csprojResolveAssemblyReference.cache -C:\Users\user\Desktop\Overnewing\vst\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.MainForm.resources -C:\Users\user\Desktop\Overnewing\vst\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.Properties.Resources.resources -C:\Users\user\Desktop\Overnewing\vst\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csproj.GenerateResource.Cache -C:\Users\user\Desktop\Overnewing\vst\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csproj.CoreCompileInputs.cache -C:\Users\user\Desktop\Overnewing\vst\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.exe -C:\Users\user\Desktop\Overnewing\vst\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.pdb -C:\Users\user\Desktop\Overnewing\vst\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe.config -C:\Users\user\Desktop\Overnewing\vst\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe -C:\Users\user\Desktop\Overnewing\vst\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.pdb -C:\Users\Инженерка\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe.config -C:\Users\Инженерка\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe -C:\Users\Инженерка\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.pdb -C:\Users\Инженерка\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csprojResolveAssemblyReference.cache -C:\Users\Инженерка\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.MainForm.resources -C:\Users\Инженерка\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.Properties.Resources.resources -C:\Users\Инженерка\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csproj.GenerateResource.Cache -C:\Users\Инженерка\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csproj.CoreCompileInputs.cache -C:\Users\Инженерка\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.exe -C:\Users\Инженерка\Desktop\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.pdb -C:\Users\silan\OneDrive\Документы\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe.config -C:\Users\silan\OneDrive\Документы\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe -C:\Users\silan\OneDrive\Документы\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.pdb -C:\Users\silan\OneDrive\Документы\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csprojResolveAssemblyReference.cache -C:\Users\silan\OneDrive\Документы\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.MainForm.resources -C:\Users\silan\OneDrive\Документы\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.Properties.Resources.resources -C:\Users\silan\OneDrive\Документы\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csproj.GenerateResource.cache -C:\Users\silan\OneDrive\Документы\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csproj.CoreCompileInputs.cache -C:\Users\silan\OneDrive\Документы\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.exe -C:\Users\silan\OneDrive\Документы\MultRedactor-master\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.pdb diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.GenerateResource.Cache b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.GenerateResource.Cache deleted file mode 100644 index 7b3957014d7fae3d7c20963f68f28f5345c12d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1015 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 diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.pdb b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.pdb deleted file mode 100644 index c8c75c22e7a2360da1d58a2df7ace6e0763a8aa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40448 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

0R)$RWlGlJs+gkO{3IHa^>!S}!$C zRpYUYu}x~d$i9F>{P>E?8ngMR8C5w#4x2CHI1vp4HR=X7SvHD^ktX^?ZDaAOi<6d7d1~#DgA0OBYAUEsfqgc3lISHN z_{f59AqVV}T^1nqI+mR{0@RoWEkhA1&!*$q$cOYN?SWtSKvOZhKF@}Wo5UpILWd3h zAm)uPaey2rVMgX&&3=N?a6sg174Ou*ZbDR%2#Njyc zSYQun5=9IRs~{g6#Pz~nl!gSXq0Ii#^F6o=w? zAfnbz&8O<)RzXiO&&HXM02oGh1=P$smhlPDpk*jX<=Ip_bei@6?SWtMKvOZhKF@~Q z0Q@+_ylo;Z0M|Wcv~Z~-)Ip57YA+@JjTI1!#SJH65+dRpKnorZf-6KC_5wQug9z%7 z4m_lR7$=wlwv8Anw8z+(2tgPc8p0LxRcMiDy)C3gAJR9djYq3vICKXU&FSMD+2`2(FP#5CaxHu%h*ARNbNC^W7 zPNU*TnOZy54gtfpBQT&(Ri@Sj%6JgK`BY_mCjfil7}d87`83bQuA>vQ2b$o4reb!3 zJi9R_joJklH)7uKm72z_#*CJlQxiIHXXDTcDB!xF6zCA`A=xvL&jv0^e66a5%m)Mk zFr(Is)6{x_9fBINi45X&Eq!+)I#0cez;%Izzl>)?`w=^@6WKudRL}*^T}7tJI~Ekr z#{R(xKvPr-03H{oGF|8emF1J884N|n^?5Vcguc}0+1L-@$)Cit(E!+(WiU?V*>pS` zA3-`nd*By6&{WKBkY_`km|ekjkK?I;D46L20vS4m!!?aI7R0JWJWznIpi>9KNFc15 zc>*AZSUA8EwJhiWCk}T4I|RRn%_$sd5{w*}ANmav$Td_%w5pm7Q`4A{qxMki#c8TO zv;p`#0(I1QXcA(~bs&vw5%B@V8|2w_x{O&h6d{=^^owBFaF;=4v4lm+hK)ntF=ms+ ztKuYB0SZ+OcLHKes~@)p1!_L^cp=L~2Pr?YHe{KI_t)<%YA?;RDaVaY(jNG24>T3C z8|2wgJ8(O6`wUktX4Svls()jFI!qUJ5xi7~(E=h;fP`piHfu8p5g*O>eMO?&LwOQzQOb*D^V?1@<;*8S<$-8yle$vNC14ISt7Xakc-qHf#dh62;5FkgA$Ml z%v;1GZYMw)-PKTwBmY;|4!>m9)Q;l)M5*e#4%7g|s#%~~tql2aBhg@Fy4rHBexWww z_8_y=Pnu^_y+NmG5B#nNnu^(t@oXF@g;)U*${=IOzuTyPr9O~VGCl*mwCaaL6yd2K zQ3g%43$tY85Q1uxQ_`va!I2rv$N^zdahwDC)Y{=|gF4tO?1j1ZXlQ{@1V?4WA8%G=a z7kYrov;T$Nqq{_V;BWRoQ!$(7*?;qa`PZ7KdG^2d(9#|IuXv!TnEgND+3?F2etPo1 z;vKq@=Jx=VXVdeuo8P~*#ecg8nu^)~6Q2E(*$6*5PEd+E3*sl5^sfJc2WX!CUvM&A z#lP4CO~vg0CC?@wU;nLR(%4+#-!eigH;V_TJiA#8(ne?x{81igDrVQ`*<|3NYCRC_ zLi`jR%ZXfPRS=HnrlBVnt4md_ng{cMt8;2S#RzlFcq~KM1@npF)l}%IN;GL03e=gk zjA{pEOt0(cPpq|^v^v&^X#Adhu%wj z;O8D_DrVQ`*)Z?8&I1}yGX_hTw~f{S!Oa2g3-gbm6oHGd5+5vR3hRNeh}Ex=9TH91 z)H%v12TePMhj-ALeK0?m`Y1KF4|Yh*hQD<;uv6#hL(r&i2e%FO;~GEE1)k4 zfh>W5!-Bmc9;~DaOUEI0i_79JfHGdg1TpvqpU*@3pp1DowotRH-ulq63z|eVh}s5i zhHT8jf2$33>ZQMe2WXy6p9ZuC{u2*06|)=U*(hiLaSZBHbiiNHQ*7 z4b=31auEKgvQ(b^M|GU;EbW12@jz2CyK$aP#GzqzxjHds65gs-=mP~{$xcq;5E4Q8 zgf;RhcOst^j+QxvU6@q^(}gvpAqTIy0W2IX&5FY>b^HO!KjYce>uC@intVyU41Je#UtrvdcW20cLY>;~OJXVM<{MGrI;vm4~uIG&9dDuQ8P!-!|2MMu%P z(U60@wo=x=(ou)nTD;{VnW;f2WiFh^%Y&ER$cczw4f-k<(jQ}`A}f_RqquCDv#!$AXZH!(2#@g9MCKmFjU2} zDL4AUtH%G<7aXXrUtyhH@D*Y; z5Vyub5>$kGw}8MN%@L=@v+KNNrhZ*?P8|=>JiCrV=&!T~e#-+*#q9b#`?sp4mH$`| zPOZJe!VZ{~-sR z?q)N3psAQm^Xz6k2!E6*nrHt}hnwzfvwNVanB5r9rp{@G#=>+tc;XSwp{ttNEaXsi za2h7u)p^_<_Z92l9AXBxJ3I|(OfK@C{Xj^o2qW=wO?_IIkK%c?rf*S+IuZ zo#O`JzTg}>@rxdy^6XzMLaWgppgn*+&{WKBjAxTzR`UcTd^I#=!SYM6Iv%9a6NFS9 zoF*{a$(US;1UF8EW<>*h!UprF(ZV3G8v{JC>WCq+RteZ45FFM9sb0eb7AOHtw0a;U zh}y|TUu&$_OQDI{cy$q2q)NoAS`mf1B4L#^c#@J_Bc+}hI^$;^pn3MsyhHD!J@8i^ zXews^glAJ(DGABM3L$(pT6UFKm5<6?sp*x`JPDV9SNdUadZGtWE1jHM4ZaV8*@c?<2;+n+EJR?FKW6m z<8(gu0Gv7D$wTObm!$=8|@)d3^t!+L+UHY&@y3DV(mB$dpYhb zp-9LAJH+bS^wxj};LPFk`2g7PNn>^c4x+PY5B$^vKgH~yl>956T@}y%iG^R;MP3b;;VUq2%DfSR5Shv=^~$)P6ia zn;b2OJR;;m&hLY=@)>lTZfx)yilWG=uBw3oHhj$Mu0yRX?;-ErX7elW+ansmA{c zY3v_d7qr#ZhYLOo@wN5!C0qwOwzeVQdC)=nLLnD)xV}|PjmWG%BG^v-1bK9P(a}L= zp`Z_WbdWL}Bgp5A;E0DH&wzu_fyUPG5eGZypyOR|q`1B{-nI?l^FyG8#8$tBP!}`> z_YSoRKH*G3eMGyUUyWmSBRm^bSwgcV=+^7 zC13*|Uu1BN)&a}(YJ>m`s8J>^{TQMc37=T!CwA)Bg?tNTF=mIP1Nv4WlT%1K!Y%3{ z0Q*=O=hwpQ>f)$nB)~%rWDm)v;uhlK|D6P2vy(3uK_g&Q2yv@SxQ`fT$Tow2eBoG- zm`xyfHNs(d22d2n)Brj7|0gX6vrv~PofwB<0~d+XW2k+{X?*NJ4bo6G#%3^r+X?!x z3m*|;sPTn{6EF+~(O#@fwTWtn0h1gMYPA7&!G>ExBy4|**%Y3Q%2L=iF{scR?SbF- z0Gv6%uF11s1R1j#eIQe0YjoHIFY+?PJKJ| z>q5$KrD7OHZ9w@{eQcIcCV4g_074K1qE9Nru5TGzfCPXah9zqL-XPC00lSd3-pQt7<%lHbW!?pEKxK5TEt#1dtAHGj0R5VbpZvnB8b>q&l7r7aw?${-izdyB;87 zBOFUO4VkQTA~y05j%Q=ogVvJQRt*f3ys#FNuBS|ZE-+)bOzMPFsFxtNQ?GbcT^Nc` zDS!$TBd0PvY>-eUc{b!=2!SGh8P5iNXaF#B9CO7s{|gE5Eee1Th*iyWNzV{W7i}2K zunv*%CBoe3wg>kYYgQMn`vV(=oNFZ58zMeq#z*d~!6`%BHC#?-NKoM;@gLqe(|Jy^F+0_JSj$$_u+nG-b! zCc-foaFsG_iF%1J585C_=AmDv2o1!&us-ZS5m3;_%6be&dOC}t$Eqqun&67K*c6Ki zwGey`+d=h$1wDo>iwgz821CHo109Af7wMzD2uO%bJus4vE3Mx)s!ddiY5{c+22tG3 zbQVMgYBo@|1q`e92K6iaR%Z*=32!k_+v?}k7$RvCt_9o$rhvuj!RbeOo0SeuCi=@_ z>0x$@Jp=j3!_Z}vp!NdFa&7fcjxDRo;mB{OmY*CiFbKwBY}n?DlFBh9ofXz&{tsC zaLVL(N9wO3lzzv*YhfH5kjs@o4~W6y8DO35GXl5%dk;6_Ah_1BeS- z{ks}!^T8oM=h>i)eT5k?vVegZw;5ZmK02_cDu9L(5cENJO8Dqto4AierwH(FAfAow zqXcm^H@r2Rp5{L!nEWx7zBW$$7HfF*8~W(WB><+zl5-u zkgmC;s&j~esL5ON9+CgV+J92E$=(00f>Z#b#*)DZzAmvrQn@OiLEtwfo{cY7tc(-b zPGfaZ%VP9};tfWf31tF?;cwLjE#Y!Q8jOulEmy0P5r*0p@UFiv0Zssh+F(4pSt^B| z0^fy+y)b~G&^Y`+SpP-^)G*7(X(I8P@oeg0LjH%56FP#AHL?jId3;=OEx6vsI^H;D z|25BM{Wi~TtQCJkKIX5ev%ob)T;f+=IE4`Fg$!WHK#Hlf8%ovT<@IxZ*L%3e-!0gn z{(oZaKPlT_W12k^E+EX1(1lBIC_Xg2=Jpm>N+^@DWH^-g_asp|G2{}&j*Qo0<@$E& z*M*QQ1dLX*;pz*z0X9Y|#}LZZ@oZEV6oDTj@oW>63CaLkRAr)-} zhi=UAWruIosZ1JG1fcC(j=YhsC8~AjC?tpw)lno(wg9>ye?E%^Yvr|-c>rTJto2X-r#(P> zfc60Gfq%9KsF)4!CWm(~(x0>kXb;dHpgr(U^*}AmrU9Gw0PO+V1GESJ(H_8<4eQAM zQ^ysW{nH+xJwSVa_5kt##%u`TPy!PPb!&L+Dj^P@xS%%We z;nD^iX#?U@&ywrp{_Eh)uw;os3~3mqJwSVa_5kgHCVK#5cI|jJ(?HLd&o|`p4Ea0* z9#4>MmxZ4t|jcM zVe@pF_Q3xO5AcPsnh&e$tWJluoQc=+!X}D=OkTQ>@9PAs=@P#Ph4A>4T{YK5Ogf)f zWFJ;X7V?m?FDC{qJ%#jz;jot<62pV9#DY>h!ZNzDz{l!E zAq_8bqqYa^6N@3i8w$y5mfA1K@eL;yOoENykY(H+RQ7NB#Qwqdh0qIM;w5SD?k!&* z!q2E*LJr|Eq%VY3^n62z7mL9=AcZ{WmoFTz+L%_q{ailyr|M9mvQ@Ri+rTK8Mm@gN z{Qp%NV|ML$wz7d9ptW&2-;mFTPk?RZm>9rpV@0(XHOm-fOTcUd+k%+7;SRv&bRT8t z5J$)(F&oYiK8we*WvVgNY9PG63+Wu%1OH49z@( z3CUjIHsfAEA8p|k?8LfzY^txE*c@Rv_`eFsi3d&^Z!`24>Jq^_Do7nTcA^-<8u8Yf z+F)P*X#TB!_(_{ly|pmA=HM$D7#OFg16sqUAs}};A23_l*B3CG&$Q*KS@M*P0kdNi zjnlcriA?Q;Z8(p3sfv(8<=J|^oOB;G^jSxrT9!`J9{2}(pbpc;Ed-Dtsdm-*PlaJ% z!(5J!t!)*}MNkw&aNMe&^8uoKeL|@40N})D15gpxpg3aQkS1Zcif2>vsrvYus)k`0 zRcc+8)lIFr#=$bRUxa0nxk5hNEs*0$Eenue$7b{9*aG5me5wI51lmBXKnpNZHI#9% z$B+&;CM2C*qYrJv!_HqaW5nI5#}4(Ss&)diYx+(C`Cqg4=Jm!;tkuHo>ShW6k&P_{ z>9zuZ?Q~;7x&fcSY(*bmOJycs%@SZ6&>H>&Y^THTk+lydK(!@=M1(BNv#B{OChV$v zLe;TAbr_wdJ@7yGKs6B7q9*{EfXP(QB>|P-d2l`>K*c!#JX~Mk(6s`Ih*@H;450~} zroun9cB&m;24>K3N<^8A`_^ZobwC&5%>X>` zl37^(9>=rm_k}=Hg5Z+ex*?`ZWy5eObJK|^EIh=iv*#*ECIZ`Vufih2J|r`)@;1uEl_d-m6{XeG6!jF9;m1gKWj&scZwa3W`cn-<7a3|!=nX6|EgQ}-_+b*y7_kk9 zNq<#8Qc_FNY1#w-SPxVKVO^e$Lm8;$m{r3Sfddx+gnYIS!H=t1Y@O?c1Wtk(`}_jW zCSVEJCmF}BAGZd}*czm%5n?nfK&u*yXIBp|L`=6q%YW<9q4I1L?}zr|djsIpD7b`v z0e}`_9q>86+oARsG4jUR{1cu{W$h?k4detlrKal~$HwYv_WW9yT@Af}*@~8W27IO- z5B@7NiT~2dTnR;%Gz7G{2Fe^g;(xfF9tVD@taTzcdjtPhj-l(NJ%Bw>hv}mHY9Oy+ zwA6qGf!`#1hAV<#Y#bJvH-c^AD+RMd4D+Bv!atC2BFsX9Xcfx`u)%h!L)6tFO_Dm* zX_YTT+-uK*!1aPlRzJXQ^gHSz3bsRew<^d1$3$v>ZK6Fn_&E3F|Z)ltjp9Y5MOg%nK z@@uQ;%XHE+E%jmy;XjjW5ED~3o=rU|=rrwt|JNQs7k3C7qMLx4RnbimIajJa zS0lldV9eFPQx!IZe29`#C)t5dfLV&jYX|ls)(E9gEhI1yvlockePH4GTD7A&Dp&_Y z8e*9tY_M{cj#SDoX}djpvOt)&>~XP>dPR{b)=R@@pWLz-;0; zg8v~9gv-LwMDs>)--(fyoMS^hnh^d%#}WL`_3nY0rP6k1?AP z&laY0nM_~!5z^3@_zyEk^bFD^6k~vAGu`!!(`^B>4S2=~wmC6%eewKkJnI8pxFi6eNh38EH^gg^9n8q_k8L;yyn$y>AkQ?YgW&=8 zqUjd6UQ`8cKh`8HQ~Cw@$TH|tYp3e}7t&P#S$pP2{d)0T0YGmI@#F4aEUp1}6jYv# zJc$M_DXb;dHpgll)pxHfuc{cGIWEBGd%r-RS zxciFW)&U+)2jn&|76N8VE3@_74J-vtfY}BR9^n}Ra)(q;N^kb2;r7s$X%EmIpgll) z0C}JmW>>|t(__MIonm0}Cp$#s%Oa55(6~fV4Zdg)?#=N1+GWq(<+^>otUPI% zY}3*AL5d*g(5sQ*3%BHNZS$#oplb)|D^oI#Yv%12f9w@1-A`IpJ=h|H6=}P!+jWh- zZWf=y15t;s zK9pXu%tFo0+hEN_XZ!PSirbv-GErGthTS#zp5BU~8^mL_bcq@N-GV82DZQk%vdZzh z-{#nL*tz|jAhVC$gIE0m*6|a~Ja4A<885y4oMQX!m;29<=%}6Jz3z$Po)u5UUVN9{ zzfhMIz!U3wW8g#Sffu~EV%oukMzjaHAhb|lyTWPSy5Fi{;VIXd~u~f z{oyxbb%})xqqisLwtwaN=!yESJ-Y{8aunOUyZ?h>oT07t?0OEDXstJ0Y-#SL3DRxV zT5S(`(Ah%a;JhV?C&QyvQ<5g7nP%->_wHu#QtjNn*24~-Gudz|eqqoSg`A!Wt^hwc*JCf-D*$wHmU*q15;k7JypE>{9v$!j3cLyveH~Y~4 z=re9??1)8|R3`L`ez;usl;oA0evvP_D^;k?bbFK6d9J8GS4I3q`z3wmRSdW9F3XJt(q^ggPU*5WIH6Xx8$ z{-E8b1H$L4mGcBAMv4268FbBZ!Bwy6B`vJEJ^N2yrqF+Q`HW5VuEy=tHaOe#8xVC+ z%Ov2nT}2!7)OdmHCGH&pKJ+KeoOnTR$)<#X48}ypvMNMrU-egv{Ocxnr)7?K&R@cA z7e>oMXDHE)(Y~-P{B1`7Hkg{r=uoH!$(G~W!DnkRUHBA%>9!0VaS4V5W5a{~kmJZ$ z&ah-SGwd05kQ!d+pBiH%=yYfF{oESfVJJkXKK0$LyI?I<=Q2df!QZ>O?~* z_5sp!+O~kt?fU+2;g6V;;S@c_1)f|kgE3&c{>1U~)-C>MroBDi-~d0Z&+G?7lkc?} zvTkE**YQ$|m$VUIc(0{wvhFZjtB)@NZbrC%lbfC?HT1^jEv}b_8y{-5_7bR^%)I9` zeBM%r7)|bQTcJ${&4Ro0*S!6>_MCy?;{#=}6@oiv8buz7A?N1KH`kvs#a#ZV zTS>w!9qYgklLA+*JR6!D*mKflHEq#Ktz2QEv58Wy3wz>Q5AK)S*HYBuzb3RVHQp&c z=HuuEQk->W#pfkvw;j~7M~hk8?wXG`FPeAtM4#|?6L(pv?7rGxKfvW&NdDJ=(EMB_ zIh$0akK21_I*+W>HViaYJWiH7)@GyLa>2*(o)=F9XANK#yB$8IJl!V8dc?W8AG;5= zlk>i>nC%g-QIUI0$>55fE?MeP+wx+2ucBUqGDP2ZEzs%qEXL|%QP9AsvTZ-&;zeao z1#v+lq59DLxcqEyrOfGfyhL}3d!H*)Zyyq*@zGx8CAt_F^*wcH*x`|*g38BLY%@P} zBgyggpkv1>y(T+W3hccsyh7%BIWtQSW|(=3%0gD}l4B_y*101ZVDCBQaJkCi{^g5A z*-1j9&YZH_GC!P(D?}?Q4yK=;metLFTE%*?YwGQ{imp|rR_5hQKH%b_QI@3R*=lUS zO_6Zg$>PMg)fUUMN=JE!cDao_X0f8Bf9mKjt?!7m-xg(McpOg|pD%jvEh-yyH?sWu zb@SKLhr|@UUF+SyhTo()sn3k*- zU)-nk*oTgjkB-0IbKQ9VjJb0%W50`Q&2d<$R8-t%pw)}S3Wuwk*nRd=;bHZOWvP2vtUh1vD>Pf zi%(8@xHD{Fe*c*|;p3NW7T*yt$|%}FE_~tR(fVJ%PEE3nE3%stKB(p578_;L&VStF z?_wv@^LBpT){WlFw57M`M?4;RGSTts^6C6eJHy1y*Y2@MebIjQ;`B8`Ri~(T3}~4< zN7`t{F2|v-6W^@~x79emjsLi-uCIKF8Mk!f*j7W&9}YY4rNTVIUFxW7z_a4ug)6uV z&i1<&!!e%bzi|2EE{P-7Udk){G-8qFwsomSw^CYsFk3Y)Qr|ZJn~d`y=kvB{kMqU0 zZ1CRtZ1k53W0P|xYwc9G-PaNx_a60=i* zPg_rtSKSotGSb{9Vbr(a?~eO_49QAJobxKle{R1|hf*_>J5SlVdiC=u1x%rF@!CFl z-#Oe-$8HH*duiquC3NB4usiam-RCjSZuy^-Sl74ZBUWl;i^E&@7nrM<4RAa9YLo## zZ*q$xtz#d19J`^Z)_3`k+c)AY+V|p&Uhu>6fkOAgUniw43ipqkv}{L~+tXL~ZLegU z9AtNRf9lTBPoG{4SRQ%TF3CmW(;po&*C{_0)S7H)>4Gy2D3#2A$(VuFJXIXKJ_E zb9coa?y9h!NuR@W_HAo5#eeA6g0qL^O%Nud~ zh?icy)vcArlCaB`G-zaZPZ zu<2LZYD~EQv2D-M>C?7qOZ#WvOn!B0$_jCXdAX{2Ex&wT%{ugavV3gIK?e_PdfUyO zIV_ap^F-AlC2(ufZToFAFA8s5D1E8c>734U1+6hL_jw`Lv((=m*U6l}IN7cI)_pUT zj44-J_gI&-Ldvw==VQH0H6u1zNN$a}yPUs#hvf3mxmz_W6nEdd%e%VgRFtZ3w6(<6e=HdaFDbHd%uhlTSsD8Vb z?YU)Rf?_)kcw%Ac8*2I7L0@b~*BvF2Pm9w$wGPQYFJ9D* z9Z)gubEg&IQKwp;|N6AG@ftz*N{{!uRC3ggM*bKcdx|60Bd7b7j+(`p9-3uShxwN0 zKIDx~n^WMI^>ECdD2Jd@?RU>@WQsl9#z3U*wE{3Qm>xw9s3!5 zcaZI<{U+~N&_nf%+s0CB$0VBwb6O5Do<8KQ{)YDKY4=16^|iAWo%vW0KGtu-b32El zww{+x=AT*WJI|u%!o=McudaRCvedNy&BOYuQyfCxpN_cF>9lpLu2%NRd%q@|hZ!F) zyEn9SuJNmnowkL$tr&CinPYEjD~02e*2foE^tH2+O`5U5m0NtzG&3S#@YfqhJKwJK z2_G_C<$$cm3`bkZl2*=ZTOEAfd)#QFgs&q{jyo7RFT(8ML*}(R)+%Dx3BkpzO*lD<&B=)wN{$;;T9YESedTMJiQ{~#ig5mv*gxZ z&E&6imVf_dZM#`{b}2t*ey~`U!#Q%J!2kWE4V*-)WBnqu?R>=Fs#W1Z5BBMKIb{aALBzxes*C-+aS zIH$F9~`?X8m%#vco!*pHO#rbt{J9+kc*~94> zlayLltaTEcK4B7lN4|B>wK7`Iqn197|t2~$g&^ThTXvxShV^8;w z?{QwXB|FAelU zN!x;XDF+W8{Hi>tOuFsMD|>bqmgVN;Y!}_SU~)dO$05=V)XygLB2o&zOYi%x+5O9r z=N}Ri_s6HkF=w4qAzR33xidSq)2Q!v)L*wNEq0SPeqG|Z<#-i49jnx0%=~W`W-5ek z7pyNT^%&6CZ>*L5d=u2l8T~HJU7oOd&-`|Fk5f{NE+)MeJL3I=*Sp_^Rr{_vrT2aJ zIoV4oUfEmwv$sm6>RSyR&yr6`PVE$*9G}NZ<=s>|zGqCoF8jXiy;UOjH9h*|(}aWs zuPERmA=L(zWxtF%NEkxp1bW>QlKebXjy)#7#9I#OAwpYqZ()1vye-rJ9RTXXc&Y1wVAU+rOLxSn;O%{HCrf@R+& zJUs3c9+4byXx;9S5k~GQzE6|HzdY$a&`kNAT!2vvS*FL-oC(qU_wTVk{UpXM>-pJ0 zt;hZJCHF@p8NBgS6>XDb?0J_hfai6m$ts;H`Un#jE&J+Vp&fjz*hY zdoS`{5xuGRYhRl&g33YKpM1woOr4OI?)|3h)m^?xYD#qU%2yg5dp?~ho*yq~c1bQk z&_nsw*Q=k}TE$JYP*IyT+tFEV?97<&4;L8_{p~B6AlzoWEBfh*cFX;Fv-4&tI(kO8 zf9+_eupqi*ea>^kqEq1tHy@eEsP;;_J0ntRPHLFQ)Bc1~gxJ?CKhHDFv=yT!em-G; zW9F(oheP;VryYFWd2(7}&+^0Pj(pl6xZ0E1`Ru*nQ@r91b^1{{UGKTujzK!Iqu%Zv zVs<{o*eAsOUjUH#e?UPdNH8=m}#mjzAp0x8H zc4p1K=>y4!DYndsz3?IJ3`b@pYo*dA_tV91j!2uG zUH!akLf{^G#%cXc%!yB2t=beQJ+SO|V`-lJ3svK^h=Lt+%933)`Y7H=3EB5BGS986 z>X!iZhjV;KhUf4#X;SuuA*LH1t!l5arsvL< z=yAj|VA)P3TSdj&2QH~pB%Yl!aMVL)a)!z@!>4^esA%XE8NXZ~v+L4gL*8tjvRPOw z*|1qTTRq*{Z%8&z(N|L#$2Dnta;BzM{Gizf9gTR4o=L{~2~!m{FJ1_|xOChX=EVYi zYlUrJrdV_zpC7owFn-_n4r91I%m%pFv`=d*$-O`M&H9}Ww!HZ8dO~+c*Xsj}rf?Q? zA7gz{(MS2a!Kwk^?jiQM$KGFauKaSeB=}NBL|EFUpfwBl$#X&nJX^ln(pV{NL1u#H zxK`cw=N2xNF3{+&WO(D~%yzGOoDWpW_n9~3>)3?C7bhRD$`NZ5V4HNsWvB9RsjHH$ z@|~>PuX!?crT50AfiL{|D`h6%4gXXgXfdLzV%nk0;X4;S`L-crGX4eEpd%ogZ?O-p-7A2Duv~^~Q3KQ(j#!f5<3bK*%?#YhpZsX%QX+pmZc@nNY zdQ3`w)=9lw!?xp{{fnPywGZ0*d{_4lW52vG4+&S@J;Z(A)0DIYH!Y^hJzH=q-QVw_ z-pE6<`NOl9_2t+}k7C+(+%@xH|C3*r^vrj)*LmP#?rWs&{LsE*+m+5Q?K_svIiNIA zAhTX(_^ad-GiePt91u47zpHtL*jT3v(ZdzPL8PM;X;K74Dbhg&MFpfOf&wa{(z{{<1OaI_kSbCX zUKZ*(=bn52e|X>h-y7q-VaE7Yva&Mg%$`YR=E_RI!$ZDEe=FXXCsgF^NYfeh3#&Q# zj3?N+4;OK1Ug0vkY~P(cFnW%IZ>6~T@$!Ac#k~xU`G%Epl+rpzajKp175-xsHcu|4 zl}Fv!lFKBWso`tr%cxy<)^_!1BsKXpmi|rqHY^J_o*G{wr*I(Rx!YnCl_OLaa53FU zIcBqb`L5kh>G*rc!U#`KuX=tRyVLeWG`05}=LR?5j_Es>Y`o~Tr8P3EAJ3i=J~TL) z-to>f)1<{uG0s@Jn&a6i z9>HHQXDXOooSdCiFYw{GvA(I5#pl?zgA&)Jg;Q>Lx!uWOkP|cGxT!H6Y99WGU+1ez zB%3Ouvu7Ld3ZbFCGB#E!_m9+YW_wSUha5Qf@$>gJT<Nx4WZipO@J0xO1Z7 z!eqtldBup(#rgIn?)0jdgevEfO`oV9eKn=76Hpo@6~FgRII(JWWc>Jar9SC2k%GWM zyGSvim3ecA`3>2b)r$2TPQfay60Ub+S6hzJZ>!L`RGup*aiQWb0Rf# zsRcVzn)^c>#8_-#3VP&x`C-X*P8tZo~F7$(4vwexuzd4I+>QYn%X@F)FRA4}bKbYAe#nnZsH#{q zZQ+_(&VHw*hP;l1@k1Y zY54B&aJdrZnC_nt)n<`6wo`k;j3nz(54Y6i;S9QFhNHf&pWk&{9*<`bDVqx*Gc$ij zS!Ymkh^tWF;MPDqiMv2GAmwXs<^B(Cw3fj`g>JloD`Nlt`qR%lWD`!z})%2z-^Zs_4 zdXoo5&nRx}@eS~>dor8HqDCFS5iEZ``zoU;nUrid@SQJ zuCnanRU!cso@ouf()`vMnRJ>!;d8OL6*k@&8O8KI3-;~_|MP88BKBYUDLQwI+BZ$~ zC%(KWIgq*6sXU%|_?|+3yX%`r{qKi@cy?cS{K&z<<#FGMC4*UAi{+YWmR|DO z#$_?DUYmKw+2)Akk_j!QlKQRq0l)z& zZY_jJ7Fv2Rg=tlm4T>fm8S+zA_UiQu*I_gwpHN2aQ1UYVIpb|E-08LfS~=4_JP+wn zhba1D;X^bT9Xee0rB3gK5&2GSf{2KfwekwjrLX^-RWg|y8kvG(Y`Fr?pKeo{XEpk! z=!)k|Y>SfHcBWD;)8CpyMOSWqP-ZwZflo0j(tZC)hO0t`S;|-Z`F1`E47~bf>+0Z> zo{3{`WH^tD=5fzarPlNhX*bjm-HNul;OMnj z>*e=JGLPguo4+WFZ(&1nfp4p9gwB$qr07d6(|J0_&r=z;oHld?wiz=HwVa%78fQnB zCiu@-4KI~~750&ZBb^0Cr*f1(yFNUCG^`qnc$M98DXK$XpQJ8@({9zOd0Yb!pYsMA4$eydvfj4}a$H zS6in|ObUT~M~XrhG({9EADqAMwZ+y}L)?zokce=Py-CxrM^7_1QYWVElT|WR?yV`G zts>$p2R#dFDZ^;+3nsma#jZECcuzUpOlF?EaNf=_%fHpFZh)?DD4# zD^cBI2h{k*`-<5N+rKQBzIP`_%6FG9Fro}Qg2}D)>b0;J)fIj}^qDtQLo~CrcU4++ zkH@VE{|_r+FMZiqw;YrajcaNX-&nDY0w)yEGxR9DsWXHn-TG8~wPAnGlM*ABVh@Mr zz@!4}*sNu4*-pdmZVq~b0}C8sMhy(ORPu>}GLP}HGim3td_T+x6-4P&9Q{(nb^ zXPc&|J}JRXamPv}OLMl~d+U~EEY{1J(9_+2N~@mlqHQ#bW7}Y4n;_Z8q)+McAKM?F zQ;2-7%Ppmtl{s5lztVWM@8TOTL(ksl(M>&Ct76t@ScU8J;1fMoM~nXHmgNw!&JviU%4Z#S_e=d$zB6;u+Gvc~YmIti-Yd^HV!iPdYe@oO^Gjc}{70G|}kn>7lI$(@YN~ zM-qA$H)mfeIZfNvCEn=}l9F4N`*M!FtZ&v_LK~L=bt~ugIS-t0=A9B?b^qkq?DXJ6 z!CKlB>Gp;Dn5mnp9vo^AtudeIQ{)Spc-^<(GLg5Y;_cS(M~;IojhfNXmhaUg;?DNH zF%Ob>CAY_>E;^Y)NmJPV?gataHCYC(!)2#L3@Z8Jf~6^UduP`TccfWrWnK*yPj3mc ze!T34&rf|T9zQa{_xxb*R*yimU|lD0X4O?cbGXdry+-lfU~a5W_*wQA@e^zmlLT(_ z9e5TN`<3;c3cXGKu4vm@YX)zW6mO>r_%@?^ z)~@ra1X;P`TNfg24Xwz?-=;svpS$~Ydre2po>6CoD@nulO=F^gMUSc8=2#j^DR!Qs z)DgVhU^EbYxtg6vb}id@qM`hAF5%^k!i+7pl9g6vZSpDEhBxMfw-eLv%}}*ozEbtt zEq6j>trh=Gd&V%$@Z>&|*$+DOpmF5>OYiy6lsi%H3m44O$C+;);9aFCJY>n=W3DF9 zQqeeab!t9xKN@CJdrkN97{q+HVsS%(8trk_)L$>>KSO;b>(B>@Opa*#`cXwKrQ>_A zz{Z8hn}*!`?>`?D9XQ3b%JYPViAwU!@Uem08<}cShbJwT!=pKKSPDh5QkYn?a{MYv z%cn~Y+;UxUYU-+Do))_CET{AI*ko&P^GD5OLh0$nE7LPA#jHB3?PKdY z1Xb#3XeVgWy%a*^HbrfAS>rA3(@U!6!^w~E2`TA1AJkpAccAjk!er>JX>BgEz~VjL zi$Odz(s_|u6RpM;vjz8ulE~zA%nnpM)uIghhPi9|t$II_2pQiK3^1ynp^JLg>@=h7 zFC5$?L`fYXnx`epa+uVJ)NNaMO-znF?L-PaP8{(DBX8L-l@UBqCU7G?W{`PW&evRvM!SqkD6*tn7eK4 zs>w~NSc}wS>E-%2$S$Dgli3?-!w zR1x8vH#0^=v+c${rH)m-sovgJvB}O-_R4ErGuZ)WaqpI4fx{zrO%5!C$Q2gm(hXq) zLZrmiwKZ4qPGhI5(W?W7_P#e*hNbsFj$?IuKa$PI7 z{&1AqD3e;dYb`49Rg6WI8y-KXV^vCT+S}YQP};r}POY=?G4(yooz?%MNz8ay>Rha?mi^ovZJxB~74WD=i&iq1j{7 z=*`K`W=T6{?;+{;F889vQ2{<_!nw$|-L6|^{1;!IEA5D(*8fIRs8PYy;6+nHHlTU+ z!R3<6)~DadQCbd`HovZ|$h+@K?Va?_UQOpir*+kYWczb|d7FCe@ap2tY0F;~PS_|r z)S0yruF~&$>$b^ZV}Vn(qa+ijhVEGx%lqz>daU}@&*_(wKg$KOUCLK2eOMm<>ftN3 z#^5$)-G;B?Dnyy;yz7pvK3)PQg@X1d-dLu(c>ITl_F6UB)%oznAoMT%h8cPJtC`ni)FM% zV#ma%d!D_eSu!c}Dm994r}5jNf`22y%gM7j`D^tWqg^+8x+mRCrnyuxa%6;8cPp zAFE1Fa9*X#uNhSwgr;XTJ5E^B@@T~rv}@5Se_;%#u{fgCQuk+A=DU|C7P zRCWQS4L`0`V&%*Qv+dWMuos~F9X@6aJ>>z47q(=(`4{G>sVOfJxL(CxTdfwyoRJT~ z3qE>tZ|2P!SQIYYG1zrH4jUMzdoOm&_eMW)8cPo*FTb=r9YEi6bctSZ@&15RQT78- z+>xoK^ah*TtA*I)=8?eq(m09VQ@+vTlTTalo#!`H4-pfMNzE4Cj{5MGig!9gn2oE0 zdn-o?T@@8BDB0(>&}_KegCon^u}4{CVFX$PPXw&a zK?vB+Lu?BnJpxugW`q<3wEqw;AkZOPMc9N;jKG9&3xNiq8Uf?of`HX%1S#&P{?P6E zZ^ZcjRR;w>emm_Js&yGyIZPH7{vLB8;aI&f05!V7gkS=&EtefbZ&8!I8~cMh%KL>7 zg`-7#If>A3LpwYFDF0{bkF4K`-x~Nor~zGoLo;hQ&;@F&^O4S@3mI_YrSN<3TKHY) zs(|vb4$lp0x=gT7mlzBYY_y5+w&>nXn-zZ);TXa{S5p;KlxNp+KozL5fxaFX5qA~D zSqU$_epSG8gEn3nFOOHptD>|dk}Zdq#A_m81m@tZJhxVk;y-!N{-uVJ_DYmJ0S)nOFG+!jlGycof&}H*V%fO$F)j`+%JXZFK>WKITCW`?aNxJE*Fy!r z8*x*??^v(LUoBlB;(%;5J4UdE0v5|5$RoHRL?PTmc#g0c84Y#>4uqWurU-Eec?eAi zLkPTxxg)}11ZRXWgb0K(gf@gJ1ac%(6hQ;wECOb~iV-r9478p5dk94lhVOyszj^lG z(fxk*ul4y`FaM!lP*?v;{|xPXqN*z(*p4{)-$jpDnckG0*Yyj!QTV! z$I%tc-@#@Bth_3Ue;#QeLiw=a`;ivRyLx~G&_Np}=Esp1JTcZJyNQX`D@(tAKxO?g z%KbqM$52KfLJ9gUHxWJ{Od{4Dp=y#F-oKh5}0v;C8f1kwE!C8(xY&9QDYhA~5-807^ZpLi0@9S*KUAkBz_ zLQWiz%iv&)6c1huczCu458ZU6V8KiZGwh_$PE7{9GGx%BK?a2<$l&7<3h3QN39rp5 z;U+Z|yw#_IT`p8myO{Mi*dZLU+yqDb8GwH;BjEKJAsd1103(!n zFu}8rh%jab150LLWn_W1tt{}Izykfkn}IW6Gi0){f#x1I2qa~P zk9O=J#>WAowj59;#0eBQF4$nn4a-!#5M#v)bqaj&)SeHz?FE1tF9@2Hg5a(p2xrX% zA(2xErieu0`aV%8ClLcZ9WfZu6NBxZ;&7W<0=ShVV2Vr<>;xs@u%jg0*eC_P{4#Jt zZ5yz%%7UVgEIiVd178z4czjGAYFQP)MM(kd2?|i7xC53?>;RrEiZCan2u-$%;HSI` zG>`8Bd0`a@)ldOtUR9XXPz6pZHK^fM1OH$(7^hVSr66?>q}6~H1r4}uuK^6sT5yL& z8;&YzLx!>rOdinzjiWl?`7{D1p>{cV-CozUb5o2&yGl8AXrXcBS z3Oqb!5J5mm7BIBY5+)oh;T(+>kZrVrGNuDyw)X(A zlUaj>mNiUST0;nn4J69hz)*+{ydXLRV#M~~=W7q&R2)Fr(E-}&2ykr&0rtu{!mOer zlsh`Xi=e|$CgKcZfzGg(_XwQWdIa=$yMX!*SE%0T1}P?PAh+KQ!W=vyAlM7~$h<*_ z(HpEp5Co4xir7)OuW$?mw0z)*nGb9T^a0!+Ux?E2gFbeDIBx9^CveB1(EK{>ITTJF427Z-p+G_!22NaI zaNj=+hH&AqX=?P?C@7bW0ebG!@L2vdh|-*aIWGjJI1puygX27L z;JzacMVp9oP~FRXF-}P5mv<#;Q(h6lpaU|ch@91@1F!WO_QOQ zECp`KGKYM~ z4$6lP(`yjpbq&~A3t*bN07y*>Ac3?H`XmbBZeSrqN)-XUZV~i(7Q;^E68OM#9gKLd z!zr2TfS0=t2W+oHw$=?0-gg5$4N9SlPzuUNO5uxZDX@~u<0Hw5>-QvSv8aqs-f_34P3!J zgvt$%V2P*}gam7$U!)e6_te5}s0U7=dcaXOfZ2uyxG2#GFQpsdm0ly1c{W0=ZWCw| zn!t~$8EzhIhIU*F2ynN+Yt0t8zoiwb+*^Tgs10N|+hIE=39qWc>(jK6q z>VcAwUNB{R1a=o?U@8-Y=Q5ir7yg1i1GRQr#Dwd5F-GmnFl)?47vdpgz?AA}& z0>}uiOQ#~mXB9tub0}!L5Oxl!02!wjIOZ=*qYyW_X!Wg$btBKE|!A@FJf4C z;(kj0p8NayYZ}NUb;sXA>yu$&(%b%#0()=A@Sg>Ynx+f z^652N)bhK(uaBZ-ixdA9zOMp(Uwi(O3zk}2+xU+e=>3QeuZG`-R!UUyV!(~oPGnG8 z39anlfd#GbNTSr=NPgcU4G@9ax`pwCeP|RP`L}hlaoy6P7W@%@g#q@G=JhKDf3eI@ z*;xFGB>$tu{$G|)1gmSr=#L>_zk!tE`-pz{T|1gwD6aqXVQyk+4G{m~648O_QG)kTw0=yE@}_Ej z%E0FAe;rJbuR=g`KlZ;A8IaGi{f}aFf3do@SHJAav% z3i__+3F^p0Ifj6JsryHcMjp0q&hAeC21m>nvqhejGxElq);XI0LmmGZBB1=swbVo0 z?2!gNkPbb-5!Ds_%@VNu2Tcn7_@;o(W@x?T->C85DY4}&eQ3_p2g!VW$UwlpM*f@_ zf44tU$GV4##s3_BxBuUD@_YRM)kggu|G(}3`o5Uo_8+-|f6nE<=l}oOgZe%H|8-9J wv(NnY|9 Date: Thu, 8 Oct 2020 19:07:23 +0400 Subject: [PATCH 3/4] Optimized code(again), TXLib added to resources, and compiling is in new thread now --- .gitignore | 380 +- .../.vs/WindowsFormsApplication1/v16/.suo | Bin 32768 -> 57344 bytes .../WindowsFormsApplication1/CompileForm.cs | 52 +- .../WindowsFormsApplication1/MainForm.cs | 138 +- .../WindowsFormsApplication1/Pictures/KOT.jpg | Bin 10275 -> 0 bytes .../Debug/kartinka.bmp => Pictures/cat.bmp} | Bin 150858 -> 150858 bytes .../Properties/Resources.Designer.cs | 17 +- .../Properties/Resources.resx | 17 +- .../{bin/Debug => }/TXLib.h | 16998 ++++++++-------- .../WindowsFormsApplication1.csproj | 3 + .../Debug/WindowsFormsApplication1.exe.config | 3 + .../bin/Debug/WindowsFormsApplication1.pdb | Bin 0 -> 58880 bytes .../bin/Debug/kartinka.jpg | Bin 10275 -> 0 bytes ...ework,Version=v4.6.1.AssemblyAttributes.cs | 4 + .../DesignTimeResolveAssemblyReferences.cache | Bin 0 -> 823 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 7535 bytes ...owsFormsApplication1.CompileForm.resources | Bin 0 -> 180 bytes ...indowsFormsApplication1.MainForm.resources | Bin 0 -> 180 bytes ...pplication1.Properties.Resources.resources | Bin 0 -> 415791 bytes ...pplication1.csproj.CoreCompileInputs.cache | 1 + ...msApplication1.csproj.FileListAbsolute.txt | 11 + ...Application1.csproj.GenerateResource.cache | Bin 0 -> 1079 bytes ...Application1.csprojAssemblyReference.cache | Bin 0 -> 2388 bytes .../obj/Debug/WindowsFormsApplication1.pdb | Bin 0 -> 58880 bytes 24 files changed, 9005 insertions(+), 8619 deletions(-) delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/Pictures/KOT.jpg rename WindowsFormsApplication1/WindowsFormsApplication1/{bin/Debug/kartinka.bmp => Pictures/cat.bmp} (66%) rename WindowsFormsApplication1/WindowsFormsApplication1/{bin/Debug => }/TXLib.h (97%) create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe.config create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.pdb delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/kartinka.jpg create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/.NETFramework,Version=v4.6.1.AssemblyAttributes.cs create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/DesignTimeResolveAssemblyReferences.cache create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.CompileForm.resources create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.MainForm.resources create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.Properties.Resources.resources create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.CoreCompileInputs.cache create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.FileListAbsolute.txt create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.GenerateResource.cache create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csprojAssemblyReference.cache create mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.pdb diff --git a/.gitignore b/.gitignore index 259148f..1ee5385 100644 --- a/.gitignore +++ b/.gitignore @@ -1,32 +1,362 @@ -# Prerequisites -*.d +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore -# Compiled Object files -*.slo -*.lo -*.o +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta *.obj - -# Precompiled Headers -*.gch +*.iobj *.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc -# Compiled Dynamic libraries -*.so -*.dylib -*.dll +# Chutzpah Test files +_Chutzpah* -# Fortran module files -*.mod -*.smod +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb -# Compiled Static libraries -*.lai -*.la -*.a -*.lib +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap -# Executables -*.exe -*.out -*.app +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd diff --git a/WindowsFormsApplication1/.vs/WindowsFormsApplication1/v16/.suo b/WindowsFormsApplication1/.vs/WindowsFormsApplication1/v16/.suo index beb2b32b256cebe253ba3e57f82b6614b07e04b3..7753833fbb9f67b8fccc22f1f008a24dd197ba05 100644 GIT binary patch literal 57344 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 delta 2807 zcmd5;YfMyE5WeSf7w(k>SzUPuF3Uq*a0M2YmproaQXaC4P^C@NXi?j(4~Xs-N{Fm& zVrkSCcbc?mwKcU#Yno{Fwk9=-i=wd_MU-mN8v8QwN3B`|RcwXM92OOuK1~1gB;THy zIdkUBoHH|fJ-z^sN9;7mG2x*RCJ0f;1|WtI+LaW%y?!cf}D@{fLIPy*G2Dk&-HI>NThM|C&?Ruml5onT+aHMqz+Cb+_ z!g(Sh1c5FH3L+LU4KWol1rdbEK#)ES1JV(QPz3SO{+VbRGyS{?eR|)Nq_HBO52sDh zI<0@D0OvwP+}@fX_8`2QuRilQ;RQwW@W$Mtqbby21j#7W2?z?6*5ds$(PNhorH9^4^znO>X1Ar0jm5)`vAnre0bKNmIJMHq^%lxL%#l)F5(C&3+KmnnV8 ze=b_A4#otC;&ut{8rHLHcqz6*;mJ=4NE(`BNEl&gN(CIXTEG>)87@X7!FLhS&=Zl5 zvymfBlsJFf7Xv$-R@E`%Q|8r|$dn|RepBGmJ7hC5ls#ly9nfo;*IKMFDhK(#n$^RC zVbE%qsb*9BVm1NXne7@Xwn%bEVU#RbFWl5WIp#H&NVJt66P-GqkU1Z`3HEugvp_mavKp8K=LcDs`6q~tMXAlW{8QL`L!5(=rBDAvG_kqBpS zH?=j8BGn4enzo)*!BASIOdTWLuLv#+w-Bu1TKIzoM&e5ORZOINL1z7v(EKe2B4T1PfgR3_BOpgTPZRYM^o z12SCsC^z^(V!yVbl{x-z1estyG}Ef)IF>hnXZ6gw$l2BBS~StLa3P z4Vk%q!C2v!B45TgnKh=cMgG-#{|w7Ci4xzxImre6hs@AakqD0dCh+w6z*dkAp59;> z?k&&>EpHx>Cqlv=-Qdtu_P+3b2(y(#WBN+iH75c(3!`4YK77G}{DK9zo3{}>Z8CJ^w}foRx}-}C#Q%?-{KA_HUPIFcFxc|` zoeyO$Rs!xayDXv|YR~+Qi(wE&)S0P6b5Rkv=h>mhnx>`R7f(Mp{?l83P$GJ(6Cp9# zC{t}dUV+4n76|v^Pj8@xwcNyhQVd5$>_Iu>+XxI)kJj^pQm|i%uWh_KvuwZf``>>` zD!O5^zVeB&*AQ|ospxa{3wxEUtZ29bcO4s95p1X_mg%#ibU|4i^hKmXnyB%H<55;i z;Bk~EGcNtBj`v6h^e&X8(&AbNENQcXuO<>o+DsrhBJqv&2%CS_gKec*_3e%ifoBgI z8H1Wbc(5}xi2t+TJIpoas-A=U*wiwiQCKUi#y;2}tP{4Pr<5W1r6WLlmz9aIp(|b7 zCPH`DnQ0BEyIN=xoWd$$xv*l~&OBIJVPQJ>tm|8Nxyu4S_zdudFI&04!P~tkc_D6V zKsbdL@pqX}%I7tL3(IY-@Ekf|M5AuxRZn-bs636*<#=G@z8)Q89bh?;qQ%xW`b~xt zEIFJS)QslVpu0J~S>bfiX^TmK)*FRpv`A_joU!DPT;EIm5(Qg)(Xh{_SMUphBy$C@ zT`=L7O0AHyLVslVh@tAk?aOw*Ww?=BC7e9~o(n$cKJ^WI1wA+e%E>HMcT8lVcp9S< zX*g}LH9Hk-$Ih$iUsj4bYBZzc&f&#KtX5w?rAoSvF@3@4^CF!GTe34~7u5HeRNJ{3 zqH%IhZO^PtRoWk0E_YT)S8v^ZzV@Bp!tYg-Ul%nIy(ep6W7eEU+Y0Qhm;#-7F>2Gr nP7yktli;jzlA3t=5(Cr1 { textBox2.AppendText("Готово!" + Environment.NewLine); })); + } + private void CompilerOutputHandler(object sendingProcess, DataReceivedEventArgs outputLine) { - textBox2.Invoke(new Action(() => { textBox2.Text += (outputLine.Data + Environment.NewLine); })); + textBox2.Invoke(new Action(() => { textBox2.AppendText(outputLine.Data + Environment.NewLine); })); } } } diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.cs b/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.cs index 73f8d48..9039333 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.cs +++ b/WindowsFormsApplication1/WindowsFormsApplication1/MainForm.cs @@ -239,78 +239,86 @@ namespace WindowsFormsApplication1 if (saveFileDialog1.ShowDialog() == DialogResult.OK) { - mainFilename = saveFileDialog1.FileName; - - //Adding TXLibrary and pictures - File.Copy("TXLib.h", Path.GetDirectoryName(mainFilename) + "\\TXLib.h", true); - string dir_path = Path.GetDirectoryName(mainFilename) + "\\Pictures"; - if (!Directory.Exists(dir_path)) + try { - Directory.CreateDirectory(dir_path); - } + mainFilename = saveFileDialog1.FileName; - if (addressBackground != dir_path + "\\" + Path.GetFileName(addressBackground)) - { - File.Copy(addressBackground, dir_path + "\\" + Path.GetFileName(addressBackground), true); - } - - Files.CreateStruct(mainFilename); - Files.OpenMain(mainFilename, PictureBoxBackground, addressBackground); - - for (int nomer = 0; nomer < nomerPersa; nomer++) - { - File.Copy(persons[nomer].address, dir_path + "\\" + Path.GetFileName(persons[nomer].address), true); + //Adding TXLibrary and pictures + File.WriteAllText(Path.GetDirectoryName(mainFilename) + "\\TXLib.h", Properties.Resources.TXLib); + string dir_path = Path.GetDirectoryName(mainFilename) + "\\Pictures"; + if (!Directory.Exists(dir_path)) + { + Directory.CreateDirectory(dir_path); + } - if (dir_path == dir_path + "\\" + Path.GetFileName(persons[nomer].address)) + if (addressBackground != dir_path + "\\" + Path.GetFileName(addressBackground)) + { + File.Copy(addressBackground, dir_path + "\\" + Path.GetFileName(addressBackground), true); + } + + Files.CreateStruct(mainFilename); + Files.OpenMain(mainFilename, PictureBoxBackground, addressBackground); + + for (int nomer = 0; nomer < nomerPersa; nomer++) { File.Copy(persons[nomer].address, dir_path + "\\" + Path.GetFileName(persons[nomer].address), true); + + if (dir_path == dir_path + "\\" + Path.GetFileName(persons[nomer].address)) + { + File.Copy(persons[nomer].address, dir_path + "\\" + Path.GetFileName(persons[nomer].address), true); + } + + if (persons[nomer].moveside == "Прямо") + { + Line.CreatePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); + } + else if (persons[nomer].moveside == "Волнами") + { + Sinus.CreatePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); + } + else if (persons[nomer].moveside == "Кругами") + { + Circle.CreatePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); + } + else if (persons[nomer].moveside == "Диагонально") + { + Line.CreatePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); + } } - if (persons[nomer].moveside == "Прямо") + Files.OpenWhile(mainFilename, maxTime); + + for (int nomer = 0; nomer < nomerPersa; nomer++) { - Line.CreatePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); - } - else if (persons[nomer].moveside == "Волнами") - { - Sinus.CreatePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); - } - else if (persons[nomer].moveside == "Кругами") - { - Circle.CreatePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); - } - else if (persons[nomer].moveside == "Диагонально") - { - Line.CreatePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); + if (persons[nomer].moveside == "Прямо") + { + Line.MovePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); + } + else if (persons[nomer].moveside == "Волнами") + { + Sinus.MovePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); + } + else if (persons[nomer].moveside == "Кругами") + { + Circle.MovePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); + } + else if (persons[nomer].moveside == "Диагонально") + { + Line.MovePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); + } } + + Files.CloseWhile(mainFilename); + DeletePics(mainFilename, nomerPersa); + Files.Ending(mainFilename, checkBox1.Checked); + + MessageBox.Show("Готово!"); } - - Files.OpenWhile(mainFilename, maxTime); - - for (int nomer = 0; nomer < nomerPersa; nomer++) + catch (Exception ex) { - if (persons[nomer].moveside == "Прямо") - { - Line.MovePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); - } - else if (persons[nomer].moveside == "Волнами") - { - Sinus.MovePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); - } - else if (persons[nomer].moveside == "Кругами") - { - Circle.MovePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); - } - else if (persons[nomer].moveside == "Диагонально") - { - Line.MovePerson(mainFilename, Person.PersonName(nomer), persons[nomer]); - } + _ = MessageBox.Show("Произошла ошибка!\n" + ex.Message, "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); } - - Files.CloseWhile(mainFilename); - DeletePics(mainFilename, nomerPersa); - Files.Ending(mainFilename, checkBox1.Checked); - - MessageBox.Show("Готово!"); } } @@ -344,11 +352,11 @@ namespace WindowsFormsApplication1 private void Char_Info_Click(object sender, EventArgs e) { - this.leftPanel.Controls.Remove(persons[nomerPersa - 1].l1); - this.leftPanel.Controls.Remove(persons[nomerPersa - 1].l2); - this.leftPanel.Controls.Remove(persons[nomerPersa - 1].l3); - this.leftPanel.Controls.Remove(persons[nomerPersa - 1].b1); - this.leftPanel.Controls.Remove(persons[nomerPersa - 1].b2); + leftPanel.Controls.Remove(persons[nomerPersa - 1].l1); + leftPanel.Controls.Remove(persons[nomerPersa - 1].l2); + leftPanel.Controls.Remove(persons[nomerPersa - 1].l3); + leftPanel.Controls.Remove(persons[nomerPersa - 1].b1); + leftPanel.Controls.Remove(persons[nomerPersa - 1].b2); nomerPersa--; yPersa -= 30; } diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/Pictures/KOT.jpg b/WindowsFormsApplication1/WindowsFormsApplication1/Pictures/KOT.jpg deleted file mode 100644 index ae67eb70f1ad8b12f4ccf763e65b0a13201cfcf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10275 zcmV+;DBRco*#F=F5K2Z#MgRc;000310RRC1+W>?B2?hrf6A~2@6B8B{6&D#A7Z(>8 z7#bQE7#$cG7Z(^B7#SEHC?FUbB^?+SAu%B(DJw26E*Bs(I5RCbC@n540SXEV4Gj(( z5DyzIB_Aa>H!U+ZH!UqSH8(dcH7z$cH#ILeEjThOEiE@UFf}eMD=jNHEj2AJE-y7T zH8w3aH~+u@5eNXW0UQGXA^-vr0Rs^M|HJ?s000640|5a5000000000000jmE1ONgD z0SN!Z07wu30RjXA1P25M1qTEI0{{R40ucZM1R(_yF+ovbaRw72GJ%nyvBA;s2Qxxa zVshaWBZ88mQ*)ED!qV{;HA90mV--YH|HJ?q0RaF50RaI30000000000000351p)>G z|HJ?!5di=K0s;a71Oos700000000330|XHg1tBpqQE{;oBtie$01N{G00I#M5dc2` zW$8CTy7hvf01eJ7V?7X;`v+D4vdM5bM@X+kRI8*4r&3w=z_Na&i`dk+& zWaclUfI;z3x*9NCEE3&PLam#3gYARVlroaVD=G(PQU~=g_Q8N9By9(IO21eDb&}Aw zKq^QUidYU1)8$Q1bt?skxOD;#CmsY50oYn@ z8(lfJ4O6J&{{Rrv(G@yVu|mL+sBvNj#{Rkkzc<nit(HF4=fy?dmj(^pejO~~L=WgJAK!71RDVc{<3%XS;e6lMlzouj%O-=0% zv(zNZUTcYoP-FJ95UXx%t#P)2^?cff6jCg<|2&_jPkmzq^fv2L=SZ~$)z%m?(C zSd^AI_7QGw0T6eh^<7m=yOt?Zf0-(7ZvL;$q8JkqwJ_ZhQ5c=0=*3;P*uCm;K2jh$gQEl@D2~@7Vzp&yy!jT zpD^q|<*14^LnDnGc@X~qrwM<)GNq861d`${klioWJ4`glz;HbluMi{=SGNsE3LPmv2 zNGjS&ly+&R_)f*B=BKhMDC7t3%UN27H6#-LA^|fHLWR@*y zg%g=e{6Qpx#mS1J4Lapl&w+pv6BcREUJcUW1cGvq8+iCcqXn49DhqQD;x<4Jmo(_- z&L+faGXZ@xh!spz!0sk1%u3sb4Lu+sS{8O6o^cpMYC!RLvnonYc#+6Iq*#+jAnQDi za{dc26a>ZvzgVoLL3*q;BfB ihje5IJ=B-^v5+8kue*NoeelVr=3(aRJZq{*M)s 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 diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/kartinka.bmp b/WindowsFormsApplication1/WindowsFormsApplication1/Pictures/cat.bmp similarity index 66% rename from WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/kartinka.bmp rename to WindowsFormsApplication1/WindowsFormsApplication1/Pictures/cat.bmp index 3ca76a04e2485bc140ce9bf648c995db4377b40f..24731f368065b6affbe20dadce6787557235a230 100644 GIT binary patch delta 9673 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 Bshj`+ diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/Properties/Resources.Designer.cs b/WindowsFormsApplication1/WindowsFormsApplication1/Properties/Resources.Designer.cs index bb5f151..f44f974 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/Properties/Resources.Designer.cs +++ b/WindowsFormsApplication1/WindowsFormsApplication1/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace WindowsFormsApplication1.Properties { // с помощью такого средства, как ResGen или Visual Studio. // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen // с параметром /str или перестройте свой проект VS. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -59,5 +59,20 @@ namespace WindowsFormsApplication1.Properties { resourceCulture = value; } } + + ///

+ /// Ищет локализованную строку, похожую на //================================================================================================================= + ///// [These sections are for folding control in Code::Blocks] + /////{ [Best viewed with "Fold all on file open" option enabled] [best screen width is 115 chars] + /////================================================================================================================= + /////! + /////! @file TXLib.h + /////! @brief Библиотека Тупого Художника (The Dumb Artist Libr [остаток строки не уместился]";. + /// + internal static string TXLib { + get { + return ResourceManager.GetString("TXLib", resourceCulture); + } + } } } diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/Properties/Resources.resx b/WindowsFormsApplication1/WindowsFormsApplication1/Properties/Resources.resx index ffecec8..a688e92 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/Properties/Resources.resx +++ b/WindowsFormsApplication1/WindowsFormsApplication1/Properties/Resources.resx @@ -46,7 +46,7 @@ mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with - : System.Serialization.Formatters.Binary.BinaryFormatter + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 @@ -60,6 +60,7 @@ : and then encoded with base64 encoding. --> + @@ -68,9 +69,10 @@ - + + @@ -85,9 +87,10 @@ - + + @@ -109,9 +112,13 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\TXLib.h;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;windows-1251 + \ No newline at end of file diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/TXLib.h b/WindowsFormsApplication1/WindowsFormsApplication1/TXLib.h similarity index 97% rename from WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/TXLib.h rename to WindowsFormsApplication1/WindowsFormsApplication1/TXLib.h index 7142542..b54383f 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/TXLib.h +++ b/WindowsFormsApplication1/WindowsFormsApplication1/TXLib.h @@ -1,8499 +1,8499 @@ -//================================================================================================================= -// [These sections are for folding control in Code::Blocks] -//{ [Best viewed with "Fold all on file open" option enabled] [best screen width is 115 chars] -//================================================================================================================= -//! -//! @file TXLib.h -//! @brief (The Dumb Artist Library, TX Library, TXLib). -//! -//! $Version: 00172a, Revision: 104 $ -//! $Copyright: (C) Ded (Ilya Dedinsky, http://txlib.ru) $ -//! $Date: 2014-08-09 16:37:26 +0400 $ -//! -//! TX Library - Win32 ++. -//! "" -//! . . -//! -//!
1 TX Library - -//! . -//! -//! TX Library is a tiny 2D graphics library for Win32 written in C++. This is a small -//! sandbox for the very beginners to help them to learn basic programming principles. -//! The documentation is currently in Russian. -//! -//! : txlib.ru. -//! -//! . SourceForge. -//! -//! @warning -. . @nn -//! . -//! . -//! -//! @par SourceForge: -//! - -//! - -//! -//! @par -//! -# -//! .., .., .., .., .., .., .. -//! . Batman -//! Proceedings in Sheep Philosophy, 2003, Vol. 22. pp. 23-24. -//! -// $Copyright: (C) Ded (Ilya Dedinsky, http://txlib.ru) $ -//----------------------------------------------------------------------------------------------------------------- -//! -//! @defgroup Drawing -//! @defgroup Mouse -//! @defgroup Dialogs -//! @defgroup Misc -//! @defgroup Service -//! @defgroup Technical -//} -//================================================================================================================= - -#if !defined (__TXLIB_H_INCLUDED) // <<<<<<<<< The code is here, unfold it <<<<<<<<<<<<<<<<<<<<<<<<< -#define __TXLIB_H_INCLUDED - -//----------------------------------------------------------------------------------------------------------------- -//{ Version information -//----------------------------------------------------------------------------------------------------------------- - -//! @cond INTERNAL -#define _TX_V_FROM_CVS(_1,file,ver,rev,date,auth,_2) "TXLib [Ver: " #ver ", Rev: " #rev "]" -#define _TX_A_FROM_CVS(_1,file,ver,rev,date,auth,_2) "Copyright (C) " auth -#define _TX_v_FROM_CVS(_1,file,ver,rev,date,auth,_2) ((0x##ver << 16) | 0x##rev) -//! @endcond - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief . -//! -//! @code -//! #define _TX_VERSION "TXLib [Version: 1.72a, Revision 50]" () -//! #define _TX_AUTHOR "Copyright (C) Ded (Ilya Dedinsky, http://txlib.ru)" -//! @endcode -//! . -//! -//! @see txVersion() -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- -//! @{ - -#define _TX_VERSION _TX_V_FROM_CVS ($VersionInfo: , TXLib.h, 00172a, 104, 2014-08-09 16:37:26 +0400, "Ded (Ilya Dedinsky, http://txlib.ru) ", $) -#define _TX_AUTHOR _TX_A_FROM_CVS ($VersionInfo: , TXLib.h, 00172a, 104, 2014-08-09 16:37:26 +0400, "Ded (Ilya Dedinsky, http://txlib.ru) ", $) - -//! @} -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief . -//! -//! : - , - , - . -//! , @c 0x172a0050 - @c 0.172a, @c 50. -//! -//! . -//! -//! @see txVersion() -//! @usage @code -//! #if !(defined (_TX_VER) && (_TX_VER >= 0x172a0000)) -//! #error Must use TXLib.h version >= 1.72 to compile this. -//! #endif -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#define _TX_VER _TX_v_FROM_CVS ($VersionInfo: , TXLib.h, 00172a, 104, 2014-08-09 16:37:26 +0400, "Ded (Ilya Dedinsky, http://txlib.ru) ", $) - -//} -//----------------------------------------------------------------------------------------------------------------- - -//----------------------------------------------------------------------------------------------------------------- -//{ Compiler- and platform-specific -//! @name -//----------------------------------------------------------------------------------------------------------------- -//! @{ @cond INTERNAL - -#if !defined (__cplusplus) - - #ifdef __GNUC__ - #error - #error -------------------------------------------------------------------------------------------------------- - #endif - #error TXLib.h: Must use C++ to compile TXLib.h. - #error - #error CHECK source file EXTENSION. Maybe it is ".C". It must be ".CPP". - #error If your file is named, for example, "Untitled.C", go to menu [File], then - #error then [Save As] and rename it to "Untitled.CPP". Please do NOT use spaces. - #error -------------------------------------------------------------------------------------------------------- - #error - -#endif - -#if !defined (WIN32) && !defined (__WIN32__) && !defined(_WIN32) && !defined(_WIN32_WINNT) - - #ifdef __GNUC__ - #error - #error -------------------------------------------------------------------------------------------------------- - #endif - #error TXLib.h: Windows (MSVC/Win32 or GCC/MinGW) is the only supported system, sorry. - #error - #error In Linux or iOS, you should write your own TXLib and share it with your friends, - #error or use wine. - #error -------------------------------------------------------------------------------------------------------- - #error - -#endif - -#if defined (UNICODE) || defined (_UNICODE) - - #ifdef __GNUC__ - #warning TXLib.h: Disabling the UNICODE - #endif - - #undef UNICODE // Burn Unicode, burn - #undef _UNICODE - - #if defined (_WINDOWS_H) || defined (_INC_WINDOWS) || defined (_WINDOWS_) || defined (__WINDOWS__) - - #ifdef __GNUC__ - #error - #error -------------------------------------------------------------------------------------------------------- - #endif - #error TXLib.h: Should include "TXLib.h" BEFORE or INSTEAD of in UNICODE mode. - #error - #error REARRANGE your #include directives, or DISABLE the UNICODE mode. - #error -------------------------------------------------------------------------------------------------------- - #error - - #endif - -#endif - -#if defined (__STRICT_ANSI__) // Try to extend strict ANSI rules - - #ifdef __GNUC__ - #warning TXLib.h: Trying to extend strict ANSI compatibility - #endif - - #undef __STRICT_ANSI__ - #define __STRICT_ANSI__UNDEFINED - - #if defined (_STRING_H_) || defined (_INC_STRING) || defined (_STDIO_H_) || defined (_INC_STDIO) - - #ifdef __GNUC__ - #error - #error -------------------------------------------------------------------------------------------------------- - #endif - #error TXLib.h: Should include "TXLib.h" BEFORE or in Strict ANSI mode. - #error - #error REARRANGE your #include directives, or DISABLE ANSI-compliancy. - #error -------------------------------------------------------------------------------------------------------- - #error - - #endif - -#endif - -#if defined (__GNUC__) - - #define _GCC_VER ( __GNUC__*100 + __GNUC_MINOR__*10 + __GNUC_PATCHLEVEL__ ) - - #if defined (_GCC_VER) && (_GCC_VER >= 420) - - #if (_GCC_VER >= 460) - #pragma GCC diagnostic push - #endif - - #pragma GCC optimize ("no-strict-aliasing") - #pragma GCC diagnostic ignored "-Wstrict-aliasing" - - #pragma GCC diagnostic ignored "-Wshadow" - - #pragma GCC diagnostic ignored "-Wmissing-field-initializers" - #pragma GCC diagnostic ignored "-Wunreachable-code" - #pragma GCC diagnostic ignored "-Wold-style-cast" - #pragma GCC diagnostic ignored "-Wunused-label" // Just for fun in _txCanvas_OnCmdAbout() - #pragma GCC diagnostic ignored "-Winline" - - #define _TX_THREAD __thread - - #else - #define _TX_THREAD - - #endif - - #define _TX_CHECK_FORMAT( at ) __attribute__ (( format (printf, (at), (at)+1) )) - - template - inline T _txNOP (T value) { return value; } // To suppress performance warnings in assert etc - - // From MinGW\include\float.h which is replaced by MinGW\lib\gcc\i686-pc-mingw32\x.x.x\include\float.h - extern "C" unsigned int __cdecl _controlfp (unsigned int unNew, unsigned int unMask); - extern "C" void __cdecl _fpreset (void); - -#else - - #define _TX_CHECK_FORMAT( at ) - - #define _txNOP( value ) ( value ) - -#endif - -#if defined (_MSC_VER) - - #pragma warning (push, 4) // Set maximum warning level - - #pragma warning (disable: 4127) // conditional expression is constant - #pragma warning (disable: 4351) // new behavior: elements of array will be default initialized - #pragma warning (disable: 4702) // unreachable code - - #define _TX_THREAD __declspec (thread) - -#endif - -#if defined (_MSC_VER) && (_MSC_VER == 1200) // MSVC 6 (1998) - - #define _MSC_VER_6 // Flag the bad dog - - #pragma warning (disable: 4511) // copy constructor could not be generated - #pragma warning (disable: 4512) // assignment operator could not be generated - #pragma warning (disable: 4514) // unreferenced inline function has been removed - #pragma warning (disable: 4663) // C++ language change: to explicitly specialize class template - #pragma warning (disable: 4710) // function not inlined - #pragma warning (disable: 4786) // identifier was truncated to '255' characters in the debug information - - #if !defined (WINVER) - #define WINVER 0x0400 // MSVC 6: Defaults to Windows 95 - #endif - - #if !defined (NDEBUG) - #define _CRTDBG_MAP_ALLOC 1 // Set debug mode heap allocation - #endif - -#endif - -#if defined (_MSC_VER) && (_MSC_VER >= 1400) // MSVC 8 (2005) or greater - - #pragma warning (disable: 26135) // missing locking annotation - #pragma warning (disable: 28125) // the function must be called from within a try/except block - #pragma warning (disable: 28159) // consider using another function instead - - #pragma setlocale ("russian") // Set source file encoding, see also _TX_CP - - #if !defined (NDEBUG) - #pragma check_stack (on) // Turn on stack probes at runtime - #pragma strict_gs_check (push, on) // Detects stack buffer overruns - #endif - - #define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1 - #define _TX_TRUNCATE , _TRUNCATE - -#else - - #define strcpy_s strcpy // MSVC prior to 8 (2005) versions and GCC - #define strncpy_s strncpy // do NOT have secure variants of these - #define strncat_s strncat // functions, so use insecure ones. - #define wcsncpy_s wcsncpy // ... - #define _snprintf_s _snprintf // - #define _vsnprintf_s _vsnprintf // - - #define strerror_s( buf, code ) ( strncpy ((buf), strerror (code), sizeof(buf)-1) ) - #define ctime_s( buf, sizeof_buf, time ) ( strncpy ((buf), ctime (time), (sizeof_buf)-1) ) - #define getenv_s( sz, buf, sizeof_buf, name ) ( (void)(sz), strncpy ((buf), getenv (name), (sizeof_buf)-1) ) - #define strtok_s( buf, delim, ctx ) ( (void)(ctx), strtok ((buf), (delim)) ) - - #if !( defined (_GCC_VER) && (_GCC_VER == 471) && defined (__x86_64__) ) // GCC 4.7.1 x64 already has it - #define _controlfp_s( oldCtl, newCtl, mask ) ( *(oldCtl) = _controlfp (newCtl, mask), 0 ) - #endif - - #define _TX_TRUNCATE - -#endif - -#if defined (__INTEL_COMPILER) - - #pragma warning (disable: 174) // remark: expression has no effect - #pragma warning (disable: 304) // remark: access control not specified ("public" by default) - #pragma warning (disable: 522) // remark: function "..." redeclared "inline" after being called - #pragma warning (disable: 981) // remark: operands are evaluated in unspecified order - #pragma warning (disable: 1684) // conversion from pointer to same-sized integral type (potential portability problem) - -#endif - -#if !defined (WINVER) - #define WINVER 0x0500 // Defaults to Windows 2000 - #define WINDOWS_ENABLE_CPLUSPLUS // Allow use of type-limit macros in , -#endif // they allowed by default if WINVER >= 0x0600. - -#if !defined (_WIN32_WINNT) - #define _WIN32_WINNT WINVER // Defaults to the same as WINVER -#endif - -#if !defined (_WIN32_IE) - #define _WIN32_IE WINVER // Defaults to the same as WINVER -#endif - -#define _USE_MATH_DEFINES // math.h's M_PI etc. - -//! @} @endcond -//} -//----------------------------------------------------------------------------------------------------------------- - -//----------------------------------------------------------------------------------------------------------------- -//{ The Includes -//----------------------------------------------------------------------------------------------------------------- - -#ifdef _MSC_VER_6 - #pragma warning (push, 3) // MSVC 6: At level 4, some std headers emit warnings O_o -#endif - -//----------------------------------------------------------------------------------------------------------------- - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#if defined (_MSC_VER) -#include -#endif - -//----------------------------------------------------------------------------------------------------------------- - -#ifdef _MSC_VER_6 - #pragma warning (pop) // MSVC 6: Restore max level -#endif - -#ifdef __STRICT_ANSI__UNDEFINED - #define __STRICT_ANSI__ // Redefine back -#endif - -//} -//----------------------------------------------------------------------------------------------------------------- - -//----------------------------------------------------------------------------------------------------------------- -//{ The namespaces -//----------------------------------------------------------------------------------------------------------------- - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief . -//}---------------------------------------------------------------------------------------------------------------- - -#ifdef FOR_DOXYGEN_ONLY -namespace { namespace TX { }} -#endif - -//} -//----------------------------------------------------------------------------------------------------------------- - -/*! @cond INTERNAL */ - -namespace { namespace TX { // <<<<<<<<< The main code is here, unfold it <<<<<<<<<<<<<<<<<<<< - -/*! @endcond */ - -//================================================================================================================= -//{ TXLIB INTERFACE -// -//================================================================================================================= - -//================================================================================================================= -//{ Initialization -//! @name -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief -//! -//! @param sizeX ( ) -//! @param sizeY ( ) -//! @param centered -//! -//! @return ( ) TXLib. , NULL. -//! -//! @note , . txSetDefaults(). -//! -//! @warning ( ), TXLib, -//! , , -//! . , , @c main.cpp @c game.cpp, @c main.cpp -//! , @c game.cpp . ( @c game.cpp -//! .) @n -//! , , , -//! , @c graphics.cpp, . ( -//! ) . @nn -//! TXLib @b DLL. -//! -//! @note -//! DLL. txDestroyWindow(). -//! main(). -//! -//! @warning (not thread-safe). @nn -//! TXLib , . -//! , TXLib (Qt, -//! wxWidgets, GTK+ .., . -//! SDL, OpenGL ..) . , TXLib - -//! , . -//! -//! @see txOK(), txWindow(), txDC(), _txWindowStyle, _txConsoleMode, _txConsoleFont, _txCursorBlinkInterval, -//! _txWindowUpdateInterval, _TX_NOINIT, _TX_ALLOW_TRACE, TX_TRACE -//! -//! @usage @code -//! txCreateWindow ( 800, 600); // 800600, -//! txCreateWindow (1024, 768, false); // 1024768, -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -HWND txCreateWindow (double sizeX, double sizeY, bool centered = true); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @return - true, - false. -//! -//! @par : -//! - - (TX_WHITE), 1 -//! - - (TX_WHITE) -//! - - , (TX_WHITE) -//! - - (R2_COPYPEN) -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txSelectFont(), txSetROP2() -//! -//! @usage @code -//! txSetDefaults(); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txSetDefaults(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief -//! -//! @return : true - , false - . -//! -//! " " , . - -//! , . -//! -//! @see txCreateWindow() -//! -//! @usage @code -//! txCreateWindow (800, 600); -//! if (!txOK()) -//! { -//! txMessageBox (" ", "", MB_ICONSTOP); -//! return; -//! } -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline bool txOK(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief POINT. -//! -//! @return POINT, @c x @c y. -//! -//! @see txGetExtentX(), txGetExtentY() -//! -//! @usage @code -//! POINT size = txGetExtent(); -//! -//! txLine (0, 0, size.x, size.y); -//! txLine (0, size.y, size.x, 0); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -POINT txGetExtent(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @return . -//! -//! @see txGetExtent(), txGetExtentY() -//! -//! @usage @code -//! txSetTextAlign (TA_CENTER); -//! txTextOut (txGetExtentX() / 2, 100, "Oh, oh, you're in the [army]middle now"); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -int txGetExtentX(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @return . -//! -//! @see txGetExtent(), txGetExtentX() -//! -//! @usage @code -//! void DrawHouse (int height); -//! ... -//! DrawHouse (txGetExtentY() / 2); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -int txGetExtentY(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief -//! -//! @return ( , handler) (device context, DC) (HDC). -//! -//! @note HDC , . -//! txDeleteDC(). -//! txLock() txUnlock(). -//! -//! @see txWindow(), txLock(), txUnlock(), txGDI() -//! -//! @usage @code -//! txBitBlt (txDC(), 0, 0, 100, 100, txDC(), 0, 0); -//! txBitBlt (txDC(), 100, 0, 100, 100, txDC(), 0, 0); -//! txBitBlt (txDC(), 0, 100, 100, 100, txDC(), 0, 0); -//! txBitBlt (txDC(), 100, 100, 100, 100, txDC(), 0, 0); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline HDC& txDC(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief -//! -//! @return ( , handler) -//! -//! @see txDC(), txLock(), txUnlock(), txGDI() -//! -//! @usage @code -//! SetWindowText (txWindow(), " - !"); -//! txMessageBox ("", "", MB_ICONINFORMATION); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline HWND txWindow(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief . -//! -//! @return . -//! -//! @usage @code -//! printf ("I personally love %s\n", txVersion()); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline const char* txVersion(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief . -//! -//! @return . -//! -//! @usage @code -//! printf ("My magic number is %x\n", txVersionNumber()); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline unsigned txVersionNumber(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief TXLib. -//! -//! @param fileNameOnly , Win32 -//! GetFileModuleName (NULL, ...). -//! -//! @return fileNameOnly = true: @n -//! fileNameOnly = false: TXLib -//! -//! @note @b . -//! -//! @see txWindow(), txVersion(), txVersionNumber() -//! -//! @usage @code -//! printf (" !"); -//! -//! for (int done = 0; done <= 100; done++) -//! { -//! char title [1024] = ""; -//! sprintf (title, "%s - [%-10.*s] %d%%", txGetModuleFileName (false), done/10, "||||||||||", done); -//! -//! SetWindowText (txWindow(), title); -//! txSleep (50); -//! } -//! -//! txMessageBox (" progress bar", "TXLib forever)"); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -const char* txGetModuleFileName (bool fileNameOnly = true); - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Setting the parameters -//! @name -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! . TX_BLACK, TX_BLUE . -//! -//! - ( ), RGB(). -//! . . -//! -//! @see txSetColor(), txSetFillColor(), txGetColor(), txGetFillColor(), txGetPixel(), RGB() -//! -//! @usage @code -//! #include "TXLib.h" -//! -//! const COLORREF MY_DEEP_ROMANTIC_BLUE = RGB ( 0, 0, 129), -//! MY_SHINING_MOONLIGHT = RGB (128, 255, 64); -//! ... -//! -//! txSetColor (TX_RED); -//! txSetFillColor (TX_NULL); -//! -//! txSetFillColor (MY_DEEP_ROMANTIC_BLUE); // .. , " " -//! txSetColor (MY_SHINING_MOONLIGHT); // http://tanais.info/art/pic/kuindzhi1.html -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -const COLORREF -#ifdef FOR_DOXYGEN_ONLY - enum txColors { -#endif - - TX_BLACK = RGB ( 0, 0, 0), //!< . - TX_BLUE = RGB ( 0, 0, 128), //!< - . . - TX_GREEN = RGB ( 0, 128, 0), //!< . - TX_CYAN = RGB ( 0, 128, 128), //!< . - TX_RED = RGB (128, 0, 0), //!< - . . - TX_MAGENTA = RGB (128, 0, 128), //!< - . - TX_BROWN = RGB (128, 128, 0), //!< . . Do it yourself with RGB(). - TX_ORANGE = RGB (255, 128, 0), //!< . - TX_GRAY = RGB (160, 160, 160), //!< . - TX_DARKGRAY = RGB (128, 128, 128), //!< - . - TX_LIGHTGRAY = RGB (192, 192, 192), //!< - . - TX_LIGHTBLUE = RGB ( 0, 0, 255), //!< - . - TX_LIGHTGREEN = RGB ( 0, 255, 128), //!< - . - TX_LIGHTCYAN = RGB ( 0, 255, 255), //!< - . - TX_LIGHTRED = RGB (255, 0, 128), //!< - . . - TX_LIGHTMAGENTA = RGB (255, 0, 255), //!< - . . - TX_PINK = RGB (255, 128, 255), //!< :) - TX_YELLOW = RGB (255, 255, 128), //!< . - TX_WHITE = RGB (255, 255, 255), //!< . - TX_TRANSPARENT = 0xFFFFFFFF, //!< . . - TX_NULL = TX_TRANSPARENT, //!< . . - -// () - . txExtractColor(), txRGB2HSL(), txHSL2RGB() - - TX_HUE = 0x04000000, //!< HSL - TX_SATURATION = 0x05000000, //!< HSL - TX_LIGHTNESS = 0x06000000; //!< HSL - -#ifdef FOR_DOXYGEN_ONLY - }; -#endif - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief () (). -//! -//! @param red [0; 255] -//! @param green [0; 255] -//! @param blue [0; 255] -//! -//! @return COLORREF. -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txExtractColor(), -//! txRGB2HSL(), txHSL2RGB() -//! -//! @usage @code -//! txSetColor (RGB (255, 128, 0)); // + = -//! -//! int red = 20, green = 200, blue = 20; -//! COLORREF color = RGB (red, green, blue); -//! txSetFillColor (color); -//! -//! const COLORREF SKY_COLOR = RGB (0, 128, 255); // -//! -//! ... -//! txSetFillColor (SKY_COLOR); // -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -#ifdef FOR_DOXYGEN_ONLY -COLORREF RGB (int red, int green, int blue); -#endif - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief , . -//! -//! @param color , . txColors, RGB() -//! @param thickness -//! -//! @return - true, - false. -//! -//! @see txColor(), txGetColor(), txFillColor(), txGetFillColor(), txColors, RGB() -//! -//! @usage @code -//! txSetColor (TX_RED); -//! txSetColor (RGB (255, 128, 0), 5); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txSetColor (COLORREF color, double thickness = 1); - -//! @cond INTERNAL -#define txSetColour txSetColor -//! @endcond - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param red [0; 1] -//! @param green [0; 1] -//! @param blue [0; 1] -//! -//! @return - true, - false. -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor() -//! -//! @usage @code -//! txColor (1.0, 1.0, 0.0); // + = -//! txColor (1.0, 0.5, 0.25); // -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txColor (double red, double green, double blue); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @return , . txColors, RGB() -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB() -//! -//! @usage @code -//! COLORREF color = txGetColor(); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -COLORREF txGetColor(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param color , . txColors, RGB() -//! -//! @return - true, - false. -//! -//! @see txFillColor(), txGetFillColor(), txColor(), txGetColor(), txColors, RGB() -//! -//! @usage @code -//! txSetFillColor (TX_RED); -//! txSetFillColor (RGB (255, 128, 0)); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txSetFillColor (COLORREF color); - -//! @cond INTERNAL -#define txSetFillColour txSetFillColor -//! @endcond - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param red [0; 1] -//! @param green [0; 1] -//! @param blue [0; 1] -//! -//! @return - true, - false. -//! -//! @see txSetFillColor(), txGetFillColor(), txSetColor(), txGetColor() -//! -//! @usage @code -//! txFillColor (1.0, 0.5, 0.25); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txFillColor (double red, double green, double blue); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @return , . txColors, RGB() -//! -//! @see txSetFillColor(), txGetFillColor(), txSetColor(), txGetColor(), txColors, RGB() -//! -//! @usage @code -//! COLORREF color = txGetFillColor(); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -COLORREF txGetFillColor(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! , -//! . -//! -//! @param mode -//! -//! @return , . txColors, RGB() -//! -//! @title : -//! @table @tr R2_COPYPEN @td = ( :) -//! @tr R2_NOTCOPYPEN @td = ~ -//! @tbr -//! @tr R2_BLACK @td = ( ) -//! @tr R2_WHITE @td = ( ) -//! @tr R2_NOT @td = ~ ( ) -//! @tbr -//! @tr R2_XORPEN @td = ^ ( , c. ) -//! @tr R2_NOTXORPEN @td = ~ ( ^ ) -//! @tbr -//! @tr R2_MASKPEN @td = & -//! @tr R2_NOTMASKPEN @td = ~ ( & ) -//! @tr R2_MASKNOTPEN @td = & ~ -//! @tr R2_MASKPENNOT @td = ~ & -//! @tbr -//! @tr R2_MERGEPEN @td = | -//! @tr R2_NOTMERGEPEN @td = ~ ( | ) -//! @tr R2_MERGENOTPEN @td = | ~ -//! @tr R2_MERGEPENNOT @td = ~ | -//! @tbr -//! @tr R2_NOP @td . -//! @endtable -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() -//! -//! @usage @code -//! txSetColor (TX_WHITE, 5); // -//! txSetROP2 (R2_XORPEN); // R2_XORPEN -//! -//! txLine (100, 100, 200, 200); // - -//! txSleep (1000); -//! txLine (100, 100, 200, 200); // - ( ) -//! -//! txSetROP2 (R2_COPYPEN); // -//! txLine (100, 100, 200, 200); // - -//! -//! txLine (100, 100, 200, 200); // - , -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txSetROP2 (int mode = R2_COPYPEN); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief ( ) . -//! -//! @param color -//! @param component , . txColors -//! -//! @return , . txColors -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txExtractColor(), -//! txRGB2HSL(), txHSL2RGB() -//! -//! @usage @code -//! int red = txExtractColor (color, TX_RED); -//! int lightness = txExtractColor (TX_BLUE, TX_LIGHTNESS); -//! -//! . AppearText(), AppearEarth() 5 (""). -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -int txExtractColor (COLORREF color, COLORREF component); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief RGB HSL. -//! -//! @param rgbColor @strike @endstrike RGB -//! -//! @return COLORREF. -//! -//! @b RGB -//! -//! - (Red), 0 255. -//! - (Green), 0 255. -//! - (Blue), 0 255. -//! -//! @b HSL -//! -//! - (Hue), 0 255 ( 360). -//! - (Saturation), 0 255. -//! - (Lightness), 0 255. -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txExtractColor(), -//! txRGB2HSL(), txHSL2RGB() -//! -//! @usage @code -//! COLORREF hslColor = txRGB2HSL (TX_RED); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -COLORREF txRGB2HSL (COLORREF rgbColor); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief HSL RGB. -//! -//! @param hslColor HSL -//! -//! @return COLORREF. -//! -//! @b RGB -//! -//! - (Red), 0 255. -//! - (Green), 0 255. -//! - (Blue), 0 255. -//! -//! @b HSL -//! -//! - (Hue), 0 255 ( 360). -//! - (Saturation), 0 255. -//! - (Lightness), 0 255. -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txExtractColor(), -//! txRGB2HSL(), txHSL2RGB() -//! -//! @usage @code -//! int hue = 10, saturation = 128, lightness = 128; -//! COLORREF hslColor = RGB (hue, saturation, lightness); -//! txSetColor (txHSL2RGB (hslColor)); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -COLORREF txHSL2RGB (COLORREF hslColor); - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Drawing -//! @name -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @return - true, - false. -//! -//! @see txSetFillColor(), txFillColor(), txGetFillColor(), txColors, RGB() -//! -//! @usage @code -//! txClear(); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txClear(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief ( ). -//! -//! @param x - -//! @param y Y- -//! @param color , . txColors, RGB() -//! -//! @return - true, - false. -//! -//! @see txPixel(), txGetPixel(), txColors, RGB() -//! -//! @usage @code -//! txSetPixel (100, 100, TX_RED); -//! txSetPixel (100, 100, RGB (255, 128, 0)); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline bool txSetPixel (double x, double y, COLORREF color); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief ( ). -//! -//! @param x - -//! @param y Y- -//! @param red [0; 1] -//! @param green [0; 1] -//! @param blue [0; 1] -//! -//! @return - true, - false. -//! -//! @see txSetPixel(), txGetPixel() -//! -//! @usage @code -//! txSetPixel (100, 100, 1.0, 0.5, 0.25); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline bool txPixel (double x, double y, double red, double green, double blue); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief () . -//! -//! @param x - -//! @param y Y- -//! -//! @return , . txColors, RGB() -//! -//! @see txSetPixel(), txPixel(), txColors, RGB() -//! -//! @usage @code -//! COLORREF color = txGetPixel (100, 200); -//! -//! if (txGetPixel (x, y) == TX_RED) -//! CarCrash (x, y); // Mess with the red - die like the rest -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline COLORREF txGetPixel (double x, double y); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param x0 X- -//! @param y0 Y- -//! @param x1 X- -//! @param y1 Y- -//! -//! @return - true, - false. -//! -//! txSetColor(). -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() -//! -//! @usage @code -//! txLine (100, 200, 400, 500); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txLine (double x0, double y0, double x1, double y1); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param x0 X- -//! @param y0 Y- -//! @param x1 X- -//! @param y1 Y- -//! -//! @return - true, - false. -//! -//! txSetColor(), - txSetFillColor(). -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() -//! -//! @usage @code -//! txRectangle (100, 200, 400, 500); -//! -//! Win32::RoundRect (txDC(), 100, 200, 400, 500, 30, 30); // . . RoundRect MSDN.com -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txRectangle (double x0, double y0, double x1, double y1); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param points POINT -//! @param numPoints -//! -//! @return - true, - false. -//! -//! txSetColor(), - txSetFillColor(). -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() -//! -//! @usage @code -//! POINT star[5] = {{150, 300}, {200, 100}, {250, 300}, {100, 200}, {300, 200}}; -//! txPolygon (star, 5); // -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txPolygon (const POINT points[], int numPoints); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param x0 X- , -//! @param y0 Y- -//! @param x1 X- -//! @param y1 Y- -//! -//! @return - true, - false. -//! -//! txSetColor(), - txSetFillColor(). -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() -//! -//! @usage @code -//! txEllipse (100, 100, 300, 200); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txEllipse (double x0, double y0, double x1, double y1); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param x - -//! @param y Y- -//! @param r -//! -//! @return - true, - false. -//! -//! txSetColor(), - txSetFillColor(). -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() -//! -//! @usage @code -//! txCircle (100, 100, 10); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txCircle (double x, double y, double r); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param x0 X- , , (. txEllipse) -//! @param y0 Y- -//! @param x1 X- -//! @param y1 Y- -//! @param startAngle OX ( ) -//! @param totalAngle ( ) -//! -//! @return - true, - false. -//! -//! txSetColor(), - txSetFillColor(). -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() -//! -//! @usage @code -//! txArc (100, 100, 300, 200, 45, 270); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txArc (double x0, double y0, double x1, double y1, double startAngle, double totalAngle); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param x0 X- , , (. txEllipse) -//! @param y0 Y- -//! @param x1 X- -//! @param y1 Y- -//! @param startAngle OX ( ) -//! @param totalAngle ( ) -//! -//! @return - true, - false. -//! -//! txSetColor(), - txSetFillColor(). -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() -//! -//! @usage @code -//! txPie (100, 100, 300, 200, 0, 180); // Enter Pacman -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txPie (double x0, double y0, double x1, double y1, double startAngle, double totalAngle); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param x0 X- , , (. txEllipse) -//! @param y0 Y- -//! @param x1 X- -//! @param y1 Y- -//! @param startAngle OX ( ) -//! @param totalAngle ( ) -//! -//! @return - true, - false. -//! -//! txSetColor(), - txSetFillColor(). -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() -//! -//! @usage @code -//! txChord (100, 100, 300, 200, 45, 270); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txChord (double x0, double y0, double x1, double y1, double startAngle, double totalAngle); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param x - -//! @param y Y- -//! @param color (TX_TRANSPARENT - ) -//! @param mode (FLOODFILLSURFACE - ) -//! -//! @return - true, - false. -//! -//! txSetFillColor(). - -//! . -//! -//! @title : @table -//! @tr FLOODFILLSURFACE @td - , color. -//! @tr FLOODFILLBORDER @td - , color. -//! @endtable -//! -//! @see txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() -//! -//! @usage @code -//! txSetFillColor (TX_PINK); -//! txLine (100, 200, 150, 100); -//! txLine (150, 100, 200, 200); -//! txLine (200, 200, 100, 200); -//! txFloodFill (150, 150); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txFloodFill (double x, double y, COLORREF color = TX_TRANSPARENT, DWORD mode = FLOODFILLSURFACE); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief , . -//! -//! @param x1 - 1 -//! @param y1 Y- 1 -//! @param x2 - 2 -//! @param y2 Y- 2 -//! @param x3 - 3 -//! @param y3 Y- 3 -//! -//! @return - true, - false. -//! -//! @see txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() -//! -//! @par . : -//! @ref Tutor_Params " " -//}---------------------------------------------------------------------------------------------------------------- - -bool txTriangle (double x1, double y1, double x2, double y2, double x3, double y3) - { - (void)x1; (void)y1; (void)x2; (void)y2; (void)x3; (void)y3; - - MessageBox (txWindow(), - " , \n" - " , txPolygon(). . \" \". ", - "TXLib ", MB_ICONINFORMATION); - - return false; - } - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param x - -//! @param y Y- -//! @param sizeX -//! @param sizeY ( ) -//! @param color -//! @param handL ( ) -//! @param handR ( ) -//! @param twist @a ( ) -//! @param head @a ( ) -//! @param eyes ( ) -//! @param wink (0 - , -1 - , +1 - ) -//! @param crazy ( ) -//! @param smile ( ) -//! @param hair ( ) -//! @param wind , ( ) -//! -//! @see txSetFillColor(), txColors, RGB(), txLine(), txCircle() -//! -//! @usage @code -//! txCreateWindow (800, 600); -//! -//! //-----------+---+----+-----+-----+----------+-----+-----+-----+----+----+----+-----+-----+----+----- -//! // | x | y |sizeX|sizeY| color |handL|handR|twist|head|eyes|wink|crazy|smile|hair|wind -//! //-----------+---+----+-----+-----+----------+-----+-----+-----+----+----+----+-----+-----+----+----- -//! // | | | | | | | | | | | | | | | -//! txDrawMan (125, 250, 200, 200, TX_WHITE, 0, 0, 0, 0, 0.8, 0, 0, 1.0, 0, 0); -//! txDrawMan (325, 250, 100, 200, TX_YELLOW, 0, 0, 0, 0, 0.8, 0, 0, -1.0, 2, 0); -//! txDrawMan (525, 250, 200, 100, TX_ORANGE, 0, 0, 0, 0, 1.0, 0, -1, 0.3, 1, 0); -//! txDrawMan (725, 250, 100, 100, TX_LIGHTRED, 0, 0, 0, 0, 1.0, 0, 1, -0.3, 3, 0); -//! -//! txDrawMan (125, 550, 200, 200, TX_WHITE, 0.3, 0.3, 0, 0, 0.8, -1, 1, 0.5, 2, -1); -//! txDrawMan (325, 550, 100, 200, TX_YELLOW, -0.5, -0.5, 0, 0.1, 0.8, 1, 0, -0.5, 3, 5); -//! txDrawMan (525, 550, 200, 100, TX_ORANGE, -0.5, 0.3, 0.2, 0, 0.8, -1, 1, 0.0, 10, -5); -//! txDrawMan (725, 550, 100, 100, TX_LIGHTRED, 0.3, -0.5, -0.4, 0, 0.8, 1, -1, 0.0, 1, 1); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -void txDrawMan (int x, int y, int sizeX, int sizeY, COLORREF color, double handL, double handR, double twist, - double head, double eyes, double wink, double crazy, double smile, double hair, double wind); -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Drawing text -//! @name -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param x - -//! @param y Y- -//! @param text -//! -//! @return - true, - false. -//! -//! txSetColor(), - txSetTextAlign(). -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txSelectFont(), txSetTextAign(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY() -//! -//! @usage @code -//! txTextOut (100, 100, " ."); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txTextOut (double x, double y, const char text[]); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief , . -//! -//! @param x0 X- -//! @param y0 Y- -//! @param x1 X- -//! @param y1 Y- -//! @param text -//! @param format -//! -//! @return - true, - false. -//! -//! txSetColor(), - txSetTextAlign(). -//! -//! @note , ( x0 > x1 y0 > y1). -//! -//! . MSDN (http://msdn.com), "DrawText Function (Windows)": -//! http://msdn.microsoft.com/en-us/library/dd162498%28VS.85%29.aspx. -//! -//! , -//! ( @b @c \\n). -//! -//! , , -//! , : @c DT_VCENTER ( ) @c | -//! @c DT_WORDBREAK ( ) @c | @c DT_WORD_ELLIPSIS ( , -//! ). . . -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), -//! txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY() -//! -//! @usage @code -//! txSetColor (TX_BLACK); -//! txSetFillColor (TX_DARKGRAY); Win32::RoundRect (txDC(), 105, 105, 205, 255, 30, 30); -//! txSetFillColor (TX_WHITE); Win32::RoundRect (txDC(), 100, 100, 200, 250, 30, 30); -//! -//! txSelectFont ("Arial", 20, 0, FW_BOLD); -//! txDrawText (100, 100, 200, 250, "I hate it when I'm studying " -//! "and a Velociraptor throws bananas on me.\n"); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txDrawText (double x0, double y0, double x1, double y1, const char text[], - unsigned format = DT_CENTER | DT_VCENTER | DT_WORDBREAK | DT_WORD_ELLIPSIS); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param name -//! @param sizeY ( Y) -//! @param sizeX -//! @param bold ( 0 1000) -//! @param italic -//! @param underline -//! @param strikeout -//! @param angle ( ) -//! -//! @return true. , Windows -//! @c (SYSTEM_FIXED_FONT, . MSDN). txFontExist. -//! -//! @see txTextOut(), txFontExist() -//! -//! @usage @code -//! txSelectFont ("Comic Sans MS", 40); -//! txTextOut (100, 100, " ."); -//! txSelectFont ("Comic Sans MS", 40, 10, false, true, false, true, 15); -//! txTextOut (100, 200, " - ."); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txSelectFont (const char name[], double sizeY, - double sizeX = -1, - int bold = FW_DONTCARE, - bool italic = false, - bool underline = false, - bool strikeout = false, - double angle = 0); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param text -//! -//! @return SIZE. -//! -//! @see txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY() -//! -//! @usage @code -//! SIZE size = txGetTextExtent (text); -//! txTextOut (100 + size.cx / 2, 200 + size.cy / 2, text); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -SIZE txGetTextExtent (const char text[]); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param text -//! -//! @return . -//! -//! @see txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY() -//! -//! @usage @code -//! txTextOut (100 + txGetTextExtentX (text) / 2, 200 + txGetTextExtentY (text) / 2, text); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -int txGetTextExtentX (const char text[]); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param text -//! -//! @return . -//! -//! @see txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY() -//! -//! @usage @code -//! txTextOut (100 + txGetTextExtentX (text) / 2, 200 + txGetTextExtentY (text) / 2, text); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -int txGetTextExtentY (const char text[]); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param align -//! -//! @return . -//! -//! @title : @table -//! @tr TA_BASELINE @td (X,Y) . -//! @tr TA_BOTTOM @td (X,Y) ( ). -//! @tr TA_TOP @td (X,Y) ( ). -//! @tbr -//! @tr TA_CENTER @td (X,Y). -//! @tr TA_LEFT @td (X,Y) ( ). -//! @tr TA_RIGHT @td (X,Y) ( ). -//! @endtable -//! -//! @see txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY() -//! -//! @usage @code -//! txSetTextAlign (TA_RIGHT); -//! txTextOut (700, 100, " ,"); -//! txTextOut (700, 150, " ."); -//! txSetTextAlign(); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -unsigned txSetTextAlign (unsigned align = TA_CENTER | TA_BASELINE); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param name -//! -//! @return LOGFONT. , NULL. -//! -//! @see txTextOut(), txSelectFont() -//! -//! @usage @code -//! if (txFontExist ("Comic Sans MS")) txSelectFont ("Comic Sans MS", 30); -//! else txSelectFont ("Times New Roman", 30); -//! -//! txTextOut (100, 100, " ?"); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -LOGFONT* txFontExist (const char name[]); - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Drawing to memory DC and image loading -//! @name ( " ") -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief ( , Device Context, DC) . -//! -//! @param sizeX -//! @param sizeY -//! @param bitmap Bitmap to be associated with DC -//! -//! @return ( , Windows) ( ). -//! -//! @warning @b txDeleteDC(). @n -//! When the program will be shutting down, TXLib will try to delete DCs which were not deleted, -//! but this is not guaranteed. -//! -//! @see txCreateWindow(), txCreateCompatibleDC(), txLoadImage(), txDeleteDC() -//! -//! @usage @code -//! HDC save = txCreateCompatibleDC (100, 100); -//! -//! txBitBlt (save, 0, 0, 100, 100, txDC(), 0, 0); // -//! -//! txTextOut (20, 20, "Boo!"); -//! txSleep (2000); -//! -//! txBitBlt (txDC(), 0, 0, 100, 100, save, 0, 0); // -//! -//! txDeleteDC (save); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -HDC txCreateCompatibleDC (double sizeX, double sizeY, HBITMAP bitmap = NULL); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief BMP. . -//! -//! @param filename BMP -//! @param imageFlags , . -//! @param loadFlags , . -//! -//! @return , . -//! ( , ..), NULL. -//! -//! @warning (" "), -//! txDeleteDC(). @n -//! When the program will be shutting down, TXLib will try to delete DCs which were not deleted, -//! but this is not guaranteed. -//! -//! @note BMP. , JPG, -//! BMP, . -//! . -//! -//! NULL, -//! . ( ), -//! , -//! . About -//! ( "Run from"). -//! -//! @note , . -//! ! @n -//! @note @a , . , -//! TX\Examples\Tennis\Tennis.cpp. -//! -//! @title : -//! @table @tr IMAGE_BITMAP @td BMP -//! @tr IMAGE_CURSOR @td -//! @tr IMAGE_ICON @td -//! @endtable -//! -//! @title : -//! @table @tr LR_CREATEDIBSECTION @td DIB (device-indepandent bitmap), -//! @tr LR_LOADFROMFILE @td ( , ) -//! @tr @td . MSDN.com, "LoadImage function". -//! @endtable -//! -//! @see txCreateWindow(), txCreateCompatibleDC(), txLoadImage(), txDeleteDC(), txBitBlt(), txAlphaBlend(), txTransparentBlt() -//! -//! @usage . TX\Examples\Tennis\Tennis.cpp. -//! @code -//! HDC background_FromTXLibHelp = txLoadImage ("Resources\\Images\\Background.bmp"); -//! -//! if (!background_FromTXLibHelp) -//! txMessageBox (" Background.bmp", ", "); -//! -//! // , - ! -//! // , . -//! // , TX\Examples\Tennis\Tennis.cpp. -//! -//! txBitBlt (txDC(), 0, 0, 800, 600, background_FromTXLibHelp, 0, 0); -//! -//! ... -//! txDeleteDC (background_FromTXLibHelp); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -HDC txLoadImage (const char filename[], unsigned imageFlags = IMAGE_BITMAP, unsigned loadFlags = LR_LOADFROMFILE); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief ( , DC) . -//! -//! @param dc . @n -//! , NULL. -//! -//! @return - true, - false. -//! -//! @see txCreateWindow(), txCreateCompatibleDC(), txLoadImage(), txDeleteDC() -//! -//! @usage . TX\Examples\Tennis\Tennis.cpp. -//! @code -//! HDC background_FromTXLibHelp = txLoadImage ("Resources\\Images\\Background.bmp"); -//! -//! if (!background_FromTXLibHelp) -//! txMessageBox (" Background.bmp, .", "Oh, not now"); -//! -//! // . txLoadImage! -//! -//! txBitBlt (txDC(), 0, 0, 800, 600, background_FromTXLibHelp, 0, 0); -//! -//! ... -//! txDeleteDC (background_FromTXLibHelp); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- -//@ { - -bool txDeleteDC (HDC dc); - -//! @cond INTERNAL -bool txDeleteDC (HDC* dc); -//! @endcond - -//@ } -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief ( , DC) . -//! -//! @param dest ( ) -//! @param xDest - - -//! @param yDest Y- - -//! @param width -//! @param height -//! @param src ( ) -//! @param xSrc - - -//! @param ySrc Y- - -//! @param rOp -//! -//! @return - true, - false. -//! -//! @warning NULL, . -//! - . -//! . . -//! -//! @title : -//! @table @tr SRCCOPY @td :) - -//! @tbr -//! @tr BLACKNESS @td - (- ). -//! @tr WHITENESS @td - (- ). -//! @tr DSTINVERT @td - (- ). -//! @tr PATCOPY @td -. -//! @tbr -//! @tr MERGECOPY @td = & . -//! @tr MERGEPAINT @td = ~ | -//! @tr NOTSRCCOPY @td = ~ -//! @tr NOTSRCERASE @td = ~ ( | ) -//! @tr PATINVERT @td = ^ -//! @tr PATPAINT @td = ( | ~) | -//! @tr SRCAND @td = & -//! @tr SRCERASE @td = ~ & -//! @tr SRCINVERT @td = ^ -//! @tr SRCPAINT @td = | -//! @endtable -//! -//! @see txAlphaBlend(), txTransparentBlt(), txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB() -//! -//! @usage . TX\Examples\Tennis\Tennis.cpp. -//! @code -//! HDC background_FromTXLibHelp = txLoadImage ("Resources\\Images\\Background.bmp"); -//! -//! if (!background_FromTXLibHelp) -//! (" Background.bmp, , .", "Once again :("); -//! -//! // . txLoadImage! -//! -//! txBitBlt (txDC(), 0, 0, 800, 600, background_FromTXLibHelp, 0, 0); -//! -//! ... -//! txDeleteDC (background_FromTXLibHelp); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txBitBlt (HDC dest, double xDest, double yDest, double width, double height, - HDC src, double xSrc = 0, double ySrc = 0, DWORD rOp = SRCCOPY); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief ( , DC) -//! . -//! -//! @param dest ( ) -//! @param xDest - - -//! @param yDest Y- - -//! @param width , -//! @param height , -//! @param src ( ) -//! @param xSrc - - -//! @param ySrc Y- - -//! @param transColor , -//! -//! @return - true, - false. -//! -//! @warning NULL, . -//! - . -//! . . -//! -//! TransparentBlt Win32 API . txTransparentBlt -//! . If you need image scaling, use original function -//! TransparentBlt and don't mess with stupid TX-based tools. (See implementation of txTransparentBlt -//! in TXLib.h). -//! -//! @note TransparentBlt , AlphaBlend, . -//! -//! @see txBitBlt(), txTransparentBlt(), txLoadImage(), txCreateCompatibleDC() -//! -//! @usage . TX\Examples\Tennis\Tennis.cpp. -//! @code -//! HDC superman_FromTXLibHelp = txLoadImage ("Resources\\Images\\Superman.bmp"); -//! -//! if (!superman_FromTXLibHelp) -//! txMessageBox ("Cannot load superman, all the monsters will succeed (I copied them from TXLib Help)", "Sorry"); -//! -//! // . txLoadImage! -//! -//! txTransparentBlt (txDC(), 0, 0, 800, 600, superman_FromTXLibHelp, 0, 0); -//! -//! // : -//! Win32::TransparentBlt (txDC(), 0, 0, 800, 600, superman_FromTXLibHelp, 0, 0, 80, 60, -1); // 10- -//! // Win32 GDI, TXLib'! :) . TransparentBlt MSDN.com. -//! -//! ... -//! txDeleteDC (superman_FromTXLibHelp); // So pity :( But he was only a copy from TXLib Help. -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txTransparentBlt (HDC dest, double xDest, double yDest, double width, double height, - HDC src, double xSrc = 0, double ySrc = 0, COLORREF transColor = TX_BLACK); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief ( , DC) -//! . -//! -//! @param dest ( ) -//! @param xDest - - -//! @param yDest Y- - -//! @param width , -//! @param height , -//! @param src ( ). 32- - (. ). -//! @param xSrc - -, . -//! @param ySrc Y- -, . -//! @param alpha , - (0 - , 1 - -). -//! -//! @return - true, - false. -//! -//! @warning NULL, . -//! - . -//! . . -//! -//! - - . -//! -//! @note txLoadImage() 32- RGBA-. -//! (A, -) -//! . 24- (TrueColor RGB) txAlphaBlend . -//! -//! - , , Adobe Photoshop, " (New Channel)" -//! (Channels). - , - -//! . ( R, G, B) -//! , , . . - -//! TX\Examples\Tennis\Tennis.cpp ( : TX\Examples\Tennis\Resources\Images\Racket.bmp). -//! -//! , R,G,B -: R,G,B *= A. : -//! -//! - - 0 ( ), -//! R,G,B 0 ( ). -//! - - 255 ( ), -//! R,G,B . -//! - -, . -//! -//! Photoshop Image @d Apply Image : -//! @table @tr Source: @td -//! @tr Layer: @td Background -//! @tr @b Channel: @td Alpha 1 -//! @tr Blending: @td Multiply -//! @tr Opacity: @td 100% -//! @endtable -//! -//! @note AlphaBlend Win32 API . txAlphaBlend -//! . If you still need image scaling, use original function AlphaBlend -//! and don't mess with stupid TX-based tools. (See implementation of txAlphaBlend in TXLib.h). -//! -//! @see txBitBlt(), txTransparentBlt(), txLoadImage(), txCreateCompatibleDC() -//! -//! @usage . TX\Examples\Tennis\Tennis.cpp. -//! @code -//! HDC batman_FromTXLibHelp = txLoadImage ("Resources\\Images\\Batman.bmp"); -//! -//! if (!batman_FromTXLibHelp) -//! txMessageBox ("Call to Batman failed because I copied it from TXLib Help", "Do save yourself"); -//! -//! // . txLoadImage! -//! -//! txAlphaBlend (txDC(), 0, 0, 800, 600, batman_FromTXLibHelp, 0, 0); -//! -//! ... -//! txDeleteDC (batman_FromTXLibHelp); // Don't worry, batman will return in "Batman returns" movie, later... -//! ... -//! -//! return batman_FromTXLibHelp; // ...and there he comes -- in TXLib copy form -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txAlphaBlend (HDC dest, double xDest, double yDest, double width, double height, - HDC src, double xSrc = 0, double ySrc = 0, double alpha = 1.0); -//! @} -//} - -//================================================================================================================= -//{ Utility functions -//! @name -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param time . -//! -//! @return , . -//! -//! @note , -//! txBegin(). -//! -//! @see txBegin(), txEnd(), txUpdateWindow() -//! -//! @usage @code -//! txSleep (500); // : -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -double txSleep (double time); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief , . -//! -//! txEnd(). -//! -//! , txSleep(), -//! , . -//! -//! @warning . . -//! -//! @note Alt+PrintScreen, . -//! -//! @return ( 0, ). -//! -//! @see txEnd(), txSleep(), txUpdateWindow(), txTextCursor() -//! -//! @usage @code -//! txBegin(); // "" -//! txSetFillColor (TX_WHITE); -//! txClear(); // txBegin() -//! txSetFillColor (TX_RED); -//! txRectangle (100, 100, 200, 200); -//! txEnd(); // -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline int txBegin(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief , txBegin(). -//! -//! @warning txBegin() , -//! txEnd(). -//! -//! @note Alt+PrintScreen, . -//! -//! @return ( 0, ). -//! -//! @see txBegin(), txSleep(), txUpdateWindow(), txTextCursor() -//! -//! @usage @code -//! txBegin(); // "" -//! txSetFillColor (TX_WHITE); -//! txClear(); // txBegin() -//! txSetFillColor (TX_RED); -//! txRectangle (100, 100, 200, 200); -//! txEnd(); // -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline int txEnd(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Service -//! @brief . -//! -//! @param update (true - , false - ). -//! -//! @return . -//! -//! txBegin() txEnd(), " -//! ", txUpdateWindow() -//! . -//! -//! . txBegin(), txEnd() txSleep(). -//! -//! @see txBegin(), txEnd(), txSleep(), txUpdateWindow(), txTextCursor(), txLock(), txUnlock(), txGDI() -//! -//! @usage @code -//! txUpdateWindow (false); -//! ... -//! txUpdateWindow(); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline int txUpdateWindow (int update = true); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Service -//! @brief GDI. -//! -//! @param obj GDI -//! -//! @return - true, - false. -//! -//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txSelectFont() -//! -//! @usage @code -//! HPEN pen = CreatePen (PS_DASH, 1, RGB (255, 128, 0)); -//! txSelectObject (pen); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txSelectObject (HGDIOBJ obj); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Service -//! @brief . . . -//! -//! @return - true, - false. -//! -//! , , -//! @a . @strike @endstrike -//! , . -//! -//! @see txCreateWindow(), txSleep() -//! -//! @usage @code -//! int main() -//! { -//! txCreateWindow (800, 600); -//! -//! txSetTextAlign (TA_CENTER); -//! txTextOut (txGetExtentX()/2, txGetExtentY()/2, "Press any key to exit!"); -//! @endcode -// -// +--<<< , . ! [F3] " " -// | -// v -// txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture(); -//! @code txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture(); -//! return 0; -//! } -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -// +--<<< __ , __. ! [F3] " " -// | -// v -bool txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief TXLib. -//! -//! @return - true, - false. -//! -//! @warning TXLib, main() . -//! @b , @b . -//! -//! @see txCreateWindow() -//! -//! @usage @code -//! txDestroyWindow(); // Farewell to the world -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txDestroyWindow(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @return ( ) . -//! -//! @see txSleep() -//! -//! @usage @code -//! if (txQueryPerformance() < 1) printf (" "); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -double txQueryPerformance(); - -//! @} -//} - -//================================================================================================================= -//{ Mouse functions -//! @name -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Mouse -//! @brief ! -//! -//! @return POINT. -//! -//! @see txMouseX(), txMouseY(), txMousePos(), txMouseButtons() -//! -//! @usage @code -//! RECT area = { 100, 100, 110, 110 }; -//! -//! while (txMouseButtons() != 1) -//! { -//! if (In (txMousePos(), area)) txTextOut (100, 100, "What are you doing here?!"); -//! txSleep (0); -//! } -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline POINT txMousePos(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Mouse -//! @brief - ! -//! -//! @return - . -//! -//! @see txMouseX(), txMouseY(), txMousePos(), txMouseButtons() -//! -//! @usage @code -//! while (txMouseButtons() != 1) -//! { -//! txCircle (txMouseX(), txMouseY(), 20); -//! txSleep (0); -//! } -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline int txMouseX(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Mouse -//! @brief Y- ! -//! -//! @return Y- . -//! -//! @see txMouseX(), txMouseY(), txMousePos(), txMouseButtons() -//! -//! @usage @code -//! while (txMouseButtons() != 1) -//! { -//! txCircle (txMouseX(), txMouseY(), 20); -//! txSleep (0); -//! } -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline int txMouseY(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Mouse -//! @brief ! -//! -//! @return ! -//! -//! 1- () , -//! 2- - . @n -//! , 3 ( 11) . -//! -//! @see txMouseX(), txMouseY(), txMousePos(), txMouseButtons() -//! -//! @usage @code -//! while (txMouseButtons() != 3) -//! { -//! if (txMouseButtons() & 1) txCircle (txMouseX(), txMouseY(), 20); -//! if (txMouseButtons() & 2) txLine (txMouseX(), txMouseY(), 0, 0); -//! txSleep (0); -//! } -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline int txMouseButtons(); - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Console functions -//! @name -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param colors . -//! -//! @return - true, - false. -//! -//! @b - (colorText) (colorBackground), : @nn -//! colors = colorText + colorBackground * 16 @nn -//! @nn -//! colors = colorText | (colorBackground \<\< 4) @nn -//! @b , @ref txColors "TX_..." -//! , RGB(), txSetColor(), txColor(), txSetFillColor(), txFillColor() .. -//! . . -//! -//! @title -//! @table @tr Dec @td @c Hex @td @td Dec @td @c Hex @td -//! @tbr -//! @tr 0 = @td @c 0x0 @td = , @td 8 = @td @c 0x8 @td = -, -//! @tr 1 = @td @c 0x1 @td = , @td 9 = @td @c 0x9 @td = -, -//! @tr 2 = @td @c 0x2 @td = , @td 10 = @td @c 0xA @td = -, -//! @tr 3 = @td @c 0x3 @td = -, @td 11 = @td @c 0xB @td = --, -//! @tr 4 = @td @c 0x4 @td = , @td 12 = @td @c 0xC @td = -, -//! @tr 5 = @td @c 0x5 @td = , @td 13 = @td @c 0xD @td = -, -//! @tr 6 = @td @c 0x6 @td = -, @td 14 = @td @c 0xE @td = , -//! @tr 7 = @td @c 0x7 @td = , @td 15 = @td @c 0xF @td = . -//! @endtable -//! -//! : , , -//! , @c 0x1e ( - 4 - , -//! - 4 - ). -//! -//! @see txTextCursor(), txGetConsoleAttr(), txSetConsoleCursorPos(), txGetConsoleCursorPos(), -//! txGetConsoleFontSize(), txClearConsole() -//! -//! @usage @code -//! txSetConsoleAttr (0x1E); -//! printf (" 0x1 0xE"); // (c) . -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txSetConsoleAttr (unsigned colors = 0x07); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @return . . txSetConsoleAttr(). -//! -//! @see txTextCursor(), txSetConsoleAttr(), txSetConsoleCursorPos(), txGetConsoleCursorPos(), -//! txGetConsoleFontSize(), txClearConsole() -//! -//! @usage @code -//! unsigned attr = txGetConsoleAttr(); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -unsigned txGetConsoleAttr(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @return - true, - false. -//! -//! ( ) . -//! -//! @see txTextCursor(), txSetConsoleAttr(), txGetConsoleAttr(), txGetConsoleCursorPos(), -//! txGetConsoleFontSize(), txClearConsole() -//! -//! @usage @code -//! txClearConsole(); // , -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txClearConsole(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param x X- . -//! @param y Y- . -//! -//! @return POINT. -//! -//! @note . , -//! . , -//! . . txGetConsoleFontSize(). -//! -//! @see txTextCursor(), txSetConsoleAttr(), txGetConsoleAttr(), txGetConsoleCursorPos(), -//! txGetConsoleFontSize(), txClearConsole() -//! -//! @usage @code -//! txSetConsoleCursorPos (txGetExtentX(), txGetExtentY()); // -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -POINT txSetConsoleCursorPos (double x, double y); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @return POINT. -//! -//! @see txTextCursor(), txSetConsoleAttr(), txGetConsoleAttr(), txSetConsoleCursorPos(), -//! txGetConsoleFontSize(), txClearConsole() -//! -//! @usage @code -//! POINT pos = txGetConsoleCursorPos(); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -POINT txGetConsoleCursorPos(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @return , POINT. -//! -//! @see txTextCursor(), txSetConsoleAttr(), txGetConsoleAttr(), txSetConsoleCursorPos(), -//! txGetConsoleFontSize(), txClearConsole() -//! -//! @usage @code -//! POINT size = txGetConsoleFontSize(); -//! txSetConsoleCursorPos (5 * size.x, 10 * size.y); // -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -POINT txGetConsoleFontSize(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Drawing -//! @brief . -//! -//! @param blink false - -//! -//! @return . -//! -//! @see txSetConsoleAttr(), txGetConsoleAttr(), txSetConsoleCursorPos(), txGetConsoleCursorPos(), -//! txGetConsoleFontSize(), txClearConsole(), txCreateWindow(), txUpdateWindow(), txLock(), txUnlock(), txGDI() -//! -//! @usage @code -//! txTextCursor (false); -//! ... -//! txTextCursor(); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txTextCursor (bool blink = true); - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Other staff not related to drawing -//! @name , -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief . -//! -//! @param filename . NULL - . -//! @param mode -//! -//! @return - true, - false. -//! -//! @title : @table -//! @tr SND_ASYNC @td . @n -//! , txPlaySound (NULL). -//! @tr SND_SYNC @td . -//! @tr SND_LOOP @td . @n -//! , txPlaySound (NULL). -//! @tbr -//! @tr SND_NODEFAULT @td , . -//! @tr SND_NOSTOP @td - , . -//! @tr SND_APPLICATION @td , , . -//! @endtable -//! -//! @note WAV. (MP3 .) . -//! , txLoadImage(). -//! -//! @usage @code -//! txPlaySound ("tada.wav"); // So happy that this always exists -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txPlaySound (const char filename[] = NULL, DWORD mode = SND_ASYNC); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief MessageBox. -//! -//! @param text -//! @param header -//! @param flags -//! -//! @return , MessageBox. -//! -//! @warning _TX_BIGBUFSIZE , @d _TX_BIGBUFSIZE , -//! . -//! -//! @note txMessageBox (text, header, flags) Win32 -//! MessageBox (txWindow(), text, header, flags). txMessageBox , -//! -, , -//! UNICODE. , Windows -//! , UNICODE. -//! @c txMessageBox . -//! -//! @see TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txNotifyIcon() -//! -//! @usage @code -//! if (txMessageBox ("?", " ", MB_YESNO) == IDYES) -//! { -//! MessageBox (txWindow(), " MessageBox()", "Win32 ", 0); -//! } -//! else -//! txMessageBox (" . . ."); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -unsigned txMessageBox (const char* text, const char* header = "TXLib ", unsigned flags = 0); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief . -//! -//! @param flags -//! @param title -//! @param format , printf(). -//! -//! @title : -//! @table @tr @c NIIF_INFO @td -//! @tr @c NIIF_WARNING @td -//! @tr @c NIIF_ERROR @td -//! @endtable -//! -//! @return . -//! -//! printf() . -//! -//! @warning -//! - , Internet Explorer @c (_WIN32_IE) -//! 0x0500. TXLib.h @c windows.h . -//! @c (\#define) . -//! Internet Explorer , Windows -//! (, @c shell32.dll @c comctl32.dll), -//! ). Internet Explorer -//! . -//! - _TX_BUFSIZE , . -//! -//! @see TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox() -//! -//! @usage @code -//! int hours = 3, minutes = 10; -//! const char station[] = ""; -//! ... -//! txNotifyIcon (NIIF_INFO, " ", -//! " %s %d:%d.", station, hours, minutes); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -bool txNotifyIcon (unsigned flags, const char title[], const char format[], ...) _TX_CHECK_FORMAT (3); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief . -//! -//! @param format , printf(). -//! -//! @return . -//! -//! printf() OutputDebugString(). -//! -, , -//! DbgView. -//! , @c '\\a' (. ), . :( -//! @note -//! - @c '\\a', txMessageBox(). -//! - @c '\\f', printf(). -//! -//! @warning _TX_BIGBUFSIZE , . -//! -//! @see TX_ERROR(), TX_DEBUG_ERROR(), txNotifyIcon(), txMessageBox() -//! -//! @usage @code -//! int x = 42; -//! ... -//! txOutputDebugPrintf (" , %d.", x); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -int txOutputDebugPrintf (const char format[], ...) _TX_CHECK_FORMAT (1); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief -//! -//! @param arr -//! -//! @return ( ). -//! -//! sizearr() , , -//! . -//! -//! SIZEARR() , -//! . -//! , , -//! . -//! -//! @warning SIZEARR() , , -//! , SIZEARR(). . . -//! -//! @note Microsoft Visual Studio 6 sizearr() - , -//! . :( -//! -//! @usage @code -//! void test() -//! { -//! // , , -//! // . 4 ( POINT). -//! -//! POINT coord[] = { {110, 110}, {120, 120}, {130, 110}, {140, 120} }; -//! -//! // , .. . -//! -//! for (int i = 0; i < sizearr (coord) - 1; i++) -//! txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y); -//! -//! DrawLines1 (coord); // . -//! DrawLines2 (coord, sizearr (coord)); // . -//! -//! DrawLines3 (coord); // , , . -//! } -//! -//! // DrawLines1 DrawLines2 : -//! -//! void DrawLines1 (const POINT coord[]) -//! { -//! // . : -//! // 1) sizearr , . -//! // 2) SIZEARR , , -//! // .. sizeof (POINT*) / sizeof (POINT) == 4/8 == 0. -//! -//! for (int i = 0; i < sizearr (coord) - 1; i++) -//! txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y); -//! } -//! -//! void DrawLines2 (const POINT coord[], int n) -//! { -//! // n, . -//! -//! for (int i = 0; i < n - 1; i++) -//! txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y); -//! } -//! -//! // HIC SVNT TEMPLATES -//! -//! template -//! void DrawLines3 (const POINT (&coord) [size]) -//! { -//! for (int i = 0; i < size - 1; i++) -//! txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y); -//! } -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- -//! @{ - -#ifndef _MSC_VER_6 - - #define sizearr( arr ) ( sizeof (get_size_of_an_array_with_unknown_or_nonconst_size_ (arr)) ) - - //! @cond INTERNAL - // See explanation here: http://blogs.msdn.com/b/the1/archive/2004/05/07/128242.aspx - - template char (&get_size_of_an_array_with_unknown_or_nonconst_size_ (T (&) [N])) [N]; // ;) - - //! @endcond - -#endif - -//! sizearr() Microsoft Visual Studio 6 - -#define SIZEARR( arr ) ( sizeof (arr) / sizeof (0[arr]) ) - -//! @} -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief , [a; b] -//! -//! @param x -//! @param a () -//! @param b () -//! -//! @return a <= x && x <= b, , - -//! -//! @usage @code -//! while (txMouseButtons() != 1) -//! { -//! if (In (txMouseX(), 110, 120)) txTextOut (100, 100, "Meet the wall!"); -//! txSleep (0); -//! } -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -template -inline bool In (T x, T a, T b); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief , pt rect -//! -//! @param pt POINT {x, y} -//! @param rect RECT {left, top, right, bottom} -//! -//! @return -//! -//! , . -//! -//! @usage @code -//! RECT button = { 100, 100, 150, 120 }; -//! -//! txSetFillColor (TX_LIGHTGRAY); -//! txRectangle (button.left, button.top, button.right, button.bottom); -//! -//! txSetTextAlign(); -//! txSetFillColor (TX_WHITE); -//! txTextOut (125, 115, "Cookie"); -//! -//! for (;;) -//! { -//! if (In (txMousePos(), button)) -//! { -//! txSetFillColor (TX_TRANSPARENT); -//! txRectangle (button.left, button.top, button.right, button.bottom); -//! -//! if (txMouseButtons()) -//! { -//! txSetFillColor (TX_DARKGRAY); -//! txRectangle (button.left, button.top, button.right, button.bottom); -//! -//! txSetFillColor (TX_WHITE); -//! txTextOut (125, 115, "You got cookie"); -//! -//! break; -//! } -//! } -//! -//! txSleep (0); -//! } -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- -//! @{ - -inline bool In (const POINT& pt, const RECT& rect); - -inline bool In (const COORD& pt, const SMALL_RECT& rect); - -//! @} -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief -//! -//! @param range (@b ). -//! -//! @return [0; range). -//! -//! , ? :) -//! -//! @usage @code -//! char message[100] = "Maybe..."; -//! sprintf ("You SUDDENLY got %d bucks now. But note that tax rate is $%d.", random (100), 100); -//! txMessageBox (message, "Lottery"); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline int random (int range); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief -//! -//! @param left (@b ). -//! @param right (@b ). -//! -//! @return [left; right]. -//! -//! , ? :) -//! -//! @usage @code -//! int money = random (-100, +100); -//! if (money < 0) -//! { -//! char message[100] = "Maybe..."; -//! sprintf (" ? %d ", -money); -//! txMessageBox (message, "!"); -//! } -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline double random (double left, double right); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief -//! -//! @param a :) -//! @param b :) -//! -//! @return a b -//! -//! @see MIN() -//! -//! @usage @code -//! if (MAX (3, 7) != 7) printf ("Your CPU is broken, throw it away."); -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#define MAX( a, b ) ( (a) > (b) ? (a) : (b) ) - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief -//! -//! @param a :) -//! @param b :) -//! -//! @return a b -//! -//! @see MAX() -//! -//! @usage @code -//! if (MIN (3, 7) != 3) printf ("Your CPU is still broken, throw it away twice."); -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#define MIN( a, b ) ( (a) < (b) ? (a) : (b) ) - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief -//! -//! @param x -//! -//! @return , @c int -//! -//! @usage @code -//! double weight = 5.5; // 5.5 kilos is the weight of Maru in 2012. -//! int Maru = ROUND (weight); // Should use ROUND() because Maru is so round. -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L // C99 case - - #define ROUND( x ) ( (int) round (x) ) - -#else - - #define ROUND( x ) ( (int) floor ((x) + 0.5) ) - -#endif - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief -//! -//! @usage @code -//! if (txPI == 1) txMessageBox (" .", "", MB_ICONSTOP); -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -const double txPI = asin (1.0) * 2; - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief . -//! -//! @param x -//! -//! @return , , -//! -//! @note , : txSqr() @d " ". -//! , ( , ), -//! , , . -//! txSqr() - , . , , . -//! . . -//! -//! @usage @code -//! printf ("\n" "\t\t" " \n\n"); -//! -//! for (double r = 100; r > 0; r--) -//! { -//! printf ("%6.2lf...", r); -//! -//! double square = M_PI * txSqr (r); // ! -//! printf ("\b\b\b \t"); -//! -//! printf ("%-.2lf\n", square); -//! } -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -inline -double txSqr (double x) - { - double sqr = pow (sqrt (x) * sqrt (x), sqrt (4.0)); // - - char str[1024] = ""; - _snprintf_s (str, sizeof (str), " %g!" "!!" "!!" " ???? ", sqr); - txMessageBox (str, " !" "!!", MB_ICONEXCLAMATION | MB_YESNO) != IDNO || - ( - txMessageBox ("...", " ", MB_ICONINFORMATION), - txMessageBox (" ", " ...", MB_ICONSTOP), - exit (EXIT_FAILURE), 0 - ); - - txNotifyIcon (1, NULL, "\n%s\n", " ! \0" // , ? - " ... \0" // - " \0" // - " - \0" // ?.. - ", \0" - " ?\0" + GetTickCount() % 6 * 21); - - return sqr; // . - } - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief , -//! -//! @param type -//! -//! @return @p type, ( - ). -//! -//! @usage @code -//! void f (POINT p); -//! ... -//! -//! POINT z = {}; f (z); // ZERO -//! -//! f (ZERO (POINT)); // ZERO -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#define ZERO( type ) zero () - -//! @cond INTERNAL -template inline T zero(); -//! @endcond - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief ( @c __finally) -//! -//! @param param_t -//! @param param -//! @param func ( ) -//! -//! @par TX_AUTO_FUNC (param_t, param, func) -//! @note -//! - @a . -//! - @c param_t @c param , -//! . -//! . -//! - : TX_FINALLY -//! -//! @warning Microsoft Visual Studio 6 2003 (Debug) , -//! . MS KB Article 199057. -//! @c _TX_AUTO_FUNC, . @c TX_AUTO_FUNC. -//! -//! @par tx_auto_func (func) -//! @note -//! - @a . -//! - @a . . -//! - - @c C++0x, MSVS 2010 -//! GCC 4.5 @c -std=c++0x @c -std=c++11. -//! - : tx_finally -//! -//! @see txAutoLock -//! -//! @usage @code -//! void f1() -//! { -//! int x = 1; -//! TX_AUTO_FUNC (int, x, $(x)); // Will be printed at return -//! -//! FILE* f = fopen (__FILE__".o.txt", "w"); // Will be closed at return -//! TX_AUTO_FUNC (FILE*, f, fclose (f)); -//! -//! fprintf (f, "start: x = %d\n", x); // Do some job -//! x = 2; // Do some job -//! } -//! -//! void f2() // Do the same. For C++0x only -//! { -//! int x = 1; -//! tx_auto_func ($(x)); // More simple usage -//! -//! FILE* f = fopen (__FILE__".o.txt", "w"); -//! tx_auto_func (fclose (f)); // More simple usage -//! -//! fprintf (f, "start: x = %d\n", x); -//! x = 2; -//! } -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- -//! @{ - -//{ C++03 version - -#define TX_AUTO_FUNC( param_t, param, func ) \ - _TX_AUTO_FUNC( __LINE__, param_t, param, func ) - -#define _TX_AUTO_FUNC( n, param_t, param, func ) \ - _TX_AUTO_FUN2( n, param_t, param, func ) - -#define _TX_AUTO_FUN2( n, param_t, param, func ) \ - struct _TX_AUTO_FUNC_##n \ - { \ - typedef _TX_AUTO_FUNC_##n this_t; \ - param_t& param; \ - \ - _TX_AUTO_FUNC_##n (param_t& __p) : param (__p) { } \ - ~_TX_AUTO_FUNC_##n () { func; } \ - \ - private: this_t& operator= (const this_t&) { return *this; } \ - } \ - _TX_AUTO_FUNC_##n (param) -//} - -//{ C++0x version, use MSVS 2010 or GCC v.4.5+ and -std=c++0x in command line - -#define tx_auto_func( func ) _tx_auto_fun1 ( __LINE__, func ) -#define _tx_auto_fun1( n, func ) _tx_auto_fun2 ( n, func ) -#define _tx_auto_fun2( n, func ) auto _tx_auto_func_##n = _tx_auto_func ([&]() { func; }) - -template -struct _tx_auto_func_ - { - typedef _tx_auto_func_ this_t; - T func_; - - _tx_auto_func_ (T func) : func_ (func) {} - ~_tx_auto_func_ () { func_(); } - - private: this_t& operator= (const this_t&) { return *this; } - }; - -template -_tx_auto_func_ _tx_auto_func (T func) - { - return _tx_auto_func_ (func); - } -//} - -//{ Compatibility - -#define TX_FINALLY( param_t, param, func ) TX_AUTO_FUNC (param_t, param, func) -#define tx_finally( func ) tx_auto_func (func) - -//} - -//! @} - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief assert(), txMessageBox(), -//! OutputDebugString(). -//! -//! @param cond -//! -//! @return -//! -//! , assert(), , . @n -//! , -//! . -//! -//! @warning Release ( NDEBUG) assert . @n -//! assert() , ! -//! -//! @note @c cond , -//! ( 0). -//! @note See: "JPL Institutional Coding -//! Standard for the C Programming Language", Jet Propulsion Laboratory, California Institute of -//! Technology, JPL DOCID D-60411, Ver. 1.0, March 3, 2009, page 15. -//! -//! @see asserted, verified, verify(), TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(), -//! txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__ -//! -//! @usage @code -//! assert (0 <= i && i < ARRAY_SIZE); -//! -//! FILE* input = fopen ("a.txt", "r"); -//! assert (input); -//! -//! // fgets() Release: -//! assert (fgets (str, sizeof (str) - 1, input)); -//! -//! // : -//! bool ok = (fclose (input) == 0); -//! assert (ok); -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#if !defined (NDEBUG) - #undef assert - #define assert( cond ) _txNOP ( !(cond)? (TX_ERROR ("\a" ": : " \ - ", \"%s\"." TX_COMMA #cond), \ - 0/(int)!!(cond)) : 1 ) -#else - #undef assert - #define assert( cond ) ((void) 1) - -#endif - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief . -//! -//! @return 0 -//! -//! assert(), Release . -//! -//! @note , 0 false. @n@n -//! Release ( NDEBUG) asserted . -//! -//! @see assert(), verify(), verified, TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(), -//! txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__ -//! -//! @usage @code -//! FILE* input = fopen ("a.txt", "r"); assert (input); -//! -//! // fgets() : -//! fgets (str, sizeof (str) - 1, input) asserted; -//! -//! // fgets() Release: -//! assert (fgets (str, sizeof (str) - 1, input)); -//! -//! (fclose (input) != 0) asserted; -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#if !defined (NDEBUG) - #define asserted || TX_ERROR ("\a" " .") - -#else - #define asserted || _txNOP (0) - -#endif - -#define verified asserted //!< For compatibility with assert macro - -//! @cond INTERNAL -#define TX_NEEDED asserted //!< For compatibility with earlier releases -//! @endcond - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief ( ) . -//! -//! @param expr () -//! -//! @return 1, @p expr , 0. -//! -//! , verify(), , . @n -//! , -//! . -//! -//! @note assert(), Release ( NDEBUG) -//! verify @b . -//! -//! @see verified, assert(), asserted, TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(), -//! txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__ -//! -//! @usage @code -//! FILE* input = verify (fopen ("a.txt", "r")); -//! -//! // fgets() Release: -//! verify (fgets (str, sizeof (str) - 1, input)); -//! -//! // : -//! verify (fclose (input) == 0); -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#if !defined (NDEBUG) - #undef verify - #define verify assert - -#else - #undef verify - #define verify( expr ) ( expr ) - -#endif - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief . -//! -//! @param msg @c printf(). -//! -//! @note @c GCC ANSI ( -ansi) -//! Microsoft Visual Studio 6 2003 . -//! , , @b _ (@ref _ " ", -//! ) TX_COMMA, , TX_ERROR @d . @n -//! boost, -//! @b @c TXLib.h TX_COMMA, @c boost -//! @c boost::preprocessor, @strike -//! . @endstrike -//! -//! @return false -//! -//! @see _, TX_COMMA, assert(), asserted, verify(), verified, TX_DEBUG_ERROR(), txOutputDebugPrintf(), -//! txMessageBox(), txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__ -//! -//! @usage @code -//! TX_ERROR (" ' '. %d: '%s'", reasonNum, fileName); -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -// Variadic macros not supported in Strict ANSI mode and in MSVC prior to MSVC 8 (2005) - -#if defined (__STRICT_ANSI__) || defined (_MSC_VER) && (_MSC_VER < 1400) - #define TX_ERROR( msg ) _txError (__FILE__, __LINE__, __TX_FUNCTION__, msg) - -#else - #define TX_ERROR( ... ) _txError (__FILE__, __LINE__, __TX_FUNCTION__, __VA_ARGS__) - -#endif - -//! @cond INTERNAL -#define TX_THROW TX_ERROR //!< For compatibility with earlier releases -//! @endcond - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief . -//! -//! . TX_ERROR. -//! -//! @note Release . -//! -//! @see _, TX_COMMA, assert(), asserted, verify(), verified, TX_ERROR(), txOutputDebugPrintf(), -//! txMessageBox(), txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__ -//! -//! @usage @code -//! TX_DEBUG_ERROR (" ' '. %d: '%s'", reasonNum, fileName); -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#if !defined (NDEBUG) - #define TX_DEBUG_ERROR TX_ERROR - -#else - #define TX_DEBUG_ERROR(m) ((void) 0) - -#endif - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief . -//! -//! @param address . -//! @param name ( 8 ). -//! -//! @note 256 . @nn -//! 0x07 (- ). -//! -//! @see TX_ERROR(), TX_DEBUG_ERROR() -//! -//! @usage @code -//! const char text[] = " - "; -//! txDump (text); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -void txDump (const void* address, const char name[] = "txDump()"); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief , - . -//! -//! @note TX_COMMA . -//! -//! @see TX_ERROR(), TX_DEBUG_ERROR() -//! -//! @usage @code -//! TX_ERROR (" : ' ', '%s', %d" _ fileName _ lineNum); -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- -//! @{ - -#define _ , -#define TX_COMMA , //!< _ (@ref _ " ") - -//! @} - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#if defined (__GNUC__) - #define __TX_COMPILER__ "GNU g++ " TX_PREPROCESS (__GNUC__) "." \ - TX_PREPROCESS (__GNUC_MINOR__) "." \ - TX_PREPROCESS (__GNUC_PATCHLEVEL__) \ - ", std=" TX_PREPROCESS (__cplusplus) -#elif defined (_MSC_VER) - #define __TX_COMPILER__ "MSVS " TX_PREPROCESS (_MSC_VER) \ - ", std=" TX_PREPROCESS (__cplusplus) - -#elif defined (__INTEL_COMPILER) - #define __TX_COMPILER__ "Intel C++ " TX_PREPROCESS (__INTEL_COMPILER) \ - ", std=" TX_PREPROCESS (__cplusplus) - -#else - #define __TX_COMPILER__ "Unknown C++, std=" TX_PREPROCESS (__cplusplus) - -#endif - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief , , . -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#define __TX_FILELINE__ __FILE__ " (" TX_PREPROCESS (__LINE__) ")" - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief -//! -//! @warning , __TX_FUNCTION__ -//! . -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#if defined (__GNUC__) - #define __TX_FUNCTION__ __PRETTY_FUNCTION__ - -#elif defined (__FUNCSIG__) - #define __TX_FUNCTION__ __FUNCSIG__ - -#elif defined (__FUNCTION__) - #define __TX_FUNCTION__ __FUNCTION__ - -#elif defined (__INTEL_COMPILER) && (__INTEL_COMPILER >= 600) - #define __TX_FUNCTION__ __FUNCTION__ - -#elif defined (__BORLANDC__) && (__BORLANDC__ >= 0x550) - #define __TX_FUNCTION__ __FUNC__ - -#elif defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901) - #define __TX_FUNCTION__ __func__ - -#elif defined (__PYTHON__) - #error No Python. No. Using parseltongue languages can lead you to Slytherin. - -#else - #define __TX_FUNCTION__ "(" __TX_FILELINE__ ")" - -#endif - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#if !defined (NDEBUG) && defined (_DEBUG) - #define _TX_BUILDMODE "DEBUG" - -#elif !defined (NDEBUG) && !defined (_DEBUG) - #define _TX_BUILDMODE "Debug" - -#elif defined (NDEBUG) - #define _TX_BUILDMODE "Release" -#endif - -//! @{ @cond INTERNAL - -#define TX_PREPROCESS( sym ) _TX_QUOTE (sym) -#define _TX_QUOTE( sym ) #sym - -//! @endcond - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief TXLib, . -//! -//! @note TXLib.h. -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#if !defined (_TX_MODULE) - #define _TX_MODULE "TXLib" -#endif - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Back-hole (I hope, not an ass-hole:) of the library) -//! @name -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Service -//! @brief Windows ( ) -//! TXLib. -//! -//! @param wndProc TXLib. @n -//! NULL, . -//! -//! @return TXLib. -//! -//! @b TXLib. -//! : -//! @code -//! LRESULT CALLBACK NewWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam); -//! @endcode -//! -//! @warning () , @ref -//! txCreateWindow(). @b , main(). -//! , .. " -//! " (race condition). -//! -//! @warning , 0, TXLib -//! @b . - , , . -//! Alt-Ctrl-Del , -//! Process Explorer. -//! , Win32 (. MSDN), -//! DefWindowProc(). -//! -//! @note SetWindowLong SetWindowLongPtr: -//! @code -//! WNDPROC OldWndProc = (WNDPROC) SetWindowLongPtr (txWindow(), GWL_WNDPROC, (LONG_PTR) NewWndProc); -//! @endcode -//! CallWindowProc, (. MSDN), -//! , . -//! -//! @see txCreateWindow(), txDialog, txInputBox() -//! -//! @usage @code -//! LRESULT CALLBACK MyWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam); -//! -//! int main() -//! { -//! txCreateWindow (GetSystemMetrics (SM_CXSCREEN) / 4, GetSystemMetrics (SM_CYSCREEN) / 4); -//! -//! txSetWindowsHook (MyWndProc); -//! -//! txDrawText (0, 0, txGetExtentX(), txGetExtentY(), "MOV txWindow, eax [please]"); -//! -//! return 0; -//! } -//! -//! LRESULT CALLBACK MyWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam) -//! { -//! if (message == WM_MOVE) txMessageBox (" I like to MOVe it, MOVe it", "TXLib 2 Real", MB_ICONINFORMATION); -//! -//! static int i = 0; -//! if (i++ % 10 == 0) printf ("\b" "%c", "-\\|/" [i/10 % 4]); // -//! -//! return 0; // TXLib -//! } -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -WNDPROC txSetWindowsHook (WNDPROC wndProc = NULL); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Service -//! @brief ( ). -//! -//! @param wait -//! -//! @return -//! -//! Win32 GDI txLock() -//! txUnlock(). , ( , -//! Win32: WM_PAINT) TXLib -//! . - . -//! -//! txLock() EnterCriticalSection(), , , -//! . , -//! . txSleep() Sleep() -//! . -//! -//! txLock() / txUnlock() - . -//! txBegin() / txEnd() / txUpdateWindow(), , -//! . -//! -//! @see txDC(), txLock(), txUnlock(), txGDI() -//! -//! @usage . _txCanvas_OnPAINT() _txConsole_Draw() TXLib.h. -//}---------------------------------------------------------------------------------------------------------------- - -bool txLock (bool wait = true); - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Service -//! @brief -//! -//! @return ( false). -//! -//! . txLock(). -//! -//! @see txDC(), txLock(), txGDI() -//! -//! @usage . _txCanvas_OnPAINT() _txConsole_Draw() TXLib.h. -//}---------------------------------------------------------------------------------------------------------------- -//! @{ - -bool txUnlock(); - -//! @cond INTERNAL -template inline T txUnlock (T value); -//! @endcond - -//! @} - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Service -//! @brief Win32 GDI . -//! -//! @param command GDI (, ) -//! -//! @return , GDI. , -//! false. -//! -//! @note (txDC() NULL), GDI , txGDI() -//! false. @n -//! -//! @note GDI , , -//! , txGDI() - . -//! -//! @see txDC(), txLock(), txUnlock() -//! -//! @usage @code -//! txGDI (( Rectangle (txDC(), x1, y1, x2, y2) )); // (()) -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#define txGDI( command ) txUnlock ( (txLock(), (command)) ) - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Tune-up constants and variables -//! @name -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief TXLib -//! -//! \#define @a TXLib.h , -//! ( @c main) @b . -//! -//! @note : -//! - , -//! - _TX_CP (1251) , -//! - , -//! - stdio iostream , -//! , -//! - ( 0, ..), -//! - , -//! - , -//! - , , -//! - , . @nn -//! -//! @note , EXE- TXLib txCreateWindow(), -//! . @b DLL @b . @nn -//! -//! @note (not thread-safe). -//! -//! @see txCreateWindow(), _TX_ALLOW_KILL_PARENT, _TX_WAITABLE_PARENTS, _txConsoleMode -//! -//! @usage @code -//! #define _TX_NOINIT -//! #include "TXLib.h" -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#if defined (_TX_NOINIT) - - #undef _TX_NOINIT - #define _TX_NOINIT 1 - -#else - - #define _TX_NOINIT 0 - -#endif - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief . ShowWindow. -//! -//! : @c SW_HIDE @d . -//! -//! @note @b . -//! -//! @see _TX_NOINIT -//! -//! @usage @code -//! _txConsoleMode = SW_HIDE; // -//! txCreateWindow (800, 600); -//! -//! _txConsoleMode = SW_SHOW; // -//! txCreateWindow (800, 600); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -unsigned _txConsoleMode = SW_HIDE; - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief . -//! -//! @note -//! - @b . -//! -//! @usage @code -//! _txWindowStyle &= ~WS_CAPTION; // FullScreen: , -//! txCreateWindow (GetSystemMetrics (SM_CXSCREEN), GetSystemMetrics (SM_CYSCREEN)); -//! -//! printf (" Alt+F4\n"); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -unsigned _txWindowStyle = WS_POPUP | WS_BORDER | WS_CAPTION | WS_SYSMENU; - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief -//! @note @b . -//}---------------------------------------------------------------------------------------------------------------- - -const char* _txConsoleFont = "Lucida Console"; - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief () -//}---------------------------------------------------------------------------------------------------------------- - -unsigned _txCursorBlinkInterval = 500; - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief () -//! @note @b . -//}---------------------------------------------------------------------------------------------------------------- - -int _txWindowUpdateInterval = 25; - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief () -//}---------------------------------------------------------------------------------------------------------------- - -#if !defined (TX_TRACE) - const int _TX_TIMEOUT = 1000 - -#else - const int _TX_TIMEOUT = 5000 - -#endif - -#if defined (_TX_USE_DEVPARTNER) - * 10 -#endif - ; - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief TXLib -//}---------------------------------------------------------------------------------------------------------------- - -const unsigned _TX_BUFSIZE = 1024; - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief TXLib -//}---------------------------------------------------------------------------------------------------------------- - -const unsigned _TX_BIGBUFSIZE = 2048; - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief , TXLib. -//! -//! TXLib , TXLib -//! . ( , TXLib, -//! .) -//! -//! . , -//! . -//! -//! TXLib.h . -//! -//! @see _TX_ALLOW_KILL_PARENT, _TX_NOINIT -//}---------------------------------------------------------------------------------------------------------------- - - // TX_VEGETABLE_PRINTERS -#if !defined (_TX_WAITABLE_PARENTS) - #define _TX_WAITABLE_PARENTS "cmd.exe:devenv.exe, " /* MSVS 2003-2010 */ \ - "vcspawn.exe:msdev.exe, " /* MSVS 6 */ \ - "cb_console_runner.exe:codeblocks.exe, " /* CodeBlocks 8-10 */ \ - "cmd.exe:console_runner.exe, " /* CodeBlocks 1 */ \ - "starter.exe:eclipse.exe, " /* Eclipse 4 */ \ - "starter.exe:javaw.exe, " /* Eclipse 3 */ \ - "consolepauser.exe:devcpp.exe" /* Dev-Cpp */ -#endif - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief , TXLib. -//! -//! , TXLib, -//! . -//! -//! , , _TX_WAITABLE_PARENTS. -//! -//! TXLib.h . -//! -//! . TXLib.h. -//! -//! @see _TX_WAITABLE_PARENTS, _TX_NOINIT -//! -//! @usage @code -//! #define _TX_ALLOW_KILL_PARENT false -//! #include "TXLib.h" -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -#if !defined (_TX_ALLOW_KILL_PARENT) // DISCLAIMER: ! -#define _TX_ALLOW_KILL_PARENT true // . -#endif // - . - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Internal diagnostics -//! @name -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief / . -//! -//! TX_TRACE, (statement). -//! . -//! -//! OutputDebugString(), -//! -, , -//! DbgView. , TX_TRACE TXLib.h . -//! -//! @warning @b , Microsoft Visual Studio. -//! DbgView (. ) , -//! - Visual Studio. -//! -//! _TX_ALLOW_TRACE TX_TRACE TXLib.h . -//! -//! @usage @code -//! #define _TX_ALLOW_TRACE // DbgView -//! #include "TXLib.h" -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- -//! @{ - -#ifdef FOR_DOXYGEN_ONLY -#define _TX_ALLOW_TRACE -#endif - -#if defined (_TX_ALLOW_TRACE) - #undef $ - #define $ { _txFile = __FILE__; _txLine = __LINE__; _txFunc = __TX_FUNCTION__; TX_TRACE; } - #undef $1 - #define $1 _txFuncEntry __txFuncEntry; $ - -#elif defined (_DEBUG) - #undef $ - #define $ { _txFile = __FILE__; _txLine = __LINE__; _txFunc = __TX_FUNCTION__; } - #undef $1 - #define $1 _txFuncEntry __txFuncEntry; $ - -#else - #undef $ - #define $ ; - #undef $1 - #define $1 ; - -#endif - -//! @} - -//{---------------------------------------------------------------------------------------------------------------- - -//! @cond _OFF - -extern int _txInitialized; -extern unsigned volatile _txMainThreadId; -extern unsigned volatile _txCanvas_ThreadId; -extern bool _txConsole; -extern bool _txMain; -extern bool _txIsDll; -extern bool volatile _txRunning; -extern bool volatile _txExit; -extern bool volatile _txAllowTrace; - -extern const char* volatile _txFile; -extern int volatile _txLine; -extern const char* volatile _txFunc; -extern _TX_THREAD int volatile _txInTX; - -//! @endcond - -//! @cond INTERNAL - -struct _txFuncEntry - { - _txFuncEntry() { _txInTX++; } - ~_txFuncEntry() { _txInTX--; } - }; - -//! @endcond -//}---------------------------------------------------------------------------------------------------------------- - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Technical -//! @brief OutputDebugString(). -//! -//! OutputDebugString(), -//! -, , -//! DbgView. "" TX\Dev\DbgView.ini, DbgView -//! Edit/Filter/Load (Ctrl+L). -//! -//! TX_TRACE TXLib. -//! TXLib, _TX_ALLOW_TRACE TXLib.h . -//! TXLib . -//! -//! TX_TRACE . , , -//! TXLib. , - . -//! -//! @usage @code -//! int main() -//! { -//! ... -//! TX_TRACE // DbgView -//! ... -//! } -//! @endcode -//! @code -//! #define TX_TRACE printf (__TX_FILELINE__ "\n"); -//! #include "TXLib.h" -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- -//! @{ - -#ifdef FOR_DOXYGEN_ONLY -#define TX_TRACE -#endif - -#if !defined (TX_TRACE) - #define TX_TRACE if (_txAllowTrace) _txTrace (__FILE__, __LINE__, __TX_FUNCTION__); -#endif - -//! @} - -//{---------------------------------------------------------------------------------------------------------------- - -//! @cond INTERNAL - -void _txTrace (const char file[], int line, const char func[], const char msg[] = NULL, ...); -void _txTrace (const char file[], int line, const char func[], const char msg[] /* = NULL */, ...) - { - unsigned id = GetCurrentThreadId(); - - const char marks[2][2][3] = {{"uU", "cC"}, {"mM", "??"}}; - - char mark = marks [id == _txMainThreadId] [id == _txCanvas_ThreadId] [(_txInTX > 0)]; - - char msgStr[_TX_BUFSIZE] = ""; - if (msg) - { - va_list arg; va_start (arg, msg); - _vsnprintf_s (msgStr, sizeof (msgStr) - 1 _TX_TRUNCATE, msg, arg); - va_end (arg); - } - - txOutputDebugPrintf ("%s - %p %c%c%c%c%c%c [%c] - %s (%d) " "|%*s%s" "%s%s\n", - _TX_VERSION, (void*) &_txInitialized, - "cC"[_txConsole], "mM"[_txMain], "dD"[_txIsDll], "rR"[_txRunning], "eE"[_txExit], "tT"[_txAllowTrace], - mark, (file? file : "(NULL file)"), line, (_txInTX - 1) * 2, "", (func? func : ""), - (*msgStr? ": " : ""), msgStr); - } - -//! @endcond -//}---------------------------------------------------------------------------------------------------------------- - -//================================================================================================================= -//{ Sweet critical section blocking: txAutoLock class -//================================================================================================================= - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Service -//! @brief . -//! -//! -//! , , : @d EnterCriticalSection(), -//! @d LeaveCriticalSection(). @c RAII : -//! and your thread show will always go on. -//! -//! : TryEnterCriticalSection(), , -//! , . , -//! (. @c bool). -//! -//! @note . . - :) -//! -//! @see txLock(), txUnlock(), txGDI() -//}---------------------------------------------------------------------------------------------------------------- - -//! @cond _OFF -extern CRITICAL_SECTION _txCanvas_LockBackBuf; -//! @endcond - -class txAutoLock - { - public: - -//{---------------------------------------------------------------------------------------------------------------- -//! @brief , -//! -//! @param cs -//! @param mandatory @c true, (EnterCriticalSection). @n -//! @c false, (TryEnterCriticalSection). -//! @usage @code -//! CRITICAL_SECTION cs = {}; // This is not a Counter Strike -//! -//! void foo() -//! { -//! txAutoLock lock (&cs); // EnterCriticalSection() -//! ... -//! } // LeaveCriticalsection() -//! -//! void bar() -//! { -//! txAutoLock lock (&cs, false); // TryEnterCriticalSection() -//! if (!lock) return; // -//! ... -//! } -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - - txAutoLock (CRITICAL_SECTION* cs, bool mandatory = true) : - cs_ (cs) - { -$1 if (!cs_) return; - - if (mandatory) { $ EnterCriticalSection (cs_); } - else { $ TryEnterCriticalSection (cs_)? 0 : (cs_ = NULL); } - } - -//{---------------------------------------------------------------------------------------------------------------- -//! @brief TXLib -//! -//! @param mandatory @c true, @b , @ref txLock (true). @n -//! @c false, @b , @ref txLock (false). -//! @usage @code -//! void foobar() -//! { -//! txAutoLock lock; // txLock() -//! ... -//! } // txUnlock() -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - - txAutoLock (bool mandatory = true) : - cs_ (NULL) - { -$1 new (this) txAutoLock (&_txCanvas_LockBackBuf, mandatory); - } - -//{---------------------------------------------------------------------------------------------------------------- -//! @brief , -//}---------------------------------------------------------------------------------------------------------------- - - ~txAutoLock() - { -$1 if (!cs_) return; -$ LeaveCriticalSection (cs_); cs_ = NULL; - } - -//{---------------------------------------------------------------------------------------------------------------- -//! @brief , -//! @usage . txAutoLock::AutoLock (CRITICAL_SECTION&, bool) -//}---------------------------------------------------------------------------------------------------------------- - - operator bool () const - { -$1 return (cs_ != NULL); - } - -//{---------------------------------------------------------------------------------------------------------------- -//! -//}---------------------------------------------------------------------------------------------------------------- - -// private: - CRITICAL_SECTION* cs_; - -//{---------------------------------------------------------------------------------------------------------------- -//! . -//}---------------------------------------------------------------------------------------------------------------- -//! @{ - - private: - txAutoLock (const txAutoLock&); - txAutoLock& operator = (const txAutoLock&); - -//! @} - - }; - -//} -//================================================================================================================= - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Dialogs: txDialog class -//! @name . txDialog -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Dialogs -//! @brief . -//! -//! : -//! -# ; -//! -# () txDialog::setLayout(), -//! txDialog::dialogBox(); -//! -# txDialog::dialogProc() -//! TX_BEGIN_MESSAGE_MAP(), -//! TX_END_MESSAGE_MAP, TX_COMMAND_MAP. -//! -//! @see txDialog::setLayout(), txDialog::dialogProc(), txDialog::Layout, TX_BEGIN_MESSAGE_MAP(), -//! TX_END_MESSAGE_MAP, TX_COMMAND_MAP -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -struct txDialog - { - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Dialogs -//! @brief . -//! -//! , txDialog::CONTROL. -//! -//! @see txDialog::Layout, txDialog::setLayout() -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - - public: - enum CONTROL - { - DIALOG = 0x00000000, //!< - BUTTON = 0xFFFF0080, //!< - EDIT = 0xFFFF0081, //!< - STATIC = 0xFFFF0082, //!< (, ..) - LISTBOX = 0xFFFF0083, //!< - SCROLLBAR = 0xFFFF0084, //!< - COMBOBOX = 0xFFFF0085, //!< - END = 0x00000000 //!< - }; - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Dialogs -//! @brief () -//! -//! . -//! (.rc): -//! -//! - -//! - ( -//! ) -//! - - txDialog::END {NULL} -//! -//! @see txDialog::setLayout(), txDialog::dialogBox(), txDialog::dialogProc() -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - - public: - struct Layout - { - CONTROL wndclass; //!< - const char* caption; //!< - WORD id; //!< - short x; //!< - short y; //!< - short sx; //!< X - short sy; //!< Y - DWORD style; //!< - - const char* font; //!< - WORD fontsize; //!< - }; - -//{---------------------------------------------------------------------------------------------------------------- -//! @brief . -//! -//! @see txDialog::txDialog (const txDialog::Layout*) -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - - public: - txDialog(); - -//{---------------------------------------------------------------------------------------------------------------- -//! @brief . -//! -//! @param layout -//! -//! @see txDialog::Layout, txDialog::setLayout() -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - - txDialog (const Layout* layout); - -//{---------------------------------------------------------------------------------------------------------------- -//! @brief . -//}---------------------------------------------------------------------------------------------------------------- - - virtual ~txDialog() {}; - -//{---------------------------------------------------------------------------------------------------------------- -//! @brief . -//! -//! @param layout -//! -//! @return . -//! -//! @see txDialog::Layout, txDialog::txDialog (const txDialog::Layout*), txDialog::dialogBox() -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - - const Layout* setLayout (const Layout *layout); - -//{---------------------------------------------------------------------------------------------------------------- -//! @brief . -//! -//! @param _wnd -//! @param _msg -//! @param _wParam 1- (WORD) -//! @param _lParam 2- (DWORD) -//! -//! @return false, . DialogProc MSDN. -//! -//! , -//! TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_COMMAND_MAP. -//! -//! @see txDialog::dialogBox(), TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_COMMAND_MAP -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - - virtual int dialogProc (HWND _wnd, UINT _msg, WPARAM _wParam, LPARAM _lParam); - -//{---------------------------------------------------------------------------------------------------------------- -//! @brief . -//! -//! @param layout . @n -//! - , txDialog::setLayout() -//! txDialog::txDialog (const txDialog::Layout*). -//! @param bufsize ( - ) -//! -//! @return , EndDialog(). @n -//! - (this), txDialog::dialogBox(). -//! -//! @see txDialog::dialogProc(), txDialog::setLayout(), txDialog::Layout, txDialog -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - - INT_PTR dialogBox (const Layout* layout = NULL, size_t bufsize = 0); - -//{---------------------------------------------------------------------------------------------------------------- -//! @brief . -//! -//! @param resource -//! -//! @return , EndDialog(). @n -//! - (this), txDialog::dialogBox(). -//! -//! @see txDialog::dialogProc() -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - - INT_PTR dialogBox (WORD resource); - -//{---------------------------------------------------------------------------------------------------------------- -//! @brief . -//}---------------------------------------------------------------------------------------------------------------- - - private: - txDialog (const txDialog&); - txDialog& operator = (const txDialog&); - -//{---------------------------------------------------------------------------------------------------------------- -//! ( txDialog::dialogProc(), .. in32 ). -//}---------------------------------------------------------------------------------------------------------------- - - private: - static ptrdiff_t CALLBACK dialogProc__ (HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam); - -//{---------------------------------------------------------------------------------------------------------------- -//! . -//}---------------------------------------------------------------------------------------------------------------- - - private: - const Layout* layout_; - }; - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Dialogs: Message Map macros -//! @name (Message Map) -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief (Message Map). -//! -//! @see TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#define TX_BEGIN_MESSAGE_MAP() \ - virtual int dialogProc (HWND _wnd, UINT _msg, WPARAM _wParam, LPARAM _lParam) \ - { \ - (void)_wnd; (void)_msg; (void)_wParam; (void)_lParam; \ - \ - switch (_msg) \ - { \ - case WM_NULL: - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief (Message handler) . -//! -//! @param id -//! -//! @see TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#define TX_HANDLE( id ) \ - break; \ - case (id): - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief (Command map) . -//! -//! @see TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#define TX_COMMAND_MAP \ - default: break; \ - } \ - \ - if (_msg == WM_COMMAND) switch (LOWORD (_wParam)) \ - { \ - case 0: - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief . -//! -//! @see TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog -//! -//! @usage @code -//! C. txInputBox(). -//! @endcode -//! -//! @hideinitializer -//}---------------------------------------------------------------------------------------------------------------- - -#define TX_END_MESSAGE_MAP \ - default: break; \ - } \ - \ - return FALSE; \ - } - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Dialogs: txDialog example: txInputBox() -//! @name : txInputBox() -//================================================================================================================= -//! @{ -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Dialogs -//! @brief . -//! -//! @param text -//! @param caption -//! @param input -//! -//! @return ( ). -//! -//! @warning - , . txInputBox() -//! , -//! strcpy(). -//! -//! @see txDialog, TX_BEGIN_MESSAGE_MAP, TX_BEGIN_COMMAND_MAP, TX_HANDLE, TX_END_MESSAGE_MAP -//! -//! @usage @code -//! const char* name = txInputBox ("So what's ur name?!?!", "System", "Sorry I'm Vasya Pupkin"); -//! txMessageBox (name, "Aaand nooowww.. the winner iiis..."); -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -const char* txInputBox (const char* text = NULL, const char* caption = NULL, const char* input = NULL); - -const char* txInputBox (const char* text, const char* caption, const char* input) - { - //------------------------------------------------------------------------------------------------------------- - // , - . - // txGetModuleFileName() - EXE-, , - . - //------------------------------------------------------------------------------------------------------------- - - if (!text) text = " :"; - if (!caption) caption = txGetModuleFileName (false); - if (!input) input = ""; - - //------------------------------------------------------------------------------------------------------------- - // . GetDlgItemText(). - // , , . - // - , . , - // . - // , . , - // txDialog::dialogBox() _tx_DLGTEMPLATE_()... _ - //------------------------------------------------------------------------------------------------------------- - - #define ID_TEXT_ 101 - #define ID_INPUT_ 102 - - //------------------------------------------------------------------------------------------------------------- - // () . - // txDialog::Layout - // txDialog .rc - . - // . rc- Win32 (MSDN, http://msdn.com). - //------------------------------------------------------------------------------------------------------------- - - txDialog::Layout layout[] = - - //----------------------+----------+-----------+-----------------+--------------------------------------------- - // | | - | | - // | | |-----------------| (. - // | | | X | Y |.|.| MSDN) - //----------------------+----------+-----------+---+---+----+----+--------------------------------------------- - // | | | | | | | - {{ txDialog::DIALOG, caption, 0, 0, 0, 240, 85 }, - { txDialog::STATIC, text, ID_TEXT_, 10, 10, 150, 40, SS_LEFT }, - { txDialog::EDIT, input, ID_INPUT_, 10, 60, 220, 15, ES_LEFT | WS_BORDER | ES_AUTOHSCROLL | WS_TABSTOP }, - { txDialog::BUTTON, "&OK", IDOK, 180, 10, 50, 15, BS_DEFPUSHBUTTON | WS_TABSTOP }, - { txDialog::BUTTON, "&Cancel", IDCANCEL, 180, 30, 50, 15, BS_PUSHBUTTON | WS_TABSTOP }, - { txDialog::END }}; - - //------------------------------------------------------------------------------------------------------------- - // InputBox. , .. . - // (str) , - // Win32 ( TX_BEGIN_MESSAGE_MAP ). - // , , - // str ( DialogBoxParam - // WM_INITDIALOG). - //------------------------------------------------------------------------------------------------------------- - struct inputDlg : txDialog - { - char str [1024]; - - //--------------------------------------------------------------------------------------------------------- - - inputDlg() : - str() // . - { // , : - memset (str, 0, sizeof (str)); // - } - - //--------------------------------------------------------------------------------------------------------- - - TX_BEGIN_MESSAGE_MAP() // . . - - TX_COMMAND_MAP // WM_COMMAND. switch. - - //------------------------------------------------------------------------------------------------- - // OK str, - // .. . - // case switch. - // _wnd - , . TX_BEGIN_MESSAGE_MAP(). - //------------------------------------------------------------------------------------------------- - - TX_HANDLE (IDOK) GetDlgItemText (_wnd, ID_INPUT_, str, sizeof (str) - 1); - - TX_END_MESSAGE_MAP - - //--------------------------------------------------------------------------------------------------------- - // - //--------------------------------------------------------------------------------------------------------- - - }; - - //------------------------------------------------------------------------------------------------------------- - // , . - // " ", - - // . #undef. - // , _. - // , , . - //------------------------------------------------------------------------------------------------------------- - - #undef ID_TEXT_ - #undef ID_INPUT_ - - //------------------------------------------------------------------------------------------------------------- - // , . - //------------------------------------------------------------------------------------------------------------- - - static inputDlg dlg; - - //------------------------------------------------------------------------------------------------------------- - // layout - //------------------------------------------------------------------------------------------------------------- - - dlg.dialogBox (layout); - - //------------------------------------------------------------------------------------------------------------- - // . , - // , , . - // , . - //------------------------------------------------------------------------------------------------------------- - - return dlg.str; - } - -//! @} -//} -//================================================================================================================= - -//} -//================================================================================================================= - -//================================================================================================================= -//{ TXLIB IMPLEMENTATION -// -//================================================================================================================= -//! @cond INTERNAL - -//================================================================================================================= -//{ [Internal] Function prototypes, macros and constants -// , -//================================================================================================================= - -const int _TX_CP = 1251; // -const char _TX_LC_CTYPE[] = "Russian"; -const wchar_t _TX_LC_CTYPE_W[] = L"Russian_Russia.ACP"; - -const int _TX_IDM_ABOUT = 40000; // -const int _TX_IDM_CONSOLE = 40001; - -//----------------------------------------------------------------------------------------------------------------- - -int _txInitialize(); -void _txCleanup(); - -HWND _txCanvas_CreateWindow (SIZE* size); -inline bool _txCanvas_OK(); - -bool _txCanvas_OnCREATE (HWND wnd); -bool _txCanvas_OnDESTROY (HWND wnd); -bool _txCanvas_OnCLOSE (HWND); -bool _txCanvas_OnPAINT (HWND wnd); -bool _txCanvas_OnKEYDOWN (HWND wnd, WPARAM vk, LPARAM info); -bool _txCanvas_OnCHAR (HWND wnd, WPARAM ch, LPARAM info); -bool _txCanvas_OnTIMER (HWND wnd, WPARAM id); -bool _txCanvas_OnMOUSEMOVE (HWND wnd, WPARAM buttons, LPARAM coords); -bool _txCanvas_OnCmdCONSOLE (HWND wnd, WPARAM cmd); -bool _txCanvas_OnCmdABOUT (HWND wnd, WPARAM cmd); - -unsigned WINAPI _txCanvas_ThreadProc (void* data); -LRESULT CALLBACK _txCanvas_WndProc (HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar); - -int _txCanvas_SetRefreshLock (int count); - -HDC _txBuffer_Create (HWND wnd, const POINT* size = NULL, HBITMAP bmap = NULL); -bool _txBuffer_Delete (HDC* dc); -bool _txBuffer_Select (HGDIOBJ obj, HDC dc = txDC()); - -HWND _txConsole_Attach(); -bool _txConsole_OK(); -bool _txConsole_Detach (bool activate); -bool _txConsole_Draw (HDC dc); -bool _txConsole_SetUnicodeFont(); - -int _txSetFinishedText (HWND wnd); -void _txPauseBeforeTermination (HWND canvas); -bool _txIsParentWaitable (DWORD* parentPID = NULL); -PROCESSENTRY32* _txFindProcess (unsigned pid = GetCurrentProcessId()); -bool _txKillProcess (DWORD pid); -PROC _txSetProcAddress (HMODULE module, const char* dllName, const char* funcName, PROC newFunc); -bool _txInDll(); -int _txGetInput(); -void _tx_cexit(); - -bool _txCreateShortcut (const char shortcutName[], - const char fileToLink[], const char args[] = NULL, const char workDir[] = NULL, - const char description[] = NULL, int cmdShow = SW_SHOWNORMAL, - const char iconFile[] = NULL, int iconIndex = 0, int fontSize = 0, - COORD bufSize = ZERO (COORD), COORD wndSize = ZERO (COORD), COORD wndOrg = ZERO (COORD)); - -void* _tx_DLGTEMPLATE_Create (void* globalMem, size_t bufsize, DWORD style, DWORD exStyle, - WORD controls, short x, short y, short cx, short cy, - const char caption[], const char font[], WORD fontsize, - HANDLE menu); - -void* _tx_DLGTEMPLATE_Add (void* dlgTemplatePtr, size_t bufsize, DWORD style, DWORD exStyle, - short x, short y, short cx, short cy, - WORD id, const char wclass[], const char caption[]); - -const char* _txError (const char file[] = NULL, int line = 0, const char func[] = NULL, - const char msg[] = NULL, ...) _TX_CHECK_FORMAT (4); - -HICON _txCreateTXIcon (int size); - -void _txOnSignal (int signal = 0, int fpe = 0); -void _txOnTerminate(); -void _txOnUnexpected(); - -FARPROC _txDllImport (const char dllFileName[], const char funcName[], bool required = true); - -//----------------------------------------------------------------------------------------------------------------- - -// These are macros for __FILE__ and __LINE__ to work properly. - -#if !defined (NDEBUG) - #define _TX_IF_ARGUMENT_FAILED( cond ) if (!assert (cond) && (SetLastErrorEx (ERROR_BAD_ARGUMENTS, 0), 1)) - - #define _TX_IF_TXWINDOW_FAILED if ( !txOK() && (SetLastErrorEx (ERROR_INVALID_DATA, 0), 1) && \ - (TX_ERROR ("\a" " "), 1)) -#else - #define _TX_IF_ARGUMENT_FAILED( cond ) if (! (cond) && (SetLastErrorEx (ERROR_BAD_ARGUMENTS, 0), 1)) - - #define _TX_IF_TXWINDOW_FAILED if ( !txOK() && (SetLastErrorEx (ERROR_INVALID_DATA, 0), 1)) - -#endif - -// Take action in debug configuration only. -// Definition ({ expr; }) would be better, but some old dinosaurs (yes it is MSVC 6) reject it. So sad. :'( - -#if !defined (NDEBUG) - #define _TX_ON_DEBUG( code ) { code; } -#else - #define _TX_ON_DEBUG( code ) ; -#endif - -// This is a macro because cond is an expression and not always a function. Lack of lambdas in pre-C++0x. - -#define _txWaitFor( cond, time ) { for (DWORD _t = GetTickCount() + (time); \ - !(cond) && GetTickCount() < _t; \ - Sleep (_txWindowUpdateInterval)) ; \ - if (!(cond)) \ - _txTrace (__FILE__, __LINE__, "WARNING: Timeout: " #cond "."); } -//} -//================================================================================================================= - -//================================================================================================================= -//{ [Internal] DLL functions import -//! @name -//================================================================================================================= -//! @{ - -FARPROC _txDllImport (const char dllFileName[], const char funcName[], bool required /*= true*/) - { - _TX_IF_ARGUMENT_FAILED (!(dllFileName && !*dllFileName)) return NULL; - _TX_IF_ARGUMENT_FAILED ( funcName && *funcName) return NULL; - - HMODULE dll = GetModuleHandle (dllFileName); - if (!dll && dllFileName) dll = LoadLibrary (dllFileName); - if (!dll && required) TX_ERROR ("\a" "Cannot load library \"%s\"" _ dllFileName); - - if (!dll) return NULL; - - FARPROC addr = GetProcAddress (dll, funcName); - if (!addr && required) TX_ERROR ("\a" "Cannot import \"%s\" from library \"%s\"" _ funcName _ dllFileName); - - return addr; - } - -//----------------------------------------------------------------------------------------------------------------- -// Import helpers -// -//----------------------------------------------------------------------------------------------------------------- - -#define _TX_DLLIMPORT( lib, retval, name, params ) \ - retval (WINAPI* name) params = (retval (WINAPI*) params) _txDllImport (lib ".dll", #name, true) - -#define _TX_DLLIMPORT_OPT( lib, retval, name, params ) \ - retval (WINAPI* name) params = (retval (WINAPI*) params) _txDllImport (lib ".dll", #name, false) - -//----------------------------------------------------------------------------------------------------------------- -// Some IDEs don't link with these libs by default in console projects, so do sunrise by hand. :( -//{ - -namespace Win32 { - -#ifdef _MSC_VER_6 -struct CONSOLE_FONT_INFO; -#endif - -struct NT_CONSOLE_PROPS; -struct CONSOLE_FONT_INFOEX; - -_TX_DLLIMPORT ("GDI32", HDC, CreateCompatibleDC, (HDC dc)); -_TX_DLLIMPORT ("GDI32", HBITMAP, CreateCompatibleBitmap, (HDC dc, int width, int height)); -_TX_DLLIMPORT ("GDI32", HGDIOBJ, GetStockObject, (int object)); -_TX_DLLIMPORT ("GDI32", HGDIOBJ, SelectObject, (HDC dc, HGDIOBJ object)); -_TX_DLLIMPORT ("GDI32", HGDIOBJ, GetCurrentObject, (HDC dc, unsigned objectType)); -_TX_DLLIMPORT ("GDI32", int, GetObjectA, (HGDIOBJ obj, int bufsize, void* buffer)); -_TX_DLLIMPORT ("GDI32", DWORD, GetObjectType, (HGDIOBJ object)); -_TX_DLLIMPORT ("GDI32", BOOL, DeleteDC, (HDC dc)); -_TX_DLLIMPORT ("GDI32", BOOL, DeleteObject, (HGDIOBJ object)); -_TX_DLLIMPORT ("GDI32", COLORREF, SetTextColor, (HDC dc, COLORREF color)); -_TX_DLLIMPORT ("GDI32", COLORREF, SetBkColor, (HDC dc, COLORREF color)); -_TX_DLLIMPORT ("GDI32", int, SetBkMode, (HDC dc, int bkMode)); -_TX_DLLIMPORT ("GDI32", HFONT, CreateFontA, (int height, int width, int escapement, int orientation, - int weight, DWORD italic, DWORD underline, DWORD strikeout, - DWORD charSet, DWORD outputPrec, DWORD clipPrec, - DWORD quality, DWORD pitchAndFamily, const char face[])); -_TX_DLLIMPORT ("GDI32", int, EnumFontFamiliesExA, (HDC dc, LPLOGFONT logFont, FONTENUMPROC enumProc, - LPARAM lParam, DWORD reserved)); -_TX_DLLIMPORT ("GDI32", COLORREF, SetPixel, (HDC dc, int x, int y, COLORREF color)); -_TX_DLLIMPORT ("GDI32", COLORREF, GetPixel, (HDC dc, int x, int y)); -_TX_DLLIMPORT ("GDI32", HPEN, CreatePen, (int penStyle, int width, COLORREF color)); -_TX_DLLIMPORT ("GDI32", HBRUSH, CreateSolidBrush, (COLORREF color)); -_TX_DLLIMPORT ("GDI32", BOOL, MoveToEx, (HDC dc, int x, int y, POINT* point)); -_TX_DLLIMPORT ("GDI32", BOOL, LineTo, (HDC dc, int x, int y)); -_TX_DLLIMPORT ("GDI32", BOOL, Polygon, (HDC dc, const POINT points[], int count)); -_TX_DLLIMPORT ("GDI32", BOOL, Rectangle, (HDC dc, int x0, int y0, int x1, int y1)); -_TX_DLLIMPORT ("GDI32", BOOL, RoundRect, (HDC dc, int x0, int y0, int x1, int y1, int sizeX, int sizeY)); -_TX_DLLIMPORT ("GDI32", BOOL, Ellipse, (HDC dc, int x0, int y0, int x1, int y1)); -_TX_DLLIMPORT ("GDI32", BOOL, Arc, (HDC dc, int x0, int y0, int x1, int y1, - int xStart, int yStart, int xEnd, int yEnd)); -_TX_DLLIMPORT ("GDI32", BOOL, Pie, (HDC dc, int x0, int y0, int x1, int y1, - int xStart, int yStart, int xEnd, int yEnd)); -_TX_DLLIMPORT ("GDI32", BOOL, Chord, (HDC dc, int x0, int y0, int x1, int y1, - int xStart, int yStart, int xEnd, int yEnd)); -_TX_DLLIMPORT ("GDI32", BOOL, TextOutA, (HDC dc, int x, int y, const char string[], int length)); -_TX_DLLIMPORT ("GDI32", UINT, SetTextAlign, (HDC dc, unsigned mode)); -_TX_DLLIMPORT ("GDI32", BOOL, GetTextExtentPoint32A, (HDC dc, const char string[], int length, SIZE* size)); -_TX_DLLIMPORT ("GDI32", BOOL, ExtFloodFill, (HDC dc, int x, int y, COLORREF color, unsigned type)); -_TX_DLLIMPORT ("GDI32", BOOL, BitBlt, (HDC dest, int xDest, int yDest, int width, int height, - HDC src, int xSrc, int ySrc, DWORD rOp)); -_TX_DLLIMPORT ("GDI32", int, SetDIBitsToDevice, (HDC dc, int xDest, int yDest, DWORD width, DWORD height, - int xSrc, int ySrc, unsigned startLine, unsigned numLines, - const void* data, const BITMAPINFO* info, unsigned colorUse)); -_TX_DLLIMPORT ("GDI32", int, GetDIBits, (HDC hdc, HBITMAP hbmp, unsigned uStartScan, unsigned cScanLines, - void* lpvBits, BITMAPINFO* lpbi, unsigned usage)); -_TX_DLLIMPORT ("GDI32", BOOL, PatBlt, (HDC dc, int x0, int y0, int width, int height, DWORD rOp)); -_TX_DLLIMPORT ("GDI32", int, SetROP2, (HDC dc, int mode)); -_TX_DLLIMPORT ("GDI32", HRGN, CreateRectRgn, (int x0, int y0, int x1, int y1)); -_TX_DLLIMPORT ("GDI32", BOOL, GetBitmapDimensionEx, (HBITMAP bitmap, SIZE* dimensions)); - -_TX_DLLIMPORT ("User32", int, DrawTextA, (HDC dc, const char text[], int length, RECT* rect, unsigned format)); -_TX_DLLIMPORT ("User32", HANDLE, LoadImageA, (HINSTANCE inst, const char name[], unsigned type, - int sizex, int sizey, unsigned mode)); -_TX_DLLIMPORT_OPT ("User32", BOOL, IsHungAppWindow, (HWND wnd)); -_TX_DLLIMPORT_OPT ("User32", HWND, GhostWindowFromHungWindow,(HWND wnd)); - -_TX_DLLIMPORT ("WinMM", BOOL, PlaySound, (const char sound[], HMODULE mod, DWORD mode)); - -_TX_DLLIMPORT_OPT ("MSImg32", BOOL, TransparentBlt, (HDC dest, int destX, int destY, int destWidth, int destHeight, - HDC src, int srcX, int srcY, int srcWidth, int srcHeight, - unsigned transparentColor)); -_TX_DLLIMPORT_OPT ("MSImg32", BOOL, AlphaBlend, (HDC dest, int destX, int destY, int destWidth, int destHeight, - HDC src, int srcX, int srcY, int srcWidth, int srcHeight, - BLENDFUNCTION blending)); - -_TX_DLLIMPORT ("Kernel32", HWND, GetConsoleWindow, (void)); -_TX_DLLIMPORT_OPT ("Kernel32", BOOL, SetConsoleFont, (HANDLE con, DWORD fontIndex)); -_TX_DLLIMPORT_OPT ("Kernel32", BOOL, GetConsoleFontInfo, (HANDLE con, bool fullScr, DWORD nFonts, CONSOLE_FONT_INFO* info)); -_TX_DLLIMPORT_OPT ("Kernel32", DWORD, GetNumberOfConsoleFonts, (void)); -_TX_DLLIMPORT_OPT ("Kernel32", BOOL, GetCurrentConsoleFont, (HANDLE con, bool maxWnd, CONSOLE_FONT_INFO* curFont)); -_TX_DLLIMPORT_OPT ("Kernel32", BOOL, GetCurrentConsoleFontEx, (HANDLE con, bool maxWnd, CONSOLE_FONT_INFOEX* curFont)); -_TX_DLLIMPORT_OPT ("Kernel32", BOOL, SetCurrentConsoleFontEx, (HANDLE con, bool maxWnd, CONSOLE_FONT_INFOEX* curFont)); - -_TX_DLLIMPORT ("OLE32", HRESULT, CoInitialize, (void*)); -_TX_DLLIMPORT ("OLE32", HRESULT, CoCreateInstance, (REFCLSID clsid, LPUNKNOWN, DWORD, REFIID iid, PVOID* value)); -_TX_DLLIMPORT ("OLE32", void, CoUninitialize, (void)); - -_TX_DLLIMPORT ("Shell32", HINSTANCE,ShellExecuteA, (HWND wnd, const char operation[], const char file[], - const char parameters[], const char directory[], int showCmd)); - -_TX_DLLIMPORT_OPT ("NTDLL", char*, wine_get_version, (void)); - -_TX_DLLIMPORT_OPT ("MSVCRT", void, _cexit, (void)); - -//----------------------------------------------------------------------------------------------------------------- -// Another issue, some of structs, consts and interfaces aren't defined in MinGW some ealry headers. -// Copied from Windows SDK 7.0a. - -#ifndef AC_SRC_ALPHA -#define AC_SRC_ALPHA 0x01 -#endif - -#ifndef SMTO_ERRORONEXIT -#define SMTO_ERRORONEXIT 0x0020 -#endif - -#ifndef NT_CONSOLE_PROPS_SIG -#define NT_CONSOLE_PROPS_SIG 0xA0000002 -#endif - -#ifndef NIIF_INFO -#define NIIF_INFO 0x00000001 -#define NIIF_WARNING 0x00000002 -#define NIIF_ERROR 0x00000003 -#endif - -#ifndef NIF_INFO -#define NIF_STATE 0x00000008 -#define NIF_INFO 0x00000010 -#endif - -#pragma pack (push, 1) - -#ifdef _MSC_VER_6 - -struct CONSOLE_FONT_INFO - { - DWORD nFont; - COORD dwFontSize; - }; - -struct NOTIFYICONDATA - { - DWORD cbSize; - HWND hWnd; - UINT uID; - UINT uFlags; - UINT uCallbackMessage; - HICON hIcon; - - CHAR szTip[128]; - DWORD dwState; - DWORD dwStateMask; - CHAR szInfo[256]; - - union { - UINT uTimeout; - UINT uVersion; - } u; - - CHAR szInfoTitle[64]; - DWORD dwInfoFlags; - }; - -#endif - -struct CONSOLE_FONT_INFOEX - { - ULONG cbSize; - DWORD nFont; - COORD dwFontSize; - UINT FontFamily; - UINT FontWeight; - WCHAR FaceName[LF_FACESIZE]; - }; - -struct DATABLOCK_HEADER - { - DWORD cbSize; - DWORD dwSignature; - }; - -struct NT_CONSOLE_PROPS - { - DATABLOCK_HEADER dbh; - - WORD wFillAttribute; - WORD wPopupFillAttribute; - COORD dwScreenBufferSize; - COORD dwWindowSize; - COORD dwWindowOrigin; - DWORD nFont; - DWORD nInputBufferSize; - COORD dwFontSize; - UINT uFontFamily; - UINT uFontWeight; - WCHAR FaceName[LF_FACESIZE]; - UINT uCursorSize; - BOOL bFullScreen; - BOOL bQuickEdit; - BOOL bInsertMode; - BOOL bAutoPosition; - UINT uHistoryBufferSize; - UINT uNumberOfHistoryBuffers; - BOOL bHistoryNoDup; - - COLORREF ColorTable[16]; - }; - -#pragma pack (pop) - -#undef INTERFACE -#define INTERFACE IShellLinkDataList - -DECLARE_INTERFACE_ (IShellLinkDataList, IUnknown) - { - // *** IUnknown methods *** - STDMETHOD (QueryInterface) (THIS_ REFIID iid, void** value) PURE; - STDMETHOD_(ULONG, AddRef) (THIS) PURE; - STDMETHOD_(ULONG, Release) (THIS) PURE; - - // *** IShellLinkDataList methods *** - STDMETHOD (AddDataBlock) (THIS_ void* dataBlock) PURE; - STDMETHOD (CopyDataBlock) (THIS_ DWORD sig, void** dataBlock) PURE; - STDMETHOD (RemoveDataBlock) (THIS_ DWORD sig) PURE; - STDMETHOD (GetFlags) (THIS_ DWORD* flags) PURE; - STDMETHOD (SetFlags) (THIS_ DWORD flags) PURE; - - protected: - virtual ~IShellLinkDataList(); - }; - -const GUID IID_IShellLink = {0x000214ee, 0x0000, 0x0000, {0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}}; -const GUID IID_IShellLinkDataList = {0x45e2b4ae, 0xb1c3, 0x11d0, {0xb9,0x2f,0x00,0xa0,0xc9,0x03,0x12,0xe1}}; -const GUID IID_IPersistFile = {0x0000010b, 0x0000, 0x0000, {0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}}; - -#undef INTERFACE - -} // namespace Win32 - -#ifdef _MSC_VER_6 -using namespace Win32; -#endif - -//} - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ [Internal] Global data -//! @name -// -// , , :) -// -// TXLib.h , . -// . -// -// , . -//================================================================================================================= -//! @{ - -int _txInitialized = _TX_NOINIT || _txInitialize(); - -unsigned volatile _txMainThreadId = 0; // ID , main() - -unsigned volatile _txCanvas_ThreadId = 0; // ID , TXLib -HANDLE volatile _txCanvas_Thread = NULL; // -HWND volatile _txCanvas_Window = NULL; // TXLib - -UINT _txCanvas_RefreshTimer = 0; // Timer to redraw TXLib window -int volatile _txCanvas_RefreshLock = 0; // Blocks auto on-timer canvas update, see txBegin/txEnd - -HDC _txCanvas_BackBuf[2] = {NULL, // [0] Main working TXLib memory DC, where user picture lies - NULL}; // [1] Image ready for auto-refresh, see txCanvas_OnPAINT() -CRITICAL_SECTION _txCanvas_LockBackBuf = {0,-1}; // Prevent simultaneous access to back buffer, see txLock() - -std::vector* _txCanvas_UserDCs = NULL; // List of DCs allocated, for auto-free - -bool volatile _txConsole_IsBlinking = true; // To blink or not to blink, that is the question. - -bool _txConsole = false; // Only first TXLib module in app owns it -bool _txMain = false; // First TXLib wnd opened (closing it terminates program) -bool _txIsDll = false; // TXLib module is in DLL -bool volatile _txRunning = false; // main() is still running -bool volatile _txExit = false; // exit() is active -bool volatile _txAllowTrace = true; // Internal TX trace is active - -POINT _txMousePos = {0}; // Ask Captn Obviouos about it. See txCanvas_OnMOUSE() -int _txMouseButtons = 0; - -WNDPROC volatile _txAltWndProc = NULL; // . . txSetWindowsHook(). - -const char* volatile _txFile = NULL; // Current execution point tracking, see $ macro -int volatile _txLine = 0; -const char* volatile _txFunc = NULL; -_TX_THREAD int volatile _txInTX = 0; // We are inside one of TXLib's functions - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ TXLib engine init/check/cleanup -//! @name // TXLib -//================================================================================================================= -//! @{ - -//----------------------------------------------------------------------------------------------------------------- -//{ Early initialization -//----------------------------------------------------------------------------------------------------------------- - -int _txInitialize() - { - #if defined (_TX_ALLOC_BREAK) && defined (_MSC_VER) - _CrtSetBreakAlloc (_TX_ALLOC_BREAK); - #endif - - _TX_ON_DEBUG (OutputDebugString ("\n"); - OutputDebugString (_TX_VERSION " - The Dumb Artist Library, " _TX_AUTHOR ": \"" __FILE__ "\" " - "compiled " __DATE__ " " __TIME__ ", " _TX_BUILDMODE " mode, module: " _TX_MODULE "\n"); - OutputDebugString ("\n")); - - _txMainThreadId = GetCurrentThreadId(); - -$1 _txIsDll = _txInDll(); - -$ if (!_txIsDll) - { -$ _txConsole = ! FindAtom ("_txConsole"); // Not a thread-safe -$ (void) AddAtom ("_txConsole"); - } - -$ if (_txConsole) - { -$ _txOnSignal(); -$ SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); - - #if defined (_MSC_VER) -$ _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF); -$ _CrtSetReportMode (_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); -$ _CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW); -$ _CrtSetReportMode (_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW); -$ _CrtSetReportFile (_CRT_WARN, _CRTDBG_FILE_STDERR); -$ _CrtSetReportFile (_CRT_ERROR, _CRTDBG_FILE_STDERR); -$ _CrtSetReportFile (_CRT_ASSERT, _CRTDBG_FILE_STDERR); - #endif - - #ifndef _MSC_VER_6 -$ std::set_unexpected (_txOnUnexpected); -$ std::set_terminate (_txOnTerminate); - #endif - -$ HWND console = _txConsole_Attach(); -$ SetWindowTextA (console, txGetModuleFileName (false)); - } - -$ InitializeCriticalSection (&_txCanvas_LockBackBuf); - -$ _txCanvas_UserDCs = new std::vector ; - -#if defined (_GCC_VER) -$ _txSetProcAddress (GetModuleHandle (NULL), "MSVCRT.DLL", "_cexit", (PROC) _tx_cexit); // See _tx_cexit() -#endif - -$ atexit (_txCleanup); - -$ (void) Win32::SetDIBitsToDevice; // Just to suppress "defined but not used" warning -$ (void) Win32::GetDIBits; -$ (void) Win32::RoundRect; -$ (void) Win32::CreateRectRgn; -$ (void) Win32::GetBitmapDimensionEx; -$ (void) Win32::GetConsoleFontInfo; - -$ if (_txConsole) - { -$ txSetConsoleAttr (0x07); -$ SetLastError (0); - -$ unsigned old87 = 0, new87 = 0x0008001C; // _EM_INVALID | _EM_DENORMAL | _EM_ZERODIVIDE | _EM_OVERFLOW -$ if (_controlfp_s (&old87, 0, 0) == 0) - { $ (void) _controlfp_s (&old87, old87 & ~new87, 0x0008001F /* _MCW_EM */); } - } - -$ return 1; - } - -//} -//----------------------------------------------------------------------------------------------------------------- - -HWND txCreateWindow (double sizeX, double sizeY, bool centered /*= true*/) - { -$1 if (!_txInitialized) _txInitialized = _txInitialize(); - -$ if (txWindow()) - { -$ SetLastErrorEx (ERROR_INVALID_DATA, 0); -$ _TX_ON_DEBUG (TX_ERROR ("\a" " ")); -$ return txWindow(); - } - -$ if (!_txIsDll) - { -$ _txMain = ! FindAtom ("_txMain"); // Not a thread-safe -$ (void) AddAtom ("_txMain"); - } - -$ if (_txWindowUpdateInterval < 10) { $ _txWindowUpdateInterval = 10; } - -$ _txRunning = false; - - // Store the size - -$ static SIZE size = { ROUND (sizeX), ROUND (sizeY) }; -$ if (centered) { size.cx *= -1; size.cy *= -1; } - - // In Thread, where REAL creation lies... - - #if !( defined (_MSC_VER) && (_MSC_VER < 1400) && !defined (_MT) ) -$ unsigned id = 0; -$ _txCanvas_Thread = (HANDLE) _beginthreadex (NULL, 0, _txCanvas_ThreadProc, &size, 0, &id); - #else -$ DWORD id = 0; -$ _txCanvas_Thread = CreateThread (NULL, 0, (PTHREAD_START_ROUTINE)_txCanvas_ThreadProc, &size, 0, &id); - #endif - -$ if (!_txCanvas_Thread) return TX_DEBUG_ERROR ("\a" "Cannot start canvas thread."), (HWND)NULL; - -$ _txWaitFor (_txRunning, 30*_TX_TIMEOUT); - -$ if (!_txRunning) return TX_DEBUG_ERROR ("\a" "Cannot create canvas window."),(HWND)NULL; -$ if (!txOK()) return TX_DEBUG_ERROR ("\a" "Canvas window is not OK."), (HWND)NULL; - -$ Sleep (100); - -$ errno = _doserrno = 0; -$ SetLastError (0); - -$ return txWindow(); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txSetDefaults() - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ txUpdateWindow (false); -$ txAutoLock _lock; - -$ RECT r = {0}; - -$ GetClientRect (_txCanvas_Window, &r) asserted; -$ SIZE szCanvas = { r.right - r.left, r.bottom - r.top }; - -$ GetClientRect (Win32::GetConsoleWindow(), &r) asserted; -$ SIZE szCon = { r.right - r.left, r.bottom - r.top }; - -$ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE); - -$ CONSOLE_SCREEN_BUFFER_INFO con = {{80, 25}, {0}, 0, {0, 0, 80-1, 25-1}, {80, 25}}; -$ GetConsoleScreenBufferInfo (out, &con); - -$ SIZE szTxt = { (short) (con.srWindow.Right - con.srWindow.Left + 1), - (short) (con.srWindow.Bottom - con.srWindow.Top + 1) }; - -//{ Set defaults for graphics layer - -$ _txBuffer_Select (Win32::GetStockObject (WHITE_PEN), txDC()) asserted; -$ _txBuffer_Select (Win32::GetStockObject (WHITE_BRUSH), txDC()) asserted; - -$ _txBuffer_Select (Win32::CreateFont (szCon.cy/szTxt.cy, szCon.cx/szTxt.cx, - 0, 0, FW_REGULAR, FALSE, FALSE, FALSE, - RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, DEFAULT_PITCH, _txConsoleFont), - txDC()) asserted; - -$ (Win32::SetTextColor (txDC(), TX_WHITE) != CLR_INVALID) asserted; -$ Win32::SetBkMode (txDC(), TRANSPARENT) asserted; - -$ Win32::SetROP2 (txDC(), R2_COPYPEN) asserted; - -//} - -//{ Set defaults for console layer - -$ HGDIOBJ font = txFontExist (_txConsoleFont)? - Win32::CreateFont ((int) (1.0 * szCanvas.cy/szTxt.cy), (int) (1.0 * szCanvas.cx/szTxt.cx), - 0, 0, FW_REGULAR, FALSE, FALSE, FALSE, - RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, FIXED_PITCH, _txConsoleFont) - : - Win32::GetStockObject (SYSTEM_FIXED_FONT); - -$ _txBuffer_Select (font, _txCanvas_BackBuf[1]) asserted; -//} - -//{ Scroll the console for text to go above top of window and don't mix with graphics - -$ if (con.dwCursorPosition.X) _putch ('\n'); - -$ short delta = (short) (con.dwCursorPosition.Y - con.srWindow.Top); - -$ con.srWindow.Top = (short) (con.srWindow.Top + delta); -$ con.srWindow.Bottom = (short) (con.srWindow.Bottom + delta); - -$ SMALL_RECT src = {0, 0, (short) (con.dwSize.X - 1), (short) (con.dwSize.Y - 1) }; -$ CHAR_INFO fill = {{' '}, 0x07}; // Fill with spaces, light-gray on black -$ COORD dest = {0, (short) -delta}; // New UL-corner of src, scroll up - -$ con.dwCursorPosition.X = 0; -$ con.dwCursorPosition.Y = (short) (con.dwCursorPosition.Y - delta); - -$ (con.srWindow.Bottom < con.dwSize.Y && // Move the "window" - SetConsoleWindowInfo (out, true, &con.srWindow)) - || - (ScrollConsoleScreenBuffer (out, &src, NULL, dest, &fill), // Or scroll the buffer - SetConsoleCursorPosition (out, con.dwCursorPosition)); -//} - -$ txUpdateWindow (true); - - return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline bool txOK() - { -$1 return _txCanvas_OK(); - } - -//----------------------------------------------------------------------------------------------------------------- - -// In GCC, implicit std(MSVCRT.dll)::_cexit() call before _txCleanup leads to hands in _cexit handlers chain. -// So redefining std::_cexit(). Do it dynamically via PE Import Table hook to avoid duplicate symbols in linking -// serveral modules including TXLib.h. See _txSetProcAddress() call in _txInitialize(). - -#if defined (_GCC_VER) - -void _tx_cexit() - { -$1 _txCleanup(); - - if (Win32::_cexit) { $ Win32::_cexit(); } - -$ return; - } - -#endif - -//----------------------------------------------------------------------------------------------------------------- - -void _txCleanup() - { -$1 if (!_txInitialized) return; - else _txInitialized = false; - -$ txSleep (_txWindowUpdateInterval); - -$ _txRunning = false; -$ _txConsole_IsBlinking = false; - -$ HWND canvas = txWindow(); -$ HWND console = Win32::GetConsoleWindow(); -$ unsigned thread = GetCurrentThreadId(); - -$ HWND wnd = (canvas)? canvas : console; - -$ bool externTerm = (thread != _txMainThreadId && - thread != _txCanvas_ThreadId); -$ DWORD parent = 0; -$ bool waitableParent = !externTerm && _txIsParentWaitable (&parent); - -$ if (_txConsole) - { -$ if (_txMain) txSetConsoleAttr (0x07); -$ if (console) EnableWindow (console, true); - } - -$ if (_txMain && !externTerm && wnd != NULL) - { $ _txSetFinishedText (wnd); } - -$ if ((canvas? _txMain : _txConsole && !waitableParent) && !_txExit && - thread == _txMainThreadId) - { -$ if (wnd) - { -$ ShowWindow (wnd, SW_SHOW); -$ EnableWindow (wnd, true); -$ SetForegroundWindow (wnd); -$ BringWindowToTop (wnd); -$ RedrawWindow (wnd, NULL, NULL, RDW_INVALIDATE | RDW_INTERNALPAINT | RDW_UPDATENOW); - } - -$ if (console) - { $ _txPauseBeforeTermination (canvas); } - } - -$ if (txWindow()) - { $ SendNotifyMessage (txWindow(), WM_DESTROY, 0, 0); } - -$ _txWaitFor (!txWindow(), 5*_TX_TIMEOUT); - -$ if (!txWindow()) - { $ DeleteCriticalSection (&_txCanvas_LockBackBuf); _txCanvas_LockBackBuf = ZERO (CRITICAL_SECTION); } - -$ if (_txCanvas_Thread) - { $ CloseHandle (_txCanvas_Thread) asserted; _txCanvas_Thread = NULL; } - -$ delete _txCanvas_UserDCs; _txCanvas_UserDCs = NULL; - -$ if (_txMain && canvas && waitableParent && _txNOP (_TX_ALLOW_KILL_PARENT)) - { $ waitableParent |= !_txKillProcess (parent); } - -$ if (_txMain && _txConsole) - { $ _txConsole_Detach (waitableParent && !externTerm); } - - _TX_ON_DEBUG (OutputDebugString ("\n"); - OutputDebugString (_TX_VERSION " - FINISHED: " _TX_MODULE "\n"); - OutputDebugString ("\n")); - } - -//----------------------------------------------------------------------------------------------------------------- - -int _txSetFinishedText (HWND wnd) - { - struct tools - { - static LRESULT getWindowText (HWND window, wchar_t text[], int size) - { -$1 memset (text, 0, size * sizeof (*text)); - -$ return SendMessageTimeoutW (window, WM_GETTEXT, (WPARAM) size, (LPARAM) text, SMTO_BLOCK | SMTO_ABORTIFHUNG, _TX_TIMEOUT, NULL); - } - - static LRESULT setWindowText (HWND window, wchar_t text[]) - { -$1 return SendMessageTimeoutW (window, WM_SETTEXT, 0, (LPARAM) text, SMTO_BLOCK | SMTO_ABORTIFHUNG, _TX_TIMEOUT, NULL); - } - }; - -$1 static wchar_t title [_TX_BUFSIZE+15] = L"TXLib"; - -$ tools::getWindowText (wnd, title, _TX_BUFSIZE-1); -$ unsigned len = (unsigned) wcslen (title); if (len >= _TX_BUFSIZE) len = _TX_BUFSIZE-1; - -$ MultiByteToWideChar (_TX_CP, 0, " []", -1, title + len, _TX_BUFSIZE - len); - -$ tools::setWindowText (wnd, title); -$ tools::getWindowText (wnd, title, _TX_BUFSIZE-1); -$ if (len <= _TX_BUFSIZE-1-2 && title [len+2] == /* '' */ (wchar_t) 0x0417) return 0; - -$ MultiByteToWideChar (_TX_CP, 0, " [FINISHED]", -1, title + len, _TX_BUFSIZE - len); - -$ tools::setWindowText (wnd, title); -$ tools::getWindowText (wnd, title, _TX_BUFSIZE-1); -$ if (len <= _TX_BUFSIZE-1-2 && title [len+2] == /* 'F' */ (wchar_t) 0x0046) return 1; - -$ return 2; - } - -//----------------------------------------------------------------------------------------------------------------- - -void _txPauseBeforeTermination (HWND canvas) - { -$1 while (_kbhit()) (void)_getch(); - -$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}}; -$ bool kbRedir = !GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &con); -$ bool kbWait = (_txGetInput() == EOF); -$ bool wine = !!Win32::wine_get_version; - -$ if (kbWait && !canvas && !kbRedir && !wine) - { -$ printf ("\n" "[ ]"); - } - -$ for (int i = 1; ; i++) - { -$ Sleep (_txWindowUpdateInterval); - - if (!kbWait || (kbRedir && !canvas)) { $ break; } // No need to run and hide - - if (!wine && _txGetInput() != EOF) { $ break; } // Somebody hit something. - - if (canvas && !_txCanvas_ThreadId) { $ break; } // There was a window, and now there is not. - - if (!Win32::GetConsoleWindow()) { $ break; } // Console was destroyed - - if (Win32::GhostWindowFromHungWindow && Win32::GhostWindowFromHungWindow (canvas)) - { $ TX_ERROR (" ."); break; } - - if (canvas && Win32::IsHungAppWindow && Win32::IsHungAppWindow (canvas)) - { $ _txTrace (__FILE__, __LINE__, "WARNING: ."); break; } - - if (canvas && !SendMessageTimeout (canvas, WM_NULL, 0,0, SMTO_BLOCK | SMTO_ABORTIFHUNG, _TX_TIMEOUT, NULL)) - { $ _txTrace (__FILE__, __LINE__, "WARNING: ."); break; } - - if (!wine && !(i % 100500)) - { $ printf ("\r" "[ - ]"); } - } - -$ while (!wine && _kbhit()) (void)_getch(); - -$ printf ("\n"); - } - -//----------------------------------------------------------------------------------------------------------------- - -int _txGetInput() - { -$1 HANDLE con = GetStdHandle (STD_INPUT_HANDLE); - -$ DWORD nchars = 0; -$ if (GetConsoleMode (con, &nchars) == 0 && - PeekNamedPipe (con, NULL, 0, NULL, &nchars, NULL)) - { -$ return (nchars)? fgetc (stdin) : EOF; - } - -$ if (_kbhit()) - { -$ return _getch(); - } - -#if defined (_MSC_VER) && (_MSC_VER < 1700) - -$ if (fseek (stdin, 1, SEEK_CUR) != EOF) - { -$ (void) fseek (stdin, -1, SEEK_CUR); -$ return fgetc (stdin); // This causes blocking in MSVC 2011 beta - } - -#endif - -$ return EOF; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txIsParentWaitable (DWORD* parentPID /*= NULL*/) - { -$1 PROCESSENTRY32* info = _txFindProcess(); -$ if (!info) return false; - -$ info = _txFindProcess (info->th32ParentProcessID); -$ if (!info) return false; - -$ char parent [MAX_PATH] = ""; -$ strncpy_s (parent, info->szExeFile, sizeof (parent) - 1); -$ if (parentPID) *parentPID = info->th32ProcessID; - -$ info = _txFindProcess (info->th32ParentProcessID); // info: grandparent - -$ char list[_TX_BUFSIZE] = _TX_WAITABLE_PARENTS; -$ char* ctx = NULL; - -$ for (char* p = strtok_s (list, ", ", &ctx); p; p = strtok_s (NULL, ", ", &ctx)) - { -$ char* gp = strchr (p, ':'); - -$ if (gp) - { -$ *gp++ = 0; -$ if (_stricmp (p, parent) != 0) { continue; } - -$ if (info) if (_stricmp (gp, info->szExeFile) == 0) // Was &&, but OMG MSVC /analyze.. - { $ return true; } - } - else - { -$ if (_stricmp (p, parent) == 0) - { $ return true; } - } - } - -$ return false; - } - -//----------------------------------------------------------------------------------------------------------------- - -PROCESSENTRY32* _txFindProcess (unsigned pid /*= GetCurrentProcessId()*/) - { -$1 static PROCESSENTRY32 info = { sizeof (info) }; -$ if (!pid) return &info; - -$ HANDLE sshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); -$ assert (sshot); if (!sshot) return NULL; - -$ for (bool ok = !!Process32First (sshot, &info); ok; ok = !!Process32Next (sshot, &info)) - if (info.th32ProcessID == pid) break; - -$ CloseHandle (sshot); - -$ return &info; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txInDll() - { -$1 MODULEENTRY32 mod = { sizeof (mod) }; - -$ HANDLE sshot = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, 0); -$ assert (sshot); if (!sshot) return false; - -$ bool inDll = false; - -$ for (bool ok = !!Module32First (sshot, &mod); ok; ok = !!Module32Next (sshot, &mod)) - { -$ if (!mod.modBaseAddr) continue; - -$ IMAGE_DOS_HEADER* dosHdr = (IMAGE_DOS_HEADER*) mod.modBaseAddr; -$ IMAGE_NT_HEADERS* ntHdr = (IMAGE_NT_HEADERS*) (mod.modBaseAddr + dosHdr->e_lfanew); - -$ inDll = (dosHdr->e_magic == IMAGE_DOS_SIGNATURE && - ntHdr->Signature == IMAGE_NT_SIGNATURE && - (ntHdr->FileHeader.Characteristics & IMAGE_FILE_DLL) != 0); - -$ if (In ((BYTE*)(ptrdiff_t)_txInDll, mod.modBaseAddr, mod.modBaseAddr + mod.modBaseSize)) break; - } - -$ CloseHandle (sshot); -$ return inDll; - } - -//----------------------------------------------------------------------------------------------------------------- - -// You are here, little hacker? - -bool _txKillProcess (DWORD pid) - { -$1 _TX_IF_ARGUMENT_FAILED (pid) return false; - -$ HANDLE token = INVALID_HANDLE_VALUE; -$ OpenProcessToken (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token) asserted; - -$ LUID luid = {0}; -$ LookupPrivilegeValue (NULL, SE_DEBUG_NAME, &luid) asserted; - -$ TOKEN_PRIVILEGES priv = { 1, {{{ luid.LowPart, luid.HighPart}, SE_PRIVILEGE_ENABLED }}}; -$ TOKEN_PRIVILEGES old = {0}; - -$ DWORD oldSz = 0; -$ AdjustTokenPrivileges (token, false, &priv, sizeof (priv), &old, &oldSz) asserted; - -$ HANDLE proc = OpenProcess (PROCESS_ALL_ACCESS, 0, pid); -$ if (!proc) return false; - -$ bool ok = !!TerminateProcess (proc, 0); -$ CloseHandle (proc); - -$ return ok; - } - -//----------------------------------------------------------------------------------------------------------------- - -// TXLib continues to hack the reality to make your life better, sweeter and easier - -PROC _txSetProcAddress (HMODULE module, const char* dllName, const char* funcName, PROC newFunc) - { -$1 _TX_IF_ARGUMENT_FAILED (module) return NULL; -$ _TX_IF_ARGUMENT_FAILED (dllName) return NULL; -$ _TX_IF_ARGUMENT_FAILED (newFunc) return NULL; - -$ HMODULE dll = GetModuleHandle (dllName); -$ if (!dll) return NULL; - -$ PROC oldFunc = GetProcAddress (dll, funcName); -$ if (!oldFunc) return NULL; - - #define RVA_( type, addr ) ( (type) ((ptrdiff_t) module + (ptrdiff_t) (addr)) ) - -$ IMAGE_DOS_HEADER* dosHdr = RVA_ (IMAGE_DOS_HEADER*, 0); -$ IMAGE_NT_HEADERS* ntHdr = RVA_ (IMAGE_NT_HEADERS*, dosHdr->e_lfanew); - -$ if (dosHdr->e_magic != IMAGE_DOS_SIGNATURE || - ntHdr ->Signature != IMAGE_NT_SIGNATURE) return NULL; - -$ DWORD impOffset = ntHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; -$ IMAGE_IMPORT_DESCRIPTOR* desc = RVA_ (IMAGE_IMPORT_DESCRIPTOR*, impOffset); - -$ if (desc == (IMAGE_IMPORT_DESCRIPTOR*) ntHdr) return NULL; - -$ IMAGE_THUNK_DATA* thunk = NULL; -$ bool found = false; - - for (; desc->Name; desc++) - { -$ if (_stricmp (RVA_ (const char*, desc->Name), dllName) != 0) continue; - -$ for (thunk = RVA_ (IMAGE_THUNK_DATA*, desc->FirstThunk); thunk->u1.Function; thunk++) - if ((ptrdiff_t) thunk->u1.Function == (ptrdiff_t) oldFunc) { found = true; break; } - -$ if (found) break; - } - -$ if (!found) return NULL; - -$ *(PROC*)& thunk->u1.Function = newFunc; // In different MS-SDKs this field has different types (DWORD/DWORD*/etc) - -$ return oldFunc; - - #undef RVA_ - } - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ [Internal] TXLib window functions (_txCanvas...) -//! @name TXLib (_txCanvas...) -//================================================================================================================= - -//{ -#if defined (_MSC_VER_6) || defined (_GCC_VER) && (_GCC_VER <= 345) - - #define SetClassLong_ SetClassLong - #define GCL_HICON_ GCL_HICON - #define GCL_HICONSM_ GCL_HICONSM - #define GCL_HCURSOR_ GCL_HCURSOR - -#else - #define SetClassLong_ SetClassLongPtr - #define GCL_HICON_ GCLP_HICON - #define GCL_HICONSM_ GCLP_HICONSM - #define GCL_HCURSOR_ GCLP_HCURSOR - #endif -//} - -unsigned WINAPI _txCanvas_ThreadProc (void* data) - { -$1 _txCanvas_ThreadId = GetCurrentThreadId(); - -$ _TX_IF_ARGUMENT_FAILED (data) return false; - -$ HWND wnd = _txCanvas_CreateWindow ((SIZE*) data); -$ if (!txWindow()) return TX_DEBUG_ERROR ("\a" "Cannot create canvas"), 0; - -$ HICON icon32 = LoadIcon (GetModuleHandle (NULL), "_TX_ICON"); -$ HICON icon16 = LoadIcon (GetModuleHandle (NULL), "_TX_ICONSM"); -$ HCURSOR cursor = LoadCursor (GetModuleHandle (NULL), "_TX_CURSOR"); - -$ SetClassLong_ (wnd, GCL_HICON_, (DWORD)(ptrdiff_t) (icon32? icon32 : _txCreateTXIcon (32))); -$ SetClassLong_ (wnd, GCL_HICONSM_, (DWORD)(ptrdiff_t) (icon16? icon16 : _txCreateTXIcon (16))); -$ SetClassLong_ (wnd, GCL_HCURSOR_, (DWORD)(ptrdiff_t) (cursor? cursor : LoadCursor (NULL, IDC_ARROW))); - -$ HACCEL accel = LoadAccelerators (NULL, "_TX_ACCELERATORS"); - - _TX_ON_DEBUG (OutputDebugString (_TX_VERSION " - STARTED: " _TX_MODULE "\n")); - -$ _txRunning = true; - -$ ShowWindow (wnd, SW_SHOW); -$ SetForegroundWindow (wnd); -$ UpdateWindow (wnd); - -$ MSG msg = {0}; -$ while (GetMessage (&msg, NULL, 0, 0)) - { -$ if (!msg.hwnd) continue; - -$ if (accel != NULL && TranslateAccelerator (wnd, accel, &msg)) continue; - -$ TranslateMessage (&msg); -$ DispatchMessage (&msg); - -$ Sleep (0); - } - -$ if (icon16) DestroyIcon (icon16); // If Explorer is displaying Tray Notification, these -$ if (icon32) DestroyIcon (icon32); // calls will possibly fail, and we'll get resource leak. - -$ LeaveCriticalSection (&_txCanvas_LockBackBuf); - -$ if (_txRunning && _txMain) // Main window is destroyed but main() is still running. - { // No chances for good termination, so use exit(). -$ exit ((int) msg.wParam); - } - - _TX_ON_DEBUG (OutputDebugString (_TX_VERSION " - STOPPED: " _TX_MODULE "\n")); - -$ _txCanvas_ThreadId = 0; -$ return true; - } - -//{ -#undef SetClassLong -#undef GCL_HICON_ -#undef GCL_HICONSM_ -#undef GCL_HCURSOR_ -//} - -//----------------------------------------------------------------------------------------------------------------- - -HWND _txCanvas_CreateWindow (SIZE* size) - { -$1 _TX_IF_ARGUMENT_FAILED (size) return NULL; - -$ static char className[_TX_BUFSIZE] = ""; -$ _snprintf_s (className, sizeof (className) - 1 _TX_TRUNCATE, - "/*---[TXLib]-------------------------- " - _TX_VERSION " " __FILE__ " WndClass %08X " - "--------------------------[TXLib]---*/", (int) GetTickCount()); - -$ WNDCLASSEX wc = { sizeof (wc) }; -$ wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; -$ wc.lpfnWndProc = _txCanvas_WndProc; -$ wc.hCursor = LoadCursor (NULL, IDC_ARROW); -$ wc.hbrBackground = (HBRUSH) Win32::GetStockObject (HOLLOW_BRUSH); -$ wc.lpszClassName = className; - -$ ATOM wndclass = RegisterClassEx (&wc); -$ if (!wndclass) return TX_DEBUG_ERROR ("RegisterClass (\"%s\") failed" _ className), (HWND) NULL; - -$ int centered = false; -$ if (size->cx < 0 && size->cy < 0) { size->cx *= -1; size->cy *= -1; centered = true; } - -$ SIZE scr = { GetSystemMetrics (SM_CXSCREEN), GetSystemMetrics (SM_CYSCREEN) }; -$ RECT r = { 0, 0, size->cx, size->cy }; AdjustWindowRect (&r, _txWindowStyle, false); -$ SIZE sz = { r.right - r.left, r.bottom - r.top }; - -$ HWND wnd = CreateWindowEx (WS_EX_APPWINDOW, className, txGetModuleFileName (false), _txWindowStyle, - centered? scr.cx/2 - sz.cx/2 : CW_USEDEFAULT, - centered? scr.cy/2 - sz.cy/2 : CW_USEDEFAULT, - sz.cx, sz.cy, NULL, NULL, NULL, NULL); - -$ if (!wnd || !txWindow()) return TX_DEBUG_ERROR ("Cannot create canvas: CreateWindowEx (\"%s\") failed" _ className), (HWND) NULL; -$ HMENU menu = GetSystemMenu (txWindow(), false); -$ if (!menu) return txWindow(); - -$ AppendMenu (menu, MF_SEPARATOR, 0, NULL) asserted; -$ AppendMenu (menu, MF_STRING, _TX_IDM_CONSOLE, "Show &Console") asserted; -$ AppendMenu (menu, MF_STRING, _TX_IDM_ABOUT, "&About...") asserted; - -$ HWND console = Win32::GetConsoleWindow(); - -$ DWORD proc = 0; -$ GetWindowThreadProcessId (console, &proc); - -$ if (console && (proc == GetCurrentProcessId() || _txIsParentWaitable())) - { $ ShowWindow (console, _txConsoleMode); } - -$ CheckMenuItem (menu, _TX_IDM_CONSOLE, (console? (IsWindowVisible (console)? MF_CHECKED : 0) : MF_DISABLED)); - -$ return txWindow(); - } - -//----------------------------------------------------------------------------------------------------------------- - -inline bool _txCanvas_OK() - { -$1 return _txCanvas_ThreadId && - _txCanvas_Window && - _txCanvas_BackBuf[0] && - _txCanvas_BackBuf[1]; - } - -//----------------------------------------------------------------------------------------------------------------- - -int _txCanvas_SetRefreshLock (int count) - { -$1 int oldCount = _txCanvas_RefreshLock; - -$ _txCanvas_RefreshLock = count; - -$ HWND wnd = txWindow(); - -$ if ((_txCanvas_RefreshLock <= 0 || oldCount <= 0) && wnd) - { $ RedrawWindow (wnd, NULL, NULL, RDW_INVALIDATE | RDW_INTERNALPAINT | RDW_UPDATENOW); } - -$ return oldCount; - } - -//----------------------------------------------------------------------------------------------------------------- - -HICON _txCreateTXIcon (int size) - { -$1 _TX_IF_ARGUMENT_FAILED (size == 32 || size == 16) return NULL; - -$ const char image32 [32*32+1] = - "00000000000000000000000000000000""0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0""0F0000000000000000000000000000F0""0F0000000000000000000000000000F0" - "0F0000000000000099999999999900F0""0F0000000000000090300333330900F0""0F0000000990000090000000000900F0""0F00000099990000900BB000000900F0" - "0F0000039999000090B00090900900F0""0F0000009999000090B00999990900F0""0F00000009903799900BB090900900F0""0F000000009BB70090000010000900F0" - "0F0000000B90000090000000000900F0""0F000000B0B0000099999999999900F0""0F00007B30B0000090000000000000F0""0F00007300B0000090000000000000F0" - "0F00000000B3000090000000000000F0""0F0000000B0B000090000000000000F0""0F000000B303B00090000000000000F0""0F000003B000B00090000000000000F0" - "0F00003B00003B0090000000000000F0""0F0000300000030090000000000000F0""0F0000000448888888888844000000F0""0F00004886E6E6E60E66E6EEEE4400F0" - "0F4488866E0E60E00660E06E66EEE4F0""0F868806E06E06E666E66E00E06EE6F0""0F08606E66E0066000E006E66E00E6F0""0F8666E006600E00006600E006E00EF0" - "0F000E066888888888888888606660F0""0F66EEE6EE000E00000E00086EEEE6F0""0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0""00000000000000000000000000000000"; - -$ const char image16 [16*16+1] = - "0000000000000000""0000000999999990""0009000900000090""0099900909973090""0059700909009390""0009799909973090""0099000900000090""0959330999999990" - "0709500900000000""0095930900000000""0090393900000000""0790073900000000""0900000900000000""000EE6E6E6E6E000""0EE6E6E6E6E6EEE0""0000000000000000"; - -$ const COLORREF pal['F'-'0'+1] = { 0x000000, 0x002b2b, 0x555500, 0x005555, 0x808000, 0x008080, 0xaaaa00, 0x00aaaa, 0xd5d500, 0x00d5d5, 0,0,0,0,0,0,0, - 0xffff00, 0x00ffff, 0xffffaa, 0xaaffff, 0xd5d500, 0xffffff }; - -$ const char* image = (size == 32)? image32 : image16; - -$ POINT sz = { size, size }; -$ HDC dcMask = _txBuffer_Create (txWindow(), &sz); assert (dcMask); -$ HDC dcColor = _txBuffer_Create (txWindow(), &sz); assert (dcColor); - -$ for (int i = 0; i < size*size; i++) - { - assert (In (image[i], '0', '9') || In (image[i], 'A', 'F')); - - Win32::SetPixel (dcColor, i % size, i / size, pal [image[i] - '0']); - } - -$ ICONINFO info = { true, 0, 0, (HBITMAP) Win32::GetCurrentObject (dcMask, OBJ_BITMAP), - (HBITMAP) Win32::GetCurrentObject (dcColor, OBJ_BITMAP) }; - -$ HICON icon = CreateIconIndirect (&info); -$ assert (icon); - -$ _txBuffer_Delete (&dcMask) asserted; -$ _txBuffer_Delete (&dcColor) asserted; - -$ return icon; - } - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ [Internal] Main window event handlers (_txCanvas_On...) -//! @name (_txCanvas_On...) -//================================================================================================================= -//! @{ - -LRESULT CALLBACK _txCanvas_WndProc (HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar) - { -#ifdef _TX_ALLOW_TRACE - - _txInTX++; - - if (_txAllowTrace) _txTrace (__FILE__, __LINE__, __TX_FUNCTION__, - "%*s" "0x%X <- 0x%03X (0x%08X, 0x%08lX)", 12 - _txInTX*2, "", wnd, msg, wpar, lpar); - _txInTX--; - -#endif - -$1 if (msg == WM_KEYDOWN && wpar == VK_F12 && - GetKeyState (VK_SHIFT) && GetKeyState (VK_CONTROL) && GetKeyState (VK_MENU)) - { -$ _txCanvas_OnCmdABOUT (wnd, wpar); -$ return DefWindowProc (wnd, msg, wpar, lpar); - } - - WNDPROC altWndProc = _txAltWndProc; // Cache to prevent change from main thread - if (altWndProc) - { -$ LRESULT res = altWndProc (wnd, msg, wpar, lpar); -$ if (res) return res; - } - - switch (msg) - { - case WM_CREATE: $ _txCanvas_OnCREATE (wnd); return 0; - - case WM_CLOSE: $ if (_txCanvas_OnCLOSE (wnd)) break; else return 0; - case WM_DESTROY: $ _txCanvas_OnDESTROY (wnd); return 0; - - case WM_PAINT: $ _txCanvas_OnPAINT (wnd); return 0; - case WM_TIMER: $ _txCanvas_OnTIMER (wnd, wpar); return 0; - - case WM_KEYDOWN: $ _txCanvas_OnKEYDOWN (wnd, wpar, lpar); return 0; - case WM_CHAR: $ _txCanvas_OnCHAR (wnd, wpar, lpar); return 0; - - case WM_LBUTTONUP: - case WM_LBUTTONDOWN: - case WM_RBUTTONUP: - case WM_RBUTTONDOWN: - case WM_MBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MOUSEMOVE: $ _txCanvas_OnMOUSEMOVE (wnd, wpar, lpar); return 0; - - default: break; - } - - if (msg == WM_SYSCOMMAND) switch (wpar) - { - case _TX_IDM_ABOUT: $ _txCanvas_OnCmdABOUT (wnd, wpar); return 0; - case _TX_IDM_CONSOLE: $ _txCanvas_OnCmdCONSOLE (wnd, wpar); return 0; - - default: break; - } - -$ return DefWindowProc (wnd, msg, wpar, lpar); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txCanvas_OnCREATE (HWND wnd) - { -$1 _TX_IF_ARGUMENT_FAILED (wnd) return false; - -$ _txCanvas_BackBuf[0] = _txBuffer_Create (wnd); assert (_txCanvas_BackBuf[0]); -$ _txCanvas_BackBuf[1] = _txBuffer_Create (wnd); assert (_txCanvas_BackBuf[1]); - -$ SetTimer (wnd, _txCanvas_RefreshTimer, _txWindowUpdateInterval, NULL) asserted; - -$ _txCanvas_Window = wnd; - -$ txSetDefaults(); - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txCanvas_OnDESTROY (HWND wnd) - { -$1 _TX_IF_ARGUMENT_FAILED (wnd) return false; - - // - -$ PostQuitMessage (_txRunning? WM_DESTROY : EXIT_SUCCESS); - -$ if (!_txCanvas_Window) return false; - - // Indicate that we are about to manually terminate - -$ _txExit = true; - - // Lock GDI resources - -$ bool locked = false; -$ _txWaitFor ((locked = txLock (false), locked), _TX_TIMEOUT); -$ if (!locked) TX_DEBUG_ERROR ("Cannot lock GDI to free resources"); - - // - -$ if (_txCanvas_UserDCs && _txCanvas_UserDCs->size()) - { -$ txNotifyIcon (NIIF_ERROR, NULL, " %d HDC.", (int) _txCanvas_UserDCs->size()); -$ Sleep (_TX_TIMEOUT); - -$ for (size_t i = 0; i < _txCanvas_UserDCs->size(); i++) _txBuffer_Delete (&_txCanvas_UserDCs->at (i)); -$ _txCanvas_UserDCs->clear(); - } - - // , - -$ if (_txCanvas_RefreshTimer) KillTimer (wnd, _txCanvas_RefreshTimer) asserted; - -$ if (_txCanvas_BackBuf[1]) _txBuffer_Delete (&_txCanvas_BackBuf[1]) asserted; -$ if (_txCanvas_BackBuf[0]) _txBuffer_Delete (&_txCanvas_BackBuf[0]) asserted; - -$ txUnlock(); - - // Indicate that we are destroyed - -$ _txCanvas_Window = NULL; - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txCanvas_OnCLOSE (HWND wnd) - { -$1 _TX_IF_ARGUMENT_FAILED (wnd && _txCanvas_OK()) return false; - -$ if (_txMain && _txRunning && - txMessageBox (" main() . . ? \n\n" - " , main() - .", - txGetModuleFileName (false), MB_OKCANCEL | MB_ICONSTOP) != IDOK) return false; -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txCanvas_OnTIMER (HWND wnd, WPARAM) - { -$1 _TX_IF_ARGUMENT_FAILED (wnd) return false; - -$ if (_txCanvas_RefreshLock > 0 || !_txRunning) return false; - -$ InvalidateRect (wnd, NULL, false) asserted; -$ UpdateWindow (wnd) asserted; - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txCanvas_OnPAINT (HWND wnd) - { -$1 _TX_IF_ARGUMENT_FAILED (wnd && _txCanvas_OK()) return false; - -$ bool forceRedraw = GetAsyncKeyState (VK_MENU) && GetAsyncKeyState (VK_CONTROL) && - GetAsyncKeyState (VK_SHIFT) && GetAsyncKeyState (VK_SNAPSHOT); - -$ PAINTSTRUCT ps = {0}; -$ HDC dc = BeginPaint (wnd, &ps); -$ if (!dc) return false; - -$ RECT r = {0}; -$ GetClientRect (wnd, &r) asserted; -$ POINT size = { r.right - r.left, r.bottom - r.top }; - -$ if ((_txCanvas_RefreshLock <= 0 || forceRedraw) && - txLock (false)) - { -$ Win32::BitBlt (_txCanvas_BackBuf[1], 0, 0, size.x, size.y, txDC(), 0, 0, SRCCOPY); - -$ _txConsole_Draw (_txCanvas_BackBuf[1]); - -$ txUnlock(); - } - - // Magic 100500 value is used to completely block screen refresh. - // Since no value can be 100500 or above, this condition is always true and the refresh cannot be blocked IRL. - // Do not use 100501 because it may lead to errors on some compilers and possible may crash the compilers - // themselves. - // Yes guys, with all your software installed. :( - -$ if (_txCanvas_RefreshLock != 100500) - { $ Win32::BitBlt (dc, 0, 0, size.x, size.y, _txCanvas_BackBuf[1], 0, 0, SRCCOPY); } - -$ EndPaint (wnd, &ps) asserted; - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txCanvas_OnKEYDOWN (HWND, WPARAM vk, LPARAM info) - { -$1 INPUT_RECORD evt = {0}; - -$ evt.EventType = KEY_EVENT; -$ evt.Event.KeyEvent.bKeyDown = true; -$ evt.Event.KeyEvent.wRepeatCount = 1; -$ evt.Event.KeyEvent.uChar.AsciiChar = (unsigned char) MapVirtualKey ((WORD) vk, 2); // 2 == MAPVK_VK_TO_CHAR -$ evt.Event.KeyEvent.wVirtualScanCode = (unsigned char) (info >> 16); -$ evt.Event.KeyEvent.wVirtualKeyCode = (WORD) vk; -$ evt.Event.KeyEvent.dwControlKeyState = (info & (1 << 24))? ENHANCED_KEY : 0; - -$ if (evt.Event.KeyEvent.uChar.AsciiChar) return false; // Let TranslateMessage() and WM_CHAR do the job - -$ DWORD written = 0; -$ WriteConsoleInput (GetStdHandle (STD_INPUT_HANDLE), &evt, 1, &written); - -$ return false; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txCanvas_OnCHAR (HWND, WPARAM ch, LPARAM info) - { -$1 INPUT_RECORD evt = {0}; - -$ evt.EventType = KEY_EVENT; -$ evt.Event.KeyEvent.bKeyDown = true; -$ evt.Event.KeyEvent.wRepeatCount = 1; -$ evt.Event.KeyEvent.uChar.AsciiChar = (unsigned char) (ch); -$ evt.Event.KeyEvent.wVirtualScanCode = (unsigned char) (info >> 16); -$ evt.Event.KeyEvent.wVirtualKeyCode = (WORD) MapVirtualKey ((WORD) (info >> 16), 3); // 3 == MAPVK_VSC_TO_VK_EX -$ evt.Event.KeyEvent.dwControlKeyState = 0; - -$ DWORD written = 0; -$ WriteConsoleInput (GetStdHandle (STD_INPUT_HANDLE), &evt, 1, &written); - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txCanvas_OnMOUSEMOVE (HWND, WPARAM buttons, LPARAM coords) - { -$1 _TX_IF_ARGUMENT_FAILED (_txCanvas_OK()) return false; - -$ _txMousePos.x = LOWORD (coords); -$ _txMousePos.y = HIWORD (coords); -$ _txMouseButtons = (int) buttons; - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txCanvas_OnCmdCONSOLE (HWND wnd, WPARAM cmd) - { -$1 _TX_IF_ARGUMENT_FAILED (wnd) return false; - -$ HWND console = Win32::GetConsoleWindow(); -$ if (!console) return false; - -$ bool visible = !!IsWindowVisible (console); - -$ ShowWindow (console, visible? SW_HIDE : SW_SHOW); - -$ visible = !!IsWindowVisible (console); -$ CheckMenuItem (GetSystemMenu (wnd, false), (int) cmd, visible? MF_CHECKED : MF_UNCHECKED); - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txCanvas_OnCmdABOUT (HWND, WPARAM) - { -$1 //{ Overriding the missing names, if the set is uncomplete - - #if defined (__MODULE) - #define ABOUT_NAME_ __MODULE - #else - #define ABOUT_NAME_ "TXLib" - #endif - - #if defined (__MODULE) || defined (__VERSION) || defined (__DESCRIPTION) || defined (__AUTHOR) - - #ifndef __MODULE - #define __MODULE "TXLib" "\n" "#define __MODULE to set the name.\n" - #endif - - #ifndef __VERSION - #define __VERSION "(0.000000000)." "\n" "#define __VERSION to set the string value.\n" - #endif - - #ifndef __DESCRIPTION - #define __DESCRIPTION "(, )." "\n" "#define __DESCRIPTION to override project role.\n" - #endif - - #ifndef __AUTHOR - #define __AUTHOR "( )." "\n" "#define __AUTHOR to override this name." - #endif - - #endif - //} - -$ time_t timeT = time (NULL) - clock()/CLOCKS_PER_SEC; -$ char timeS[32] = ""; -$ ctime_s (timeS, sizeof (timeS), &timeT); - -$ static char text[_TX_BUFSIZE] = ""; -$ char cwd [MAX_PATH] = ""; - -$ _snprintf_s (text, sizeof (text) - 1 _TX_TRUNCATE, - - "Application:\n" - - #if defined (__MODULE) || defined (__VERSION) || defined (__DESCRIPTION) || defined (__AUTHOR) - __MODULE " version " __VERSION "\n" __DESCRIPTION "\n" "Copyright (c) " __AUTHOR "\n" - #else - " :)\n" - "#define __MODULE to \"your program name\" before including TXLib.h to use this billboard...\n" - #endif - - "\n" "Developed with:\n\n" - "The Dumb Artist Library (TX Library) - " _TX_VERSION "\n" _TX_AUTHOR "\n" - "See license on: http://txlib.ru\n\n" - - "TXLib file:" "\t" __FILE__ "\n" - "Compiled:" "\t" __DATE__ " " __TIME__ ", " _TX_BUILDMODE ", " __TX_COMPILER__ "\n" - "Started:" "\t" "%.6s %.4s %.8s\n\n" - - "Run file:" "\t" "%s\n" - "Directory:" "\t" "%s", - - timeS + 4, timeS + 20, timeS + 11, // These offsets are ANSI standardized - txGetModuleFileName(), - _getcwd (cwd, sizeof (cwd) - 1)); - -$ txMessageBox (text, "About " ABOUT_NAME_, MB_ICONINFORMATION); - - // And a bit of HTTP-code in C++ function: - - goto http; - http://txlib.ru // See valuable refs here :) - -$ return true; - - #undef ABOUT_NAME_ - } - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ [Internal] Console-support functions (_txConsole...) -//! @name (_txConsole...) -//================================================================================================================= -//! @{ - -HWND _txConsole_Attach() - { -$1 HWND console = Win32::GetConsoleWindow(); - -$ if (!console) - { -$ FreeConsole(); -$ AllocConsole(); - } - -$ console = Win32::GetConsoleWindow(); -$ if (!console) return NULL; - - // Linux::Wine v1.2.2+ compatibility. - // Beer compatibility will be added in future versions. - // : wine . - -$ if (Win32::wine_get_version) - { -$ Win32::GetNumberOfConsoleFonts = NULL; -$ Win32::GetCurrentConsoleFont = NULL; -$ Win32::SetConsoleFont = NULL; - } - - // Windows - -$ SetConsoleCP (_TX_CP); // 1251 -$ SetConsoleOutputCP (_TX_CP); // 1251 - - // , Unicode- - // (wprintf, ...). gcc L"unicode-" - // , g++: -finput-charset=CP1251 -fexec-charset=CP1251. - -$ setlocale (LC_CTYPE, _TX_LC_CTYPE); // "Russian" -$ if (!Win32::wine_get_version) _wsetlocale (LC_CTYPE, _TX_LC_CTYPE_W); // L"Russian_Russia.ACP" - -$ static bool done = false; -$ if (done) return console; - - // . - -$ if (!Win32::wine_get_version) - { $ _txConsole_SetUnicodeFont(); } - -#ifndef _CONSOLE - - // -, subsystem != console - -$ *stdin = *_fdopen (_open_osfhandle ((DWORD)(ptrdiff_t) GetStdHandle (STD_INPUT_HANDLE), _O_TEXT), "r"); -$ fflush (stdout); *stdout = *_fdopen (_open_osfhandle ((DWORD)(ptrdiff_t) GetStdHandle (STD_OUTPUT_HANDLE), _O_TEXT), "w"); -$ fflush (stderr); *stderr = *_fdopen (_open_osfhandle ((DWORD)(ptrdiff_t) GetStdHandle (STD_ERROR_HANDLE), _O_TEXT), "w"); - -$ setvbuf (stdin, NULL, _IONBF, 0); -$ setvbuf (stdout, NULL, _IONBF, 0); -$ setvbuf (stderr, NULL, _IONBF, 0); - -$ std::ios::sync_with_stdio(); - -#endif - - // That's all, folks - -$ done = true; -$ return console; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline bool _txConsole_OK() - { -$1 return Win32::GetConsoleWindow() != NULL; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txConsole_Detach (bool activate) - { -$1 HWND console = Win32::GetConsoleWindow(); -$ if (!console) return false; - -$ EnableWindow (console, true); -$ ShowWindow (console, SW_SHOW); - -$ if (activate) - { -$ SetForegroundWindow (console); -$ BringWindowToTop (console); - } - -$ return !!FreeConsole(); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txConsole_Draw (HDC dc) - { -$1 _TX_IF_ARGUMENT_FAILED (dc) return false; - -$ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE); - -$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}}; -$ BOOL ok = GetConsoleScreenBufferInfo (out, &con); -$ if (!ok) return false; - -$ POINT size = { con.srWindow.Right - con.srWindow.Left + 1, - con.srWindow.Bottom - con.srWindow.Top + 1 }; - -$ SIZE fontSz = { 12, 16 }; -$ Win32::GetTextExtentPoint32 (dc, "W", 1, &fontSz) asserted; - -$ COLORREF pal [16] = { 0x000000, 0x800000, 0x008000, 0x808000, 0x000080, 0x800080, 0x008080, 0xC0C0C0, - 0x808080, 0xFF0000, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFF }; - -$ for (int y = 0; y < size.y; y++) - { - static char chr [_TX_BUFSIZE + 1] = ""; // [con.dwSize.X + 1]; maybe will be truncated - static WORD atr [_TX_BUFSIZE + 1] = {0}; // [con.dwSize.X + 1]; maybe will be truncated - COORD coord = { (short) (con.srWindow.Left), (short) (y + con.srWindow.Top) }; - DWORD read = 0; - - if (!ReadConsoleOutputCharacter (out, chr, SIZEARR (chr) - 1, coord, &read)) continue; - if (!ReadConsoleOutputAttribute (out, atr, SIZEARR (atr) - 1, coord, &read)) continue; - - for (int x = 0, xEnd = size.x; x < size.x; x = xEnd) - { - Win32::SetTextColor (dc, pal [ atr[x] & 0x0F]); - Win32::SetBkColor (dc, pal [(atr[x] >> 4) & 0x0F]); - Win32::SetBkMode (dc, (atr[x] & 0xF0)? OPAQUE : TRANSPARENT); - - for (xEnd = x+1; atr[xEnd] == atr[x] && xEnd < size.x; xEnd++) ; - - Win32::TextOut (dc, ROUND (fontSz.cx * (x + con.srWindow.Left)), - ROUND (fontSz.cy * y), chr + x, xEnd - x) asserted; - } - } - -$ Win32::SetTextColor (dc, pal [ con.wAttributes & 0x0F]); -$ Win32::SetBkColor (dc, pal [(con.wAttributes >> 4) & 0x0F]); -$ Win32::SetBkMode (dc, TRANSPARENT); - -$ if (_txConsole_IsBlinking && - In (con.dwCursorPosition, con.srWindow) && - GetTickCount() % _txCursorBlinkInterval*2 > _txCursorBlinkInterval && - GetForegroundWindow() == txWindow()) - { -$ Win32::TextOut (dc, ROUND (fontSz.cx * (con.dwCursorPosition.X - con.srWindow.Left)), - ROUND (fontSz.cy * (con.dwCursorPosition.Y - con.srWindow.Top)) + 1, - "_", 1) asserted; - } - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- -//{ Welcome to the Duck Side! Together we will rule the Bathroom! -//----------------------------------------------------------------------------------------------------------------- - -bool _txConsole_SetUnicodeFont() - { - // ... - -$1 if (Win32::GetCurrentConsoleFontEx && Win32::SetCurrentConsoleFontEx) - { -$ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE); - -$ Win32::CONSOLE_FONT_INFOEX info = { sizeof (info) }; -$ if (!Win32::GetCurrentConsoleFontEx (out, false, &info)) return false; - -$ info.FontFamily = 0x36; // Unicode fixed-pitch -$ if (!*info.FaceName) info.dwFontSize.Y = (SHORT) (info.dwFontSize.Y + 2); // Terminal font is too small -$ wcsncpy_s (info.FaceName, L"Lucida Console", SIZEARR (info.FaceName)); - -$ return !!Win32::SetCurrentConsoleFontEx (out, false, &info); - } - - // ... - -$ const unsigned uniFont = 10; // The Internet and W2K sources know this magic number -$ const unsigned uniSize = 20; // Size of the font desired, should be > max of Raster Fonts -$ bool ok = true; - - // Force Windows to use Unicode font by creating and run the console shortcut tuned to use that font. - -$ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE); - -$ if (Win32::GetNumberOfConsoleFonts && Win32::GetNumberOfConsoleFonts() <= uniFont) - { -$ HRESULT init = Win32::CoInitialize (NULL); -$ size_t sz = 0; - -$ char link [MAX_PATH] = ""; -$ getenv_s (&sz, link, sizeof (link) - 1, "TEMP"); -$ strncat_s (link, "\\~txLink.lnk", sizeof (link) - 1); - -$ char comspec [MAX_PATH] = ""; -$ getenv_s (&sz, comspec, sizeof (comspec), "COMSPEC"); - -$ (void) _unlink (link); - -$ _txCreateShortcut (link, comspec, "/c exit", NULL, NULL, SW_SHOWMINNOACTIVE, NULL, 0, uniSize) asserted; - -$ ok = (Win32::ShellExecuteA (NULL, NULL, link, NULL, NULL, SW_SHOWMINNOACTIVE) > (void*)32); // Sic! - if (ok) { $ _txWaitFor (FindWindow (NULL, "~txLink"), _TX_TIMEOUT); } - -$ (void) _unlink (link); - -$ if (init == S_OK) Win32::CoUninitialize(); - } - - // If Unicode font is not already set, do set it. - -$ CONSOLE_FONT_INFO cur = {0}; - if (Win32::GetCurrentConsoleFont) { $ Win32::GetCurrentConsoleFont (out, false, &cur); } - -$ ok &= (cur.nFont >= uniFont); - if (!ok) { $ ok &= Win32::SetConsoleFont && Win32::SetConsoleFont (out, uniFont); } - -$ HWND console = Win32::GetConsoleWindow(); -$ InvalidateRect (console, NULL, false); -$ UpdateWindow (console); - -$ return ok; - } - -//----------------------------------------------------------------------------------------------------------------- -//{ The nightmare helpers - -#define _TX_TRY { goto __tx_try; } __tx_try: { int __tx_error = S_OK; (void)__tx_error; -#define _TX_CHECKED( cmd ) { if (FAILED (__tx_error = (cmd))) goto __tx_catch; } -#define _TX_FAIL { __tx_error = E_FAIL; goto __tx_catch; } -#define _TX_RETRY { __tx_error = S_OK; goto __tx_try; } -#define _TX_OK ( SUCCEEDED (__tx_error) ) -#define _TX_CATCH goto __tx_finally; __tx_catch: -#define _TX_RETURN goto __tx_finally; -#define _TX_FINALLY __tx_finally: -#define _TX_ENDTRY } - -//} -//----------------------------------------------------------------------------------------------------------------- - -// - -bool _txCreateShortcut (const char shortcutName[], - const char fileToLink[], const char args[] /*= NULL*/, const char workDir[] /*= NULL*/, - const char description[] /*= NULL*/, int cmdShow /*= SW_SHOWNORMAL*/, const char iconFile[] /*= NULL*/, int iconIndex /*= 0*/, - int fontSize /*= 0*/, COORD bufSize /*= ZERO (COORD)*/, COORD wndSize /*= ZERO (COORD)*/, COORD wndOrg /*=ZERO (COORD)*/) - { -$1 _TX_IF_ARGUMENT_FAILED (shortcutName && *shortcutName) return false; -$ _TX_IF_ARGUMENT_FAILED (fileToLink && *fileToLink) return false; - -$ IShellLink* shellLink = NULL; -$ Win32::IShellLinkDataList* dataList = NULL; -$ IPersistFile* file = NULL; - -$ HRESULT init = Win32::CoInitialize (NULL); - - _TX_TRY - { -$ _TX_CHECKED (Win32::CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, Win32::IID_IShellLink, (void**) &shellLink)); -$ if (!shellLink) _TX_FAIL; - -$ shellLink->SetPath (fileToLink); -$ shellLink->SetArguments (args); -$ shellLink->SetWorkingDirectory (workDir); -$ shellLink->SetDescription (description); -$ shellLink->SetShowCmd (cmdShow); -$ shellLink->SetIconLocation (iconFile, iconIndex); - -$ _TX_CHECKED (shellLink->QueryInterface (Win32::IID_IShellLinkDataList, (void**) &dataList)); -$ if (!dataList) _TX_FAIL; - -$ Win32::NT_CONSOLE_PROPS props = - {{sizeof (props), NT_CONSOLE_PROPS_SIG}, - - 0x07, 0xF5, // wFillAttribute, wPopupFillAttribute - {bufSize.X, bufSize.Y}, // dwScreenBufferSize - {wndSize.X, wndSize.Y}, // dwWindowSize - {wndOrg.X, wndOrg.Y}, // dwWindowOrigin - 0, // nFont - 0, // nInputBufferSize - {0, (short) fontSize}, // dwFontSize - 0x36, 400, L"Lucida Console", // uFontFamily, uFontWeight, FaceName. We're dancing for this! - 15, // uCursorSize - 0, 1, 1, 0, // bFullScreen, bQuickEdit, bInsertMode, bAutoPosition - 50, 4, 0, // uHistoryBufferSize, uNumberOfHistoryBuffers, bHistoryNoDup - - {0x000000, 0x800000, 0x008000, 0x808000, 0x000080, 0x800080, 0x008080, 0xC0C0C0, - 0x808080, 0xFF0000, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFF} - }; - -$ _TX_CHECKED (dataList->AddDataBlock (&props)); - -$ _TX_CHECKED (shellLink->QueryInterface (Win32::IID_IPersistFile, (void**) &file)); -$ if (!file) _TX_FAIL; - -$ wchar_t wName[MAX_PATH] = L""; -$ MultiByteToWideChar (_TX_CP, 0, shortcutName, -1, wName, MAX_PATH) || ZeroMemory (wName, sizeof (wName)); - -$ _TX_CHECKED (file->Save (wName, true)); - } - -$ _TX_CATCH -$ _TX_FINALLY - -$ if (file) file ->Release(); -$ if (dataList) dataList ->Release(); -$ if (shellLink) shellLink->Release(); - -$ if (init == S_OK) Win32::CoUninitialize(); - -$ return _TX_OK; - _TX_ENDTRY - } - -//} -//----------------------------------------------------------------------------------------------------------------- - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ [Internal] Memory DC functions (_txBuffer...) -//! @name " " ( , _txBuffer...) -//================================================================================================================= -//! @{ - -HDC _txBuffer_Create (HWND wnd, const POINT* size, HBITMAP bitmap) - { -$1 txAutoLock _lock; - -$ HDC wndDC = GetDC (wnd); -$ if (!wndDC) return NULL; - -$ RECT r = {0}; -$ if (wnd) GetClientRect (wnd, &r) asserted; -$ POINT sz = { r.right - r.left, r.bottom - r.top }; -$ if (!size) size = &sz; - -$ HDC dc = Win32::CreateCompatibleDC (wndDC); -$ if (!dc) TX_DEBUG_ERROR ("Cannot create buffer: CreateCompatibleDC() failed"); - -$ HBITMAP bmap = bitmap? bitmap : Win32::CreateCompatibleBitmap (wndDC, size->x, size->y); -$ if (!bmap) TX_DEBUG_ERROR ("Cannot create buffer: CreateCompatibleBitmap() failed"); - -$ Win32::SelectObject (dc, bmap) asserted; - -$ if (!bitmap) Win32::PatBlt (dc, 0, 0, size->x, size->y, BLACKNESS) asserted; - -$ ReleaseDC (wnd, wndDC) asserted; - -$ return dc; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txBuffer_Delete (HDC* dc) - { -$1 _TX_IF_ARGUMENT_FAILED (dc) return false; -$ if (!*dc) return false; - -$ if (!Win32::GetObjectType (Win32::GetCurrentObject (*dc, OBJ_BITMAP))) return false; - -$ txAutoLock _lock; - -$ _txBuffer_Select (Win32::GetStockObject (NULL_PEN), *dc) asserted; -$ _txBuffer_Select (Win32::GetStockObject (NULL_BRUSH), *dc) asserted; -$ _txBuffer_Select (Win32::GetStockObject (SYSTEM_FONT), *dc) asserted; -$ _txBuffer_Select (Win32::CreateCompatibleBitmap (*dc, 0, 0), *dc) asserted; - -$ Win32::DeleteObject (Win32::GetCurrentObject (*dc, OBJ_BITMAP)) asserted; - -$ Win32::DeleteDC (*dc) asserted; - -$ *dc = NULL; - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool _txBuffer_Select (HGDIOBJ obj, HDC dc /*= txDC()*/) - { -$1 _TX_IF_ARGUMENT_FAILED (obj) return false; -$ _TX_IF_ARGUMENT_FAILED (dc) return false; - -$ if (!Win32::GetObjectType (obj)) TX_DEBUG_ERROR ("Invalid GDI object type"); - -$ txAutoLock _lock; - -$ obj = Win32::SelectObject (dc, obj); -$ if (obj) Win32::DeleteObject (obj) asserted; - -$ return obj != NULL; - } - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ Diagnostics -//! @name -//================================================================================================================= -//! @{ - -void _txOnSignal (int sig/* = 0*/, int fpe/* = 0*/) - { - if (!sig && !fpe) - { -$1 signal (SIGSEGV, (void(*)(int))_txOnSignal) != SIG_ERR asserted; -$ signal (SIGFPE, (void(*)(int))_txOnSignal) != SIG_ERR asserted; -$ signal (SIGABRT, (void(*)(int))_txOnSignal) != SIG_ERR asserted; -$ signal (SIGILL, (void(*)(int))_txOnSignal) != SIG_ERR asserted; -$ signal (SIGTERM, (void(*)(int))_txOnSignal) != SIG_ERR asserted; -$ return; - } - - const char* sSig = ": "; - const char* sFPE = ": "; - - #define GET_DESCR_( str, code, descr ) case (code): { (str) = #code ": " descr; break; } - - switch (sig) - { - GET_DESCR_ (sSig, SIGSEGV, " . !") - GET_DESCR_ (sSig, SIGILL, " . .") - GET_DESCR_ (sSig, SIGABRT, " , abort().") - GET_DESCR_ (sSig, SIGTERM, " .") - GET_DESCR_ (sSig, SIGFPE, " , 0 - ") - default: break; - } - - if (sig == SIGFPE) switch (fpe) - { - GET_DESCR_ (sFPE, 0x81 /* _FPE_INVALID */, " ") - GET_DESCR_ (sFPE, 0x82 /* _FPE_DENORMAL */, "") - GET_DESCR_ (sFPE, 0x83 /* _FPE_ZERODIVIDE */, " ") - GET_DESCR_ (sFPE, 0x84 /* _FPE_OVERFLOW */, " ") - GET_DESCR_ (sFPE, 0x85 /* _FPE_UNDERFLOW */, " ") - GET_DESCR_ (sFPE, 0x86 /* _FPE_INEXACT */, " ") - GET_DESCR_ (sFPE, 0x87 /* _FPE_UNEMULATED */, " ") - GET_DESCR_ (sFPE, 0x88 /* _FPE_SQRTNEG */, " ") - GET_DESCR_ (sFPE, 0x8A /* _FPE_STACKOVERFLOW */, " ") - GET_DESCR_ (sFPE, 0x8B /* _FPE_STACKUNDERFLOW */, " ") - GET_DESCR_ (sFPE, 0x8C /* _FPE_EXPLICITGEN */, " ") - default: break; - } - - #undef GET_DESCR_ - - _fpreset(); - - if (sig == SIGFPE && fpe) - _txError (NULL, 0, NULL, "signal (%d, 0x%02X): %s, %s." _ sig _ fpe _ sSig _ sFPE); - else - _txError (NULL, 0, NULL, "signal (%d): %s" _ sig _ sSig); - - _txExit = true; - - _txCleanup(); - } - -//----------------------------------------------------------------------------------------------------------------- - -void _txOnUnexpected() - { - _txError (NULL, 0, NULL, - "std::unexpected(): . catch-. catch (...). \n\n" - " () , , ."); - } - -//----------------------------------------------------------------------------------------------------------------- - -void _txOnTerminate() - { - _txError (NULL, 0, NULL, - "std::terminate(): - main() . \n\n" - " try/catch , catch (...), , ."); - } - -//----------------------------------------------------------------------------------------------------------------- - -const char* _txError (const char file[] /*= NULL*/, int line /*= 0*/, const char func[] /*= NULL*/, - const char msg [] /*= NULL*/, ...) - { - va_list arg; va_start (arg, msg); - - static int nCalls = 0; nCalls++; - - DWORD winerr = GetLastError(); - int crterr = errno; - int doserr = _doserrno; - unsigned threadId = GetCurrentThreadId(); - - bool isFatal = (msg && *msg == '\a')? (msg++, true) : false; - bool fmtOnly = (msg && *msg == '\f')? (msg++, true) : false; - - static char what[_TX_BIGBUFSIZE] = ""; - static char str [_TX_BIGBUFSIZE] = ""; - char *s = what; - - #define SZARG_(n) sizeof (what) - 1 - (n) - (s-what) _TX_TRUNCATE - - s += _snprintf_s (s, SZARG_(1), "TXLib :\n\n"); - - s += _snprintf_s (s, SZARG_(1), ": %s, ", txGetModuleFileName()); - if (file) s += _snprintf_s (s, SZARG_(1), ": %s, ", file); - if (line) s += _snprintf_s (s, SZARG_(1), ": %d, ", line); - if (func) s += _snprintf_s (s, SZARG_(1), ": %s.", func); - s += _snprintf_s (s, SZARG_(1), "\n\n"); - - if (msg) s += _snprintf_s (s, SZARG_(1), "%s: ", (file || line || func)? "" : ""), - s += _vsnprintf_s (s, SZARG_(1), msg, arg), - s += _snprintf_s (s, SZARG_(1), "\n\n"); - - s += _snprintf_s (s, SZARG_(1), "#%d: %s, Instance: 0x%p, Flags: %c%c%c%c%c%c, Thread: 0x%08X%s", - nCalls, _TX_VERSION, (void*) &_txInitialized, - "cC"[_txConsole], "mM"[_txMain], "dD"[_txIsDll], "rR"[_txRunning], "eE"[_txExit], "tT"[_txAllowTrace], - threadId, - (threadId == _txMainThreadId)? " (Main)" : - (threadId == _txCanvas_ThreadId)? " (Canvas)" : ""); - - if (winerr) s += _snprintf_s (s, SZARG_(0), ", GetLastError(): %lu (", winerr), - s += FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, winerr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - s, (DWORD) (sizeof (what) - (s-what)), NULL) - 2, - s -= (s[-1] == '.')? 1 : 0, - s += _snprintf_s (s, SZARG_(1), ")"); - - if (crterr) s += _snprintf_s (s, SZARG_(1), ", errno: %d (%s)", crterr, (strerror_s (str, crterr), str)); - - if (doserr) s += _snprintf_s (s, SZARG_(1), ", _doserrno: %d (%s)", doserr, (strerror_s (str, doserr), str)); - - s += _snprintf_s (s, SZARG_(1), ". %s\n", std::uncaught_exception()? "std::uncaught_exception(): true." : ""); - - if (_txInTX > 0 && !(_txLine == line && file && _stricmp (_txFile, file) == 0)) - s += _snprintf_s (s, SZARG_(1), "From: %s (%d) %s.\n", _txFile, _txLine, _txFunc); - - #undef SZARG_ - va_end (arg); - - struct tools - { - static char* compressSpaces (char* dest, const char* src) - { - char* dst = dest; - - for (char last = ' '; *src; src++) - if (isspace ((unsigned char)(*src))) { if (last != ' ') *dst++ = last = ' '; } - else *dst++ = last = *src; - - if (dst > dest && dst[-1] == ' ') dst--; - *dst++ = '\n'; *dst++ = 0; - - return dest; - } - - static char* replace (char* dest, const char* src, char find, char repl) - { - size_t i = 0; - for (; src[i]; i++) dest[i] = (src[i] == find)? repl : src[i]; - dest[i] = 0; - - return dest; - } - }; - -$ txOutputDebugPrintf ("%s - %s", _TX_VERSION, tools::compressSpaces (str, what)); - - if (fmtOnly) return what; - - tools::replace (str, what, '\v', ' '); - printf ("\n" "--------------------------------------------------\n" - "%s" - "--------------------------------------------------\n", str); - - tools::replace (str, what, '\v', '\n'); - txMessageBox (str, isFatal? " " : " ", MB_ICONSTOP | MB_TOPMOST | MB_SYSTEMMODAL); - - if (!isFatal) return what; - - if (!IsDebuggerPresent()) exit (EXIT_FAILURE); - -// vvvvvvvvvvvvvvvvvv - DebugBreak(); //>>> . . -// ^^^^^^^^^^^^^^^^^^ - - return what; //>>> (F10/F11). (Alt+7). - } - -//----------------------------------------------------------------------------------------------------------------- - -int txOutputDebugPrintf (const char format[], ...) - { - if (!format) return 0; - - bool msgbox = (*format == '\a')? (format++, true) : false; - bool print = (*format == '\f')? (format++, true) : false; - - char str[_TX_BIGBUFSIZE] = ""; - - va_list arg; va_start (arg, format); - int n = _vsnprintf_s (str, sizeof (str) - 1 _TX_TRUNCATE, format, arg); - va_end (arg); - - OutputDebugString (str); - - if (print) - fprintf (stderr, "%s", str); - - if (msgbox) - txMessageBox (str, ", ", MB_ICONEXCLAMATION | MB_TOPMOST); - - return n; - } - -//----------------------------------------------------------------------------------------------------------------- - -unsigned txMessageBox (const char* text, const char* header, unsigned flags /*= 0*/) - { - static wchar_t textW [_TX_BIGBUFSIZE * sizeof (wchar_t)] = L"[NULL text]"; - static wchar_t headerW [_TX_BUFSIZE * sizeof (wchar_t)] = L"[NULL header]"; - - if (text) MultiByteToWideChar (_TX_CP, 0, text, -1, textW, SIZEARR (textW)) || memset (textW, 0, sizeof (textW)); - if (header) MultiByteToWideChar (_TX_CP, 0, header, -1, headerW, SIZEARR (headerW)) || memset (headerW, 0, sizeof (headerW)); - - HWND wnd = _txCanvas_Window; - return MessageBoxW ((wnd? wnd : Win32::GetConsoleWindow()), textW, headerW, flags | MB_SETFOREGROUND | MB_TOPMOST); - } - -//----------------------------------------------------------------------------------------------------------------- - -const char* txGetModuleFileName (bool fileNameOnly /*= true*/) - { - static char name[MAX_PATH] = ""; - - if (!*name) GetModuleFileName (NULL, name, sizeof (name) - 1) || strcpy_s (name, ""); - assert (*name); - - if (fileNameOnly) return name; - - static char fullName[MAX_PATH] = ""; - strncpy_s (fullName, name, sizeof (fullName) - 1); - - char* title = strrchr (fullName, '\\'); if (!title) title = fullName; - char* ext = strrchr (fullName, '.'); if (!ext) ext = fullName + strlen (fullName); - - size_t sz = sizeof (fullName) - (ext - fullName) - 1; - - #if defined (_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES) && _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES - strncpy_s (ext, sz, " - TXLib", sz); - #else - strncpy (ext, " - TXLib", sz); - #endif - - return title + 1; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txNotifyIcon (unsigned flags, const char title[], const char format[], ...) - { -$1 _TX_IF_ARGUMENT_FAILED (format) return false; - -$ va_list arg; va_start (arg, format); -$ bool ok = true; - - #if defined (_WIN32_IE) && (_WIN32_IE >= 0x0500) - -$ NOTIFYICONDATA nid = { sizeof (nid) }; - -$ nid.uFlags = NIF_ICON | NIF_TIP | NIF_INFO; -$ nid.hWnd = NULL; -$ nid.uID = 1; -$ nid.hIcon = _txCreateTXIcon (16); assert (nid.hIcon); -$ strncpy_s (nid.szTip, "TXLib Information", sizeof (nid.szTip)); -$ strncpy_s (nid.szInfoTitle, (title? title : "TXLib "), sizeof (nid.szInfoTitle) - 1); -$ _vsnprintf_s (nid.szInfo, sizeof (nid.szInfo) _TX_TRUNCATE, format, arg); -$ nid.dwInfoFlags = flags; - -$ txOutputDebugPrintf (_TX_VERSION " - Icon notification: %s: %s\n", nid.szInfoTitle, nid.szInfo); - -$ ok &= !!Shell_NotifyIcon (NIM_ADD, (::NOTIFYICONDATA*) &nid); -$ ok &= !!Shell_NotifyIcon (NIM_MODIFY, (::NOTIFYICONDATA*) &nid); - -$ if (nid.hIcon) DestroyIcon (nid.hIcon) asserted; - - #else - -$ char nid_szInfo[_TX_BUFSIZE] = ""; -$ _vsnprintf_s (nid_szInfo, sizeof (nid_szInfo) _TX_TRUNCATE, format, arg); -$ txOutputDebugPrintf (_TX_VERSION " - Icon notification (NOT displayed): %s: %s\n", title, nid_szInfo); -$ ok = false; - -$ (void)flags; (void)title; - - #endif - -$ va_end (arg); -$ return ok; - } - -//! @} -//} -//================================================================================================================= - -//================================================================================================================= -//{ TXLib API implementation -// TXLib API -//================================================================================================================= - -inline const char* txVersion() - { - return _TX_VERSION; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline unsigned txVersionNumber() - { - return _TX_VER; - } - -//----------------------------------------------------------------------------------------------------------------- - -POINT txGetExtent() - { -$1 _TX_IF_TXWINDOW_FAILED return ZERO (POINT); - -$ RECT r = {0}; -$ GetClientRect (txWindow(), &r); - -$ POINT size = { r.right - r.left, r.bottom - r.top }; -$ return size; - } - -//----------------------------------------------------------------------------------------------------------------- - -int txGetExtentX() - { -$1 return txGetExtent().x; - } - -//----------------------------------------------------------------------------------------------------------------- - -int txGetExtentY() - { -$1 return txGetExtent().y; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline HDC& txDC() - { -$1 return _txCanvas_BackBuf[0]; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline HWND txWindow() - { -$1 return _txCanvas_Window; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txDestroyWindow() - { -$1 if (!txWindow()) return false; - -$ if (SendNotifyMessage (txWindow(), (_txMain? WM_CLOSE : WM_DESTROY), 0, 0) == 0) return false; - -$ if (_txMain) - { -$ txNotifyIcon (NIIF_WARNING, NULL, "\n" ", txDestroyWindow(). \n\n" - " main(), .\n"); -$ Sleep (_TX_TIMEOUT); - } - -$ _txWaitFor (!_txCanvas_Window, _TX_TIMEOUT); - -$ return _txCanvas_Window == NULL; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txSetColor (COLORREF color, double thickness /*= 1*/) - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ return _txBuffer_Select (Win32::CreatePen ((color == TX_TRANSPARENT? PS_NULL : PS_SOLID), ROUND (thickness), color)) - && - txGDI ((Win32::SetTextColor (txDC(), color))); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txColor (double red, double green, double blue) - { -$1 if (red > 1) red = 1; if (red < 0) red = 0; -$ if (green > 1) green = 1; if (green < 0) green = 0; -$ if (blue > 1) blue = 1; if (blue < 0) blue = 0; - -$ return txSetColor (RGB (ROUND (red * 255), ROUND (green * 255), ROUND (blue * 255))); - } - -//----------------------------------------------------------------------------------------------------------------- - -COLORREF txGetColor() - { -$1 _TX_IF_TXWINDOW_FAILED return CLR_INVALID; - -$ HGDIOBJ obj = txGDI ((Win32::GetCurrentObject (txDC(), OBJ_PEN))); -$ assert (obj); if (!obj) return CLR_INVALID; - -$ union { EXTLOGPEN extLogPen; LOGPEN LogPen; } buf = {{0}}; - -$ int size = Win32::GetObject (obj, 0, NULL); -$ Win32::GetObject (obj, sizeof (buf), &buf) asserted; - -$ return (size == sizeof (LOGPEN))? buf.LogPen.lopnColor : buf.extLogPen.elpColor; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txSetFillColor (COLORREF color) - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ return _txBuffer_Select ((color == TX_TRANSPARENT)? Win32::GetStockObject (HOLLOW_BRUSH) : - Win32::CreateSolidBrush (color)); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txFillColor (double red, double green, double blue) - { -$1 if (red > 1) red = 1; if (red < 0) red = 0; -$ if (green > 1) green = 1; if (green < 0) green = 0; -$ if (blue > 1) blue = 1; if (blue < 0) blue = 0; - -$ return txSetFillColor (RGB (ROUND (red * 255), ROUND (green * 255), ROUND (blue * 255))); - } - -//----------------------------------------------------------------------------------------------------------------- - -COLORREF txGetFillColor() - { -$1 _TX_IF_TXWINDOW_FAILED return CLR_INVALID; - -$ HGDIOBJ obj = txGDI ((Win32::GetCurrentObject (txDC(), OBJ_BRUSH))); -$ assert (obj); if (!obj) return CLR_INVALID; - -$ LOGBRUSH buf = {0}; -$ txGDI ((Win32::GetObject (obj, sizeof (buf), &buf))) asserted; - -$ return buf.lbColor; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txSetROP2 (int mode /*= R2_COPYPEN*/) - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ return txGDI (!!(Win32::SetROP2 (txDC(), mode))); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txClear() - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ POINT size = txGetExtent(); -$ return txGDI (!!(Win32::PatBlt (txDC(), 0, 0, size.x, size.y, PATCOPY))); - } - -//----------------------------------------------------------------------------------------------------------------- - -inline bool txSetPixel (double x, double y, COLORREF color) - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ txGDI ((Win32::SetPixel (txDC(), ROUND (x), ROUND (y), color))); - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline bool txPixel (double x, double y, double red, double green, double blue) - { -$1 if (red > 1) red = 1; if (red < 0) red = 0; -$ if (green > 1) green = 1; if (green < 0) green = 0; -$ if (blue > 1) blue = 1; if (blue < 0) blue = 0; - -$ return txSetPixel (x, y, RGB (ROUND (red * 255), ROUND (green * 255), ROUND (blue * 255))); - } - -//----------------------------------------------------------------------------------------------------------------- - -inline COLORREF txGetPixel (double x, double y) - { -$1 _TX_IF_TXWINDOW_FAILED return CLR_INVALID; - -$ return txGDI ((Win32::GetPixel (txDC(), ROUND (x), ROUND (y)))); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txLine (double x0, double y0, double x1, double y1) - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ txGDI ((Win32::MoveToEx (txDC(), ROUND (x0), ROUND (y0), NULL))) asserted; -$ txGDI ((Win32::LineTo (txDC(), ROUND (x1), ROUND (y1) ))) asserted; - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txRectangle (double x0, double y0, double x1, double y1) - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ txGDI ((Win32::Rectangle (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1)))) asserted; - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txPolygon (const POINT points[], int numPoints) - { -$1 _TX_IF_TXWINDOW_FAILED return false; -$ _TX_IF_ARGUMENT_FAILED (points) return false; - -$ return txGDI (!!(Win32::Polygon (txDC(), points, numPoints))); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txEllipse (double x0, double y0, double x1, double y1) - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ txGDI ((Win32::Ellipse (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1)))) asserted; - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txCircle (double x, double y, double r) - { -$1 return txEllipse (x-r, y-r, x+r, y+r); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txArc (double x0, double y0, double x1, double y1, double startAngle, double totalAngle) - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ POINT center = { ROUND ((x0 + x1) /2), ROUND ((y0 + y1) /2) }; - -$ double start = startAngle * txPI/180, - end = (startAngle + totalAngle) * txPI/180; - -$ return txGDI (!!(Win32::Arc (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1), - ROUND (center.x + 1E3*cos (start)), ROUND (center.y - 1E3*sin (start)), - ROUND (center.x + 1E3*cos (end)), ROUND (center.y - 1E3*sin (end))))); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txPie (double x0, double y0, double x1, double y1, double startAngle, double totalAngle) - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ POINT center = { ROUND ((x0 + x1) /2), ROUND ((y0 + y1) /2) }; - -$ double start = startAngle * txPI/180, - end = (startAngle + totalAngle) * txPI/180; - -$ return txGDI (!!(Win32::Pie (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1), - ROUND (center.x + 1E3*cos (start)), ROUND (center.y - 1E3*sin (start)), - ROUND (center.x + 1E3*cos (end)), ROUND (center.y - 1E3*sin (end))))); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txChord (double x0, double y0, double x1, double y1, double startAngle, double totalAngle) - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ POINT center = { ROUND ((x0 + x1) /2), ROUND ((y0 + y1) /2) }; - -$ double start = startAngle * txPI/180, - end = (startAngle + totalAngle) * txPI/180; - -$ return txGDI (!!(Win32::Chord (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1), - ROUND (center.x + 1E3*cos (start)), ROUND (center.y - 1E3*sin (start)), - ROUND (center.x + 1E3*cos (end)), ROUND (center.y - 1E3*sin (end))))); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txFloodFill (double x, double y, - COLORREF color /*= TX_TRANSPARENT*/, DWORD mode /*= FLOODFILLSURFACE*/) - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ if (color == TX_TRANSPARENT) color = txGetPixel (x, y); - -$ return txGDI (!!(Win32::ExtFloodFill (txDC(), ROUND (x), ROUND (y), color, mode))); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txTextOut (double x, double y, const char text[]) - { -$1 _TX_IF_TXWINDOW_FAILED return false; -$ _TX_IF_ARGUMENT_FAILED (text) return false; - -$ int len = (int) strlen (text); -$ txGDI (!!(Win32::TextOut (txDC(), ROUND (x), ROUND (y), text, len))) asserted; - -$ SIZE size = {0}; -$ txGDI ((Win32::GetTextExtentPoint32 (txDC(), text, len, &size))) asserted; - -$ RECT r = { ROUND (x), ROUND (y), ROUND (x + size.cx), ROUND (y + size.cy) }; -$ InvalidateRect (txWindow(), &r, false) asserted; - -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txDrawText (double x0, double y0, double x1, double y1, const char text[], - unsigned format /*= DT_CENTER | DT_VCENTER | DT_WORDBREAK | DT_WORD_ELLIPSIS*/) -{ -$1 _TX_IF_TXWINDOW_FAILED return false; -$ _TX_IF_ARGUMENT_FAILED (text) return false; - -$ RECT r = { ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1) }; - -$ if (!strchr (text, '\n')) format |= DT_SINGLELINE; - -$ unsigned prev = txSetTextAlign (TA_LEFT | TA_TOP | TA_NOUPDATECP); - - if (Win32::DrawText) { $ txGDI ((Win32::DrawText (txDC(), text, -1, &r, format))) asserted; } - -$ txSetTextAlign (prev); - -$ return true; -} - -//----------------------------------------------------------------------------------------------------------------- - -bool txSelectFont (const char name[], double sizeY, - double sizeX /*= -1*/, - int bold /*= FW_DONTCARE*/, - bool italic /*= false*/, - bool underline /*= false*/, - bool strikeout /*= false*/, - double angle /*= 0*/) - { -$1 _TX_IF_TXWINDOW_FAILED return false; -$ _TX_IF_ARGUMENT_FAILED (name) return false; - -$ _txBuffer_Select (txFontExist (name)? - Win32::CreateFont (ROUND (sizeY), ROUND ((sizeX >= 0)? sizeX : sizeY/3), - ROUND (angle*10), 0, bold, italic, underline, strikeout, - RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, FIXED_PITCH, name) - : - Win32::GetStockObject (SYSTEM_FIXED_FONT)); -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -SIZE txGetTextExtent (const char text[]) - { -$1 SIZE size = {0}; - -$ _TX_IF_TXWINDOW_FAILED return size; -$ _TX_IF_ARGUMENT_FAILED (text) return size; - -$ txGDI ((Win32::GetTextExtentPoint32 (txDC(), text, (int) strlen (text), &size))) asserted; - -$ return size; - } - -//----------------------------------------------------------------------------------------------------------------- - -int txGetTextExtentX (const char text[]) - { -$1 return txGetTextExtent (text) .cx; - } - -//----------------------------------------------------------------------------------------------------------------- - -int txGetTextExtentY (const char text[]) - { -$1 return txGetTextExtent (text) .cy; - } - -//----------------------------------------------------------------------------------------------------------------- - -unsigned txSetTextAlign (unsigned align /*= TA_CENTER | TA_BASELINE*/) - { -$1 _TX_IF_TXWINDOW_FAILED return 0; - -$ return txGDI ((Win32::SetTextAlign (txDC(), align))); - } - -//----------------------------------------------------------------------------------------------------------------- - -LOGFONT* txFontExist (const char name[]) - { -$1 _TX_IF_TXWINDOW_FAILED return NULL; -$ _TX_IF_ARGUMENT_FAILED (name) return NULL; - -$ static LOGFONT font = {0}; -$ font.lfCharSet = DEFAULT_CHARSET; -$ strncpy_s (font.lfFaceName, name, sizeof (font.lfFaceName) - 1); - -$ struct tools - { - static int CALLBACK enumFonts (const LOGFONT* fnt, const TEXTMETRIC*, DWORD, LPARAM data) - { -$ _TX_IF_ARGUMENT_FAILED (fnt) return 0; -$ _TX_IF_ARGUMENT_FAILED (data) return 0; - - #ifndef __STRICT_ANSI__ -$ return _strnicmp (fnt->lfFaceName, ((LOGFONT*)data)->lfFaceName, LF_FACESIZE); - - #else -$ return strncmp (fnt->lfFaceName, ((LOGFONT*)data)->lfFaceName, LF_FACESIZE); - - #endif - } - }; - -$ return txGDI ((Win32::EnumFontFamiliesEx (txDC(), &font, tools::enumFonts, (LPARAM) &font, 0))) == 0? &font : NULL; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txSelectObject (HGDIOBJ obj) - { -$1 _TX_IF_TXWINDOW_FAILED return false; -$ _TX_IF_ARGUMENT_FAILED (obj) return false; - -$ return _txBuffer_Select (obj); - } - -//----------------------------------------------------------------------------------------------------------------- - -HDC txCreateCompatibleDC (double sizeX, double sizeY, HBITMAP bitmap /*= NULL*/) - { -$1 _TX_IF_TXWINDOW_FAILED return NULL; - -$ POINT size = { ROUND (sizeX), ROUND (sizeY) }; -$ HDC dc = _txBuffer_Create (txWindow(), &size, bitmap); -$ assert (dc); if (!dc) return NULL; - -$ if (!_txCanvas_UserDCs) return dc; - -$ txAutoLock _lock; -$ _txCanvas_UserDCs->push_back (dc); - -$ if (_txCanvas_UserDCs->size() >= _TX_BUFSIZE) - { $ txNotifyIcon (NIIF_WARNING, NULL, " %d HDC, .", (int) _txCanvas_UserDCs->size()); } - -$ return dc; - } - -//----------------------------------------------------------------------------------------------------------------- - -HDC txLoadImage (const char filename[], unsigned imageFlags /*= IMAGE_BITMAP*/, unsigned loadFlags /*= LR_LOADFROMFILE*/) - { -$1 _TX_IF_TXWINDOW_FAILED return NULL; -$ _TX_IF_ARGUMENT_FAILED (filename && *filename) return NULL; - -$ HBITMAP image = (HBITMAP) Win32::LoadImage ((loadFlags & LR_LOADFROMFILE)? NULL : GetModuleHandle (NULL), - filename, imageFlags, 0, 0, loadFlags); -$ if (!image) return NULL; - -$ HDC dc = txCreateCompatibleDC (0, 0, image); - -$ if (!(loadFlags & LR_LOADFROMFILE)) return dc; - -$ static std::map loadTimes; -$ std::string file = filename; -$ unsigned time = GetTickCount(); - -$ if ((long) (time - loadTimes [file]) < _TX_TIMEOUT) - { $ txNotifyIcon (NIIF_WARNING, NULL, " \"%s\" , .", filename); } - -$ loadTimes [file] = time; - -$ return dc; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txDeleteDC (HDC* pdc) - { -$1 _TX_IF_TXWINDOW_FAILED return false; -$ _TX_IF_ARGUMENT_FAILED (pdc) return false; - -$ HDC dc = *pdc; -$ bool ok = _txBuffer_Delete (pdc); -$ if (!ok) return false; - -$ if (!_txCanvas_UserDCs) return ok; - -$ txAutoLock _lock; -$ std::vector ::iterator i = std::find (_txCanvas_UserDCs->begin(), _txCanvas_UserDCs->end(), dc); -$ if (i != _txCanvas_UserDCs->end()) { std::swap (*i, _txCanvas_UserDCs->back()); _txCanvas_UserDCs->pop_back(); } - -$ return ok; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txDeleteDC (HDC dc) - { -$1 _TX_IF_TXWINDOW_FAILED return false; - -$ return txDeleteDC (&dc); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txBitBlt (HDC dest, double xDest, double yDest, double width, double height, - HDC src, double xSrc /*= 0*/, double ySrc /*= 0*/, DWORD rOp /*= SRCCOPY*/) - { -$1 _TX_IF_TXWINDOW_FAILED return false; -$ _TX_IF_ARGUMENT_FAILED (dest) return false; -$ _TX_IF_ARGUMENT_FAILED (src) return false; - -$ return txGDI (!!(Win32::BitBlt (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height), - src, ROUND (xSrc), ROUND (ySrc), rOp))); - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txTransparentBlt (HDC dest, double xDest, double yDest, double width, double height, - HDC src, double xSrc /*= 0*/, double ySrc /*= 0*/, COLORREF transColor /*= TX_BLACK*/) - { -$1 _TX_IF_TXWINDOW_FAILED return false; -$ _TX_IF_ARGUMENT_FAILED (dest) return false; -$ _TX_IF_ARGUMENT_FAILED (src) return false; - -$ return (Win32::TransparentBlt)? - txGDI (!!(Win32::TransparentBlt (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height), - src, ROUND (xSrc), ROUND (ySrc), ROUND (width), ROUND (height), transColor))) - : - txGDI (!!(Win32::BitBlt (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height), - src, ROUND (xSrc), ROUND (ySrc), SRCCOPY))), false; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txAlphaBlend (HDC dest, double xDest, double yDest, double width, double height, - HDC src, double xSrc /*= 0*/, double ySrc /*= 0*/, double alpha /*= 1.0*/) - { -$1 _TX_IF_TXWINDOW_FAILED return false; -$ _TX_IF_ARGUMENT_FAILED (dest) return false; -$ _TX_IF_ARGUMENT_FAILED (src) return false; - -$ if (alpha < 0) alpha = 0; -$ if (alpha > 1) alpha = 1; - -$ BLENDFUNCTION blend = { AC_SRC_OVER, 0, (BYTE) ROUND (alpha * 255), AC_SRC_ALPHA }; - -$ return (Win32::AlphaBlend)? - txGDI (!!(Win32::AlphaBlend (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height), - src, ROUND (xSrc), ROUND (ySrc), ROUND (width), ROUND (height), blend))) - : - txGDI (!!(Win32::BitBlt (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height), - src, ROUND (xSrc), ROUND (ySrc), SRCCOPY))), false; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline int txUpdateWindow (int update /*= true*/) - { -$1 return _txCanvas_SetRefreshLock (update >= 0? !update : -update); - } - -//----------------------------------------------------------------------------------------------------------------- - -inline int txBegin() - { -$1 _txCanvas_SetRefreshLock (_txCanvas_RefreshLock + 1); - -$ return _txCanvas_RefreshLock; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline int txEnd() - { -$1 _txCanvas_SetRefreshLock (_txCanvas_RefreshLock - 1); - -$ return _txCanvas_RefreshLock; - } - -//----------------------------------------------------------------------------------------------------------------- - -double txSleep (double time) - { -$1 LARGE_INTEGER start = {{0}}; -$ QueryPerformanceCounter (&start) asserted; - -$ LARGE_INTEGER freq = {{0}}; -$ QueryPerformanceFrequency (&freq) asserted; - -$ int lock = _txCanvas_RefreshLock; -$ _txCanvas_RefreshLock = 0; - -$ HWND wnd = txWindow(); - if (wnd) { $ RedrawWindow (wnd, NULL, NULL, RDW_INVALIDATE | RDW_INTERNALPAINT | RDW_UPDATENOW) asserted; } - -$ Sleep (ROUND (time)); - -$ _txCanvas_RefreshLock = lock; - -$ LARGE_INTEGER stop = {{0}}; -$ QueryPerformanceCounter (&stop) asserted; - -$ return 1000.0 * (double) (stop.QuadPart - start.QuadPart) / (double) freq.QuadPart; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txLock (bool wait /*= true*/) - { -$1 if (_txCanvas_RefreshLock <= 0 || _txExit) Sleep (0); - -$ if (wait) { $ return EnterCriticalSection (&_txCanvas_LockBackBuf), true; } - else { $ return !!TryEnterCriticalSection (&_txCanvas_LockBackBuf); } - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txUnlock() - { -$1 LeaveCriticalSection (&_txCanvas_LockBackBuf); - -$ if (_txCanvas_RefreshLock <= 0 || _txExit) Sleep (0); -$ return false; - } - -//----------------------------------------------------------------------------------------------------------------- - -template -inline T txUnlock (T value) - { -$1 txUnlock(); -$ return value; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline POINT txMousePos() - { -$1 _TX_IF_TXWINDOW_FAILED return ZERO (POINT); - -$ return _txMousePos; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline int txMouseX() - { -$1 return _txMousePos.x; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline int txMouseY() - { -$1 return _txMousePos.y; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline int txMouseButtons() - { -$1 _TX_IF_TXWINDOW_FAILED return 0; - -$ return _txMouseButtons; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txSetConsoleAttr (unsigned color /*= 0x07*/) - { -$1 return !!SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), (WORD) color); - } - -//----------------------------------------------------------------------------------------------------------------- - -unsigned txGetConsoleAttr() - { -$1 CONSOLE_SCREEN_BUFFER_INFO con = {{0}}; -$ GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &con); - -$ return con.wAttributes; - } - -//----------------------------------------------------------------------------------------------------------------- - -POINT txSetConsoleCursorPos (double x, double y) - { -$1 POINT fontSz = txGetConsoleFontSize(); - -$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}}; -$ GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &con) asserted; - -$ COORD pos = { (short) ROUND (1.0 * x / fontSz.x + con.srWindow.Left), - (short) ROUND (1.0 * y / fontSz.y + con.srWindow.Top ) }; - -$ SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), pos) asserted; - -$ POINT prev = { ROUND (1.0 * (con.dwCursorPosition.X - con.srWindow.Left) / fontSz.x), - ROUND (1.0 * (con.dwCursorPosition.Y - con.srWindow.Top ) / fontSz.y) }; -$ return prev; - } - -//----------------------------------------------------------------------------------------------------------------- - -POINT txGetConsoleCursorPos() - { -$1 POINT fontSz = txGetConsoleFontSize(); - -$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}}; -$ GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &con) asserted; - -$ POINT pos = { ROUND (1.0 * (con.dwCursorPosition.X - con.srWindow.Left) / fontSz.x), - ROUND (1.0 * (con.dwCursorPosition.Y - con.srWindow.Top ) / fontSz.y) }; -$ return pos; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txClearConsole() - { -$1 HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE); - -$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}}; -$ GetConsoleScreenBufferInfo (out, &con) asserted; - -$ COORD start = {con.srWindow.Left, con.srWindow.Top}; - -$ DWORD len = (con.srWindow.Right - con.srWindow.Left + 1) * - (con.srWindow.Bottom - con.srWindow.Top + 1); - -$ DWORD written = 0; -$ FillConsoleOutputCharacter (out, 0x20 /*' '*/, len, start, &written) asserted; -$ FillConsoleOutputAttribute (out, con.wAttributes, len, start, &written) asserted; - -$ SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), start) asserted; - -$ return written == len; - } - -//----------------------------------------------------------------------------------------------------------------- - -POINT txGetConsoleFontSize() - { -$1 CONSOLE_FONT_INFO font = {0, {8, 16}}; - -$ if (Win32::GetCurrentConsoleFont) - { $ Win32::GetCurrentConsoleFont (GetStdHandle (STD_OUTPUT_HANDLE), false, &font) asserted; } - -$ SIZE size = { font.dwFontSize.X, font.dwFontSize.Y }; -$ txGDI (Win32::GetTextExtentPoint32 (_txCanvas_BackBuf[1], "W", 1, &size)); - -$ POINT sizeFont = { size.cx, size.cy }; -$ return sizeFont; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txTextCursor (bool blink /*= true*/) - { -$1 bool old = _txConsole_IsBlinking; - -$ _txConsole_IsBlinking = blink; - -$ return old; - } - -//----------------------------------------------------------------------------------------------------------------- - -bool txPlaySound (const char filename[] /*= NULL*/, DWORD mode /*= SND_ASYNC*/) - { -$1 _TX_IF_ARGUMENT_FAILED (!(filename && !*filename)) return false; - -$ mode |= SND_FILENAME | SND_NODEFAULT | SND_NOWAIT; -$ if (mode & SND_LOOP) mode = (mode & ~SND_SYNC) | SND_ASYNC; - -$ if (!filename) mode = SND_PURGE; - -$ return !!Win32::PlaySound (filename, NULL, mode); - } - -//----------------------------------------------------------------------------------------------------------------- - -// +--<<< , :) -// V , - -WNDPROC txSetWindowsHook (WNDPROC wndProc /*= NULL*/) - { -$1 WNDPROC old = _txAltWndProc; _txAltWndProc = wndProc; -$ return old; - } - -//----------------------------------------------------------------------------------------------------------------- - -// +--<<< , , . -// | ! - . -// | -// v -bool txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture() - { -$1 txMessageBox (" . . :\n\n" - - "txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture()\n\n" - - " [] , . " - " , - , .\n\n" - - " . TXLib.h, " - " , .\n\n" - - " Ctrl+O, TXLib.h ( , " - " TXLib), Ctrl+F \"txIDontWant\". !\n\n", - - " ", MB_ICONSTOP); - - // The truth is out there... (C++files) - -$ return false; - } - -//----------------------------------------------------------------------------------------------------------------- - -// Bingo! Now you are learned to use the Sources, Luke. And may the Source be with you. - -inline bool txDisableAutoPause() - { -$1 _txExit = true; -$ return true; - } - -//----------------------------------------------------------------------------------------------------------------- - -void txDrawMan (int x, int y, int sizeX, int sizeY, COLORREF color, double handL, double handR, double twist, - double head, double eyes, double wink, double crazy, double smile, double hair, double wind) - { -$1 const char msg[] = "\0/ - !\0/ !\0/ !\0/"; - static unsigned count = GetTickCount(), L = 0; - -$ COLORREF lineColor = txGetColor(); - COLORREF fillColor = txGetFillColor(); - -$ txSetColor (TX_DARKGRAY); - txSetFillColor (TX_TRANSPARENT); - -$ txRectangle (x - sizeX/2, y - sizeY, x + sizeX/2, y); - txCircle (x, y, 4); - -$ txSetColor (color); - txSetFillColor (color); - -$ txLine (x + twist * sizeX, y - 0.35 * sizeY, x, y - 0.7 * sizeY); - -$ txLine (x, y - 0.7 * sizeY, x - sizeX/2, y - (0.7 + handL) * sizeY); - txLine (x, y - 0.7 * sizeY, x + sizeX/2, y - (0.7 + handR) * sizeY); - -$ txLine (x + twist * sizeX, y - 0.35 * sizeY, x - sizeX/2, y); - txLine (x + twist * sizeX, y - 0.35 * sizeY, x + sizeX/2, y); - -$ txCircle (x, y - (0.85 + head) * sizeY, 0.15 * sizeY); - -$ txLine (x, y - (1 + head) * sizeY, x + wind/10 * sizeX, y - (1 + head + hair/10) * sizeY); - txLine (x, y - (1 + head) * sizeY, x + (wind/10 - 0.1) * sizeX, y - (1 + head + hair/10) * sizeY); - txLine (x, y - (1 + head) * sizeY, x + (wind/10 + 0.1) * sizeX, y - (1 + head + hair/10) * sizeY); - -$ txSetColor (~color & 0xFFFFFF); - txSetFillColor (~color & 0xFFFFFF); - -$ txLine (x, y - (0.8 + head - 0.05 * smile/2) * sizeY, x - 0.05 * sizeY, y - (0.8 + head + 0.05 * smile/2) * sizeY), - txLine (x, y - (0.8 + head - 0.05 * smile/2) * sizeY, x + 0.05 * sizeY, y - (0.8 + head + 0.05 * smile/2) * sizeY), - txNotifyIcon (4, (const char*)!! (L+'L')[msg], "\n%s\n", msg + (count++ % 3)["\"<"]); - -$ txCircle (x - 0.05 * sizeY, y - (0.9 + head - 0.02 * crazy) * sizeY, eyes * (1 + 0.5*wink) * 0.02 * sizeY), - txCircle (x + 0.05 * sizeY, y - (0.9 + head + 0.02 * crazy) * sizeY, eyes * (1 - 0.5*wink) * 0.02 * sizeY), - Sleep (1000 + count%2); - -$ txSetColor (lineColor); - txSetFillColor (fillColor); - } - -//----------------------------------------------------------------------------------------------------------------- - -void txDump (const void* address, const char name[] /*= "txDump()"*/) - { - const unsigned char* p = (const unsigned char*) address; - int x = 0; - - txSetConsoleAttr (0x0F); - printf ("\n%8.8s ", name? name : ""); - - txSetConsoleAttr (0x0E); - for (x = 0; x < 16; x++) printf ("%02X ", x); - for (x = 0; x < 16; x++) printf ("%X", x); - - for (int y = 0; y < 16; y++, p += 16) - { - txSetConsoleAttr (0x0E); - printf ("\n" "%8p ", p); - - for (x = 0; x < 16; x++) { txSetConsoleAttr (0x0A + x/4%2); printf ("%02X ", p[x]); } - for (x = 0; x < 16; x++) { txSetConsoleAttr (0x0A + x/4%2); printf ("%c", isprint (p[x])? p[x] : '.'); } - } - - txSetConsoleAttr (0x07); - printf ("\n"); - } - -//----------------------------------------------------------------------------------------------------------------- - -double txQueryPerformance() - { -$1 int maxTime = 500; -$ int maxSamples = 100; -$ POINT size = {500, 500}; - -$ HDC dc = _txBuffer_Create (txWindow(), &size, NULL); -$ assert (dc); if (!dc) return -1; - -$ DWORD mask = (DWORD) SetThreadAffinityMask (GetCurrentThread(), 1); -$ assert (mask); - -$ LARGE_INTEGER freq = {{0}}; -$ QueryPerformanceFrequency (&freq) asserted; - -$ LARGE_INTEGER start = {{0}}; -$ QueryPerformanceCounter (&start) asserted; - -$ int samples = 0; -$ while (samples++ < maxSamples) - { -$ LARGE_INTEGER cur = {{0}}; -$ QueryPerformanceCounter (&cur) asserted; - -$ double t = 1000.0 * (double) (cur.QuadPart - start.QuadPart) / (double) freq.QuadPart; -$ if (t > maxTime) break; - - // Draw test scene - -$ for (int y = 0; y < size.y; y += 10) - for (int x = 0; x < size.x; x += 10) Win32::TextOut (dc, x, y, "*", 1); - -$ Win32::Ellipse (dc, 0, 0, size.x, size.y); -$ Win32::ExtFloodFill (dc, size.x/2, size.y/2, TX_TRANSPARENT, FLOODFILLSURFACE); - -$ txBitBlt (dc, size.x/2, 0, size.x/2, size.y/2, dc, 0, 0) asserted; -$ txBitBlt (dc, size.x/2, size.y/2, size.x/2, size.y/2, dc, 0, size.y/2) asserted; -$ txBitBlt (dc, 0, size.y/2, size.x/2, size.y/2, dc, 0, 0) asserted; -$ txBitBlt (dc, size.x/2, size.y/2, size.x/2, size.y/2, dc, size.x/2, 0) asserted; - } - -$ mask = (DWORD) SetThreadAffinityMask (GetCurrentThread(), mask); -$ assert (mask); - -$ _txBuffer_Delete (&dc); - -$ return 15.0 * samples / sqrt (1.0 * size.x * size.y); - } - -//----------------------------------------------------------------------------------------------------------------- - -int txExtractColor (COLORREF color, COLORREF component) - { -$1 switch (component) - { - case TX_RED: - case TX_HUE: $ return (color >> 0) & 0xFF; - - case TX_GREEN: - case TX_SATURATION: $ return (color >> 8) & 0xFF; - - case TX_BLUE: - case TX_LIGHTNESS: $ return (color >> 16) & 0xFF; - - default: $ return CLR_INVALID; - } - } - -//----------------------------------------------------------------------------------------------------------------- - -COLORREF txRGB2HSL (COLORREF rgbColor) - { -$1 int r = txExtractColor (rgbColor, TX_RED), - g = txExtractColor (rgbColor, TX_GREEN), - b = txExtractColor (rgbColor, TX_BLUE); - -$ double m1 = MAX (MAX (r, g), b) / 255.0, - m2 = MIN (MIN (r, g), b) / 255.0, - dm = m1 - m2, - sm = m1 + m2, - - ir = r / 255.0, - ig = g / 255.0, - ib = b / 255.0, - - ih = 0, - is = 0, - il = sm / 2; - -$ const double prec = 0.001; - -$ if (fabs (dm) < prec) - { -$ is = dm / ((sm <= 1)? sm : (2-sm)); - -$ double cr = (m1 - ir) / dm, - cg = (m1 - ig) / dm, - cb = (m1 - ib) / dm; - -$ if (fabs (ir - m1) < prec) ih = cb - cg; -$ if (fabs (ig - m1) < prec) ih = 2 + cr - cb; -$ if (fabs (ib - m1) < prec) ih = 4 + cg - cr; - } - -$ ih = (ih >= 0)? ih*60 : ih*60 + 360; - -$ return RGB (ROUND (ih / 360 * 255), ROUND (is * 255), ROUND (il * 255)); - } - -//----------------------------------------------------------------------------------------------------------------- - -COLORREF txHSL2RGB (COLORREF hslColor) - { -$1 struct xRGB - { - static double calc (double h, double m1, double m2) - { -$ if (h < 0) h += 360; -$ if (h > 360) h -= 360; - -$ return (h < 60)? m1 + (m2-m1) * h / 60 : - (h < 180)? m2 : - (h < 240)? m1 + (m2-m1) * (240-h) / 60 : - m1; - } - }; - -$ int h = txExtractColor (hslColor, TX_HUE), - s = txExtractColor (hslColor, TX_SATURATION), - l = txExtractColor (hslColor, TX_LIGHTNESS); - -$ double ih = h / 255.0 * 360.0, - il = l / 100.0, - is = s / 100.0, - - m2 = (il <= 0.5)? il * (1 + is) : il + is - il * is, - m1 = 2 * il - m2, - - ir = s? xRGB::calc (ih + 120, m1, m2) : il, - ig = s? xRGB::calc (ih, m1, m2) : il, - ib = s? xRGB::calc (ih - 120, m1, m2) : il; - -$ return RGB (ROUND (ir * 255), ROUND (ig * 255), ROUND (ib * 255)); - } - -//----------------------------------------------------------------------------------------------------------------- - -template -inline bool In (T x, T a, T b) - { - return a <= x && x <= b; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline bool In (const POINT& pt, const RECT& rect) - { - _TX_IF_ARGUMENT_FAILED (&pt) return 0; - _TX_IF_ARGUMENT_FAILED (&rect) return 0; - - return In (pt.x, rect.left, rect.right) && - In (pt.y, rect.top, rect.bottom); - } - -//----------------------------------------------------------------------------------------------------------------- - -inline bool In (const COORD& pt, const SMALL_RECT& rect) - { - _TX_IF_ARGUMENT_FAILED (&pt) return 0; - _TX_IF_ARGUMENT_FAILED (&rect) return 0; - - return In (pt.X, rect.Left, rect.Right) && - In (pt.Y, rect.Top, rect.Bottom); - } - -//----------------------------------------------------------------------------------------------------------------- - -inline int random (int range) - { - return rand() % range; - } - -//----------------------------------------------------------------------------------------------------------------- - -inline double random (double left, double right) - { - return left + (right - left) * ((double) rand() / RAND_MAX); - } - -//----------------------------------------------------------------------------------------------------------------- - -template -inline T zero() -#ifdef _MSC_VER_6 - { T __zero = {0}; return __zero; } - -#else - { T __zero = { }; return __zero; } - -#endif - -//} -//================================================================================================================= - -//================================================================================================================= -//{ txDialog methods implementation -// txDialog -//================================================================================================================= - -txDialog::txDialog () : - layout_ (NULL) - {$1} - -//----------------------------------------------------------------------------------------------------------------- - -txDialog::txDialog (const Layout* layout) : - layout_ (layout) - {$1} - -//----------------------------------------------------------------------------------------------------------------- - -const txDialog::Layout* txDialog::setLayout (const Layout* layout) - { -$1 return std::swap (layout_, layout), layout; - } - -//----------------------------------------------------------------------------------------------------------------- - -INT_PTR txDialog::dialogBox (WORD resourceID) - { -$1 const char* resName = (char*)(ptrdiff_t) resourceID; - -$ if (!FindResource (NULL, resName, RT_DIALOG)) return TX_DEBUG_ERROR (" %d" _ resourceID), 0; - -$ return DialogBoxParam (NULL, resName, NULL, dialogProc__, (LPARAM) this); - } - -//----------------------------------------------------------------------------------------------------------------- - -INT_PTR txDialog::dialogBox (const txDialog::Layout* layout /*= NULL*/, size_t bufsize /*= 0*/) - { -$1 if (!layout) layout = layout_; -$ if (!layout) return TX_DEBUG_ERROR (" "), 0; - -$ if (!bufsize) bufsize = 1024; - -$ DLGTEMPLATE* tmpl = (DLGTEMPLATE*) GlobalAlloc (GPTR, bufsize); -$ if (!tmpl) return TX_DEBUG_ERROR ("GlobalAlloc(): "), 0; - -$ const Layout* dlg = &layout[0]; -$ const Layout def = { DIALOG, NULL, 0, 0,0,0,0, WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_CENTER, "MS Shell Dlg", 8 }; - -$ void* ptr = _tx_DLGTEMPLATE_Create (tmpl, bufsize, - (dlg->style? dlg->style : def.style) | DS_SETFONT, 0, 0, - dlg->x, dlg->y, dlg->sx, dlg->sy, - dlg->caption? dlg->caption : def.caption, - dlg->font? dlg->font : def.font, - dlg->fontsize? dlg->fontsize : def.fontsize, NULL); -$ WORD i = 0; -$ for (i = 1; layout[i].wndclass != END; ++i) - { -$ const Layout* item = &layout[i]; - -$ ptr = _tx_DLGTEMPLATE_Add (ptr, bufsize - ((char*)ptr - (char*)tmpl), - item->style | WS_VISIBLE, 0, item->x, item->y, item->sx, item->sy, - item->id, (const char*) item->wndclass, item->caption); - } - -$ tmpl->cdit = (unsigned short) (i-1); -$ INT_PTR res = DialogBoxIndirectParam (NULL, tmpl, NULL, dialogProc__, (LPARAM) this); - -$ GlobalFree (tmpl); - -$ return res; - } - -//----------------------------------------------------------------------------------------------------------------- - -int txDialog::dialogProc (HWND, UINT, WPARAM, LPARAM) - { -$1 return FALSE; - } - -//----------------------------------------------------------------------------------------------------------------- - -ptrdiff_t CALLBACK txDialog::dialogProc__ (HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam) - { -$1 static txDialog* this__ = NULL; - -$ if (msg == WM_INITDIALOG) this__ = (txDialog*) lParam; -$ if (!this__) return FALSE; - -$ switch (msg) - { - case WM_INITDIALOG: $ SetForegroundWindow (wnd); break; - - case WM_COMMAND: $ switch (LOWORD (wParam)) - { - case IDOK: - case IDCANCEL: $ SetForegroundWindow (txWindow()); - $ EndDialog (wnd, (INT_PTR) this__); break; - default: $ break; - } - - default: $ break; - } - -$ return this__-> dialogProc (wnd, msg, wParam, lParam); - } - -//----------------------------------------------------------------------------------------------------------------- - -void* _tx_DLGTEMPLATE_Create (void* globalMem, size_t bufsize, DWORD style, DWORD exStyle, - WORD controls, short x, short y, short cx, short cy, - const char caption[], const char font[], WORD fontsize, HANDLE menu) - { -$1 _TX_IF_ARGUMENT_FAILED (globalMem) return NULL; - -$ WORD* pw = (WORD*) globalMem; - -$ DLGTEMPLATE* tmpl = ((DLGTEMPLATE*&) pw)++; - -$ tmpl->style = style; -$ tmpl->dwExtendedStyle = exStyle; -$ tmpl->cdit = controls; -$ tmpl->x = x; -$ tmpl->y = y; -$ tmpl->cx = cx; -$ tmpl->cy = cy; - -$ *pw++ = (WORD)(ptrdiff_t) NULL; -$ *pw++ = (WORD)(ptrdiff_t) menu; - -$ if (caption) - { -$ pw += MultiByteToWideChar (_TX_CP, 0, caption? caption : "", -1, (wchar_t*) pw, - (int) (bufsize? bufsize - ((char*)pw - (char*)globalMem) : 0xFFFF)); - } - -$ if (style & DS_SETFONT) - { -$ *pw++ = fontsize; -$ pw += MultiByteToWideChar (_TX_CP, 0, font? font : "", -1, (wchar_t*) pw, - (int) (bufsize? bufsize - ((char*)pw - (char*)globalMem) : 0xFFFF)); - } - -$ return pw; - } - -//----------------------------------------------------------------------------------------------------------------- - -void* _tx_DLGTEMPLATE_Add (void* dlgTemplatePtr, size_t bufsize, DWORD style, DWORD exStyle, - short x, short y, short cx, short cy, - WORD id, const char wclass[], const char caption[]) - { -$1 _TX_IF_ARGUMENT_FAILED (dlgTemplatePtr) return NULL; - -$ WORD* pw = (LPWORD) dlgTemplatePtr; // Force align at word boundary -$ (ULONG&) pw += 3; -$ (ULONG&) pw >>= 2; -$ (ULONG&) pw <<= 2; - -$ DLGITEMTEMPLATE* tmpl = ((DLGITEMTEMPLATE*&) pw)++; - -$ tmpl->style = style; -$ tmpl->dwExtendedStyle = exStyle; -$ tmpl->x = x; -$ tmpl->y = y; -$ tmpl->cx = cx; -$ tmpl->cy = cy; -$ tmpl->id = id; - -$ if (HIWORD (wclass) == 0xFFFF) - { -$ *pw++ = (WORD) (HIWORD ((ptrdiff_t) wclass)); -$ *pw++ = (WORD) (LOWORD ((ptrdiff_t) wclass)); - } - else if (wclass) - { -$ pw += MultiByteToWideChar (_TX_CP, 0, const_cast (wclass), -1, (wchar_t*) pw, - (int) (bufsize? bufsize - ((char*)pw - (char*)dlgTemplatePtr) : 0xFFFF)); - } - else - { -$ *pw++ = 0; - } - -$ if (caption) - { -$ pw += MultiByteToWideChar (_TX_CP, 0, caption, -1, (wchar_t*) pw, - (int) (bufsize? bufsize - ((char*)pw - (char*)dlgTemplatePtr) : 0xFFFF)); - } - else - { -$ *pw++ = 0; - } - -$ *pw++ = 0; - -$ return pw; - } - -//} -//================================================================================================================= - -//================================================================================================================= -//{ Cleaning up the utility macros -// -//================================================================================================================= - -#undef $ - -//} -//================================================================================================================= - -//! @endcond -//} -//================================================================================================================= - -/*! @cond INTERNAL */ - -} } // namespace TX, anonymous namespace - -/*! @endcond */ - -//----------------------------------------------------------------------------------------------------------------- -//{ Easy using of TX:: and some of std:: -//----------------------------------------------------------------------------------------------------------------- - -using namespace TX; // Allow easy usage of TXLib functions - -using ::std::cin; // Predefined usings to avoid "using namespace std" -using ::std::cout; -using ::std::cerr; -using ::std::string; - -//} -//----------------------------------------------------------------------------------------------------------------- - -//================================================================================================================= -//{ [Experimental] Debugging macros -//! @name -//================================================================================================================= - -//{---------------------------------------------------------------------------------------------------------------- -//! @ingroup Misc -//! @brief -//! -//! -//! @warning . -//! -//! @title : @table -//! @tr $ (x) @td @c x . -//! @tr $_(x) @td @c x . -//! @tbr -//! @tr $$ (expr) @td , , . @n -//! "", , -//! expr . -//! @tr $$_(expr) @td , $$(expr), . -//! @tbr -//! @tr $$$ (expr) @td , $$(expr), ( ). -//! @tr $$$_(expr) @td , $$$(expr), . -//! @tbr -//! @tr $$$$ @td . -//! @tr $$$$_ @td ( ). -//! @tr $n @td ( @c '\\n'). -//! @endtable -//! -//! @title : @table -//! @tr @c $d @td - @td @td @c $T @td -//! @tr @c $b @td - @td @td @c $B @td - -//! @tr @c $g @td - @td @td @c $G @td - -//! @tr @c $c @td - @td @td @c $C @td - -//! @tr @c $r @td - @td @td @c $R @td - -//! @tr @c $m @td - @td @td @c $M @td - -//! @tr @c $y @td @td @td @c $Y @td - -//! @tr @c $t @td @td @td @c $D @td - -//! @endtable -//! @title @table -//! @tr @c $a @td Assertion @td - @td -//! @td @c $A @td Assertion bold @td @td -//! @tr @c $i @td Information @td - @td -//! @td @c $I @td Information bold @td @td -//! @tr @c $w @td Warning @td - @td -//! @td @c $W @td Warning bold @td @td -//! @tr @c $e @td Error @td - @td -//! @td @c $E @td Error bold @td @td -//! @tr @c $f @td Fatal @td - @td -//! @td @c $F @td Fatal bold @td - @td -//! @tr @c $l @td Location @td - @td -//! @td @c $L @td Location bold @td - - @td -//! @endtable -//! @title @table -//! @tr @c $s @td . . -//! @endtable -//! -//! @see assert(), asserted, __TX_FILELINE__, __TX_FUNCTION__, TX_ERROR -//! -//! @usage @code -//! $g // green -//! int x = 5; -//! int y = $(x) + 1; -//! $$( x = $(y) + 2 ); -//! -//! $r // red -//! double xy = $$( pow (x, y) ); -//! -//! $$$$ -//! double h = $$(( $(x) = x*x, y = y*y, sqrt ($(x+y)) )); -//! -//! $$( txCreateWindow (800, 600) ); -//! -//! $d // default color -//! $$$( if ($(xy) < $(h)) { $s return $(h); } ) -//! -//! $$$$ -//! @endcode -//}---------------------------------------------------------------------------------------------------------------- - -#ifndef __TX_DEBUG_MACROS -#define __TX_DEBUG_MACROS (" $-") - -//! @cond INTERNAL - -#define $_(var) _txDump (var) - -#define $(var) ( _txDump ((var), "[" #var " = ", "] ") ) - -#define $$(cmd) ( std::cerr << "\n[" __TX_FILELINE__ ": " #cmd "]\n", \ - _txDump ((cmd),"\n[" __TX_FILELINE__ ": " #cmd ": ", ", DONE]\n") ) - -#define $$_(cmd) ( std::cerr << "\n[" __TX_FILELINE__ ": " #cmd "]\n", \ - _txDump ((cmd), "[" __TX_FILELINE__ ": " #cmd ": ", ", DONE]\n") ) - -#define $$$(cmd) { std::cerr << "\n[" __TX_FILELINE__ ": " #cmd "]\n"; \ - _txDumpSuffix ("\n[" __TX_FILELINE__ ": " #cmd " DONE]\n"); { cmd; } } - -#define $$$_(cmd) { std::cerr << "\n[" __TX_FILELINE__ ": " #cmd "]\n"; \ - _txDumpSuffix ( "[" __TX_FILELINE__ ": " #cmd " DONE]\n"); { cmd; } } - -#define $$$$ { txOutputDebugPrintf ("\f\n"); \ - { $s $l txOutputDebugPrintf ("\f" "[%s (%d) %s]", __FILE__, __LINE__, __TX_FUNCTION__); } txOutputDebugPrintf ("\f\n"); } - -#define $$$$_ { txOutputDebugPrintf ("\f\n"); \ - { $s $l txOutputDebugPrintf ("\f" "[%s]", __func__); } txOutputDebugPrintf ("\f\n"); } - -#define $n std::cerr << "\n"; - -#define $s _txSaveConsoleAttr __txSaveConsoleAttr; - -#define $T txSetConsoleAttr (0x00); -#define $B txSetConsoleAttr (0x01); -#define $G txSetConsoleAttr (0x02); -#define $C txSetConsoleAttr (0x03); -#define $R txSetConsoleAttr (0x04); -#define $M txSetConsoleAttr (0x05); -#define $Y txSetConsoleAttr (0x06); -#define $d txSetConsoleAttr (0x07); -#define $D txSetConsoleAttr (0x08); -#define $b txSetConsoleAttr (0x09); -#define $g txSetConsoleAttr (0x0a); -#define $c txSetConsoleAttr (0x0b); -#define $r txSetConsoleAttr (0x0c); -#define $m txSetConsoleAttr (0x0d); -#define $y txSetConsoleAttr (0x0e); -#define $t txSetConsoleAttr (0x0f); - -#define $i txSetConsoleAttr (0x1b); -#define $I txSetConsoleAttr (0x1e); -#define $a txSetConsoleAttr (0x2a); -#define $A txSetConsoleAttr (0x2e); -#define $e txSetConsoleAttr (0x4f); -#define $E txSetConsoleAttr (0x4e); -#define $w txSetConsoleAttr (0x5d); -#define $W txSetConsoleAttr (0x5e); -#define $f txSetConsoleAttr (0xc0); -#define $F txSetConsoleAttr (0xc5); -#define $l txSetConsoleAttr (0x80); -#define $L txSetConsoleAttr (0x87); - -//----------------------------------------------------------------------------------------------------------------- - -#if !defined (_MSC_VER_6) - -template inline -const T& _txDump (const T& value, const char* prefix = "", const char* suffix = "") - { - std::cerr << prefix << value << suffix; - return value; - } - -#endif - -template inline - T& _txDump ( T& value, const char* prefix = "", const char* suffix = "") - { - std::cerr << prefix << value << suffix; - return value; - } - -struct _txDumpSuffix - { - const char* suffix_; - - inline _txDumpSuffix (const char* suffix = "") : suffix_ (suffix) {} - inline ~_txDumpSuffix() { std::cerr << suffix_; } - - _txDumpSuffix (const _txDumpSuffix&); - _txDumpSuffix& operator = (const _txDumpSuffix&); - }; - -struct _txSaveConsoleAttr - { - unsigned attr_; - - inline _txSaveConsoleAttr() : attr_ (txGetConsoleAttr ()) {} - inline _txSaveConsoleAttr (WORD attr) : attr_ (txGetConsoleAttr ()) { txSetConsoleAttr (attr); } - inline ~_txSaveConsoleAttr() { txSetConsoleAttr (attr_); } - }; - -//! @endcond - -#endif - -//} -//================================================================================================================= - -//----------------------------------------------------------------------------------------------------------------- -//{ Compiler- and platform-specific -// -//----------------------------------------------------------------------------------------------------------------- -//! @cond INTERNAL - -#if defined (_GCC_VER) && (_GCC_VER >= 420) - - #pragma GCC optimize ("strict-aliasing") - - #if (_GCC_VER >= 460) - #pragma GCC diagnostic pop - - #else - #pragma GCC diagnostic warning "-Wstrict-aliasing" - #pragma GCC diagnostic warning "-Wshadow" - #endif - - // Still block this warnings to avoid reporting about "= {0}" or "= {}" init style, - // and old style cast used in Windows.h RGB() macro. - - #pragma GCC diagnostic ignored "-Wmissing-field-initializers" - #pragma GCC diagnostic ignored "-Wold-style-cast" - - // These warnings really occur at end of compilation, so block them too. - - #pragma GCC diagnostic ignored "-Wunreachable-code" - #pragma GCC diagnostic ignored "-Wunused-label" - #pragma GCC diagnostic ignored "-Winline" - -#endif - -//----------------------------------------------------------------------------------------------------------------- - -#if defined (_MSC_VER) - - #pragma warning (default: 4127) // conditional expression is constant - #pragma warning (default: 4351) // new behavior: elements of array will be default initialized - - #pragma warning (default: 4511) // copy constructor could not be generated - #pragma warning (default: 4512) // assignment operator could not be generated - #pragma warning (default: 4663) // C++ language change: to explicitly specialize class template - #pragma warning (default: 4702) // unreachable code - - #if (_MSC_VER >= 1400) // MSVC 8 (2005) or greater - #pragma warning (default: 26135) // missing locking annotation - #pragma warning (default: 28125) // the function must be called from within a try/except block - #pragma warning (default: 28159) // consider using another function instead - #endif - - // This warning really occur at end of compilation, so still block it. - - #pragma warning (disable: 4514) // unreferenced inline function has been removed - #pragma warning (disable: 4710) // function not inlined - #pragma warning (disable: 4786) // identifier was truncated to '255' characters in the debug information - -#endif - -#if defined (__INTEL_COMPILER) - - #pragma warning (default: 174) // remark: expression has no effect - #pragma warning (default: 304) // remark: access control not specified ("public" by default) - #pragma warning (default: 522) // remark: function redeclared "inline" after being called - #pragma warning (default: 981) // remark: operands are evaluated in unspecified order - #pragma warning (default: 1684) // conversion from pointer to same-sized integral type (potential portability problem) - -#endif - -//! @endcond -//} -//----------------------------------------------------------------------------------------------------------------- - -#endif // __TXLIB_H_INCLUDED - -//================================================================================================================= -// EOF -//================================================================================================================= - - - - - - - - - - - - +//================================================================================================================= +// [These sections are for folding control in Code::Blocks] +//{ [Best viewed with "Fold all on file open" option enabled] [best screen width is 115 chars] +//================================================================================================================= +//! +//! @file TXLib.h +//! @brief (The Dumb Artist Library, TX Library, TXLib). +//! +//! $Version: 00172a, Revision: 104 $ +//! $Copyright: (C) Ded (Ilya Dedinsky, http://txlib.ru) $ +//! $Date: 2014-08-09 16:37:26 +0400 $ +//! +//! TX Library - Win32 ++. +//! "" +//! . . +//! +//! 1 TX Library - +//! . +//! +//! TX Library is a tiny 2D graphics library for Win32 written in C++. This is a small +//! sandbox for the very beginners to help them to learn basic programming principles. +//! The documentation is currently in Russian. +//! +//! : txlib.ru. +//! +//! . SourceForge. +//! +//! @warning -. . @nn +//! . +//! . +//! +//! @par SourceForge: +//! - +//! - +//! +//! @par +//! -# +//! .., .., .., .., .., .., .. +//! . Batman +//! Proceedings in Sheep Philosophy, 2003, Vol. 22. pp. 23-24. +//! +// $Copyright: (C) Ded (Ilya Dedinsky, http://txlib.ru) $ +//----------------------------------------------------------------------------------------------------------------- +//! +//! @defgroup Drawing +//! @defgroup Mouse +//! @defgroup Dialogs +//! @defgroup Misc +//! @defgroup Service +//! @defgroup Technical +//} +//================================================================================================================= + +#if !defined (__TXLIB_H_INCLUDED) // <<<<<<<<< The code is here, unfold it <<<<<<<<<<<<<<<<<<<<<<<<< +#define __TXLIB_H_INCLUDED + +//----------------------------------------------------------------------------------------------------------------- +//{ Version information +//----------------------------------------------------------------------------------------------------------------- + +//! @cond INTERNAL +#define _TX_V_FROM_CVS(_1,file,ver,rev,date,auth,_2) "TXLib [Ver: " #ver ", Rev: " #rev "]" +#define _TX_A_FROM_CVS(_1,file,ver,rev,date,auth,_2) "Copyright (C) " auth +#define _TX_v_FROM_CVS(_1,file,ver,rev,date,auth,_2) ((0x##ver << 16) | 0x##rev) +//! @endcond + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief . +//! +//! @code +//! #define _TX_VERSION "TXLib [Version: 1.72a, Revision 50]" () +//! #define _TX_AUTHOR "Copyright (C) Ded (Ilya Dedinsky, http://txlib.ru)" +//! @endcode +//! . +//! +//! @see txVersion() +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- +//! @{ + +#define _TX_VERSION _TX_V_FROM_CVS ($VersionInfo: , TXLib.h, 00172a, 104, 2014-08-09 16:37:26 +0400, "Ded (Ilya Dedinsky, http://txlib.ru) ", $) +#define _TX_AUTHOR _TX_A_FROM_CVS ($VersionInfo: , TXLib.h, 00172a, 104, 2014-08-09 16:37:26 +0400, "Ded (Ilya Dedinsky, http://txlib.ru) ", $) + +//! @} +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief . +//! +//! : - , - , - . +//! , @c 0x172a0050 - @c 0.172a, @c 50. +//! +//! . +//! +//! @see txVersion() +//! @usage @code +//! #if !(defined (_TX_VER) && (_TX_VER >= 0x172a0000)) +//! #error Must use TXLib.h version >= 1.72 to compile this. +//! #endif +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#define _TX_VER _TX_v_FROM_CVS ($VersionInfo: , TXLib.h, 00172a, 104, 2014-08-09 16:37:26 +0400, "Ded (Ilya Dedinsky, http://txlib.ru) ", $) + +//} +//----------------------------------------------------------------------------------------------------------------- + +//----------------------------------------------------------------------------------------------------------------- +//{ Compiler- and platform-specific +//! @name +//----------------------------------------------------------------------------------------------------------------- +//! @{ @cond INTERNAL + +#if !defined (__cplusplus) + + #ifdef __GNUC__ + #error + #error -------------------------------------------------------------------------------------------------------- + #endif + #error TXLib.h: Must use C++ to compile TXLib.h. + #error + #error CHECK source file EXTENSION. Maybe it is ".C". It must be ".CPP". + #error If your file is named, for example, "Untitled.C", go to menu [File], then + #error then [Save As] and rename it to "Untitled.CPP". Please do NOT use spaces. + #error -------------------------------------------------------------------------------------------------------- + #error + +#endif + +#if !defined (WIN32) && !defined (__WIN32__) && !defined(_WIN32) && !defined(_WIN32_WINNT) + + #ifdef __GNUC__ + #error + #error -------------------------------------------------------------------------------------------------------- + #endif + #error TXLib.h: Windows (MSVC/Win32 or GCC/MinGW) is the only supported system, sorry. + #error + #error In Linux or iOS, you should write your own TXLib and share it with your friends, + #error or use wine. + #error -------------------------------------------------------------------------------------------------------- + #error + +#endif + +#if defined (UNICODE) || defined (_UNICODE) + + #ifdef __GNUC__ + #warning TXLib.h: Disabling the UNICODE + #endif + + #undef UNICODE // Burn Unicode, burn + #undef _UNICODE + + #if defined (_WINDOWS_H) || defined (_INC_WINDOWS) || defined (_WINDOWS_) || defined (__WINDOWS__) + + #ifdef __GNUC__ + #error + #error -------------------------------------------------------------------------------------------------------- + #endif + #error TXLib.h: Should include "TXLib.h" BEFORE or INSTEAD of in UNICODE mode. + #error + #error REARRANGE your #include directives, or DISABLE the UNICODE mode. + #error -------------------------------------------------------------------------------------------------------- + #error + + #endif + +#endif + +#if defined (__STRICT_ANSI__) // Try to extend strict ANSI rules + + #ifdef __GNUC__ + #warning TXLib.h: Trying to extend strict ANSI compatibility + #endif + + #undef __STRICT_ANSI__ + #define __STRICT_ANSI__UNDEFINED + + #if defined (_STRING_H_) || defined (_INC_STRING) || defined (_STDIO_H_) || defined (_INC_STDIO) + + #ifdef __GNUC__ + #error + #error -------------------------------------------------------------------------------------------------------- + #endif + #error TXLib.h: Should include "TXLib.h" BEFORE or in Strict ANSI mode. + #error + #error REARRANGE your #include directives, or DISABLE ANSI-compliancy. + #error -------------------------------------------------------------------------------------------------------- + #error + + #endif + +#endif + +#if defined (__GNUC__) + + #define _GCC_VER ( __GNUC__*100 + __GNUC_MINOR__*10 + __GNUC_PATCHLEVEL__ ) + + #if defined (_GCC_VER) && (_GCC_VER >= 420) + + #if (_GCC_VER >= 460) + #pragma GCC diagnostic push + #endif + + #pragma GCC optimize ("no-strict-aliasing") + #pragma GCC diagnostic ignored "-Wstrict-aliasing" + + #pragma GCC diagnostic ignored "-Wshadow" + + #pragma GCC diagnostic ignored "-Wmissing-field-initializers" + #pragma GCC diagnostic ignored "-Wunreachable-code" + #pragma GCC diagnostic ignored "-Wold-style-cast" + #pragma GCC diagnostic ignored "-Wunused-label" // Just for fun in _txCanvas_OnCmdAbout() + #pragma GCC diagnostic ignored "-Winline" + + #define _TX_THREAD __thread + + #else + #define _TX_THREAD + + #endif + + #define _TX_CHECK_FORMAT( at ) __attribute__ (( format (printf, (at), (at)+1) )) + + template + inline T _txNOP (T value) { return value; } // To suppress performance warnings in assert etc + + // From MinGW\include\float.h which is replaced by MinGW\lib\gcc\i686-pc-mingw32\x.x.x\include\float.h + extern "C" unsigned int __cdecl _controlfp (unsigned int unNew, unsigned int unMask); + extern "C" void __cdecl _fpreset (void); + +#else + + #define _TX_CHECK_FORMAT( at ) + + #define _txNOP( value ) ( value ) + +#endif + +#if defined (_MSC_VER) + + #pragma warning (push, 4) // Set maximum warning level + + #pragma warning (disable: 4127) // conditional expression is constant + #pragma warning (disable: 4351) // new behavior: elements of array will be default initialized + #pragma warning (disable: 4702) // unreachable code + + #define _TX_THREAD __declspec (thread) + +#endif + +#if defined (_MSC_VER) && (_MSC_VER == 1200) // MSVC 6 (1998) + + #define _MSC_VER_6 // Flag the bad dog + + #pragma warning (disable: 4511) // copy constructor could not be generated + #pragma warning (disable: 4512) // assignment operator could not be generated + #pragma warning (disable: 4514) // unreferenced inline function has been removed + #pragma warning (disable: 4663) // C++ language change: to explicitly specialize class template + #pragma warning (disable: 4710) // function not inlined + #pragma warning (disable: 4786) // identifier was truncated to '255' characters in the debug information + + #if !defined (WINVER) + #define WINVER 0x0400 // MSVC 6: Defaults to Windows 95 + #endif + + #if !defined (NDEBUG) + #define _CRTDBG_MAP_ALLOC 1 // Set debug mode heap allocation + #endif + +#endif + +#if defined (_MSC_VER) && (_MSC_VER >= 1400) // MSVC 8 (2005) or greater + + #pragma warning (disable: 26135) // missing locking annotation + #pragma warning (disable: 28125) // the function must be called from within a try/except block + #pragma warning (disable: 28159) // consider using another function instead + + #pragma setlocale ("russian") // Set source file encoding, see also _TX_CP + + #if !defined (NDEBUG) + #pragma check_stack (on) // Turn on stack probes at runtime + #pragma strict_gs_check (push, on) // Detects stack buffer overruns + #endif + + #define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1 + #define _TX_TRUNCATE , _TRUNCATE + +#else + + #define strcpy_s strcpy // MSVC prior to 8 (2005) versions and GCC + #define strncpy_s strncpy // do NOT have secure variants of these + #define strncat_s strncat // functions, so use insecure ones. + #define wcsncpy_s wcsncpy // ... + #define _snprintf_s _snprintf // + #define _vsnprintf_s _vsnprintf // + + #define strerror_s( buf, code ) ( strncpy ((buf), strerror (code), sizeof(buf)-1) ) + #define ctime_s( buf, sizeof_buf, time ) ( strncpy ((buf), ctime (time), (sizeof_buf)-1) ) + #define getenv_s( sz, buf, sizeof_buf, name ) ( (void)(sz), strncpy ((buf), getenv (name), (sizeof_buf)-1) ) + #define strtok_s( buf, delim, ctx ) ( (void)(ctx), strtok ((buf), (delim)) ) + + #if !( defined (_GCC_VER) && (_GCC_VER == 471) && defined (__x86_64__) ) // GCC 4.7.1 x64 already has it + #define _controlfp_s( oldCtl, newCtl, mask ) ( *(oldCtl) = _controlfp (newCtl, mask), 0 ) + #endif + + #define _TX_TRUNCATE + +#endif + +#if defined (__INTEL_COMPILER) + + #pragma warning (disable: 174) // remark: expression has no effect + #pragma warning (disable: 304) // remark: access control not specified ("public" by default) + #pragma warning (disable: 522) // remark: function "..." redeclared "inline" after being called + #pragma warning (disable: 981) // remark: operands are evaluated in unspecified order + #pragma warning (disable: 1684) // conversion from pointer to same-sized integral type (potential portability problem) + +#endif + +#if !defined (WINVER) + #define WINVER 0x0500 // Defaults to Windows 2000 + #define WINDOWS_ENABLE_CPLUSPLUS // Allow use of type-limit macros in , +#endif // they allowed by default if WINVER >= 0x0600. + +#if !defined (_WIN32_WINNT) + #define _WIN32_WINNT WINVER // Defaults to the same as WINVER +#endif + +#if !defined (_WIN32_IE) + #define _WIN32_IE WINVER // Defaults to the same as WINVER +#endif + +#define _USE_MATH_DEFINES // math.h's M_PI etc. + +//! @} @endcond +//} +//----------------------------------------------------------------------------------------------------------------- + +//----------------------------------------------------------------------------------------------------------------- +//{ The Includes +//----------------------------------------------------------------------------------------------------------------- + +#ifdef _MSC_VER_6 + #pragma warning (push, 3) // MSVC 6: At level 4, some std headers emit warnings O_o +#endif + +//----------------------------------------------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#if defined (_MSC_VER) +#include +#endif + +//----------------------------------------------------------------------------------------------------------------- + +#ifdef _MSC_VER_6 + #pragma warning (pop) // MSVC 6: Restore max level +#endif + +#ifdef __STRICT_ANSI__UNDEFINED + #define __STRICT_ANSI__ // Redefine back +#endif + +//} +//----------------------------------------------------------------------------------------------------------------- + +//----------------------------------------------------------------------------------------------------------------- +//{ The namespaces +//----------------------------------------------------------------------------------------------------------------- + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief . +//}---------------------------------------------------------------------------------------------------------------- + +#ifdef FOR_DOXYGEN_ONLY +namespace { namespace TX { }} +#endif + +//} +//----------------------------------------------------------------------------------------------------------------- + +/*! @cond INTERNAL */ + +namespace { namespace TX { // <<<<<<<<< The main code is here, unfold it <<<<<<<<<<<<<<<<<<<< + +/*! @endcond */ + +//================================================================================================================= +//{ TXLIB INTERFACE +// +//================================================================================================================= + +//================================================================================================================= +//{ Initialization +//! @name +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief +//! +//! @param sizeX ( ) +//! @param sizeY ( ) +//! @param centered +//! +//! @return ( ) TXLib. , NULL. +//! +//! @note , . txSetDefaults(). +//! +//! @warning ( ), TXLib, +//! , , +//! . , , @c main.cpp @c game.cpp, @c main.cpp +//! , @c game.cpp . ( @c game.cpp +//! .) @n +//! , , , +//! , @c graphics.cpp, . ( +//! ) . @nn +//! TXLib @b DLL. +//! +//! @note +//! DLL. txDestroyWindow(). +//! main(). +//! +//! @warning (not thread-safe). @nn +//! TXLib , . +//! , TXLib (Qt, +//! wxWidgets, GTK+ .., . +//! SDL, OpenGL ..) . , TXLib - +//! , . +//! +//! @see txOK(), txWindow(), txDC(), _txWindowStyle, _txConsoleMode, _txConsoleFont, _txCursorBlinkInterval, +//! _txWindowUpdateInterval, _TX_NOINIT, _TX_ALLOW_TRACE, TX_TRACE +//! +//! @usage @code +//! txCreateWindow ( 800, 600); // 800600, +//! txCreateWindow (1024, 768, false); // 1024768, +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +HWND txCreateWindow (double sizeX, double sizeY, bool centered = true); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @return - true, - false. +//! +//! @par : +//! - - (TX_WHITE), 1 +//! - - (TX_WHITE) +//! - - , (TX_WHITE) +//! - - (R2_COPYPEN) +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txSelectFont(), txSetROP2() +//! +//! @usage @code +//! txSetDefaults(); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txSetDefaults(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief +//! +//! @return : true - , false - . +//! +//! " " , . - +//! , . +//! +//! @see txCreateWindow() +//! +//! @usage @code +//! txCreateWindow (800, 600); +//! if (!txOK()) +//! { +//! txMessageBox (" ", "", MB_ICONSTOP); +//! return; +//! } +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline bool txOK(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief POINT. +//! +//! @return POINT, @c x @c y. +//! +//! @see txGetExtentX(), txGetExtentY() +//! +//! @usage @code +//! POINT size = txGetExtent(); +//! +//! txLine (0, 0, size.x, size.y); +//! txLine (0, size.y, size.x, 0); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +POINT txGetExtent(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @return . +//! +//! @see txGetExtent(), txGetExtentY() +//! +//! @usage @code +//! txSetTextAlign (TA_CENTER); +//! txTextOut (txGetExtentX() / 2, 100, "Oh, oh, you're in the [army]middle now"); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +int txGetExtentX(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @return . +//! +//! @see txGetExtent(), txGetExtentX() +//! +//! @usage @code +//! void DrawHouse (int height); +//! ... +//! DrawHouse (txGetExtentY() / 2); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +int txGetExtentY(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief +//! +//! @return ( , handler) (device context, DC) (HDC). +//! +//! @note HDC , . +//! txDeleteDC(). +//! txLock() txUnlock(). +//! +//! @see txWindow(), txLock(), txUnlock(), txGDI() +//! +//! @usage @code +//! txBitBlt (txDC(), 0, 0, 100, 100, txDC(), 0, 0); +//! txBitBlt (txDC(), 100, 0, 100, 100, txDC(), 0, 0); +//! txBitBlt (txDC(), 0, 100, 100, 100, txDC(), 0, 0); +//! txBitBlt (txDC(), 100, 100, 100, 100, txDC(), 0, 0); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline HDC& txDC(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief +//! +//! @return ( , handler) +//! +//! @see txDC(), txLock(), txUnlock(), txGDI() +//! +//! @usage @code +//! SetWindowText (txWindow(), " - !"); +//! txMessageBox ("", "", MB_ICONINFORMATION); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline HWND txWindow(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief . +//! +//! @return . +//! +//! @usage @code +//! printf ("I personally love %s\n", txVersion()); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline const char* txVersion(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief . +//! +//! @return . +//! +//! @usage @code +//! printf ("My magic number is %x\n", txVersionNumber()); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline unsigned txVersionNumber(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief TXLib. +//! +//! @param fileNameOnly , Win32 +//! GetFileModuleName (NULL, ...). +//! +//! @return fileNameOnly = true: @n +//! fileNameOnly = false: TXLib +//! +//! @note @b . +//! +//! @see txWindow(), txVersion(), txVersionNumber() +//! +//! @usage @code +//! printf (" !"); +//! +//! for (int done = 0; done <= 100; done++) +//! { +//! char title [1024] = ""; +//! sprintf (title, "%s - [%-10.*s] %d%%", txGetModuleFileName (false), done/10, "||||||||||", done); +//! +//! SetWindowText (txWindow(), title); +//! txSleep (50); +//! } +//! +//! txMessageBox (" progress bar", "TXLib forever)"); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +const char* txGetModuleFileName (bool fileNameOnly = true); + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Setting the parameters +//! @name +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! . TX_BLACK, TX_BLUE . +//! +//! - ( ), RGB(). +//! . . +//! +//! @see txSetColor(), txSetFillColor(), txGetColor(), txGetFillColor(), txGetPixel(), RGB() +//! +//! @usage @code +//! #include "TXLib.h" +//! +//! const COLORREF MY_DEEP_ROMANTIC_BLUE = RGB ( 0, 0, 129), +//! MY_SHINING_MOONLIGHT = RGB (128, 255, 64); +//! ... +//! +//! txSetColor (TX_RED); +//! txSetFillColor (TX_NULL); +//! +//! txSetFillColor (MY_DEEP_ROMANTIC_BLUE); // .. , " " +//! txSetColor (MY_SHINING_MOONLIGHT); // http://tanais.info/art/pic/kuindzhi1.html +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +const COLORREF +#ifdef FOR_DOXYGEN_ONLY + enum txColors { +#endif + + TX_BLACK = RGB ( 0, 0, 0), //!< . + TX_BLUE = RGB ( 0, 0, 128), //!< - . . + TX_GREEN = RGB ( 0, 128, 0), //!< . + TX_CYAN = RGB ( 0, 128, 128), //!< . + TX_RED = RGB (128, 0, 0), //!< - . . + TX_MAGENTA = RGB (128, 0, 128), //!< - . + TX_BROWN = RGB (128, 128, 0), //!< . . Do it yourself with RGB(). + TX_ORANGE = RGB (255, 128, 0), //!< . + TX_GRAY = RGB (160, 160, 160), //!< . + TX_DARKGRAY = RGB (128, 128, 128), //!< - . + TX_LIGHTGRAY = RGB (192, 192, 192), //!< - . + TX_LIGHTBLUE = RGB ( 0, 0, 255), //!< - . + TX_LIGHTGREEN = RGB ( 0, 255, 128), //!< - . + TX_LIGHTCYAN = RGB ( 0, 255, 255), //!< - . + TX_LIGHTRED = RGB (255, 0, 128), //!< - . . + TX_LIGHTMAGENTA = RGB (255, 0, 255), //!< - . . + TX_PINK = RGB (255, 128, 255), //!< :) + TX_YELLOW = RGB (255, 255, 128), //!< . + TX_WHITE = RGB (255, 255, 255), //!< . + TX_TRANSPARENT = 0xFFFFFFFF, //!< . . + TX_NULL = TX_TRANSPARENT, //!< . . + +// () - . txExtractColor(), txRGB2HSL(), txHSL2RGB() + + TX_HUE = 0x04000000, //!< HSL + TX_SATURATION = 0x05000000, //!< HSL + TX_LIGHTNESS = 0x06000000; //!< HSL + +#ifdef FOR_DOXYGEN_ONLY + }; +#endif + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief () (). +//! +//! @param red [0; 255] +//! @param green [0; 255] +//! @param blue [0; 255] +//! +//! @return COLORREF. +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txExtractColor(), +//! txRGB2HSL(), txHSL2RGB() +//! +//! @usage @code +//! txSetColor (RGB (255, 128, 0)); // + = +//! +//! int red = 20, green = 200, blue = 20; +//! COLORREF color = RGB (red, green, blue); +//! txSetFillColor (color); +//! +//! const COLORREF SKY_COLOR = RGB (0, 128, 255); // +//! +//! ... +//! txSetFillColor (SKY_COLOR); // +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +#ifdef FOR_DOXYGEN_ONLY +COLORREF RGB (int red, int green, int blue); +#endif + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief , . +//! +//! @param color , . txColors, RGB() +//! @param thickness +//! +//! @return - true, - false. +//! +//! @see txColor(), txGetColor(), txFillColor(), txGetFillColor(), txColors, RGB() +//! +//! @usage @code +//! txSetColor (TX_RED); +//! txSetColor (RGB (255, 128, 0), 5); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txSetColor (COLORREF color, double thickness = 1); + +//! @cond INTERNAL +#define txSetColour txSetColor +//! @endcond + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param red [0; 1] +//! @param green [0; 1] +//! @param blue [0; 1] +//! +//! @return - true, - false. +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor() +//! +//! @usage @code +//! txColor (1.0, 1.0, 0.0); // + = +//! txColor (1.0, 0.5, 0.25); // +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txColor (double red, double green, double blue); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @return , . txColors, RGB() +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB() +//! +//! @usage @code +//! COLORREF color = txGetColor(); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +COLORREF txGetColor(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param color , . txColors, RGB() +//! +//! @return - true, - false. +//! +//! @see txFillColor(), txGetFillColor(), txColor(), txGetColor(), txColors, RGB() +//! +//! @usage @code +//! txSetFillColor (TX_RED); +//! txSetFillColor (RGB (255, 128, 0)); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txSetFillColor (COLORREF color); + +//! @cond INTERNAL +#define txSetFillColour txSetFillColor +//! @endcond + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param red [0; 1] +//! @param green [0; 1] +//! @param blue [0; 1] +//! +//! @return - true, - false. +//! +//! @see txSetFillColor(), txGetFillColor(), txSetColor(), txGetColor() +//! +//! @usage @code +//! txFillColor (1.0, 0.5, 0.25); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txFillColor (double red, double green, double blue); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @return , . txColors, RGB() +//! +//! @see txSetFillColor(), txGetFillColor(), txSetColor(), txGetColor(), txColors, RGB() +//! +//! @usage @code +//! COLORREF color = txGetFillColor(); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +COLORREF txGetFillColor(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! , +//! . +//! +//! @param mode +//! +//! @return , . txColors, RGB() +//! +//! @title : +//! @table @tr R2_COPYPEN @td = ( :) +//! @tr R2_NOTCOPYPEN @td = ~ +//! @tbr +//! @tr R2_BLACK @td = ( ) +//! @tr R2_WHITE @td = ( ) +//! @tr R2_NOT @td = ~ ( ) +//! @tbr +//! @tr R2_XORPEN @td = ^ ( , c. ) +//! @tr R2_NOTXORPEN @td = ~ ( ^ ) +//! @tbr +//! @tr R2_MASKPEN @td = & +//! @tr R2_NOTMASKPEN @td = ~ ( & ) +//! @tr R2_MASKNOTPEN @td = & ~ +//! @tr R2_MASKPENNOT @td = ~ & +//! @tbr +//! @tr R2_MERGEPEN @td = | +//! @tr R2_NOTMERGEPEN @td = ~ ( | ) +//! @tr R2_MERGENOTPEN @td = | ~ +//! @tr R2_MERGEPENNOT @td = ~ | +//! @tbr +//! @tr R2_NOP @td . +//! @endtable +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() +//! +//! @usage @code +//! txSetColor (TX_WHITE, 5); // +//! txSetROP2 (R2_XORPEN); // R2_XORPEN +//! +//! txLine (100, 100, 200, 200); // - +//! txSleep (1000); +//! txLine (100, 100, 200, 200); // - ( ) +//! +//! txSetROP2 (R2_COPYPEN); // +//! txLine (100, 100, 200, 200); // - +//! +//! txLine (100, 100, 200, 200); // - , +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txSetROP2 (int mode = R2_COPYPEN); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief ( ) . +//! +//! @param color +//! @param component , . txColors +//! +//! @return , . txColors +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txExtractColor(), +//! txRGB2HSL(), txHSL2RGB() +//! +//! @usage @code +//! int red = txExtractColor (color, TX_RED); +//! int lightness = txExtractColor (TX_BLUE, TX_LIGHTNESS); +//! +//! . AppearText(), AppearEarth() 5 (""). +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +int txExtractColor (COLORREF color, COLORREF component); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief RGB HSL. +//! +//! @param rgbColor @strike @endstrike RGB +//! +//! @return COLORREF. +//! +//! @b RGB +//! +//! - (Red), 0 255. +//! - (Green), 0 255. +//! - (Blue), 0 255. +//! +//! @b HSL +//! +//! - (Hue), 0 255 ( 360). +//! - (Saturation), 0 255. +//! - (Lightness), 0 255. +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txExtractColor(), +//! txRGB2HSL(), txHSL2RGB() +//! +//! @usage @code +//! COLORREF hslColor = txRGB2HSL (TX_RED); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +COLORREF txRGB2HSL (COLORREF rgbColor); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief HSL RGB. +//! +//! @param hslColor HSL +//! +//! @return COLORREF. +//! +//! @b RGB +//! +//! - (Red), 0 255. +//! - (Green), 0 255. +//! - (Blue), 0 255. +//! +//! @b HSL +//! +//! - (Hue), 0 255 ( 360). +//! - (Saturation), 0 255. +//! - (Lightness), 0 255. +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txExtractColor(), +//! txRGB2HSL(), txHSL2RGB() +//! +//! @usage @code +//! int hue = 10, saturation = 128, lightness = 128; +//! COLORREF hslColor = RGB (hue, saturation, lightness); +//! txSetColor (txHSL2RGB (hslColor)); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +COLORREF txHSL2RGB (COLORREF hslColor); + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Drawing +//! @name +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @return - true, - false. +//! +//! @see txSetFillColor(), txFillColor(), txGetFillColor(), txColors, RGB() +//! +//! @usage @code +//! txClear(); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txClear(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief ( ). +//! +//! @param x - +//! @param y Y- +//! @param color , . txColors, RGB() +//! +//! @return - true, - false. +//! +//! @see txPixel(), txGetPixel(), txColors, RGB() +//! +//! @usage @code +//! txSetPixel (100, 100, TX_RED); +//! txSetPixel (100, 100, RGB (255, 128, 0)); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline bool txSetPixel (double x, double y, COLORREF color); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief ( ). +//! +//! @param x - +//! @param y Y- +//! @param red [0; 1] +//! @param green [0; 1] +//! @param blue [0; 1] +//! +//! @return - true, - false. +//! +//! @see txSetPixel(), txGetPixel() +//! +//! @usage @code +//! txSetPixel (100, 100, 1.0, 0.5, 0.25); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline bool txPixel (double x, double y, double red, double green, double blue); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief () . +//! +//! @param x - +//! @param y Y- +//! +//! @return , . txColors, RGB() +//! +//! @see txSetPixel(), txPixel(), txColors, RGB() +//! +//! @usage @code +//! COLORREF color = txGetPixel (100, 200); +//! +//! if (txGetPixel (x, y) == TX_RED) +//! CarCrash (x, y); // Mess with the red - die like the rest +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline COLORREF txGetPixel (double x, double y); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param x0 X- +//! @param y0 Y- +//! @param x1 X- +//! @param y1 Y- +//! +//! @return - true, - false. +//! +//! txSetColor(). +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() +//! +//! @usage @code +//! txLine (100, 200, 400, 500); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txLine (double x0, double y0, double x1, double y1); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param x0 X- +//! @param y0 Y- +//! @param x1 X- +//! @param y1 Y- +//! +//! @return - true, - false. +//! +//! txSetColor(), - txSetFillColor(). +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() +//! +//! @usage @code +//! txRectangle (100, 200, 400, 500); +//! +//! Win32::RoundRect (txDC(), 100, 200, 400, 500, 30, 30); // . . RoundRect MSDN.com +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txRectangle (double x0, double y0, double x1, double y1); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param points POINT +//! @param numPoints +//! +//! @return - true, - false. +//! +//! txSetColor(), - txSetFillColor(). +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() +//! +//! @usage @code +//! POINT star[5] = {{150, 300}, {200, 100}, {250, 300}, {100, 200}, {300, 200}}; +//! txPolygon (star, 5); // +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txPolygon (const POINT points[], int numPoints); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param x0 X- , +//! @param y0 Y- +//! @param x1 X- +//! @param y1 Y- +//! +//! @return - true, - false. +//! +//! txSetColor(), - txSetFillColor(). +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() +//! +//! @usage @code +//! txEllipse (100, 100, 300, 200); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txEllipse (double x0, double y0, double x1, double y1); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param x - +//! @param y Y- +//! @param r +//! +//! @return - true, - false. +//! +//! txSetColor(), - txSetFillColor(). +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() +//! +//! @usage @code +//! txCircle (100, 100, 10); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txCircle (double x, double y, double r); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param x0 X- , , (. txEllipse) +//! @param y0 Y- +//! @param x1 X- +//! @param y1 Y- +//! @param startAngle OX ( ) +//! @param totalAngle ( ) +//! +//! @return - true, - false. +//! +//! txSetColor(), - txSetFillColor(). +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() +//! +//! @usage @code +//! txArc (100, 100, 300, 200, 45, 270); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txArc (double x0, double y0, double x1, double y1, double startAngle, double totalAngle); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param x0 X- , , (. txEllipse) +//! @param y0 Y- +//! @param x1 X- +//! @param y1 Y- +//! @param startAngle OX ( ) +//! @param totalAngle ( ) +//! +//! @return - true, - false. +//! +//! txSetColor(), - txSetFillColor(). +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() +//! +//! @usage @code +//! txPie (100, 100, 300, 200, 0, 180); // Enter Pacman +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txPie (double x0, double y0, double x1, double y1, double startAngle, double totalAngle); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param x0 X- , , (. txEllipse) +//! @param y0 Y- +//! @param x1 X- +//! @param y1 Y- +//! @param startAngle OX ( ) +//! @param totalAngle ( ) +//! +//! @return - true, - false. +//! +//! txSetColor(), - txSetFillColor(). +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() +//! +//! @usage @code +//! txChord (100, 100, 300, 200, 45, 270); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txChord (double x0, double y0, double x1, double y1, double startAngle, double totalAngle); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param x - +//! @param y Y- +//! @param color (TX_TRANSPARENT - ) +//! @param mode (FLOODFILLSURFACE - ) +//! +//! @return - true, - false. +//! +//! txSetFillColor(). - +//! . +//! +//! @title : @table +//! @tr FLOODFILLSURFACE @td - , color. +//! @tr FLOODFILLBORDER @td - , color. +//! @endtable +//! +//! @see txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() +//! +//! @usage @code +//! txSetFillColor (TX_PINK); +//! txLine (100, 200, 150, 100); +//! txLine (150, 100, 200, 200); +//! txLine (200, 200, 100, 200); +//! txFloodFill (150, 150); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txFloodFill (double x, double y, COLORREF color = TX_TRANSPARENT, DWORD mode = FLOODFILLSURFACE); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief , . +//! +//! @param x1 - 1 +//! @param y1 Y- 1 +//! @param x2 - 2 +//! @param y2 Y- 2 +//! @param x3 - 3 +//! @param y3 Y- 3 +//! +//! @return - true, - false. +//! +//! @see txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txLine(), txRectangle(), txPolygon(), txEllipse(), txCircle(), txArc(), txPie(), txChord() +//! +//! @par . : +//! @ref Tutor_Params " " +//}---------------------------------------------------------------------------------------------------------------- + +bool txTriangle (double x1, double y1, double x2, double y2, double x3, double y3) + { + (void)x1; (void)y1; (void)x2; (void)y2; (void)x3; (void)y3; + + MessageBox (txWindow(), + " , \n" + " , txPolygon(). . \" \". ", + "TXLib ", MB_ICONINFORMATION); + + return false; + } + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param x - +//! @param y Y- +//! @param sizeX +//! @param sizeY ( ) +//! @param color +//! @param handL ( ) +//! @param handR ( ) +//! @param twist @a ( ) +//! @param head @a ( ) +//! @param eyes ( ) +//! @param wink (0 - , -1 - , +1 - ) +//! @param crazy ( ) +//! @param smile ( ) +//! @param hair ( ) +//! @param wind , ( ) +//! +//! @see txSetFillColor(), txColors, RGB(), txLine(), txCircle() +//! +//! @usage @code +//! txCreateWindow (800, 600); +//! +//! //-----------+---+----+-----+-----+----------+-----+-----+-----+----+----+----+-----+-----+----+----- +//! // | x | y |sizeX|sizeY| color |handL|handR|twist|head|eyes|wink|crazy|smile|hair|wind +//! //-----------+---+----+-----+-----+----------+-----+-----+-----+----+----+----+-----+-----+----+----- +//! // | | | | | | | | | | | | | | | +//! txDrawMan (125, 250, 200, 200, TX_WHITE, 0, 0, 0, 0, 0.8, 0, 0, 1.0, 0, 0); +//! txDrawMan (325, 250, 100, 200, TX_YELLOW, 0, 0, 0, 0, 0.8, 0, 0, -1.0, 2, 0); +//! txDrawMan (525, 250, 200, 100, TX_ORANGE, 0, 0, 0, 0, 1.0, 0, -1, 0.3, 1, 0); +//! txDrawMan (725, 250, 100, 100, TX_LIGHTRED, 0, 0, 0, 0, 1.0, 0, 1, -0.3, 3, 0); +//! +//! txDrawMan (125, 550, 200, 200, TX_WHITE, 0.3, 0.3, 0, 0, 0.8, -1, 1, 0.5, 2, -1); +//! txDrawMan (325, 550, 100, 200, TX_YELLOW, -0.5, -0.5, 0, 0.1, 0.8, 1, 0, -0.5, 3, 5); +//! txDrawMan (525, 550, 200, 100, TX_ORANGE, -0.5, 0.3, 0.2, 0, 0.8, -1, 1, 0.0, 10, -5); +//! txDrawMan (725, 550, 100, 100, TX_LIGHTRED, 0.3, -0.5, -0.4, 0, 0.8, 1, -1, 0.0, 1, 1); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +void txDrawMan (int x, int y, int sizeX, int sizeY, COLORREF color, double handL, double handR, double twist, + double head, double eyes, double wink, double crazy, double smile, double hair, double wind); +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Drawing text +//! @name +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param x - +//! @param y Y- +//! @param text +//! +//! @return - true, - false. +//! +//! txSetColor(), - txSetTextAlign(). +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txSelectFont(), txSetTextAign(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY() +//! +//! @usage @code +//! txTextOut (100, 100, " ."); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txTextOut (double x, double y, const char text[]); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief , . +//! +//! @param x0 X- +//! @param y0 Y- +//! @param x1 X- +//! @param y1 Y- +//! @param text +//! @param format +//! +//! @return - true, - false. +//! +//! txSetColor(), - txSetTextAlign(). +//! +//! @note , ( x0 > x1 y0 > y1). +//! +//! . MSDN (http://msdn.com), "DrawText Function (Windows)": +//! http://msdn.microsoft.com/en-us/library/dd162498%28VS.85%29.aspx. +//! +//! , +//! ( @b @c \\n). +//! +//! , , +//! , : @c DT_VCENTER ( ) @c | +//! @c DT_WORDBREAK ( ) @c | @c DT_WORD_ELLIPSIS ( , +//! ). . . +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), +//! txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY() +//! +//! @usage @code +//! txSetColor (TX_BLACK); +//! txSetFillColor (TX_DARKGRAY); Win32::RoundRect (txDC(), 105, 105, 205, 255, 30, 30); +//! txSetFillColor (TX_WHITE); Win32::RoundRect (txDC(), 100, 100, 200, 250, 30, 30); +//! +//! txSelectFont ("Arial", 20, 0, FW_BOLD); +//! txDrawText (100, 100, 200, 250, "I hate it when I'm studying " +//! "and a Velociraptor throws bananas on me.\n"); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txDrawText (double x0, double y0, double x1, double y1, const char text[], + unsigned format = DT_CENTER | DT_VCENTER | DT_WORDBREAK | DT_WORD_ELLIPSIS); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param name +//! @param sizeY ( Y) +//! @param sizeX +//! @param bold ( 0 1000) +//! @param italic +//! @param underline +//! @param strikeout +//! @param angle ( ) +//! +//! @return true. , Windows +//! @c (SYSTEM_FIXED_FONT, . MSDN). txFontExist. +//! +//! @see txTextOut(), txFontExist() +//! +//! @usage @code +//! txSelectFont ("Comic Sans MS", 40); +//! txTextOut (100, 100, " ."); +//! txSelectFont ("Comic Sans MS", 40, 10, false, true, false, true, 15); +//! txTextOut (100, 200, " - ."); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txSelectFont (const char name[], double sizeY, + double sizeX = -1, + int bold = FW_DONTCARE, + bool italic = false, + bool underline = false, + bool strikeout = false, + double angle = 0); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param text +//! +//! @return SIZE. +//! +//! @see txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY() +//! +//! @usage @code +//! SIZE size = txGetTextExtent (text); +//! txTextOut (100 + size.cx / 2, 200 + size.cy / 2, text); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +SIZE txGetTextExtent (const char text[]); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param text +//! +//! @return . +//! +//! @see txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY() +//! +//! @usage @code +//! txTextOut (100 + txGetTextExtentX (text) / 2, 200 + txGetTextExtentY (text) / 2, text); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +int txGetTextExtentX (const char text[]); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param text +//! +//! @return . +//! +//! @see txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY() +//! +//! @usage @code +//! txTextOut (100 + txGetTextExtentX (text) / 2, 200 + txGetTextExtentY (text) / 2, text); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +int txGetTextExtentY (const char text[]); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param align +//! +//! @return . +//! +//! @title : @table +//! @tr TA_BASELINE @td (X,Y) . +//! @tr TA_BOTTOM @td (X,Y) ( ). +//! @tr TA_TOP @td (X,Y) ( ). +//! @tbr +//! @tr TA_CENTER @td (X,Y). +//! @tr TA_LEFT @td (X,Y) ( ). +//! @tr TA_RIGHT @td (X,Y) ( ). +//! @endtable +//! +//! @see txTextOut(), txSelectFont(), txGetTextExtent(), txGetTextExtentX(), txGetTextExtentY() +//! +//! @usage @code +//! txSetTextAlign (TA_RIGHT); +//! txTextOut (700, 100, " ,"); +//! txTextOut (700, 150, " ."); +//! txSetTextAlign(); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +unsigned txSetTextAlign (unsigned align = TA_CENTER | TA_BASELINE); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param name +//! +//! @return LOGFONT. , NULL. +//! +//! @see txTextOut(), txSelectFont() +//! +//! @usage @code +//! if (txFontExist ("Comic Sans MS")) txSelectFont ("Comic Sans MS", 30); +//! else txSelectFont ("Times New Roman", 30); +//! +//! txTextOut (100, 100, " ?"); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +LOGFONT* txFontExist (const char name[]); + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Drawing to memory DC and image loading +//! @name ( " ") +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief ( , Device Context, DC) . +//! +//! @param sizeX +//! @param sizeY +//! @param bitmap Bitmap to be associated with DC +//! +//! @return ( , Windows) ( ). +//! +//! @warning @b txDeleteDC(). @n +//! When the program will be shutting down, TXLib will try to delete DCs which were not deleted, +//! but this is not guaranteed. +//! +//! @see txCreateWindow(), txCreateCompatibleDC(), txLoadImage(), txDeleteDC() +//! +//! @usage @code +//! HDC save = txCreateCompatibleDC (100, 100); +//! +//! txBitBlt (save, 0, 0, 100, 100, txDC(), 0, 0); // +//! +//! txTextOut (20, 20, "Boo!"); +//! txSleep (2000); +//! +//! txBitBlt (txDC(), 0, 0, 100, 100, save, 0, 0); // +//! +//! txDeleteDC (save); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +HDC txCreateCompatibleDC (double sizeX, double sizeY, HBITMAP bitmap = NULL); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief BMP. . +//! +//! @param filename BMP +//! @param imageFlags , . +//! @param loadFlags , . +//! +//! @return , . +//! ( , ..), NULL. +//! +//! @warning (" "), +//! txDeleteDC(). @n +//! When the program will be shutting down, TXLib will try to delete DCs which were not deleted, +//! but this is not guaranteed. +//! +//! @note BMP. , JPG, +//! BMP, . +//! . +//! +//! NULL, +//! . ( ), +//! , +//! . About +//! ( "Run from"). +//! +//! @note , . +//! ! @n +//! @note @a , . , +//! TX\Examples\Tennis\Tennis.cpp. +//! +//! @title : +//! @table @tr IMAGE_BITMAP @td BMP +//! @tr IMAGE_CURSOR @td +//! @tr IMAGE_ICON @td +//! @endtable +//! +//! @title : +//! @table @tr LR_CREATEDIBSECTION @td DIB (device-indepandent bitmap), +//! @tr LR_LOADFROMFILE @td ( , ) +//! @tr @td . MSDN.com, "LoadImage function". +//! @endtable +//! +//! @see txCreateWindow(), txCreateCompatibleDC(), txLoadImage(), txDeleteDC(), txBitBlt(), txAlphaBlend(), txTransparentBlt() +//! +//! @usage . TX\Examples\Tennis\Tennis.cpp. +//! @code +//! HDC background_FromTXLibHelp = txLoadImage ("Resources\\Images\\Background.bmp"); +//! +//! if (!background_FromTXLibHelp) +//! txMessageBox (" Background.bmp", ", "); +//! +//! // , - ! +//! // , . +//! // , TX\Examples\Tennis\Tennis.cpp. +//! +//! txBitBlt (txDC(), 0, 0, 800, 600, background_FromTXLibHelp, 0, 0); +//! +//! ... +//! txDeleteDC (background_FromTXLibHelp); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +HDC txLoadImage (const char filename[], unsigned imageFlags = IMAGE_BITMAP, unsigned loadFlags = LR_LOADFROMFILE); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief ( , DC) . +//! +//! @param dc . @n +//! , NULL. +//! +//! @return - true, - false. +//! +//! @see txCreateWindow(), txCreateCompatibleDC(), txLoadImage(), txDeleteDC() +//! +//! @usage . TX\Examples\Tennis\Tennis.cpp. +//! @code +//! HDC background_FromTXLibHelp = txLoadImage ("Resources\\Images\\Background.bmp"); +//! +//! if (!background_FromTXLibHelp) +//! txMessageBox (" Background.bmp, .", "Oh, not now"); +//! +//! // . txLoadImage! +//! +//! txBitBlt (txDC(), 0, 0, 800, 600, background_FromTXLibHelp, 0, 0); +//! +//! ... +//! txDeleteDC (background_FromTXLibHelp); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- +//@ { + +bool txDeleteDC (HDC dc); + +//! @cond INTERNAL +bool txDeleteDC (HDC* dc); +//! @endcond + +//@ } +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief ( , DC) . +//! +//! @param dest ( ) +//! @param xDest - - +//! @param yDest Y- - +//! @param width +//! @param height +//! @param src ( ) +//! @param xSrc - - +//! @param ySrc Y- - +//! @param rOp +//! +//! @return - true, - false. +//! +//! @warning NULL, . +//! - . +//! . . +//! +//! @title : +//! @table @tr SRCCOPY @td :) - +//! @tbr +//! @tr BLACKNESS @td - (- ). +//! @tr WHITENESS @td - (- ). +//! @tr DSTINVERT @td - (- ). +//! @tr PATCOPY @td -. +//! @tbr +//! @tr MERGECOPY @td = & . +//! @tr MERGEPAINT @td = ~ | +//! @tr NOTSRCCOPY @td = ~ +//! @tr NOTSRCERASE @td = ~ ( | ) +//! @tr PATINVERT @td = ^ +//! @tr PATPAINT @td = ( | ~) | +//! @tr SRCAND @td = & +//! @tr SRCERASE @td = ~ & +//! @tr SRCINVERT @td = ^ +//! @tr SRCPAINT @td = | +//! @endtable +//! +//! @see txAlphaBlend(), txTransparentBlt(), txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB() +//! +//! @usage . TX\Examples\Tennis\Tennis.cpp. +//! @code +//! HDC background_FromTXLibHelp = txLoadImage ("Resources\\Images\\Background.bmp"); +//! +//! if (!background_FromTXLibHelp) +//! (" Background.bmp, , .", "Once again :("); +//! +//! // . txLoadImage! +//! +//! txBitBlt (txDC(), 0, 0, 800, 600, background_FromTXLibHelp, 0, 0); +//! +//! ... +//! txDeleteDC (background_FromTXLibHelp); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txBitBlt (HDC dest, double xDest, double yDest, double width, double height, + HDC src, double xSrc = 0, double ySrc = 0, DWORD rOp = SRCCOPY); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief ( , DC) +//! . +//! +//! @param dest ( ) +//! @param xDest - - +//! @param yDest Y- - +//! @param width , +//! @param height , +//! @param src ( ) +//! @param xSrc - - +//! @param ySrc Y- - +//! @param transColor , +//! +//! @return - true, - false. +//! +//! @warning NULL, . +//! - . +//! . . +//! +//! TransparentBlt Win32 API . txTransparentBlt +//! . If you need image scaling, use original function +//! TransparentBlt and don't mess with stupid TX-based tools. (See implementation of txTransparentBlt +//! in TXLib.h). +//! +//! @note TransparentBlt , AlphaBlend, . +//! +//! @see txBitBlt(), txTransparentBlt(), txLoadImage(), txCreateCompatibleDC() +//! +//! @usage . TX\Examples\Tennis\Tennis.cpp. +//! @code +//! HDC superman_FromTXLibHelp = txLoadImage ("Resources\\Images\\Superman.bmp"); +//! +//! if (!superman_FromTXLibHelp) +//! txMessageBox ("Cannot load superman, all the monsters will succeed (I copied them from TXLib Help)", "Sorry"); +//! +//! // . txLoadImage! +//! +//! txTransparentBlt (txDC(), 0, 0, 800, 600, superman_FromTXLibHelp, 0, 0); +//! +//! // : +//! Win32::TransparentBlt (txDC(), 0, 0, 800, 600, superman_FromTXLibHelp, 0, 0, 80, 60, -1); // 10- +//! // Win32 GDI, TXLib'! :) . TransparentBlt MSDN.com. +//! +//! ... +//! txDeleteDC (superman_FromTXLibHelp); // So pity :( But he was only a copy from TXLib Help. +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txTransparentBlt (HDC dest, double xDest, double yDest, double width, double height, + HDC src, double xSrc = 0, double ySrc = 0, COLORREF transColor = TX_BLACK); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief ( , DC) +//! . +//! +//! @param dest ( ) +//! @param xDest - - +//! @param yDest Y- - +//! @param width , +//! @param height , +//! @param src ( ). 32- - (. ). +//! @param xSrc - -, . +//! @param ySrc Y- -, . +//! @param alpha , - (0 - , 1 - -). +//! +//! @return - true, - false. +//! +//! @warning NULL, . +//! - . +//! . . +//! +//! - - . +//! +//! @note txLoadImage() 32- RGBA-. +//! (A, -) +//! . 24- (TrueColor RGB) txAlphaBlend . +//! +//! - , , Adobe Photoshop, " (New Channel)" +//! (Channels). - , - +//! . ( R, G, B) +//! , , . . - +//! TX\Examples\Tennis\Tennis.cpp ( : TX\Examples\Tennis\Resources\Images\Racket.bmp). +//! +//! , R,G,B -: R,G,B *= A. : +//! +//! - - 0 ( ), +//! R,G,B 0 ( ). +//! - - 255 ( ), +//! R,G,B . +//! - -, . +//! +//! Photoshop Image @d Apply Image : +//! @table @tr Source: @td +//! @tr Layer: @td Background +//! @tr @b Channel: @td Alpha 1 +//! @tr Blending: @td Multiply +//! @tr Opacity: @td 100% +//! @endtable +//! +//! @note AlphaBlend Win32 API . txAlphaBlend +//! . If you still need image scaling, use original function AlphaBlend +//! and don't mess with stupid TX-based tools. (See implementation of txAlphaBlend in TXLib.h). +//! +//! @see txBitBlt(), txTransparentBlt(), txLoadImage(), txCreateCompatibleDC() +//! +//! @usage . TX\Examples\Tennis\Tennis.cpp. +//! @code +//! HDC batman_FromTXLibHelp = txLoadImage ("Resources\\Images\\Batman.bmp"); +//! +//! if (!batman_FromTXLibHelp) +//! txMessageBox ("Call to Batman failed because I copied it from TXLib Help", "Do save yourself"); +//! +//! // . txLoadImage! +//! +//! txAlphaBlend (txDC(), 0, 0, 800, 600, batman_FromTXLibHelp, 0, 0); +//! +//! ... +//! txDeleteDC (batman_FromTXLibHelp); // Don't worry, batman will return in "Batman returns" movie, later... +//! ... +//! +//! return batman_FromTXLibHelp; // ...and there he comes -- in TXLib copy form +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txAlphaBlend (HDC dest, double xDest, double yDest, double width, double height, + HDC src, double xSrc = 0, double ySrc = 0, double alpha = 1.0); +//! @} +//} + +//================================================================================================================= +//{ Utility functions +//! @name +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param time . +//! +//! @return , . +//! +//! @note , +//! txBegin(). +//! +//! @see txBegin(), txEnd(), txUpdateWindow() +//! +//! @usage @code +//! txSleep (500); // : +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +double txSleep (double time); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief , . +//! +//! txEnd(). +//! +//! , txSleep(), +//! , . +//! +//! @warning . . +//! +//! @note Alt+PrintScreen, . +//! +//! @return ( 0, ). +//! +//! @see txEnd(), txSleep(), txUpdateWindow(), txTextCursor() +//! +//! @usage @code +//! txBegin(); // "" +//! txSetFillColor (TX_WHITE); +//! txClear(); // txBegin() +//! txSetFillColor (TX_RED); +//! txRectangle (100, 100, 200, 200); +//! txEnd(); // +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline int txBegin(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief , txBegin(). +//! +//! @warning txBegin() , +//! txEnd(). +//! +//! @note Alt+PrintScreen, . +//! +//! @return ( 0, ). +//! +//! @see txBegin(), txSleep(), txUpdateWindow(), txTextCursor() +//! +//! @usage @code +//! txBegin(); // "" +//! txSetFillColor (TX_WHITE); +//! txClear(); // txBegin() +//! txSetFillColor (TX_RED); +//! txRectangle (100, 100, 200, 200); +//! txEnd(); // +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline int txEnd(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Service +//! @brief . +//! +//! @param update (true - , false - ). +//! +//! @return . +//! +//! txBegin() txEnd(), " +//! ", txUpdateWindow() +//! . +//! +//! . txBegin(), txEnd() txSleep(). +//! +//! @see txBegin(), txEnd(), txSleep(), txUpdateWindow(), txTextCursor(), txLock(), txUnlock(), txGDI() +//! +//! @usage @code +//! txUpdateWindow (false); +//! ... +//! txUpdateWindow(); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline int txUpdateWindow (int update = true); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Service +//! @brief GDI. +//! +//! @param obj GDI +//! +//! @return - true, - false. +//! +//! @see txSetColor(), txGetColor(), txSetFillColor(), txGetFillColor(), txColors, RGB(), txSelectFont() +//! +//! @usage @code +//! HPEN pen = CreatePen (PS_DASH, 1, RGB (255, 128, 0)); +//! txSelectObject (pen); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txSelectObject (HGDIOBJ obj); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Service +//! @brief . . . +//! +//! @return - true, - false. +//! +//! , , +//! @a . @strike @endstrike +//! , . +//! +//! @see txCreateWindow(), txSleep() +//! +//! @usage @code +//! int main() +//! { +//! txCreateWindow (800, 600); +//! +//! txSetTextAlign (TA_CENTER); +//! txTextOut (txGetExtentX()/2, txGetExtentY()/2, "Press any key to exit!"); +//! @endcode +// +// +--<<< , . ! [F3] " " +// | +// v +// txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture(); +//! @code txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture(); +//! return 0; +//! } +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +// +--<<< __ , __. ! [F3] " " +// | +// v +bool txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief TXLib. +//! +//! @return - true, - false. +//! +//! @warning TXLib, main() . +//! @b , @b . +//! +//! @see txCreateWindow() +//! +//! @usage @code +//! txDestroyWindow(); // Farewell to the world +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txDestroyWindow(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @return ( ) . +//! +//! @see txSleep() +//! +//! @usage @code +//! if (txQueryPerformance() < 1) printf (" "); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +double txQueryPerformance(); + +//! @} +//} + +//================================================================================================================= +//{ Mouse functions +//! @name +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Mouse +//! @brief ! +//! +//! @return POINT. +//! +//! @see txMouseX(), txMouseY(), txMousePos(), txMouseButtons() +//! +//! @usage @code +//! RECT area = { 100, 100, 110, 110 }; +//! +//! while (txMouseButtons() != 1) +//! { +//! if (In (txMousePos(), area)) txTextOut (100, 100, "What are you doing here?!"); +//! txSleep (0); +//! } +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline POINT txMousePos(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Mouse +//! @brief - ! +//! +//! @return - . +//! +//! @see txMouseX(), txMouseY(), txMousePos(), txMouseButtons() +//! +//! @usage @code +//! while (txMouseButtons() != 1) +//! { +//! txCircle (txMouseX(), txMouseY(), 20); +//! txSleep (0); +//! } +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline int txMouseX(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Mouse +//! @brief Y- ! +//! +//! @return Y- . +//! +//! @see txMouseX(), txMouseY(), txMousePos(), txMouseButtons() +//! +//! @usage @code +//! while (txMouseButtons() != 1) +//! { +//! txCircle (txMouseX(), txMouseY(), 20); +//! txSleep (0); +//! } +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline int txMouseY(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Mouse +//! @brief ! +//! +//! @return ! +//! +//! 1- () , +//! 2- - . @n +//! , 3 ( 11) . +//! +//! @see txMouseX(), txMouseY(), txMousePos(), txMouseButtons() +//! +//! @usage @code +//! while (txMouseButtons() != 3) +//! { +//! if (txMouseButtons() & 1) txCircle (txMouseX(), txMouseY(), 20); +//! if (txMouseButtons() & 2) txLine (txMouseX(), txMouseY(), 0, 0); +//! txSleep (0); +//! } +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline int txMouseButtons(); + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Console functions +//! @name +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param colors . +//! +//! @return - true, - false. +//! +//! @b - (colorText) (colorBackground), : @nn +//! colors = colorText + colorBackground * 16 @nn +//! @nn +//! colors = colorText | (colorBackground \<\< 4) @nn +//! @b , @ref txColors "TX_..." +//! , RGB(), txSetColor(), txColor(), txSetFillColor(), txFillColor() .. +//! . . +//! +//! @title +//! @table @tr Dec @td @c Hex @td @td Dec @td @c Hex @td +//! @tbr +//! @tr 0 = @td @c 0x0 @td = , @td 8 = @td @c 0x8 @td = -, +//! @tr 1 = @td @c 0x1 @td = , @td 9 = @td @c 0x9 @td = -, +//! @tr 2 = @td @c 0x2 @td = , @td 10 = @td @c 0xA @td = -, +//! @tr 3 = @td @c 0x3 @td = -, @td 11 = @td @c 0xB @td = --, +//! @tr 4 = @td @c 0x4 @td = , @td 12 = @td @c 0xC @td = -, +//! @tr 5 = @td @c 0x5 @td = , @td 13 = @td @c 0xD @td = -, +//! @tr 6 = @td @c 0x6 @td = -, @td 14 = @td @c 0xE @td = , +//! @tr 7 = @td @c 0x7 @td = , @td 15 = @td @c 0xF @td = . +//! @endtable +//! +//! : , , +//! , @c 0x1e ( - 4 - , +//! - 4 - ). +//! +//! @see txTextCursor(), txGetConsoleAttr(), txSetConsoleCursorPos(), txGetConsoleCursorPos(), +//! txGetConsoleFontSize(), txClearConsole() +//! +//! @usage @code +//! txSetConsoleAttr (0x1E); +//! printf (" 0x1 0xE"); // (c) . +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txSetConsoleAttr (unsigned colors = 0x07); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @return . . txSetConsoleAttr(). +//! +//! @see txTextCursor(), txSetConsoleAttr(), txSetConsoleCursorPos(), txGetConsoleCursorPos(), +//! txGetConsoleFontSize(), txClearConsole() +//! +//! @usage @code +//! unsigned attr = txGetConsoleAttr(); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +unsigned txGetConsoleAttr(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @return - true, - false. +//! +//! ( ) . +//! +//! @see txTextCursor(), txSetConsoleAttr(), txGetConsoleAttr(), txGetConsoleCursorPos(), +//! txGetConsoleFontSize(), txClearConsole() +//! +//! @usage @code +//! txClearConsole(); // , +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txClearConsole(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param x X- . +//! @param y Y- . +//! +//! @return POINT. +//! +//! @note . , +//! . , +//! . . txGetConsoleFontSize(). +//! +//! @see txTextCursor(), txSetConsoleAttr(), txGetConsoleAttr(), txGetConsoleCursorPos(), +//! txGetConsoleFontSize(), txClearConsole() +//! +//! @usage @code +//! txSetConsoleCursorPos (txGetExtentX(), txGetExtentY()); // +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +POINT txSetConsoleCursorPos (double x, double y); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @return POINT. +//! +//! @see txTextCursor(), txSetConsoleAttr(), txGetConsoleAttr(), txSetConsoleCursorPos(), +//! txGetConsoleFontSize(), txClearConsole() +//! +//! @usage @code +//! POINT pos = txGetConsoleCursorPos(); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +POINT txGetConsoleCursorPos(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @return , POINT. +//! +//! @see txTextCursor(), txSetConsoleAttr(), txGetConsoleAttr(), txSetConsoleCursorPos(), +//! txGetConsoleFontSize(), txClearConsole() +//! +//! @usage @code +//! POINT size = txGetConsoleFontSize(); +//! txSetConsoleCursorPos (5 * size.x, 10 * size.y); // +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +POINT txGetConsoleFontSize(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Drawing +//! @brief . +//! +//! @param blink false - +//! +//! @return . +//! +//! @see txSetConsoleAttr(), txGetConsoleAttr(), txSetConsoleCursorPos(), txGetConsoleCursorPos(), +//! txGetConsoleFontSize(), txClearConsole(), txCreateWindow(), txUpdateWindow(), txLock(), txUnlock(), txGDI() +//! +//! @usage @code +//! txTextCursor (false); +//! ... +//! txTextCursor(); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txTextCursor (bool blink = true); + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Other staff not related to drawing +//! @name , +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief . +//! +//! @param filename . NULL - . +//! @param mode +//! +//! @return - true, - false. +//! +//! @title : @table +//! @tr SND_ASYNC @td . @n +//! , txPlaySound (NULL). +//! @tr SND_SYNC @td . +//! @tr SND_LOOP @td . @n +//! , txPlaySound (NULL). +//! @tbr +//! @tr SND_NODEFAULT @td , . +//! @tr SND_NOSTOP @td - , . +//! @tr SND_APPLICATION @td , , . +//! @endtable +//! +//! @note WAV. (MP3 .) . +//! , txLoadImage(). +//! +//! @usage @code +//! txPlaySound ("tada.wav"); // So happy that this always exists +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txPlaySound (const char filename[] = NULL, DWORD mode = SND_ASYNC); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief MessageBox. +//! +//! @param text +//! @param header +//! @param flags +//! +//! @return , MessageBox. +//! +//! @warning _TX_BIGBUFSIZE , @d _TX_BIGBUFSIZE , +//! . +//! +//! @note txMessageBox (text, header, flags) Win32 +//! MessageBox (txWindow(), text, header, flags). txMessageBox , +//! -, , +//! UNICODE. , Windows +//! , UNICODE. +//! @c txMessageBox . +//! +//! @see TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txNotifyIcon() +//! +//! @usage @code +//! if (txMessageBox ("?", " ", MB_YESNO) == IDYES) +//! { +//! MessageBox (txWindow(), " MessageBox()", "Win32 ", 0); +//! } +//! else +//! txMessageBox (" . . ."); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +unsigned txMessageBox (const char* text, const char* header = "TXLib ", unsigned flags = 0); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief . +//! +//! @param flags +//! @param title +//! @param format , printf(). +//! +//! @title : +//! @table @tr @c NIIF_INFO @td +//! @tr @c NIIF_WARNING @td +//! @tr @c NIIF_ERROR @td +//! @endtable +//! +//! @return . +//! +//! printf() . +//! +//! @warning +//! - , Internet Explorer @c (_WIN32_IE) +//! 0x0500. TXLib.h @c windows.h . +//! @c (\#define) . +//! Internet Explorer , Windows +//! (, @c shell32.dll @c comctl32.dll), +//! ). Internet Explorer +//! . +//! - _TX_BUFSIZE , . +//! +//! @see TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox() +//! +//! @usage @code +//! int hours = 3, minutes = 10; +//! const char station[] = ""; +//! ... +//! txNotifyIcon (NIIF_INFO, " ", +//! " %s %d:%d.", station, hours, minutes); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +bool txNotifyIcon (unsigned flags, const char title[], const char format[], ...) _TX_CHECK_FORMAT (3); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief . +//! +//! @param format , printf(). +//! +//! @return . +//! +//! printf() OutputDebugString(). +//! -, , +//! DbgView. +//! , @c '\\a' (. ), . :( +//! @note +//! - @c '\\a', txMessageBox(). +//! - @c '\\f', printf(). +//! +//! @warning _TX_BIGBUFSIZE , . +//! +//! @see TX_ERROR(), TX_DEBUG_ERROR(), txNotifyIcon(), txMessageBox() +//! +//! @usage @code +//! int x = 42; +//! ... +//! txOutputDebugPrintf (" , %d.", x); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +int txOutputDebugPrintf (const char format[], ...) _TX_CHECK_FORMAT (1); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief +//! +//! @param arr +//! +//! @return ( ). +//! +//! sizearr() , , +//! . +//! +//! SIZEARR() , +//! . +//! , , +//! . +//! +//! @warning SIZEARR() , , +//! , SIZEARR(). . . +//! +//! @note Microsoft Visual Studio 6 sizearr() - , +//! . :( +//! +//! @usage @code +//! void test() +//! { +//! // , , +//! // . 4 ( POINT). +//! +//! POINT coord[] = { {110, 110}, {120, 120}, {130, 110}, {140, 120} }; +//! +//! // , .. . +//! +//! for (int i = 0; i < sizearr (coord) - 1; i++) +//! txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y); +//! +//! DrawLines1 (coord); // . +//! DrawLines2 (coord, sizearr (coord)); // . +//! +//! DrawLines3 (coord); // , , . +//! } +//! +//! // DrawLines1 DrawLines2 : +//! +//! void DrawLines1 (const POINT coord[]) +//! { +//! // . : +//! // 1) sizearr , . +//! // 2) SIZEARR , , +//! // .. sizeof (POINT*) / sizeof (POINT) == 4/8 == 0. +//! +//! for (int i = 0; i < sizearr (coord) - 1; i++) +//! txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y); +//! } +//! +//! void DrawLines2 (const POINT coord[], int n) +//! { +//! // n, . +//! +//! for (int i = 0; i < n - 1; i++) +//! txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y); +//! } +//! +//! // HIC SVNT TEMPLATES +//! +//! template +//! void DrawLines3 (const POINT (&coord) [size]) +//! { +//! for (int i = 0; i < size - 1; i++) +//! txLine (coord[i].x, coord[i].y, coord[i+1].x, coord[i+1].y); +//! } +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- +//! @{ + +#ifndef _MSC_VER_6 + + #define sizearr( arr ) ( sizeof (get_size_of_an_array_with_unknown_or_nonconst_size_ (arr)) ) + + //! @cond INTERNAL + // See explanation here: http://blogs.msdn.com/b/the1/archive/2004/05/07/128242.aspx + + template char (&get_size_of_an_array_with_unknown_or_nonconst_size_ (T (&) [N])) [N]; // ;) + + //! @endcond + +#endif + +//! sizearr() Microsoft Visual Studio 6 + +#define SIZEARR( arr ) ( sizeof (arr) / sizeof (0[arr]) ) + +//! @} +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief , [a; b] +//! +//! @param x +//! @param a () +//! @param b () +//! +//! @return a <= x && x <= b, , - +//! +//! @usage @code +//! while (txMouseButtons() != 1) +//! { +//! if (In (txMouseX(), 110, 120)) txTextOut (100, 100, "Meet the wall!"); +//! txSleep (0); +//! } +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +template +inline bool In (T x, T a, T b); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief , pt rect +//! +//! @param pt POINT {x, y} +//! @param rect RECT {left, top, right, bottom} +//! +//! @return +//! +//! , . +//! +//! @usage @code +//! RECT button = { 100, 100, 150, 120 }; +//! +//! txSetFillColor (TX_LIGHTGRAY); +//! txRectangle (button.left, button.top, button.right, button.bottom); +//! +//! txSetTextAlign(); +//! txSetFillColor (TX_WHITE); +//! txTextOut (125, 115, "Cookie"); +//! +//! for (;;) +//! { +//! if (In (txMousePos(), button)) +//! { +//! txSetFillColor (TX_TRANSPARENT); +//! txRectangle (button.left, button.top, button.right, button.bottom); +//! +//! if (txMouseButtons()) +//! { +//! txSetFillColor (TX_DARKGRAY); +//! txRectangle (button.left, button.top, button.right, button.bottom); +//! +//! txSetFillColor (TX_WHITE); +//! txTextOut (125, 115, "You got cookie"); +//! +//! break; +//! } +//! } +//! +//! txSleep (0); +//! } +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- +//! @{ + +inline bool In (const POINT& pt, const RECT& rect); + +inline bool In (const COORD& pt, const SMALL_RECT& rect); + +//! @} +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief +//! +//! @param range (@b ). +//! +//! @return [0; range). +//! +//! , ? :) +//! +//! @usage @code +//! char message[100] = "Maybe..."; +//! sprintf ("You SUDDENLY got %d bucks now. But note that tax rate is $%d.", random (100), 100); +//! txMessageBox (message, "Lottery"); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline int random (int range); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief +//! +//! @param left (@b ). +//! @param right (@b ). +//! +//! @return [left; right]. +//! +//! , ? :) +//! +//! @usage @code +//! int money = random (-100, +100); +//! if (money < 0) +//! { +//! char message[100] = "Maybe..."; +//! sprintf (" ? %d ", -money); +//! txMessageBox (message, "!"); +//! } +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline double random (double left, double right); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief +//! +//! @param a :) +//! @param b :) +//! +//! @return a b +//! +//! @see MIN() +//! +//! @usage @code +//! if (MAX (3, 7) != 7) printf ("Your CPU is broken, throw it away."); +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#define MAX( a, b ) ( (a) > (b) ? (a) : (b) ) + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief +//! +//! @param a :) +//! @param b :) +//! +//! @return a b +//! +//! @see MAX() +//! +//! @usage @code +//! if (MIN (3, 7) != 3) printf ("Your CPU is still broken, throw it away twice."); +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#define MIN( a, b ) ( (a) < (b) ? (a) : (b) ) + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief +//! +//! @param x +//! +//! @return , @c int +//! +//! @usage @code +//! double weight = 5.5; // 5.5 kilos is the weight of Maru in 2012. +//! int Maru = ROUND (weight); // Should use ROUND() because Maru is so round. +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L // C99 case + + #define ROUND( x ) ( (int) round (x) ) + +#else + + #define ROUND( x ) ( (int) floor ((x) + 0.5) ) + +#endif + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief +//! +//! @usage @code +//! if (txPI == 1) txMessageBox (" .", "", MB_ICONSTOP); +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +const double txPI = asin (1.0) * 2; + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief . +//! +//! @param x +//! +//! @return , , +//! +//! @note , : txSqr() @d " ". +//! , ( , ), +//! , , . +//! txSqr() - , . , , . +//! . . +//! +//! @usage @code +//! printf ("\n" "\t\t" " \n\n"); +//! +//! for (double r = 100; r > 0; r--) +//! { +//! printf ("%6.2lf...", r); +//! +//! double square = M_PI * txSqr (r); // ! +//! printf ("\b\b\b \t"); +//! +//! printf ("%-.2lf\n", square); +//! } +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +inline +double txSqr (double x) + { + double sqr = pow (sqrt (x) * sqrt (x), sqrt (4.0)); // + + char str[1024] = ""; + _snprintf_s (str, sizeof (str), " %g!" "!!" "!!" " ???? ", sqr); + txMessageBox (str, " !" "!!", MB_ICONEXCLAMATION | MB_YESNO) != IDNO || + ( + txMessageBox ("...", " ", MB_ICONINFORMATION), + txMessageBox (" ", " ...", MB_ICONSTOP), + exit (EXIT_FAILURE), 0 + ); + + txNotifyIcon (1, NULL, "\n%s\n", " ! \0" // , ? + " ... \0" // + " \0" // + " - \0" // ?.. + ", \0" + " ?\0" + GetTickCount() % 6 * 21); + + return sqr; // . + } + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief , +//! +//! @param type +//! +//! @return @p type, ( - ). +//! +//! @usage @code +//! void f (POINT p); +//! ... +//! +//! POINT z = {}; f (z); // ZERO +//! +//! f (ZERO (POINT)); // ZERO +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#define ZERO( type ) zero () + +//! @cond INTERNAL +template inline T zero(); +//! @endcond + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief ( @c __finally) +//! +//! @param param_t +//! @param param +//! @param func ( ) +//! +//! @par TX_AUTO_FUNC (param_t, param, func) +//! @note +//! - @a . +//! - @c param_t @c param , +//! . +//! . +//! - : TX_FINALLY +//! +//! @warning Microsoft Visual Studio 6 2003 (Debug) , +//! . MS KB Article 199057. +//! @c _TX_AUTO_FUNC, . @c TX_AUTO_FUNC. +//! +//! @par tx_auto_func (func) +//! @note +//! - @a . +//! - @a . . +//! - - @c C++0x, MSVS 2010 +//! GCC 4.5 @c -std=c++0x @c -std=c++11. +//! - : tx_finally +//! +//! @see txAutoLock +//! +//! @usage @code +//! void f1() +//! { +//! int x = 1; +//! TX_AUTO_FUNC (int, x, $(x)); // Will be printed at return +//! +//! FILE* f = fopen (__FILE__".o.txt", "w"); // Will be closed at return +//! TX_AUTO_FUNC (FILE*, f, fclose (f)); +//! +//! fprintf (f, "start: x = %d\n", x); // Do some job +//! x = 2; // Do some job +//! } +//! +//! void f2() // Do the same. For C++0x only +//! { +//! int x = 1; +//! tx_auto_func ($(x)); // More simple usage +//! +//! FILE* f = fopen (__FILE__".o.txt", "w"); +//! tx_auto_func (fclose (f)); // More simple usage +//! +//! fprintf (f, "start: x = %d\n", x); +//! x = 2; +//! } +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- +//! @{ + +//{ C++03 version + +#define TX_AUTO_FUNC( param_t, param, func ) \ + _TX_AUTO_FUNC( __LINE__, param_t, param, func ) + +#define _TX_AUTO_FUNC( n, param_t, param, func ) \ + _TX_AUTO_FUN2( n, param_t, param, func ) + +#define _TX_AUTO_FUN2( n, param_t, param, func ) \ + struct _TX_AUTO_FUNC_##n \ + { \ + typedef _TX_AUTO_FUNC_##n this_t; \ + param_t& param; \ + \ + _TX_AUTO_FUNC_##n (param_t& __p) : param (__p) { } \ + ~_TX_AUTO_FUNC_##n () { func; } \ + \ + private: this_t& operator= (const this_t&) { return *this; } \ + } \ + _TX_AUTO_FUNC_##n (param) +//} + +//{ C++0x version, use MSVS 2010 or GCC v.4.5+ and -std=c++0x in command line + +#define tx_auto_func( func ) _tx_auto_fun1 ( __LINE__, func ) +#define _tx_auto_fun1( n, func ) _tx_auto_fun2 ( n, func ) +#define _tx_auto_fun2( n, func ) auto _tx_auto_func_##n = _tx_auto_func ([&]() { func; }) + +template +struct _tx_auto_func_ + { + typedef _tx_auto_func_ this_t; + T func_; + + _tx_auto_func_ (T func) : func_ (func) {} + ~_tx_auto_func_ () { func_(); } + + private: this_t& operator= (const this_t&) { return *this; } + }; + +template +_tx_auto_func_ _tx_auto_func (T func) + { + return _tx_auto_func_ (func); + } +//} + +//{ Compatibility + +#define TX_FINALLY( param_t, param, func ) TX_AUTO_FUNC (param_t, param, func) +#define tx_finally( func ) tx_auto_func (func) + +//} + +//! @} + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief assert(), txMessageBox(), +//! OutputDebugString(). +//! +//! @param cond +//! +//! @return +//! +//! , assert(), , . @n +//! , +//! . +//! +//! @warning Release ( NDEBUG) assert . @n +//! assert() , ! +//! +//! @note @c cond , +//! ( 0). +//! @note See: "JPL Institutional Coding +//! Standard for the C Programming Language", Jet Propulsion Laboratory, California Institute of +//! Technology, JPL DOCID D-60411, Ver. 1.0, March 3, 2009, page 15. +//! +//! @see asserted, verified, verify(), TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(), +//! txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__ +//! +//! @usage @code +//! assert (0 <= i && i < ARRAY_SIZE); +//! +//! FILE* input = fopen ("a.txt", "r"); +//! assert (input); +//! +//! // fgets() Release: +//! assert (fgets (str, sizeof (str) - 1, input)); +//! +//! // : +//! bool ok = (fclose (input) == 0); +//! assert (ok); +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#if !defined (NDEBUG) + #undef assert + #define assert( cond ) _txNOP ( !(cond)? (TX_ERROR ("\a" ": : " \ + ", \"%s\"." TX_COMMA #cond), \ + 0/(int)!!(cond)) : 1 ) +#else + #undef assert + #define assert( cond ) ((void) 1) + +#endif + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief . +//! +//! @return 0 +//! +//! assert(), Release . +//! +//! @note , 0 false. @n@n +//! Release ( NDEBUG) asserted . +//! +//! @see assert(), verify(), verified, TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(), +//! txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__ +//! +//! @usage @code +//! FILE* input = fopen ("a.txt", "r"); assert (input); +//! +//! // fgets() : +//! fgets (str, sizeof (str) - 1, input) asserted; +//! +//! // fgets() Release: +//! assert (fgets (str, sizeof (str) - 1, input)); +//! +//! (fclose (input) != 0) asserted; +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#if !defined (NDEBUG) + #define asserted || TX_ERROR ("\a" " .") + +#else + #define asserted || _txNOP (0) + +#endif + +#define verified asserted //!< For compatibility with assert macro + +//! @cond INTERNAL +#define TX_NEEDED asserted //!< For compatibility with earlier releases +//! @endcond + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief ( ) . +//! +//! @param expr () +//! +//! @return 1, @p expr , 0. +//! +//! , verify(), , . @n +//! , +//! . +//! +//! @note assert(), Release ( NDEBUG) +//! verify @b . +//! +//! @see verified, assert(), asserted, TX_ERROR(), TX_DEBUG_ERROR(), txOutputDebugPrintf(), txMessageBox(), +//! txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__ +//! +//! @usage @code +//! FILE* input = verify (fopen ("a.txt", "r")); +//! +//! // fgets() Release: +//! verify (fgets (str, sizeof (str) - 1, input)); +//! +//! // : +//! verify (fclose (input) == 0); +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#if !defined (NDEBUG) + #undef verify + #define verify assert + +#else + #undef verify + #define verify( expr ) ( expr ) + +#endif + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief . +//! +//! @param msg @c printf(). +//! +//! @note @c GCC ANSI ( -ansi) +//! Microsoft Visual Studio 6 2003 . +//! , , @b _ (@ref _ " ", +//! ) TX_COMMA, , TX_ERROR @d . @n +//! boost, +//! @b @c TXLib.h TX_COMMA, @c boost +//! @c boost::preprocessor, @strike +//! . @endstrike +//! +//! @return false +//! +//! @see _, TX_COMMA, assert(), asserted, verify(), verified, TX_DEBUG_ERROR(), txOutputDebugPrintf(), +//! txMessageBox(), txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__ +//! +//! @usage @code +//! TX_ERROR (" ' '. %d: '%s'", reasonNum, fileName); +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +// Variadic macros not supported in Strict ANSI mode and in MSVC prior to MSVC 8 (2005) + +#if defined (__STRICT_ANSI__) || defined (_MSC_VER) && (_MSC_VER < 1400) + #define TX_ERROR( msg ) _txError (__FILE__, __LINE__, __TX_FUNCTION__, msg) + +#else + #define TX_ERROR( ... ) _txError (__FILE__, __LINE__, __TX_FUNCTION__, __VA_ARGS__) + +#endif + +//! @cond INTERNAL +#define TX_THROW TX_ERROR //!< For compatibility with earlier releases +//! @endcond + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief . +//! +//! . TX_ERROR. +//! +//! @note Release . +//! +//! @see _, TX_COMMA, assert(), asserted, verify(), verified, TX_ERROR(), txOutputDebugPrintf(), +//! txMessageBox(), txNotifyIcon(), __TX_FILELINE__, __TX_FUNCTION__ +//! +//! @usage @code +//! TX_DEBUG_ERROR (" ' '. %d: '%s'", reasonNum, fileName); +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#if !defined (NDEBUG) + #define TX_DEBUG_ERROR TX_ERROR + +#else + #define TX_DEBUG_ERROR(m) ((void) 0) + +#endif + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief . +//! +//! @param address . +//! @param name ( 8 ). +//! +//! @note 256 . @nn +//! 0x07 (- ). +//! +//! @see TX_ERROR(), TX_DEBUG_ERROR() +//! +//! @usage @code +//! const char text[] = " - "; +//! txDump (text); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +void txDump (const void* address, const char name[] = "txDump()"); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief , - . +//! +//! @note TX_COMMA . +//! +//! @see TX_ERROR(), TX_DEBUG_ERROR() +//! +//! @usage @code +//! TX_ERROR (" : ' ', '%s', %d" _ fileName _ lineNum); +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- +//! @{ + +#define _ , +#define TX_COMMA , //!< _ (@ref _ " ") + +//! @} + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#if defined (__GNUC__) + #define __TX_COMPILER__ "GNU g++ " TX_PREPROCESS (__GNUC__) "." \ + TX_PREPROCESS (__GNUC_MINOR__) "." \ + TX_PREPROCESS (__GNUC_PATCHLEVEL__) \ + ", std=" TX_PREPROCESS (__cplusplus) +#elif defined (_MSC_VER) + #define __TX_COMPILER__ "MSVS " TX_PREPROCESS (_MSC_VER) \ + ", std=" TX_PREPROCESS (__cplusplus) + +#elif defined (__INTEL_COMPILER) + #define __TX_COMPILER__ "Intel C++ " TX_PREPROCESS (__INTEL_COMPILER) \ + ", std=" TX_PREPROCESS (__cplusplus) + +#else + #define __TX_COMPILER__ "Unknown C++, std=" TX_PREPROCESS (__cplusplus) + +#endif + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief , , . +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#define __TX_FILELINE__ __FILE__ " (" TX_PREPROCESS (__LINE__) ")" + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief +//! +//! @warning , __TX_FUNCTION__ +//! . +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#if defined (__GNUC__) + #define __TX_FUNCTION__ __PRETTY_FUNCTION__ + +#elif defined (__FUNCSIG__) + #define __TX_FUNCTION__ __FUNCSIG__ + +#elif defined (__FUNCTION__) + #define __TX_FUNCTION__ __FUNCTION__ + +#elif defined (__INTEL_COMPILER) && (__INTEL_COMPILER >= 600) + #define __TX_FUNCTION__ __FUNCTION__ + +#elif defined (__BORLANDC__) && (__BORLANDC__ >= 0x550) + #define __TX_FUNCTION__ __FUNC__ + +#elif defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901) + #define __TX_FUNCTION__ __func__ + +#elif defined (__PYTHON__) + #error No Python. No. Using parseltongue languages can lead you to Slytherin. + +#else + #define __TX_FUNCTION__ "(" __TX_FILELINE__ ")" + +#endif + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#if !defined (NDEBUG) && defined (_DEBUG) + #define _TX_BUILDMODE "DEBUG" + +#elif !defined (NDEBUG) && !defined (_DEBUG) + #define _TX_BUILDMODE "Debug" + +#elif defined (NDEBUG) + #define _TX_BUILDMODE "Release" +#endif + +//! @{ @cond INTERNAL + +#define TX_PREPROCESS( sym ) _TX_QUOTE (sym) +#define _TX_QUOTE( sym ) #sym + +//! @endcond + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief TXLib, . +//! +//! @note TXLib.h. +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#if !defined (_TX_MODULE) + #define _TX_MODULE "TXLib" +#endif + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Back-hole (I hope, not an ass-hole:) of the library) +//! @name +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Service +//! @brief Windows ( ) +//! TXLib. +//! +//! @param wndProc TXLib. @n +//! NULL, . +//! +//! @return TXLib. +//! +//! @b TXLib. +//! : +//! @code +//! LRESULT CALLBACK NewWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam); +//! @endcode +//! +//! @warning () , @ref +//! txCreateWindow(). @b , main(). +//! , .. " +//! " (race condition). +//! +//! @warning , 0, TXLib +//! @b . - , , . +//! Alt-Ctrl-Del , +//! Process Explorer. +//! , Win32 (. MSDN), +//! DefWindowProc(). +//! +//! @note SetWindowLong SetWindowLongPtr: +//! @code +//! WNDPROC OldWndProc = (WNDPROC) SetWindowLongPtr (txWindow(), GWL_WNDPROC, (LONG_PTR) NewWndProc); +//! @endcode +//! CallWindowProc, (. MSDN), +//! , . +//! +//! @see txCreateWindow(), txDialog, txInputBox() +//! +//! @usage @code +//! LRESULT CALLBACK MyWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam); +//! +//! int main() +//! { +//! txCreateWindow (GetSystemMetrics (SM_CXSCREEN) / 4, GetSystemMetrics (SM_CYSCREEN) / 4); +//! +//! txSetWindowsHook (MyWndProc); +//! +//! txDrawText (0, 0, txGetExtentX(), txGetExtentY(), "MOV txWindow, eax [please]"); +//! +//! return 0; +//! } +//! +//! LRESULT CALLBACK MyWndProc (HWND window, UINT message, WPARAM wParam, LPARAM lParam) +//! { +//! if (message == WM_MOVE) txMessageBox (" I like to MOVe it, MOVe it", "TXLib 2 Real", MB_ICONINFORMATION); +//! +//! static int i = 0; +//! if (i++ % 10 == 0) printf ("\b" "%c", "-\\|/" [i/10 % 4]); // +//! +//! return 0; // TXLib +//! } +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +WNDPROC txSetWindowsHook (WNDPROC wndProc = NULL); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Service +//! @brief ( ). +//! +//! @param wait +//! +//! @return +//! +//! Win32 GDI txLock() +//! txUnlock(). , ( , +//! Win32: WM_PAINT) TXLib +//! . - . +//! +//! txLock() EnterCriticalSection(), , , +//! . , +//! . txSleep() Sleep() +//! . +//! +//! txLock() / txUnlock() - . +//! txBegin() / txEnd() / txUpdateWindow(), , +//! . +//! +//! @see txDC(), txLock(), txUnlock(), txGDI() +//! +//! @usage . _txCanvas_OnPAINT() _txConsole_Draw() TXLib.h. +//}---------------------------------------------------------------------------------------------------------------- + +bool txLock (bool wait = true); + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Service +//! @brief +//! +//! @return ( false). +//! +//! . txLock(). +//! +//! @see txDC(), txLock(), txGDI() +//! +//! @usage . _txCanvas_OnPAINT() _txConsole_Draw() TXLib.h. +//}---------------------------------------------------------------------------------------------------------------- +//! @{ + +bool txUnlock(); + +//! @cond INTERNAL +template inline T txUnlock (T value); +//! @endcond + +//! @} + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Service +//! @brief Win32 GDI . +//! +//! @param command GDI (, ) +//! +//! @return , GDI. , +//! false. +//! +//! @note (txDC() NULL), GDI , txGDI() +//! false. @n +//! +//! @note GDI , , +//! , txGDI() - . +//! +//! @see txDC(), txLock(), txUnlock() +//! +//! @usage @code +//! txGDI (( Rectangle (txDC(), x1, y1, x2, y2) )); // (()) +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#define txGDI( command ) txUnlock ( (txLock(), (command)) ) + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Tune-up constants and variables +//! @name +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief TXLib +//! +//! \#define @a TXLib.h , +//! ( @c main) @b . +//! +//! @note : +//! - , +//! - _TX_CP (1251) , +//! - , +//! - stdio iostream , +//! , +//! - ( 0, ..), +//! - , +//! - , +//! - , , +//! - , . @nn +//! +//! @note , EXE- TXLib txCreateWindow(), +//! . @b DLL @b . @nn +//! +//! @note (not thread-safe). +//! +//! @see txCreateWindow(), _TX_ALLOW_KILL_PARENT, _TX_WAITABLE_PARENTS, _txConsoleMode +//! +//! @usage @code +//! #define _TX_NOINIT +//! #include "TXLib.h" +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#if defined (_TX_NOINIT) + + #undef _TX_NOINIT + #define _TX_NOINIT 1 + +#else + + #define _TX_NOINIT 0 + +#endif + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief . ShowWindow. +//! +//! : @c SW_HIDE @d . +//! +//! @note @b . +//! +//! @see _TX_NOINIT +//! +//! @usage @code +//! _txConsoleMode = SW_HIDE; // +//! txCreateWindow (800, 600); +//! +//! _txConsoleMode = SW_SHOW; // +//! txCreateWindow (800, 600); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +unsigned _txConsoleMode = SW_HIDE; + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief . +//! +//! @note +//! - @b . +//! +//! @usage @code +//! _txWindowStyle &= ~WS_CAPTION; // FullScreen: , +//! txCreateWindow (GetSystemMetrics (SM_CXSCREEN), GetSystemMetrics (SM_CYSCREEN)); +//! +//! printf (" Alt+F4\n"); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +unsigned _txWindowStyle = WS_POPUP | WS_BORDER | WS_CAPTION | WS_SYSMENU; + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief +//! @note @b . +//}---------------------------------------------------------------------------------------------------------------- + +const char* _txConsoleFont = "Lucida Console"; + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief () +//}---------------------------------------------------------------------------------------------------------------- + +unsigned _txCursorBlinkInterval = 500; + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief () +//! @note @b . +//}---------------------------------------------------------------------------------------------------------------- + +int _txWindowUpdateInterval = 25; + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief () +//}---------------------------------------------------------------------------------------------------------------- + +#if !defined (TX_TRACE) + const int _TX_TIMEOUT = 1000 + +#else + const int _TX_TIMEOUT = 5000 + +#endif + +#if defined (_TX_USE_DEVPARTNER) + * 10 +#endif + ; + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief TXLib +//}---------------------------------------------------------------------------------------------------------------- + +const unsigned _TX_BUFSIZE = 1024; + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief TXLib +//}---------------------------------------------------------------------------------------------------------------- + +const unsigned _TX_BIGBUFSIZE = 2048; + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief , TXLib. +//! +//! TXLib , TXLib +//! . ( , TXLib, +//! .) +//! +//! . , +//! . +//! +//! TXLib.h . +//! +//! @see _TX_ALLOW_KILL_PARENT, _TX_NOINIT +//}---------------------------------------------------------------------------------------------------------------- + + // TX_VEGETABLE_PRINTERS +#if !defined (_TX_WAITABLE_PARENTS) + #define _TX_WAITABLE_PARENTS "cmd.exe:devenv.exe, " /* MSVS 2003-2010 */ \ + "vcspawn.exe:msdev.exe, " /* MSVS 6 */ \ + "cb_console_runner.exe:codeblocks.exe, " /* CodeBlocks 8-10 */ \ + "cmd.exe:console_runner.exe, " /* CodeBlocks 1 */ \ + "starter.exe:eclipse.exe, " /* Eclipse 4 */ \ + "starter.exe:javaw.exe, " /* Eclipse 3 */ \ + "consolepauser.exe:devcpp.exe" /* Dev-Cpp */ +#endif + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief , TXLib. +//! +//! , TXLib, +//! . +//! +//! , , _TX_WAITABLE_PARENTS. +//! +//! TXLib.h . +//! +//! . TXLib.h. +//! +//! @see _TX_WAITABLE_PARENTS, _TX_NOINIT +//! +//! @usage @code +//! #define _TX_ALLOW_KILL_PARENT false +//! #include "TXLib.h" +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +#if !defined (_TX_ALLOW_KILL_PARENT) // DISCLAIMER: ! +#define _TX_ALLOW_KILL_PARENT true // . +#endif // - . + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Internal diagnostics +//! @name +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief / . +//! +//! TX_TRACE, (statement). +//! . +//! +//! OutputDebugString(), +//! -, , +//! DbgView. , TX_TRACE TXLib.h . +//! +//! @warning @b , Microsoft Visual Studio. +//! DbgView (. ) , +//! - Visual Studio. +//! +//! _TX_ALLOW_TRACE TX_TRACE TXLib.h . +//! +//! @usage @code +//! #define _TX_ALLOW_TRACE // DbgView +//! #include "TXLib.h" +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- +//! @{ + +#ifdef FOR_DOXYGEN_ONLY +#define _TX_ALLOW_TRACE +#endif + +#if defined (_TX_ALLOW_TRACE) + #undef $ + #define $ { _txFile = __FILE__; _txLine = __LINE__; _txFunc = __TX_FUNCTION__; TX_TRACE; } + #undef $1 + #define $1 _txFuncEntry __txFuncEntry; $ + +#elif defined (_DEBUG) + #undef $ + #define $ { _txFile = __FILE__; _txLine = __LINE__; _txFunc = __TX_FUNCTION__; } + #undef $1 + #define $1 _txFuncEntry __txFuncEntry; $ + +#else + #undef $ + #define $ ; + #undef $1 + #define $1 ; + +#endif + +//! @} + +//{---------------------------------------------------------------------------------------------------------------- + +//! @cond _OFF + +extern int _txInitialized; +extern unsigned volatile _txMainThreadId; +extern unsigned volatile _txCanvas_ThreadId; +extern bool _txConsole; +extern bool _txMain; +extern bool _txIsDll; +extern bool volatile _txRunning; +extern bool volatile _txExit; +extern bool volatile _txAllowTrace; + +extern const char* volatile _txFile; +extern int volatile _txLine; +extern const char* volatile _txFunc; +extern _TX_THREAD int volatile _txInTX; + +//! @endcond + +//! @cond INTERNAL + +struct _txFuncEntry + { + _txFuncEntry() { _txInTX++; } + ~_txFuncEntry() { _txInTX--; } + }; + +//! @endcond +//}---------------------------------------------------------------------------------------------------------------- + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Technical +//! @brief OutputDebugString(). +//! +//! OutputDebugString(), +//! -, , +//! DbgView. "" TX\Dev\DbgView.ini, DbgView +//! Edit/Filter/Load (Ctrl+L). +//! +//! TX_TRACE TXLib. +//! TXLib, _TX_ALLOW_TRACE TXLib.h . +//! TXLib . +//! +//! TX_TRACE . , , +//! TXLib. , - . +//! +//! @usage @code +//! int main() +//! { +//! ... +//! TX_TRACE // DbgView +//! ... +//! } +//! @endcode +//! @code +//! #define TX_TRACE printf (__TX_FILELINE__ "\n"); +//! #include "TXLib.h" +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- +//! @{ + +#ifdef FOR_DOXYGEN_ONLY +#define TX_TRACE +#endif + +#if !defined (TX_TRACE) + #define TX_TRACE if (_txAllowTrace) _txTrace (__FILE__, __LINE__, __TX_FUNCTION__); +#endif + +//! @} + +//{---------------------------------------------------------------------------------------------------------------- + +//! @cond INTERNAL + +void _txTrace (const char file[], int line, const char func[], const char msg[] = NULL, ...); +void _txTrace (const char file[], int line, const char func[], const char msg[] /* = NULL */, ...) + { + unsigned id = GetCurrentThreadId(); + + const char marks[2][2][3] = {{"uU", "cC"}, {"mM", "??"}}; + + char mark = marks [id == _txMainThreadId] [id == _txCanvas_ThreadId] [(_txInTX > 0)]; + + char msgStr[_TX_BUFSIZE] = ""; + if (msg) + { + va_list arg; va_start (arg, msg); + _vsnprintf_s (msgStr, sizeof (msgStr) - 1 _TX_TRUNCATE, msg, arg); + va_end (arg); + } + + txOutputDebugPrintf ("%s - %p %c%c%c%c%c%c [%c] - %s (%d) " "|%*s%s" "%s%s\n", + _TX_VERSION, (void*) &_txInitialized, + "cC"[_txConsole], "mM"[_txMain], "dD"[_txIsDll], "rR"[_txRunning], "eE"[_txExit], "tT"[_txAllowTrace], + mark, (file? file : "(NULL file)"), line, (_txInTX - 1) * 2, "", (func? func : ""), + (*msgStr? ": " : ""), msgStr); + } + +//! @endcond +//}---------------------------------------------------------------------------------------------------------------- + +//================================================================================================================= +//{ Sweet critical section blocking: txAutoLock class +//================================================================================================================= + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Service +//! @brief . +//! +//! +//! , , : @d EnterCriticalSection(), +//! @d LeaveCriticalSection(). @c RAII : +//! and your thread show will always go on. +//! +//! : TryEnterCriticalSection(), , +//! , . , +//! (. @c bool). +//! +//! @note . . - :) +//! +//! @see txLock(), txUnlock(), txGDI() +//}---------------------------------------------------------------------------------------------------------------- + +//! @cond _OFF +extern CRITICAL_SECTION _txCanvas_LockBackBuf; +//! @endcond + +class txAutoLock + { + public: + +//{---------------------------------------------------------------------------------------------------------------- +//! @brief , +//! +//! @param cs +//! @param mandatory @c true, (EnterCriticalSection). @n +//! @c false, (TryEnterCriticalSection). +//! @usage @code +//! CRITICAL_SECTION cs = {}; // This is not a Counter Strike +//! +//! void foo() +//! { +//! txAutoLock lock (&cs); // EnterCriticalSection() +//! ... +//! } // LeaveCriticalsection() +//! +//! void bar() +//! { +//! txAutoLock lock (&cs, false); // TryEnterCriticalSection() +//! if (!lock) return; // +//! ... +//! } +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + + txAutoLock (CRITICAL_SECTION* cs, bool mandatory = true) : + cs_ (cs) + { +$1 if (!cs_) return; + + if (mandatory) { $ EnterCriticalSection (cs_); } + else { $ TryEnterCriticalSection (cs_)? 0 : (cs_ = NULL); } + } + +//{---------------------------------------------------------------------------------------------------------------- +//! @brief TXLib +//! +//! @param mandatory @c true, @b , @ref txLock (true). @n +//! @c false, @b , @ref txLock (false). +//! @usage @code +//! void foobar() +//! { +//! txAutoLock lock; // txLock() +//! ... +//! } // txUnlock() +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + + txAutoLock (bool mandatory = true) : + cs_ (NULL) + { +$1 new (this) txAutoLock (&_txCanvas_LockBackBuf, mandatory); + } + +//{---------------------------------------------------------------------------------------------------------------- +//! @brief , +//}---------------------------------------------------------------------------------------------------------------- + + ~txAutoLock() + { +$1 if (!cs_) return; +$ LeaveCriticalSection (cs_); cs_ = NULL; + } + +//{---------------------------------------------------------------------------------------------------------------- +//! @brief , +//! @usage . txAutoLock::AutoLock (CRITICAL_SECTION&, bool) +//}---------------------------------------------------------------------------------------------------------------- + + operator bool () const + { +$1 return (cs_ != NULL); + } + +//{---------------------------------------------------------------------------------------------------------------- +//! +//}---------------------------------------------------------------------------------------------------------------- + +// private: + CRITICAL_SECTION* cs_; + +//{---------------------------------------------------------------------------------------------------------------- +//! . +//}---------------------------------------------------------------------------------------------------------------- +//! @{ + + private: + txAutoLock (const txAutoLock&); + txAutoLock& operator = (const txAutoLock&); + +//! @} + + }; + +//} +//================================================================================================================= + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Dialogs: txDialog class +//! @name . txDialog +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Dialogs +//! @brief . +//! +//! : +//! -# ; +//! -# () txDialog::setLayout(), +//! txDialog::dialogBox(); +//! -# txDialog::dialogProc() +//! TX_BEGIN_MESSAGE_MAP(), +//! TX_END_MESSAGE_MAP, TX_COMMAND_MAP. +//! +//! @see txDialog::setLayout(), txDialog::dialogProc(), txDialog::Layout, TX_BEGIN_MESSAGE_MAP(), +//! TX_END_MESSAGE_MAP, TX_COMMAND_MAP +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +struct txDialog + { + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Dialogs +//! @brief . +//! +//! , txDialog::CONTROL. +//! +//! @see txDialog::Layout, txDialog::setLayout() +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + + public: + enum CONTROL + { + DIALOG = 0x00000000, //!< + BUTTON = 0xFFFF0080, //!< + EDIT = 0xFFFF0081, //!< + STATIC = 0xFFFF0082, //!< (, ..) + LISTBOX = 0xFFFF0083, //!< + SCROLLBAR = 0xFFFF0084, //!< + COMBOBOX = 0xFFFF0085, //!< + END = 0x00000000 //!< + }; + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Dialogs +//! @brief () +//! +//! . +//! (.rc): +//! +//! - +//! - ( +//! ) +//! - - txDialog::END {NULL} +//! +//! @see txDialog::setLayout(), txDialog::dialogBox(), txDialog::dialogProc() +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + + public: + struct Layout + { + CONTROL wndclass; //!< + const char* caption; //!< + WORD id; //!< + short x; //!< + short y; //!< + short sx; //!< X + short sy; //!< Y + DWORD style; //!< + + const char* font; //!< + WORD fontsize; //!< + }; + +//{---------------------------------------------------------------------------------------------------------------- +//! @brief . +//! +//! @see txDialog::txDialog (const txDialog::Layout*) +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + + public: + txDialog(); + +//{---------------------------------------------------------------------------------------------------------------- +//! @brief . +//! +//! @param layout +//! +//! @see txDialog::Layout, txDialog::setLayout() +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + + txDialog (const Layout* layout); + +//{---------------------------------------------------------------------------------------------------------------- +//! @brief . +//}---------------------------------------------------------------------------------------------------------------- + + virtual ~txDialog() {}; + +//{---------------------------------------------------------------------------------------------------------------- +//! @brief . +//! +//! @param layout +//! +//! @return . +//! +//! @see txDialog::Layout, txDialog::txDialog (const txDialog::Layout*), txDialog::dialogBox() +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + + const Layout* setLayout (const Layout *layout); + +//{---------------------------------------------------------------------------------------------------------------- +//! @brief . +//! +//! @param _wnd +//! @param _msg +//! @param _wParam 1- (WORD) +//! @param _lParam 2- (DWORD) +//! +//! @return false, . DialogProc MSDN. +//! +//! , +//! TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_COMMAND_MAP. +//! +//! @see txDialog::dialogBox(), TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_COMMAND_MAP +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + + virtual int dialogProc (HWND _wnd, UINT _msg, WPARAM _wParam, LPARAM _lParam); + +//{---------------------------------------------------------------------------------------------------------------- +//! @brief . +//! +//! @param layout . @n +//! - , txDialog::setLayout() +//! txDialog::txDialog (const txDialog::Layout*). +//! @param bufsize ( - ) +//! +//! @return , EndDialog(). @n +//! - (this), txDialog::dialogBox(). +//! +//! @see txDialog::dialogProc(), txDialog::setLayout(), txDialog::Layout, txDialog +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + + INT_PTR dialogBox (const Layout* layout = NULL, size_t bufsize = 0); + +//{---------------------------------------------------------------------------------------------------------------- +//! @brief . +//! +//! @param resource +//! +//! @return , EndDialog(). @n +//! - (this), txDialog::dialogBox(). +//! +//! @see txDialog::dialogProc() +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + + INT_PTR dialogBox (WORD resource); + +//{---------------------------------------------------------------------------------------------------------------- +//! @brief . +//}---------------------------------------------------------------------------------------------------------------- + + private: + txDialog (const txDialog&); + txDialog& operator = (const txDialog&); + +//{---------------------------------------------------------------------------------------------------------------- +//! ( txDialog::dialogProc(), .. in32 ). +//}---------------------------------------------------------------------------------------------------------------- + + private: + static ptrdiff_t CALLBACK dialogProc__ (HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam); + +//{---------------------------------------------------------------------------------------------------------------- +//! . +//}---------------------------------------------------------------------------------------------------------------- + + private: + const Layout* layout_; + }; + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Dialogs: Message Map macros +//! @name (Message Map) +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief (Message Map). +//! +//! @see TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#define TX_BEGIN_MESSAGE_MAP() \ + virtual int dialogProc (HWND _wnd, UINT _msg, WPARAM _wParam, LPARAM _lParam) \ + { \ + (void)_wnd; (void)_msg; (void)_wParam; (void)_lParam; \ + \ + switch (_msg) \ + { \ + case WM_NULL: + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief (Message handler) . +//! +//! @param id +//! +//! @see TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#define TX_HANDLE( id ) \ + break; \ + case (id): + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief (Command map) . +//! +//! @see TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#define TX_COMMAND_MAP \ + default: break; \ + } \ + \ + if (_msg == WM_COMMAND) switch (LOWORD (_wParam)) \ + { \ + case 0: + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief . +//! +//! @see TX_BEGIN_MESSAGE_MAP(), TX_END_MESSAGE_MAP, TX_HANDLE(), TX_COMMAND_MAP, txDialog::dialogProc(), txDialog +//! +//! @usage @code +//! C. txInputBox(). +//! @endcode +//! +//! @hideinitializer +//}---------------------------------------------------------------------------------------------------------------- + +#define TX_END_MESSAGE_MAP \ + default: break; \ + } \ + \ + return FALSE; \ + } + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Dialogs: txDialog example: txInputBox() +//! @name : txInputBox() +//================================================================================================================= +//! @{ +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Dialogs +//! @brief . +//! +//! @param text +//! @param caption +//! @param input +//! +//! @return ( ). +//! +//! @warning - , . txInputBox() +//! , +//! strcpy(). +//! +//! @see txDialog, TX_BEGIN_MESSAGE_MAP, TX_BEGIN_COMMAND_MAP, TX_HANDLE, TX_END_MESSAGE_MAP +//! +//! @usage @code +//! const char* name = txInputBox ("So what's ur name?!?!", "System", "Sorry I'm Vasya Pupkin"); +//! txMessageBox (name, "Aaand nooowww.. the winner iiis..."); +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +const char* txInputBox (const char* text = NULL, const char* caption = NULL, const char* input = NULL); + +const char* txInputBox (const char* text, const char* caption, const char* input) + { + //------------------------------------------------------------------------------------------------------------- + // , - . + // txGetModuleFileName() - EXE-, , - . + //------------------------------------------------------------------------------------------------------------- + + if (!text) text = " :"; + if (!caption) caption = txGetModuleFileName (false); + if (!input) input = ""; + + //------------------------------------------------------------------------------------------------------------- + // . GetDlgItemText(). + // , , . + // - , . , + // . + // , . , + // txDialog::dialogBox() _tx_DLGTEMPLATE_()... _ + //------------------------------------------------------------------------------------------------------------- + + #define ID_TEXT_ 101 + #define ID_INPUT_ 102 + + //------------------------------------------------------------------------------------------------------------- + // () . + // txDialog::Layout + // txDialog .rc - . + // . rc- Win32 (MSDN, http://msdn.com). + //------------------------------------------------------------------------------------------------------------- + + txDialog::Layout layout[] = + + //----------------------+----------+-----------+-----------------+--------------------------------------------- + // | | - | | + // | | |-----------------| (. + // | | | X | Y |.|.| MSDN) + //----------------------+----------+-----------+---+---+----+----+--------------------------------------------- + // | | | | | | | + {{ txDialog::DIALOG, caption, 0, 0, 0, 240, 85 }, + { txDialog::STATIC, text, ID_TEXT_, 10, 10, 150, 40, SS_LEFT }, + { txDialog::EDIT, input, ID_INPUT_, 10, 60, 220, 15, ES_LEFT | WS_BORDER | ES_AUTOHSCROLL | WS_TABSTOP }, + { txDialog::BUTTON, "&OK", IDOK, 180, 10, 50, 15, BS_DEFPUSHBUTTON | WS_TABSTOP }, + { txDialog::BUTTON, "&Cancel", IDCANCEL, 180, 30, 50, 15, BS_PUSHBUTTON | WS_TABSTOP }, + { txDialog::END }}; + + //------------------------------------------------------------------------------------------------------------- + // InputBox. , .. . + // (str) , + // Win32 ( TX_BEGIN_MESSAGE_MAP ). + // , , + // str ( DialogBoxParam + // WM_INITDIALOG). + //------------------------------------------------------------------------------------------------------------- + struct inputDlg : txDialog + { + char str [1024]; + + //--------------------------------------------------------------------------------------------------------- + + inputDlg() : + str() // . + { // , : + memset (str, 0, sizeof (str)); // + } + + //--------------------------------------------------------------------------------------------------------- + + TX_BEGIN_MESSAGE_MAP() // . . + + TX_COMMAND_MAP // WM_COMMAND. switch. + + //------------------------------------------------------------------------------------------------- + // OK str, + // .. . + // case switch. + // _wnd - , . TX_BEGIN_MESSAGE_MAP(). + //------------------------------------------------------------------------------------------------- + + TX_HANDLE (IDOK) GetDlgItemText (_wnd, ID_INPUT_, str, sizeof (str) - 1); + + TX_END_MESSAGE_MAP + + //--------------------------------------------------------------------------------------------------------- + // + //--------------------------------------------------------------------------------------------------------- + + }; + + //------------------------------------------------------------------------------------------------------------- + // , . + // " ", - + // . #undef. + // , _. + // , , . + //------------------------------------------------------------------------------------------------------------- + + #undef ID_TEXT_ + #undef ID_INPUT_ + + //------------------------------------------------------------------------------------------------------------- + // , . + //------------------------------------------------------------------------------------------------------------- + + static inputDlg dlg; + + //------------------------------------------------------------------------------------------------------------- + // layout + //------------------------------------------------------------------------------------------------------------- + + dlg.dialogBox (layout); + + //------------------------------------------------------------------------------------------------------------- + // . , + // , , . + // , . + //------------------------------------------------------------------------------------------------------------- + + return dlg.str; + } + +//! @} +//} +//================================================================================================================= + +//} +//================================================================================================================= + +//================================================================================================================= +//{ TXLIB IMPLEMENTATION +// +//================================================================================================================= +//! @cond INTERNAL + +//================================================================================================================= +//{ [Internal] Function prototypes, macros and constants +// , +//================================================================================================================= + +const int _TX_CP = 1251; // +const char _TX_LC_CTYPE[] = "Russian"; +const wchar_t _TX_LC_CTYPE_W[] = L"Russian_Russia.ACP"; + +const int _TX_IDM_ABOUT = 40000; // +const int _TX_IDM_CONSOLE = 40001; + +//----------------------------------------------------------------------------------------------------------------- + +int _txInitialize(); +void _txCleanup(); + +HWND _txCanvas_CreateWindow (SIZE* size); +inline bool _txCanvas_OK(); + +bool _txCanvas_OnCREATE (HWND wnd); +bool _txCanvas_OnDESTROY (HWND wnd); +bool _txCanvas_OnCLOSE (HWND); +bool _txCanvas_OnPAINT (HWND wnd); +bool _txCanvas_OnKEYDOWN (HWND wnd, WPARAM vk, LPARAM info); +bool _txCanvas_OnCHAR (HWND wnd, WPARAM ch, LPARAM info); +bool _txCanvas_OnTIMER (HWND wnd, WPARAM id); +bool _txCanvas_OnMOUSEMOVE (HWND wnd, WPARAM buttons, LPARAM coords); +bool _txCanvas_OnCmdCONSOLE (HWND wnd, WPARAM cmd); +bool _txCanvas_OnCmdABOUT (HWND wnd, WPARAM cmd); + +unsigned WINAPI _txCanvas_ThreadProc (void* data); +LRESULT CALLBACK _txCanvas_WndProc (HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar); + +int _txCanvas_SetRefreshLock (int count); + +HDC _txBuffer_Create (HWND wnd, const POINT* size = NULL, HBITMAP bmap = NULL); +bool _txBuffer_Delete (HDC* dc); +bool _txBuffer_Select (HGDIOBJ obj, HDC dc = txDC()); + +HWND _txConsole_Attach(); +bool _txConsole_OK(); +bool _txConsole_Detach (bool activate); +bool _txConsole_Draw (HDC dc); +bool _txConsole_SetUnicodeFont(); + +int _txSetFinishedText (HWND wnd); +void _txPauseBeforeTermination (HWND canvas); +bool _txIsParentWaitable (DWORD* parentPID = NULL); +PROCESSENTRY32* _txFindProcess (unsigned pid = GetCurrentProcessId()); +bool _txKillProcess (DWORD pid); +PROC _txSetProcAddress (HMODULE module, const char* dllName, const char* funcName, PROC newFunc); +bool _txInDll(); +int _txGetInput(); +void _tx_cexit(); + +bool _txCreateShortcut (const char shortcutName[], + const char fileToLink[], const char args[] = NULL, const char workDir[] = NULL, + const char description[] = NULL, int cmdShow = SW_SHOWNORMAL, + const char iconFile[] = NULL, int iconIndex = 0, int fontSize = 0, + COORD bufSize = ZERO (COORD), COORD wndSize = ZERO (COORD), COORD wndOrg = ZERO (COORD)); + +void* _tx_DLGTEMPLATE_Create (void* globalMem, size_t bufsize, DWORD style, DWORD exStyle, + WORD controls, short x, short y, short cx, short cy, + const char caption[], const char font[], WORD fontsize, + HANDLE menu); + +void* _tx_DLGTEMPLATE_Add (void* dlgTemplatePtr, size_t bufsize, DWORD style, DWORD exStyle, + short x, short y, short cx, short cy, + WORD id, const char wclass[], const char caption[]); + +const char* _txError (const char file[] = NULL, int line = 0, const char func[] = NULL, + const char msg[] = NULL, ...) _TX_CHECK_FORMAT (4); + +HICON _txCreateTXIcon (int size); + +void _txOnSignal (int signal = 0, int fpe = 0); +void _txOnTerminate(); +void _txOnUnexpected(); + +FARPROC _txDllImport (const char dllFileName[], const char funcName[], bool required = true); + +//----------------------------------------------------------------------------------------------------------------- + +// These are macros for __FILE__ and __LINE__ to work properly. + +#if !defined (NDEBUG) + #define _TX_IF_ARGUMENT_FAILED( cond ) if (!assert (cond) && (SetLastErrorEx (ERROR_BAD_ARGUMENTS, 0), 1)) + + #define _TX_IF_TXWINDOW_FAILED if ( !txOK() && (SetLastErrorEx (ERROR_INVALID_DATA, 0), 1) && \ + (TX_ERROR ("\a" " "), 1)) +#else + #define _TX_IF_ARGUMENT_FAILED( cond ) if (! (cond) && (SetLastErrorEx (ERROR_BAD_ARGUMENTS, 0), 1)) + + #define _TX_IF_TXWINDOW_FAILED if ( !txOK() && (SetLastErrorEx (ERROR_INVALID_DATA, 0), 1)) + +#endif + +// Take action in debug configuration only. +// Definition ({ expr; }) would be better, but some old dinosaurs (yes it is MSVC 6) reject it. So sad. :'( + +#if !defined (NDEBUG) + #define _TX_ON_DEBUG( code ) { code; } +#else + #define _TX_ON_DEBUG( code ) ; +#endif + +// This is a macro because cond is an expression and not always a function. Lack of lambdas in pre-C++0x. + +#define _txWaitFor( cond, time ) { for (DWORD _t = GetTickCount() + (time); \ + !(cond) && GetTickCount() < _t; \ + Sleep (_txWindowUpdateInterval)) ; \ + if (!(cond)) \ + _txTrace (__FILE__, __LINE__, "WARNING: Timeout: " #cond "."); } +//} +//================================================================================================================= + +//================================================================================================================= +//{ [Internal] DLL functions import +//! @name +//================================================================================================================= +//! @{ + +FARPROC _txDllImport (const char dllFileName[], const char funcName[], bool required /*= true*/) + { + _TX_IF_ARGUMENT_FAILED (!(dllFileName && !*dllFileName)) return NULL; + _TX_IF_ARGUMENT_FAILED ( funcName && *funcName) return NULL; + + HMODULE dll = GetModuleHandle (dllFileName); + if (!dll && dllFileName) dll = LoadLibrary (dllFileName); + if (!dll && required) TX_ERROR ("\a" "Cannot load library \"%s\"" _ dllFileName); + + if (!dll) return NULL; + + FARPROC addr = GetProcAddress (dll, funcName); + if (!addr && required) TX_ERROR ("\a" "Cannot import \"%s\" from library \"%s\"" _ funcName _ dllFileName); + + return addr; + } + +//----------------------------------------------------------------------------------------------------------------- +// Import helpers +// +//----------------------------------------------------------------------------------------------------------------- + +#define _TX_DLLIMPORT( lib, retval, name, params ) \ + retval (WINAPI* name) params = (retval (WINAPI*) params) _txDllImport (lib ".dll", #name, true) + +#define _TX_DLLIMPORT_OPT( lib, retval, name, params ) \ + retval (WINAPI* name) params = (retval (WINAPI*) params) _txDllImport (lib ".dll", #name, false) + +//----------------------------------------------------------------------------------------------------------------- +// Some IDEs don't link with these libs by default in console projects, so do sunrise by hand. :( +//{ + +namespace Win32 { + +#ifdef _MSC_VER_6 +struct CONSOLE_FONT_INFO; +#endif + +struct NT_CONSOLE_PROPS; +struct CONSOLE_FONT_INFOEX; + +_TX_DLLIMPORT ("GDI32", HDC, CreateCompatibleDC, (HDC dc)); +_TX_DLLIMPORT ("GDI32", HBITMAP, CreateCompatibleBitmap, (HDC dc, int width, int height)); +_TX_DLLIMPORT ("GDI32", HGDIOBJ, GetStockObject, (int object)); +_TX_DLLIMPORT ("GDI32", HGDIOBJ, SelectObject, (HDC dc, HGDIOBJ object)); +_TX_DLLIMPORT ("GDI32", HGDIOBJ, GetCurrentObject, (HDC dc, unsigned objectType)); +_TX_DLLIMPORT ("GDI32", int, GetObjectA, (HGDIOBJ obj, int bufsize, void* buffer)); +_TX_DLLIMPORT ("GDI32", DWORD, GetObjectType, (HGDIOBJ object)); +_TX_DLLIMPORT ("GDI32", BOOL, DeleteDC, (HDC dc)); +_TX_DLLIMPORT ("GDI32", BOOL, DeleteObject, (HGDIOBJ object)); +_TX_DLLIMPORT ("GDI32", COLORREF, SetTextColor, (HDC dc, COLORREF color)); +_TX_DLLIMPORT ("GDI32", COLORREF, SetBkColor, (HDC dc, COLORREF color)); +_TX_DLLIMPORT ("GDI32", int, SetBkMode, (HDC dc, int bkMode)); +_TX_DLLIMPORT ("GDI32", HFONT, CreateFontA, (int height, int width, int escapement, int orientation, + int weight, DWORD italic, DWORD underline, DWORD strikeout, + DWORD charSet, DWORD outputPrec, DWORD clipPrec, + DWORD quality, DWORD pitchAndFamily, const char face[])); +_TX_DLLIMPORT ("GDI32", int, EnumFontFamiliesExA, (HDC dc, LPLOGFONT logFont, FONTENUMPROC enumProc, + LPARAM lParam, DWORD reserved)); +_TX_DLLIMPORT ("GDI32", COLORREF, SetPixel, (HDC dc, int x, int y, COLORREF color)); +_TX_DLLIMPORT ("GDI32", COLORREF, GetPixel, (HDC dc, int x, int y)); +_TX_DLLIMPORT ("GDI32", HPEN, CreatePen, (int penStyle, int width, COLORREF color)); +_TX_DLLIMPORT ("GDI32", HBRUSH, CreateSolidBrush, (COLORREF color)); +_TX_DLLIMPORT ("GDI32", BOOL, MoveToEx, (HDC dc, int x, int y, POINT* point)); +_TX_DLLIMPORT ("GDI32", BOOL, LineTo, (HDC dc, int x, int y)); +_TX_DLLIMPORT ("GDI32", BOOL, Polygon, (HDC dc, const POINT points[], int count)); +_TX_DLLIMPORT ("GDI32", BOOL, Rectangle, (HDC dc, int x0, int y0, int x1, int y1)); +_TX_DLLIMPORT ("GDI32", BOOL, RoundRect, (HDC dc, int x0, int y0, int x1, int y1, int sizeX, int sizeY)); +_TX_DLLIMPORT ("GDI32", BOOL, Ellipse, (HDC dc, int x0, int y0, int x1, int y1)); +_TX_DLLIMPORT ("GDI32", BOOL, Arc, (HDC dc, int x0, int y0, int x1, int y1, + int xStart, int yStart, int xEnd, int yEnd)); +_TX_DLLIMPORT ("GDI32", BOOL, Pie, (HDC dc, int x0, int y0, int x1, int y1, + int xStart, int yStart, int xEnd, int yEnd)); +_TX_DLLIMPORT ("GDI32", BOOL, Chord, (HDC dc, int x0, int y0, int x1, int y1, + int xStart, int yStart, int xEnd, int yEnd)); +_TX_DLLIMPORT ("GDI32", BOOL, TextOutA, (HDC dc, int x, int y, const char string[], int length)); +_TX_DLLIMPORT ("GDI32", UINT, SetTextAlign, (HDC dc, unsigned mode)); +_TX_DLLIMPORT ("GDI32", BOOL, GetTextExtentPoint32A, (HDC dc, const char string[], int length, SIZE* size)); +_TX_DLLIMPORT ("GDI32", BOOL, ExtFloodFill, (HDC dc, int x, int y, COLORREF color, unsigned type)); +_TX_DLLIMPORT ("GDI32", BOOL, BitBlt, (HDC dest, int xDest, int yDest, int width, int height, + HDC src, int xSrc, int ySrc, DWORD rOp)); +_TX_DLLIMPORT ("GDI32", int, SetDIBitsToDevice, (HDC dc, int xDest, int yDest, DWORD width, DWORD height, + int xSrc, int ySrc, unsigned startLine, unsigned numLines, + const void* data, const BITMAPINFO* info, unsigned colorUse)); +_TX_DLLIMPORT ("GDI32", int, GetDIBits, (HDC hdc, HBITMAP hbmp, unsigned uStartScan, unsigned cScanLines, + void* lpvBits, BITMAPINFO* lpbi, unsigned usage)); +_TX_DLLIMPORT ("GDI32", BOOL, PatBlt, (HDC dc, int x0, int y0, int width, int height, DWORD rOp)); +_TX_DLLIMPORT ("GDI32", int, SetROP2, (HDC dc, int mode)); +_TX_DLLIMPORT ("GDI32", HRGN, CreateRectRgn, (int x0, int y0, int x1, int y1)); +_TX_DLLIMPORT ("GDI32", BOOL, GetBitmapDimensionEx, (HBITMAP bitmap, SIZE* dimensions)); + +_TX_DLLIMPORT ("User32", int, DrawTextA, (HDC dc, const char text[], int length, RECT* rect, unsigned format)); +_TX_DLLIMPORT ("User32", HANDLE, LoadImageA, (HINSTANCE inst, const char name[], unsigned type, + int sizex, int sizey, unsigned mode)); +_TX_DLLIMPORT_OPT ("User32", BOOL, IsHungAppWindow, (HWND wnd)); +_TX_DLLIMPORT_OPT ("User32", HWND, GhostWindowFromHungWindow,(HWND wnd)); + +_TX_DLLIMPORT ("WinMM", BOOL, PlaySound, (const char sound[], HMODULE mod, DWORD mode)); + +_TX_DLLIMPORT_OPT ("MSImg32", BOOL, TransparentBlt, (HDC dest, int destX, int destY, int destWidth, int destHeight, + HDC src, int srcX, int srcY, int srcWidth, int srcHeight, + unsigned transparentColor)); +_TX_DLLIMPORT_OPT ("MSImg32", BOOL, AlphaBlend, (HDC dest, int destX, int destY, int destWidth, int destHeight, + HDC src, int srcX, int srcY, int srcWidth, int srcHeight, + BLENDFUNCTION blending)); + +_TX_DLLIMPORT ("Kernel32", HWND, GetConsoleWindow, (void)); +_TX_DLLIMPORT_OPT ("Kernel32", BOOL, SetConsoleFont, (HANDLE con, DWORD fontIndex)); +_TX_DLLIMPORT_OPT ("Kernel32", BOOL, GetConsoleFontInfo, (HANDLE con, bool fullScr, DWORD nFonts, CONSOLE_FONT_INFO* info)); +_TX_DLLIMPORT_OPT ("Kernel32", DWORD, GetNumberOfConsoleFonts, (void)); +_TX_DLLIMPORT_OPT ("Kernel32", BOOL, GetCurrentConsoleFont, (HANDLE con, bool maxWnd, CONSOLE_FONT_INFO* curFont)); +_TX_DLLIMPORT_OPT ("Kernel32", BOOL, GetCurrentConsoleFontEx, (HANDLE con, bool maxWnd, CONSOLE_FONT_INFOEX* curFont)); +_TX_DLLIMPORT_OPT ("Kernel32", BOOL, SetCurrentConsoleFontEx, (HANDLE con, bool maxWnd, CONSOLE_FONT_INFOEX* curFont)); + +_TX_DLLIMPORT ("OLE32", HRESULT, CoInitialize, (void*)); +_TX_DLLIMPORT ("OLE32", HRESULT, CoCreateInstance, (REFCLSID clsid, LPUNKNOWN, DWORD, REFIID iid, PVOID* value)); +_TX_DLLIMPORT ("OLE32", void, CoUninitialize, (void)); + +_TX_DLLIMPORT ("Shell32", HINSTANCE,ShellExecuteA, (HWND wnd, const char operation[], const char file[], + const char parameters[], const char directory[], int showCmd)); + +_TX_DLLIMPORT_OPT ("NTDLL", char*, wine_get_version, (void)); + +_TX_DLLIMPORT_OPT ("MSVCRT", void, _cexit, (void)); + +//----------------------------------------------------------------------------------------------------------------- +// Another issue, some of structs, consts and interfaces aren't defined in MinGW some ealry headers. +// Copied from Windows SDK 7.0a. + +#ifndef AC_SRC_ALPHA +#define AC_SRC_ALPHA 0x01 +#endif + +#ifndef SMTO_ERRORONEXIT +#define SMTO_ERRORONEXIT 0x0020 +#endif + +#ifndef NT_CONSOLE_PROPS_SIG +#define NT_CONSOLE_PROPS_SIG 0xA0000002 +#endif + +#ifndef NIIF_INFO +#define NIIF_INFO 0x00000001 +#define NIIF_WARNING 0x00000002 +#define NIIF_ERROR 0x00000003 +#endif + +#ifndef NIF_INFO +#define NIF_STATE 0x00000008 +#define NIF_INFO 0x00000010 +#endif + +#pragma pack (push, 1) + +#ifdef _MSC_VER_6 + +struct CONSOLE_FONT_INFO + { + DWORD nFont; + COORD dwFontSize; + }; + +struct NOTIFYICONDATA + { + DWORD cbSize; + HWND hWnd; + UINT uID; + UINT uFlags; + UINT uCallbackMessage; + HICON hIcon; + + CHAR szTip[128]; + DWORD dwState; + DWORD dwStateMask; + CHAR szInfo[256]; + + union { + UINT uTimeout; + UINT uVersion; + } u; + + CHAR szInfoTitle[64]; + DWORD dwInfoFlags; + }; + +#endif + +struct CONSOLE_FONT_INFOEX + { + ULONG cbSize; + DWORD nFont; + COORD dwFontSize; + UINT FontFamily; + UINT FontWeight; + WCHAR FaceName[LF_FACESIZE]; + }; + +struct DATABLOCK_HEADER + { + DWORD cbSize; + DWORD dwSignature; + }; + +struct NT_CONSOLE_PROPS + { + DATABLOCK_HEADER dbh; + + WORD wFillAttribute; + WORD wPopupFillAttribute; + COORD dwScreenBufferSize; + COORD dwWindowSize; + COORD dwWindowOrigin; + DWORD nFont; + DWORD nInputBufferSize; + COORD dwFontSize; + UINT uFontFamily; + UINT uFontWeight; + WCHAR FaceName[LF_FACESIZE]; + UINT uCursorSize; + BOOL bFullScreen; + BOOL bQuickEdit; + BOOL bInsertMode; + BOOL bAutoPosition; + UINT uHistoryBufferSize; + UINT uNumberOfHistoryBuffers; + BOOL bHistoryNoDup; + + COLORREF ColorTable[16]; + }; + +#pragma pack (pop) + +#undef INTERFACE +#define INTERFACE IShellLinkDataList + +DECLARE_INTERFACE_ (IShellLinkDataList, IUnknown) + { + // *** IUnknown methods *** + STDMETHOD (QueryInterface) (THIS_ REFIID iid, void** value) PURE; + STDMETHOD_(ULONG, AddRef) (THIS) PURE; + STDMETHOD_(ULONG, Release) (THIS) PURE; + + // *** IShellLinkDataList methods *** + STDMETHOD (AddDataBlock) (THIS_ void* dataBlock) PURE; + STDMETHOD (CopyDataBlock) (THIS_ DWORD sig, void** dataBlock) PURE; + STDMETHOD (RemoveDataBlock) (THIS_ DWORD sig) PURE; + STDMETHOD (GetFlags) (THIS_ DWORD* flags) PURE; + STDMETHOD (SetFlags) (THIS_ DWORD flags) PURE; + + protected: + virtual ~IShellLinkDataList(); + }; + +const GUID IID_IShellLink = {0x000214ee, 0x0000, 0x0000, {0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}}; +const GUID IID_IShellLinkDataList = {0x45e2b4ae, 0xb1c3, 0x11d0, {0xb9,0x2f,0x00,0xa0,0xc9,0x03,0x12,0xe1}}; +const GUID IID_IPersistFile = {0x0000010b, 0x0000, 0x0000, {0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}}; + +#undef INTERFACE + +} // namespace Win32 + +#ifdef _MSC_VER_6 +using namespace Win32; +#endif + +//} + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ [Internal] Global data +//! @name +// +// , , :) +// +// TXLib.h , . +// . +// +// , . +//================================================================================================================= +//! @{ + +int _txInitialized = _TX_NOINIT || _txInitialize(); + +unsigned volatile _txMainThreadId = 0; // ID , main() + +unsigned volatile _txCanvas_ThreadId = 0; // ID , TXLib +HANDLE volatile _txCanvas_Thread = NULL; // +HWND volatile _txCanvas_Window = NULL; // TXLib + +UINT _txCanvas_RefreshTimer = 0; // Timer to redraw TXLib window +int volatile _txCanvas_RefreshLock = 0; // Blocks auto on-timer canvas update, see txBegin/txEnd + +HDC _txCanvas_BackBuf[2] = {NULL, // [0] Main working TXLib memory DC, where user picture lies + NULL}; // [1] Image ready for auto-refresh, see txCanvas_OnPAINT() +CRITICAL_SECTION _txCanvas_LockBackBuf = {0,-1}; // Prevent simultaneous access to back buffer, see txLock() + +std::vector* _txCanvas_UserDCs = NULL; // List of DCs allocated, for auto-free + +bool volatile _txConsole_IsBlinking = true; // To blink or not to blink, that is the question. + +bool _txConsole = false; // Only first TXLib module in app owns it +bool _txMain = false; // First TXLib wnd opened (closing it terminates program) +bool _txIsDll = false; // TXLib module is in DLL +bool volatile _txRunning = false; // main() is still running +bool volatile _txExit = false; // exit() is active +bool volatile _txAllowTrace = true; // Internal TX trace is active + +POINT _txMousePos = {0}; // Ask Captn Obviouos about it. See txCanvas_OnMOUSE() +int _txMouseButtons = 0; + +WNDPROC volatile _txAltWndProc = NULL; // . . txSetWindowsHook(). + +const char* volatile _txFile = NULL; // Current execution point tracking, see $ macro +int volatile _txLine = 0; +const char* volatile _txFunc = NULL; +_TX_THREAD int volatile _txInTX = 0; // We are inside one of TXLib's functions + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ TXLib engine init/check/cleanup +//! @name // TXLib +//================================================================================================================= +//! @{ + +//----------------------------------------------------------------------------------------------------------------- +//{ Early initialization +//----------------------------------------------------------------------------------------------------------------- + +int _txInitialize() + { + #if defined (_TX_ALLOC_BREAK) && defined (_MSC_VER) + _CrtSetBreakAlloc (_TX_ALLOC_BREAK); + #endif + + _TX_ON_DEBUG (OutputDebugString ("\n"); + OutputDebugString (_TX_VERSION " - The Dumb Artist Library, " _TX_AUTHOR ": \"" __FILE__ "\" " + "compiled " __DATE__ " " __TIME__ ", " _TX_BUILDMODE " mode, module: " _TX_MODULE "\n"); + OutputDebugString ("\n")); + + _txMainThreadId = GetCurrentThreadId(); + +$1 _txIsDll = _txInDll(); + +$ if (!_txIsDll) + { +$ _txConsole = ! FindAtom ("_txConsole"); // Not a thread-safe +$ (void) AddAtom ("_txConsole"); + } + +$ if (_txConsole) + { +$ _txOnSignal(); +$ SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); + + #if defined (_MSC_VER) +$ _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF); +$ _CrtSetReportMode (_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); +$ _CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW); +$ _CrtSetReportMode (_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW); +$ _CrtSetReportFile (_CRT_WARN, _CRTDBG_FILE_STDERR); +$ _CrtSetReportFile (_CRT_ERROR, _CRTDBG_FILE_STDERR); +$ _CrtSetReportFile (_CRT_ASSERT, _CRTDBG_FILE_STDERR); + #endif + + #ifndef _MSC_VER_6 +$ std::set_unexpected (_txOnUnexpected); +$ std::set_terminate (_txOnTerminate); + #endif + +$ HWND console = _txConsole_Attach(); +$ SetWindowTextA (console, txGetModuleFileName (false)); + } + +$ InitializeCriticalSection (&_txCanvas_LockBackBuf); + +$ _txCanvas_UserDCs = new std::vector ; + +#if defined (_GCC_VER) +$ _txSetProcAddress (GetModuleHandle (NULL), "MSVCRT.DLL", "_cexit", (PROC) _tx_cexit); // See _tx_cexit() +#endif + +$ atexit (_txCleanup); + +$ (void) Win32::SetDIBitsToDevice; // Just to suppress "defined but not used" warning +$ (void) Win32::GetDIBits; +$ (void) Win32::RoundRect; +$ (void) Win32::CreateRectRgn; +$ (void) Win32::GetBitmapDimensionEx; +$ (void) Win32::GetConsoleFontInfo; + +$ if (_txConsole) + { +$ txSetConsoleAttr (0x07); +$ SetLastError (0); + +$ unsigned old87 = 0, new87 = 0x0008001C; // _EM_INVALID | _EM_DENORMAL | _EM_ZERODIVIDE | _EM_OVERFLOW +$ if (_controlfp_s (&old87, 0, 0) == 0) + { $ (void) _controlfp_s (&old87, old87 & ~new87, 0x0008001F /* _MCW_EM */); } + } + +$ return 1; + } + +//} +//----------------------------------------------------------------------------------------------------------------- + +HWND txCreateWindow (double sizeX, double sizeY, bool centered /*= true*/) + { +$1 if (!_txInitialized) _txInitialized = _txInitialize(); + +$ if (txWindow()) + { +$ SetLastErrorEx (ERROR_INVALID_DATA, 0); +$ _TX_ON_DEBUG (TX_ERROR ("\a" " ")); +$ return txWindow(); + } + +$ if (!_txIsDll) + { +$ _txMain = ! FindAtom ("_txMain"); // Not a thread-safe +$ (void) AddAtom ("_txMain"); + } + +$ if (_txWindowUpdateInterval < 10) { $ _txWindowUpdateInterval = 10; } + +$ _txRunning = false; + + // Store the size + +$ static SIZE size = { ROUND (sizeX), ROUND (sizeY) }; +$ if (centered) { size.cx *= -1; size.cy *= -1; } + + // In Thread, where REAL creation lies... + + #if !( defined (_MSC_VER) && (_MSC_VER < 1400) && !defined (_MT) ) +$ unsigned id = 0; +$ _txCanvas_Thread = (HANDLE) _beginthreadex (NULL, 0, _txCanvas_ThreadProc, &size, 0, &id); + #else +$ DWORD id = 0; +$ _txCanvas_Thread = CreateThread (NULL, 0, (PTHREAD_START_ROUTINE)_txCanvas_ThreadProc, &size, 0, &id); + #endif + +$ if (!_txCanvas_Thread) return TX_DEBUG_ERROR ("\a" "Cannot start canvas thread."), (HWND)NULL; + +$ _txWaitFor (_txRunning, 30*_TX_TIMEOUT); + +$ if (!_txRunning) return TX_DEBUG_ERROR ("\a" "Cannot create canvas window."),(HWND)NULL; +$ if (!txOK()) return TX_DEBUG_ERROR ("\a" "Canvas window is not OK."), (HWND)NULL; + +$ Sleep (100); + +$ errno = _doserrno = 0; +$ SetLastError (0); + +$ return txWindow(); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txSetDefaults() + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ txUpdateWindow (false); +$ txAutoLock _lock; + +$ RECT r = {0}; + +$ GetClientRect (_txCanvas_Window, &r) asserted; +$ SIZE szCanvas = { r.right - r.left, r.bottom - r.top }; + +$ GetClientRect (Win32::GetConsoleWindow(), &r) asserted; +$ SIZE szCon = { r.right - r.left, r.bottom - r.top }; + +$ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE); + +$ CONSOLE_SCREEN_BUFFER_INFO con = {{80, 25}, {0}, 0, {0, 0, 80-1, 25-1}, {80, 25}}; +$ GetConsoleScreenBufferInfo (out, &con); + +$ SIZE szTxt = { (short) (con.srWindow.Right - con.srWindow.Left + 1), + (short) (con.srWindow.Bottom - con.srWindow.Top + 1) }; + +//{ Set defaults for graphics layer + +$ _txBuffer_Select (Win32::GetStockObject (WHITE_PEN), txDC()) asserted; +$ _txBuffer_Select (Win32::GetStockObject (WHITE_BRUSH), txDC()) asserted; + +$ _txBuffer_Select (Win32::CreateFont (szCon.cy/szTxt.cy, szCon.cx/szTxt.cx, + 0, 0, FW_REGULAR, FALSE, FALSE, FALSE, + RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, DEFAULT_PITCH, _txConsoleFont), + txDC()) asserted; + +$ (Win32::SetTextColor (txDC(), TX_WHITE) != CLR_INVALID) asserted; +$ Win32::SetBkMode (txDC(), TRANSPARENT) asserted; + +$ Win32::SetROP2 (txDC(), R2_COPYPEN) asserted; + +//} + +//{ Set defaults for console layer + +$ HGDIOBJ font = txFontExist (_txConsoleFont)? + Win32::CreateFont ((int) (1.0 * szCanvas.cy/szTxt.cy), (int) (1.0 * szCanvas.cx/szTxt.cx), + 0, 0, FW_REGULAR, FALSE, FALSE, FALSE, + RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, FIXED_PITCH, _txConsoleFont) + : + Win32::GetStockObject (SYSTEM_FIXED_FONT); + +$ _txBuffer_Select (font, _txCanvas_BackBuf[1]) asserted; +//} + +//{ Scroll the console for text to go above top of window and don't mix with graphics + +$ if (con.dwCursorPosition.X) _putch ('\n'); + +$ short delta = (short) (con.dwCursorPosition.Y - con.srWindow.Top); + +$ con.srWindow.Top = (short) (con.srWindow.Top + delta); +$ con.srWindow.Bottom = (short) (con.srWindow.Bottom + delta); + +$ SMALL_RECT src = {0, 0, (short) (con.dwSize.X - 1), (short) (con.dwSize.Y - 1) }; +$ CHAR_INFO fill = {{' '}, 0x07}; // Fill with spaces, light-gray on black +$ COORD dest = {0, (short) -delta}; // New UL-corner of src, scroll up + +$ con.dwCursorPosition.X = 0; +$ con.dwCursorPosition.Y = (short) (con.dwCursorPosition.Y - delta); + +$ (con.srWindow.Bottom < con.dwSize.Y && // Move the "window" + SetConsoleWindowInfo (out, true, &con.srWindow)) + || + (ScrollConsoleScreenBuffer (out, &src, NULL, dest, &fill), // Or scroll the buffer + SetConsoleCursorPosition (out, con.dwCursorPosition)); +//} + +$ txUpdateWindow (true); + + return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline bool txOK() + { +$1 return _txCanvas_OK(); + } + +//----------------------------------------------------------------------------------------------------------------- + +// In GCC, implicit std(MSVCRT.dll)::_cexit() call before _txCleanup leads to hands in _cexit handlers chain. +// So redefining std::_cexit(). Do it dynamically via PE Import Table hook to avoid duplicate symbols in linking +// serveral modules including TXLib.h. See _txSetProcAddress() call in _txInitialize(). + +#if defined (_GCC_VER) + +void _tx_cexit() + { +$1 _txCleanup(); + + if (Win32::_cexit) { $ Win32::_cexit(); } + +$ return; + } + +#endif + +//----------------------------------------------------------------------------------------------------------------- + +void _txCleanup() + { +$1 if (!_txInitialized) return; + else _txInitialized = false; + +$ txSleep (_txWindowUpdateInterval); + +$ _txRunning = false; +$ _txConsole_IsBlinking = false; + +$ HWND canvas = txWindow(); +$ HWND console = Win32::GetConsoleWindow(); +$ unsigned thread = GetCurrentThreadId(); + +$ HWND wnd = (canvas)? canvas : console; + +$ bool externTerm = (thread != _txMainThreadId && + thread != _txCanvas_ThreadId); +$ DWORD parent = 0; +$ bool waitableParent = !externTerm && _txIsParentWaitable (&parent); + +$ if (_txConsole) + { +$ if (_txMain) txSetConsoleAttr (0x07); +$ if (console) EnableWindow (console, true); + } + +$ if (_txMain && !externTerm && wnd != NULL) + { $ _txSetFinishedText (wnd); } + +$ if ((canvas? _txMain : _txConsole && !waitableParent) && !_txExit && + thread == _txMainThreadId) + { +$ if (wnd) + { +$ ShowWindow (wnd, SW_SHOW); +$ EnableWindow (wnd, true); +$ SetForegroundWindow (wnd); +$ BringWindowToTop (wnd); +$ RedrawWindow (wnd, NULL, NULL, RDW_INVALIDATE | RDW_INTERNALPAINT | RDW_UPDATENOW); + } + +$ if (console) + { $ _txPauseBeforeTermination (canvas); } + } + +$ if (txWindow()) + { $ SendNotifyMessage (txWindow(), WM_DESTROY, 0, 0); } + +$ _txWaitFor (!txWindow(), 5*_TX_TIMEOUT); + +$ if (!txWindow()) + { $ DeleteCriticalSection (&_txCanvas_LockBackBuf); _txCanvas_LockBackBuf = ZERO (CRITICAL_SECTION); } + +$ if (_txCanvas_Thread) + { $ CloseHandle (_txCanvas_Thread) asserted; _txCanvas_Thread = NULL; } + +$ delete _txCanvas_UserDCs; _txCanvas_UserDCs = NULL; + +$ if (_txMain && canvas && waitableParent && _txNOP (_TX_ALLOW_KILL_PARENT)) + { $ waitableParent |= !_txKillProcess (parent); } + +$ if (_txMain && _txConsole) + { $ _txConsole_Detach (waitableParent && !externTerm); } + + _TX_ON_DEBUG (OutputDebugString ("\n"); + OutputDebugString (_TX_VERSION " - FINISHED: " _TX_MODULE "\n"); + OutputDebugString ("\n")); + } + +//----------------------------------------------------------------------------------------------------------------- + +int _txSetFinishedText (HWND wnd) + { + struct tools + { + static LRESULT getWindowText (HWND window, wchar_t text[], int size) + { +$1 memset (text, 0, size * sizeof (*text)); + +$ return SendMessageTimeoutW (window, WM_GETTEXT, (WPARAM) size, (LPARAM) text, SMTO_BLOCK | SMTO_ABORTIFHUNG, _TX_TIMEOUT, NULL); + } + + static LRESULT setWindowText (HWND window, wchar_t text[]) + { +$1 return SendMessageTimeoutW (window, WM_SETTEXT, 0, (LPARAM) text, SMTO_BLOCK | SMTO_ABORTIFHUNG, _TX_TIMEOUT, NULL); + } + }; + +$1 static wchar_t title [_TX_BUFSIZE+15] = L"TXLib"; + +$ tools::getWindowText (wnd, title, _TX_BUFSIZE-1); +$ unsigned len = (unsigned) wcslen (title); if (len >= _TX_BUFSIZE) len = _TX_BUFSIZE-1; + +$ MultiByteToWideChar (_TX_CP, 0, " []", -1, title + len, _TX_BUFSIZE - len); + +$ tools::setWindowText (wnd, title); +$ tools::getWindowText (wnd, title, _TX_BUFSIZE-1); +$ if (len <= _TX_BUFSIZE-1-2 && title [len+2] == /* '' */ (wchar_t) 0x0417) return 0; + +$ MultiByteToWideChar (_TX_CP, 0, " [FINISHED]", -1, title + len, _TX_BUFSIZE - len); + +$ tools::setWindowText (wnd, title); +$ tools::getWindowText (wnd, title, _TX_BUFSIZE-1); +$ if (len <= _TX_BUFSIZE-1-2 && title [len+2] == /* 'F' */ (wchar_t) 0x0046) return 1; + +$ return 2; + } + +//----------------------------------------------------------------------------------------------------------------- + +void _txPauseBeforeTermination (HWND canvas) + { +$1 while (_kbhit()) (void)_getch(); + +$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}}; +$ bool kbRedir = !GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &con); +$ bool kbWait = (_txGetInput() == EOF); +$ bool wine = !!Win32::wine_get_version; + +$ if (kbWait && !canvas && !kbRedir && !wine) + { +$ printf ("\n" "[ ]"); + } + +$ for (int i = 1; ; i++) + { +$ Sleep (_txWindowUpdateInterval); + + if (!kbWait || (kbRedir && !canvas)) { $ break; } // No need to run and hide + + if (!wine && _txGetInput() != EOF) { $ break; } // Somebody hit something. + + if (canvas && !_txCanvas_ThreadId) { $ break; } // There was a window, and now there is not. + + if (!Win32::GetConsoleWindow()) { $ break; } // Console was destroyed + + if (Win32::GhostWindowFromHungWindow && Win32::GhostWindowFromHungWindow (canvas)) + { $ TX_ERROR (" ."); break; } + + if (canvas && Win32::IsHungAppWindow && Win32::IsHungAppWindow (canvas)) + { $ _txTrace (__FILE__, __LINE__, "WARNING: ."); break; } + + if (canvas && !SendMessageTimeout (canvas, WM_NULL, 0,0, SMTO_BLOCK | SMTO_ABORTIFHUNG, _TX_TIMEOUT, NULL)) + { $ _txTrace (__FILE__, __LINE__, "WARNING: ."); break; } + + if (!wine && !(i % 100500)) + { $ printf ("\r" "[ - ]"); } + } + +$ while (!wine && _kbhit()) (void)_getch(); + +$ printf ("\n"); + } + +//----------------------------------------------------------------------------------------------------------------- + +int _txGetInput() + { +$1 HANDLE con = GetStdHandle (STD_INPUT_HANDLE); + +$ DWORD nchars = 0; +$ if (GetConsoleMode (con, &nchars) == 0 && + PeekNamedPipe (con, NULL, 0, NULL, &nchars, NULL)) + { +$ return (nchars)? fgetc (stdin) : EOF; + } + +$ if (_kbhit()) + { +$ return _getch(); + } + +#if defined (_MSC_VER) && (_MSC_VER < 1700) + +$ if (fseek (stdin, 1, SEEK_CUR) != EOF) + { +$ (void) fseek (stdin, -1, SEEK_CUR); +$ return fgetc (stdin); // This causes blocking in MSVC 2011 beta + } + +#endif + +$ return EOF; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txIsParentWaitable (DWORD* parentPID /*= NULL*/) + { +$1 PROCESSENTRY32* info = _txFindProcess(); +$ if (!info) return false; + +$ info = _txFindProcess (info->th32ParentProcessID); +$ if (!info) return false; + +$ char parent [MAX_PATH] = ""; +$ strncpy_s (parent, info->szExeFile, sizeof (parent) - 1); +$ if (parentPID) *parentPID = info->th32ProcessID; + +$ info = _txFindProcess (info->th32ParentProcessID); // info: grandparent + +$ char list[_TX_BUFSIZE] = _TX_WAITABLE_PARENTS; +$ char* ctx = NULL; + +$ for (char* p = strtok_s (list, ", ", &ctx); p; p = strtok_s (NULL, ", ", &ctx)) + { +$ char* gp = strchr (p, ':'); + +$ if (gp) + { +$ *gp++ = 0; +$ if (_stricmp (p, parent) != 0) { continue; } + +$ if (info) if (_stricmp (gp, info->szExeFile) == 0) // Was &&, but OMG MSVC /analyze.. + { $ return true; } + } + else + { +$ if (_stricmp (p, parent) == 0) + { $ return true; } + } + } + +$ return false; + } + +//----------------------------------------------------------------------------------------------------------------- + +PROCESSENTRY32* _txFindProcess (unsigned pid /*= GetCurrentProcessId()*/) + { +$1 static PROCESSENTRY32 info = { sizeof (info) }; +$ if (!pid) return &info; + +$ HANDLE sshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); +$ assert (sshot); if (!sshot) return NULL; + +$ for (bool ok = !!Process32First (sshot, &info); ok; ok = !!Process32Next (sshot, &info)) + if (info.th32ProcessID == pid) break; + +$ CloseHandle (sshot); + +$ return &info; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txInDll() + { +$1 MODULEENTRY32 mod = { sizeof (mod) }; + +$ HANDLE sshot = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, 0); +$ assert (sshot); if (!sshot) return false; + +$ bool inDll = false; + +$ for (bool ok = !!Module32First (sshot, &mod); ok; ok = !!Module32Next (sshot, &mod)) + { +$ if (!mod.modBaseAddr) continue; + +$ IMAGE_DOS_HEADER* dosHdr = (IMAGE_DOS_HEADER*) mod.modBaseAddr; +$ IMAGE_NT_HEADERS* ntHdr = (IMAGE_NT_HEADERS*) (mod.modBaseAddr + dosHdr->e_lfanew); + +$ inDll = (dosHdr->e_magic == IMAGE_DOS_SIGNATURE && + ntHdr->Signature == IMAGE_NT_SIGNATURE && + (ntHdr->FileHeader.Characteristics & IMAGE_FILE_DLL) != 0); + +$ if (In ((BYTE*)(ptrdiff_t)_txInDll, mod.modBaseAddr, mod.modBaseAddr + mod.modBaseSize)) break; + } + +$ CloseHandle (sshot); +$ return inDll; + } + +//----------------------------------------------------------------------------------------------------------------- + +// You are here, little hacker? + +bool _txKillProcess (DWORD pid) + { +$1 _TX_IF_ARGUMENT_FAILED (pid) return false; + +$ HANDLE token = INVALID_HANDLE_VALUE; +$ OpenProcessToken (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token) asserted; + +$ LUID luid = {0}; +$ LookupPrivilegeValue (NULL, SE_DEBUG_NAME, &luid) asserted; + +$ TOKEN_PRIVILEGES priv = { 1, {{{ luid.LowPart, luid.HighPart}, SE_PRIVILEGE_ENABLED }}}; +$ TOKEN_PRIVILEGES old = {0}; + +$ DWORD oldSz = 0; +$ AdjustTokenPrivileges (token, false, &priv, sizeof (priv), &old, &oldSz) asserted; + +$ HANDLE proc = OpenProcess (PROCESS_ALL_ACCESS, 0, pid); +$ if (!proc) return false; + +$ bool ok = !!TerminateProcess (proc, 0); +$ CloseHandle (proc); + +$ return ok; + } + +//----------------------------------------------------------------------------------------------------------------- + +// TXLib continues to hack the reality to make your life better, sweeter and easier + +PROC _txSetProcAddress (HMODULE module, const char* dllName, const char* funcName, PROC newFunc) + { +$1 _TX_IF_ARGUMENT_FAILED (module) return NULL; +$ _TX_IF_ARGUMENT_FAILED (dllName) return NULL; +$ _TX_IF_ARGUMENT_FAILED (newFunc) return NULL; + +$ HMODULE dll = GetModuleHandle (dllName); +$ if (!dll) return NULL; + +$ PROC oldFunc = GetProcAddress (dll, funcName); +$ if (!oldFunc) return NULL; + + #define RVA_( type, addr ) ( (type) ((ptrdiff_t) module + (ptrdiff_t) (addr)) ) + +$ IMAGE_DOS_HEADER* dosHdr = RVA_ (IMAGE_DOS_HEADER*, 0); +$ IMAGE_NT_HEADERS* ntHdr = RVA_ (IMAGE_NT_HEADERS*, dosHdr->e_lfanew); + +$ if (dosHdr->e_magic != IMAGE_DOS_SIGNATURE || + ntHdr ->Signature != IMAGE_NT_SIGNATURE) return NULL; + +$ DWORD impOffset = ntHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; +$ IMAGE_IMPORT_DESCRIPTOR* desc = RVA_ (IMAGE_IMPORT_DESCRIPTOR*, impOffset); + +$ if (desc == (IMAGE_IMPORT_DESCRIPTOR*) ntHdr) return NULL; + +$ IMAGE_THUNK_DATA* thunk = NULL; +$ bool found = false; + + for (; desc->Name; desc++) + { +$ if (_stricmp (RVA_ (const char*, desc->Name), dllName) != 0) continue; + +$ for (thunk = RVA_ (IMAGE_THUNK_DATA*, desc->FirstThunk); thunk->u1.Function; thunk++) + if ((ptrdiff_t) thunk->u1.Function == (ptrdiff_t) oldFunc) { found = true; break; } + +$ if (found) break; + } + +$ if (!found) return NULL; + +$ *(PROC*)& thunk->u1.Function = newFunc; // In different MS-SDKs this field has different types (DWORD/DWORD*/etc) + +$ return oldFunc; + + #undef RVA_ + } + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ [Internal] TXLib window functions (_txCanvas...) +//! @name TXLib (_txCanvas...) +//================================================================================================================= + +//{ +#if defined (_MSC_VER_6) || defined (_GCC_VER) && (_GCC_VER <= 345) + + #define SetClassLong_ SetClassLong + #define GCL_HICON_ GCL_HICON + #define GCL_HICONSM_ GCL_HICONSM + #define GCL_HCURSOR_ GCL_HCURSOR + +#else + #define SetClassLong_ SetClassLongPtr + #define GCL_HICON_ GCLP_HICON + #define GCL_HICONSM_ GCLP_HICONSM + #define GCL_HCURSOR_ GCLP_HCURSOR + #endif +//} + +unsigned WINAPI _txCanvas_ThreadProc (void* data) + { +$1 _txCanvas_ThreadId = GetCurrentThreadId(); + +$ _TX_IF_ARGUMENT_FAILED (data) return false; + +$ HWND wnd = _txCanvas_CreateWindow ((SIZE*) data); +$ if (!txWindow()) return TX_DEBUG_ERROR ("\a" "Cannot create canvas"), 0; + +$ HICON icon32 = LoadIcon (GetModuleHandle (NULL), "_TX_ICON"); +$ HICON icon16 = LoadIcon (GetModuleHandle (NULL), "_TX_ICONSM"); +$ HCURSOR cursor = LoadCursor (GetModuleHandle (NULL), "_TX_CURSOR"); + +$ SetClassLong_ (wnd, GCL_HICON_, (DWORD)(ptrdiff_t) (icon32? icon32 : _txCreateTXIcon (32))); +$ SetClassLong_ (wnd, GCL_HICONSM_, (DWORD)(ptrdiff_t) (icon16? icon16 : _txCreateTXIcon (16))); +$ SetClassLong_ (wnd, GCL_HCURSOR_, (DWORD)(ptrdiff_t) (cursor? cursor : LoadCursor (NULL, IDC_ARROW))); + +$ HACCEL accel = LoadAccelerators (NULL, "_TX_ACCELERATORS"); + + _TX_ON_DEBUG (OutputDebugString (_TX_VERSION " - STARTED: " _TX_MODULE "\n")); + +$ _txRunning = true; + +$ ShowWindow (wnd, SW_SHOW); +$ SetForegroundWindow (wnd); +$ UpdateWindow (wnd); + +$ MSG msg = {0}; +$ while (GetMessage (&msg, NULL, 0, 0)) + { +$ if (!msg.hwnd) continue; + +$ if (accel != NULL && TranslateAccelerator (wnd, accel, &msg)) continue; + +$ TranslateMessage (&msg); +$ DispatchMessage (&msg); + +$ Sleep (0); + } + +$ if (icon16) DestroyIcon (icon16); // If Explorer is displaying Tray Notification, these +$ if (icon32) DestroyIcon (icon32); // calls will possibly fail, and we'll get resource leak. + +$ LeaveCriticalSection (&_txCanvas_LockBackBuf); + +$ if (_txRunning && _txMain) // Main window is destroyed but main() is still running. + { // No chances for good termination, so use exit(). +$ exit ((int) msg.wParam); + } + + _TX_ON_DEBUG (OutputDebugString (_TX_VERSION " - STOPPED: " _TX_MODULE "\n")); + +$ _txCanvas_ThreadId = 0; +$ return true; + } + +//{ +#undef SetClassLong +#undef GCL_HICON_ +#undef GCL_HICONSM_ +#undef GCL_HCURSOR_ +//} + +//----------------------------------------------------------------------------------------------------------------- + +HWND _txCanvas_CreateWindow (SIZE* size) + { +$1 _TX_IF_ARGUMENT_FAILED (size) return NULL; + +$ static char className[_TX_BUFSIZE] = ""; +$ _snprintf_s (className, sizeof (className) - 1 _TX_TRUNCATE, + "/*---[TXLib]-------------------------- " + _TX_VERSION " " __FILE__ " WndClass %08X " + "--------------------------[TXLib]---*/", (int) GetTickCount()); + +$ WNDCLASSEX wc = { sizeof (wc) }; +$ wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; +$ wc.lpfnWndProc = _txCanvas_WndProc; +$ wc.hCursor = LoadCursor (NULL, IDC_ARROW); +$ wc.hbrBackground = (HBRUSH) Win32::GetStockObject (HOLLOW_BRUSH); +$ wc.lpszClassName = className; + +$ ATOM wndclass = RegisterClassEx (&wc); +$ if (!wndclass) return TX_DEBUG_ERROR ("RegisterClass (\"%s\") failed" _ className), (HWND) NULL; + +$ int centered = false; +$ if (size->cx < 0 && size->cy < 0) { size->cx *= -1; size->cy *= -1; centered = true; } + +$ SIZE scr = { GetSystemMetrics (SM_CXSCREEN), GetSystemMetrics (SM_CYSCREEN) }; +$ RECT r = { 0, 0, size->cx, size->cy }; AdjustWindowRect (&r, _txWindowStyle, false); +$ SIZE sz = { r.right - r.left, r.bottom - r.top }; + +$ HWND wnd = CreateWindowEx (WS_EX_APPWINDOW, className, txGetModuleFileName (false), _txWindowStyle, + centered? scr.cx/2 - sz.cx/2 : CW_USEDEFAULT, + centered? scr.cy/2 - sz.cy/2 : CW_USEDEFAULT, + sz.cx, sz.cy, NULL, NULL, NULL, NULL); + +$ if (!wnd || !txWindow()) return TX_DEBUG_ERROR ("Cannot create canvas: CreateWindowEx (\"%s\") failed" _ className), (HWND) NULL; +$ HMENU menu = GetSystemMenu (txWindow(), false); +$ if (!menu) return txWindow(); + +$ AppendMenu (menu, MF_SEPARATOR, 0, NULL) asserted; +$ AppendMenu (menu, MF_STRING, _TX_IDM_CONSOLE, "Show &Console") asserted; +$ AppendMenu (menu, MF_STRING, _TX_IDM_ABOUT, "&About...") asserted; + +$ HWND console = Win32::GetConsoleWindow(); + +$ DWORD proc = 0; +$ GetWindowThreadProcessId (console, &proc); + +$ if (console && (proc == GetCurrentProcessId() || _txIsParentWaitable())) + { $ ShowWindow (console, _txConsoleMode); } + +$ CheckMenuItem (menu, _TX_IDM_CONSOLE, (console? (IsWindowVisible (console)? MF_CHECKED : 0) : MF_DISABLED)); + +$ return txWindow(); + } + +//----------------------------------------------------------------------------------------------------------------- + +inline bool _txCanvas_OK() + { +$1 return _txCanvas_ThreadId && + _txCanvas_Window && + _txCanvas_BackBuf[0] && + _txCanvas_BackBuf[1]; + } + +//----------------------------------------------------------------------------------------------------------------- + +int _txCanvas_SetRefreshLock (int count) + { +$1 int oldCount = _txCanvas_RefreshLock; + +$ _txCanvas_RefreshLock = count; + +$ HWND wnd = txWindow(); + +$ if ((_txCanvas_RefreshLock <= 0 || oldCount <= 0) && wnd) + { $ RedrawWindow (wnd, NULL, NULL, RDW_INVALIDATE | RDW_INTERNALPAINT | RDW_UPDATENOW); } + +$ return oldCount; + } + +//----------------------------------------------------------------------------------------------------------------- + +HICON _txCreateTXIcon (int size) + { +$1 _TX_IF_ARGUMENT_FAILED (size == 32 || size == 16) return NULL; + +$ const char image32 [32*32+1] = + "00000000000000000000000000000000""0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0""0F0000000000000000000000000000F0""0F0000000000000000000000000000F0" + "0F0000000000000099999999999900F0""0F0000000000000090300333330900F0""0F0000000990000090000000000900F0""0F00000099990000900BB000000900F0" + "0F0000039999000090B00090900900F0""0F0000009999000090B00999990900F0""0F00000009903799900BB090900900F0""0F000000009BB70090000010000900F0" + "0F0000000B90000090000000000900F0""0F000000B0B0000099999999999900F0""0F00007B30B0000090000000000000F0""0F00007300B0000090000000000000F0" + "0F00000000B3000090000000000000F0""0F0000000B0B000090000000000000F0""0F000000B303B00090000000000000F0""0F000003B000B00090000000000000F0" + "0F00003B00003B0090000000000000F0""0F0000300000030090000000000000F0""0F0000000448888888888844000000F0""0F00004886E6E6E60E66E6EEEE4400F0" + "0F4488866E0E60E00660E06E66EEE4F0""0F868806E06E06E666E66E00E06EE6F0""0F08606E66E0066000E006E66E00E6F0""0F8666E006600E00006600E006E00EF0" + "0F000E066888888888888888606660F0""0F66EEE6EE000E00000E00086EEEE6F0""0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0""00000000000000000000000000000000"; + +$ const char image16 [16*16+1] = + "0000000000000000""0000000999999990""0009000900000090""0099900909973090""0059700909009390""0009799909973090""0099000900000090""0959330999999990" + "0709500900000000""0095930900000000""0090393900000000""0790073900000000""0900000900000000""000EE6E6E6E6E000""0EE6E6E6E6E6EEE0""0000000000000000"; + +$ const COLORREF pal['F'-'0'+1] = { 0x000000, 0x002b2b, 0x555500, 0x005555, 0x808000, 0x008080, 0xaaaa00, 0x00aaaa, 0xd5d500, 0x00d5d5, 0,0,0,0,0,0,0, + 0xffff00, 0x00ffff, 0xffffaa, 0xaaffff, 0xd5d500, 0xffffff }; + +$ const char* image = (size == 32)? image32 : image16; + +$ POINT sz = { size, size }; +$ HDC dcMask = _txBuffer_Create (txWindow(), &sz); assert (dcMask); +$ HDC dcColor = _txBuffer_Create (txWindow(), &sz); assert (dcColor); + +$ for (int i = 0; i < size*size; i++) + { + assert (In (image[i], '0', '9') || In (image[i], 'A', 'F')); + + Win32::SetPixel (dcColor, i % size, i / size, pal [image[i] - '0']); + } + +$ ICONINFO info = { true, 0, 0, (HBITMAP) Win32::GetCurrentObject (dcMask, OBJ_BITMAP), + (HBITMAP) Win32::GetCurrentObject (dcColor, OBJ_BITMAP) }; + +$ HICON icon = CreateIconIndirect (&info); +$ assert (icon); + +$ _txBuffer_Delete (&dcMask) asserted; +$ _txBuffer_Delete (&dcColor) asserted; + +$ return icon; + } + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ [Internal] Main window event handlers (_txCanvas_On...) +//! @name (_txCanvas_On...) +//================================================================================================================= +//! @{ + +LRESULT CALLBACK _txCanvas_WndProc (HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar) + { +#ifdef _TX_ALLOW_TRACE + + _txInTX++; + + if (_txAllowTrace) _txTrace (__FILE__, __LINE__, __TX_FUNCTION__, + "%*s" "0x%X <- 0x%03X (0x%08X, 0x%08lX)", 12 - _txInTX*2, "", wnd, msg, wpar, lpar); + _txInTX--; + +#endif + +$1 if (msg == WM_KEYDOWN && wpar == VK_F12 && + GetKeyState (VK_SHIFT) && GetKeyState (VK_CONTROL) && GetKeyState (VK_MENU)) + { +$ _txCanvas_OnCmdABOUT (wnd, wpar); +$ return DefWindowProc (wnd, msg, wpar, lpar); + } + + WNDPROC altWndProc = _txAltWndProc; // Cache to prevent change from main thread + if (altWndProc) + { +$ LRESULT res = altWndProc (wnd, msg, wpar, lpar); +$ if (res) return res; + } + + switch (msg) + { + case WM_CREATE: $ _txCanvas_OnCREATE (wnd); return 0; + + case WM_CLOSE: $ if (_txCanvas_OnCLOSE (wnd)) break; else return 0; + case WM_DESTROY: $ _txCanvas_OnDESTROY (wnd); return 0; + + case WM_PAINT: $ _txCanvas_OnPAINT (wnd); return 0; + case WM_TIMER: $ _txCanvas_OnTIMER (wnd, wpar); return 0; + + case WM_KEYDOWN: $ _txCanvas_OnKEYDOWN (wnd, wpar, lpar); return 0; + case WM_CHAR: $ _txCanvas_OnCHAR (wnd, wpar, lpar); return 0; + + case WM_LBUTTONUP: + case WM_LBUTTONDOWN: + case WM_RBUTTONUP: + case WM_RBUTTONDOWN: + case WM_MBUTTONUP: + case WM_MBUTTONDOWN: + case WM_MOUSEMOVE: $ _txCanvas_OnMOUSEMOVE (wnd, wpar, lpar); return 0; + + default: break; + } + + if (msg == WM_SYSCOMMAND) switch (wpar) + { + case _TX_IDM_ABOUT: $ _txCanvas_OnCmdABOUT (wnd, wpar); return 0; + case _TX_IDM_CONSOLE: $ _txCanvas_OnCmdCONSOLE (wnd, wpar); return 0; + + default: break; + } + +$ return DefWindowProc (wnd, msg, wpar, lpar); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txCanvas_OnCREATE (HWND wnd) + { +$1 _TX_IF_ARGUMENT_FAILED (wnd) return false; + +$ _txCanvas_BackBuf[0] = _txBuffer_Create (wnd); assert (_txCanvas_BackBuf[0]); +$ _txCanvas_BackBuf[1] = _txBuffer_Create (wnd); assert (_txCanvas_BackBuf[1]); + +$ SetTimer (wnd, _txCanvas_RefreshTimer, _txWindowUpdateInterval, NULL) asserted; + +$ _txCanvas_Window = wnd; + +$ txSetDefaults(); + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txCanvas_OnDESTROY (HWND wnd) + { +$1 _TX_IF_ARGUMENT_FAILED (wnd) return false; + + // + +$ PostQuitMessage (_txRunning? WM_DESTROY : EXIT_SUCCESS); + +$ if (!_txCanvas_Window) return false; + + // Indicate that we are about to manually terminate + +$ _txExit = true; + + // Lock GDI resources + +$ bool locked = false; +$ _txWaitFor ((locked = txLock (false), locked), _TX_TIMEOUT); +$ if (!locked) TX_DEBUG_ERROR ("Cannot lock GDI to free resources"); + + // + +$ if (_txCanvas_UserDCs && _txCanvas_UserDCs->size()) + { +$ txNotifyIcon (NIIF_ERROR, NULL, " %d HDC.", (int) _txCanvas_UserDCs->size()); +$ Sleep (_TX_TIMEOUT); + +$ for (size_t i = 0; i < _txCanvas_UserDCs->size(); i++) _txBuffer_Delete (&_txCanvas_UserDCs->at (i)); +$ _txCanvas_UserDCs->clear(); + } + + // , + +$ if (_txCanvas_RefreshTimer) KillTimer (wnd, _txCanvas_RefreshTimer) asserted; + +$ if (_txCanvas_BackBuf[1]) _txBuffer_Delete (&_txCanvas_BackBuf[1]) asserted; +$ if (_txCanvas_BackBuf[0]) _txBuffer_Delete (&_txCanvas_BackBuf[0]) asserted; + +$ txUnlock(); + + // Indicate that we are destroyed + +$ _txCanvas_Window = NULL; + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txCanvas_OnCLOSE (HWND wnd) + { +$1 _TX_IF_ARGUMENT_FAILED (wnd && _txCanvas_OK()) return false; + +$ if (_txMain && _txRunning && + txMessageBox (" main() . . ? \n\n" + " , main() - .", + txGetModuleFileName (false), MB_OKCANCEL | MB_ICONSTOP) != IDOK) return false; +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txCanvas_OnTIMER (HWND wnd, WPARAM) + { +$1 _TX_IF_ARGUMENT_FAILED (wnd) return false; + +$ if (_txCanvas_RefreshLock > 0 || !_txRunning) return false; + +$ InvalidateRect (wnd, NULL, false) asserted; +$ UpdateWindow (wnd) asserted; + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txCanvas_OnPAINT (HWND wnd) + { +$1 _TX_IF_ARGUMENT_FAILED (wnd && _txCanvas_OK()) return false; + +$ bool forceRedraw = GetAsyncKeyState (VK_MENU) && GetAsyncKeyState (VK_CONTROL) && + GetAsyncKeyState (VK_SHIFT) && GetAsyncKeyState (VK_SNAPSHOT); + +$ PAINTSTRUCT ps = {0}; +$ HDC dc = BeginPaint (wnd, &ps); +$ if (!dc) return false; + +$ RECT r = {0}; +$ GetClientRect (wnd, &r) asserted; +$ POINT size = { r.right - r.left, r.bottom - r.top }; + +$ if ((_txCanvas_RefreshLock <= 0 || forceRedraw) && + txLock (false)) + { +$ Win32::BitBlt (_txCanvas_BackBuf[1], 0, 0, size.x, size.y, txDC(), 0, 0, SRCCOPY); + +$ _txConsole_Draw (_txCanvas_BackBuf[1]); + +$ txUnlock(); + } + + // Magic 100500 value is used to completely block screen refresh. + // Since no value can be 100500 or above, this condition is always true and the refresh cannot be blocked IRL. + // Do not use 100501 because it may lead to errors on some compilers and possible may crash the compilers + // themselves. + // Yes guys, with all your software installed. :( + +$ if (_txCanvas_RefreshLock != 100500) + { $ Win32::BitBlt (dc, 0, 0, size.x, size.y, _txCanvas_BackBuf[1], 0, 0, SRCCOPY); } + +$ EndPaint (wnd, &ps) asserted; + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txCanvas_OnKEYDOWN (HWND, WPARAM vk, LPARAM info) + { +$1 INPUT_RECORD evt = {0}; + +$ evt.EventType = KEY_EVENT; +$ evt.Event.KeyEvent.bKeyDown = true; +$ evt.Event.KeyEvent.wRepeatCount = 1; +$ evt.Event.KeyEvent.uChar.AsciiChar = (unsigned char) MapVirtualKey ((WORD) vk, 2); // 2 == MAPVK_VK_TO_CHAR +$ evt.Event.KeyEvent.wVirtualScanCode = (unsigned char) (info >> 16); +$ evt.Event.KeyEvent.wVirtualKeyCode = (WORD) vk; +$ evt.Event.KeyEvent.dwControlKeyState = (info & (1 << 24))? ENHANCED_KEY : 0; + +$ if (evt.Event.KeyEvent.uChar.AsciiChar) return false; // Let TranslateMessage() and WM_CHAR do the job + +$ DWORD written = 0; +$ WriteConsoleInput (GetStdHandle (STD_INPUT_HANDLE), &evt, 1, &written); + +$ return false; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txCanvas_OnCHAR (HWND, WPARAM ch, LPARAM info) + { +$1 INPUT_RECORD evt = {0}; + +$ evt.EventType = KEY_EVENT; +$ evt.Event.KeyEvent.bKeyDown = true; +$ evt.Event.KeyEvent.wRepeatCount = 1; +$ evt.Event.KeyEvent.uChar.AsciiChar = (unsigned char) (ch); +$ evt.Event.KeyEvent.wVirtualScanCode = (unsigned char) (info >> 16); +$ evt.Event.KeyEvent.wVirtualKeyCode = (WORD) MapVirtualKey ((WORD) (info >> 16), 3); // 3 == MAPVK_VSC_TO_VK_EX +$ evt.Event.KeyEvent.dwControlKeyState = 0; + +$ DWORD written = 0; +$ WriteConsoleInput (GetStdHandle (STD_INPUT_HANDLE), &evt, 1, &written); + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txCanvas_OnMOUSEMOVE (HWND, WPARAM buttons, LPARAM coords) + { +$1 _TX_IF_ARGUMENT_FAILED (_txCanvas_OK()) return false; + +$ _txMousePos.x = LOWORD (coords); +$ _txMousePos.y = HIWORD (coords); +$ _txMouseButtons = (int) buttons; + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txCanvas_OnCmdCONSOLE (HWND wnd, WPARAM cmd) + { +$1 _TX_IF_ARGUMENT_FAILED (wnd) return false; + +$ HWND console = Win32::GetConsoleWindow(); +$ if (!console) return false; + +$ bool visible = !!IsWindowVisible (console); + +$ ShowWindow (console, visible? SW_HIDE : SW_SHOW); + +$ visible = !!IsWindowVisible (console); +$ CheckMenuItem (GetSystemMenu (wnd, false), (int) cmd, visible? MF_CHECKED : MF_UNCHECKED); + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txCanvas_OnCmdABOUT (HWND, WPARAM) + { +$1 //{ Overriding the missing names, if the set is uncomplete + + #if defined (__MODULE) + #define ABOUT_NAME_ __MODULE + #else + #define ABOUT_NAME_ "TXLib" + #endif + + #if defined (__MODULE) || defined (__VERSION) || defined (__DESCRIPTION) || defined (__AUTHOR) + + #ifndef __MODULE + #define __MODULE "TXLib" "\n" "#define __MODULE to set the name.\n" + #endif + + #ifndef __VERSION + #define __VERSION "(0.000000000)." "\n" "#define __VERSION to set the string value.\n" + #endif + + #ifndef __DESCRIPTION + #define __DESCRIPTION "(, )." "\n" "#define __DESCRIPTION to override project role.\n" + #endif + + #ifndef __AUTHOR + #define __AUTHOR "( )." "\n" "#define __AUTHOR to override this name." + #endif + + #endif + //} + +$ time_t timeT = time (NULL) - clock()/CLOCKS_PER_SEC; +$ char timeS[32] = ""; +$ ctime_s (timeS, sizeof (timeS), &timeT); + +$ static char text[_TX_BUFSIZE] = ""; +$ char cwd [MAX_PATH] = ""; + +$ _snprintf_s (text, sizeof (text) - 1 _TX_TRUNCATE, + + "Application:\n" + + #if defined (__MODULE) || defined (__VERSION) || defined (__DESCRIPTION) || defined (__AUTHOR) + __MODULE " version " __VERSION "\n" __DESCRIPTION "\n" "Copyright (c) " __AUTHOR "\n" + #else + " :)\n" + "#define __MODULE to \"your program name\" before including TXLib.h to use this billboard...\n" + #endif + + "\n" "Developed with:\n\n" + "The Dumb Artist Library (TX Library) - " _TX_VERSION "\n" _TX_AUTHOR "\n" + "See license on: http://txlib.ru\n\n" + + "TXLib file:" "\t" __FILE__ "\n" + "Compiled:" "\t" __DATE__ " " __TIME__ ", " _TX_BUILDMODE ", " __TX_COMPILER__ "\n" + "Started:" "\t" "%.6s %.4s %.8s\n\n" + + "Run file:" "\t" "%s\n" + "Directory:" "\t" "%s", + + timeS + 4, timeS + 20, timeS + 11, // These offsets are ANSI standardized + txGetModuleFileName(), + _getcwd (cwd, sizeof (cwd) - 1)); + +$ txMessageBox (text, "About " ABOUT_NAME_, MB_ICONINFORMATION); + + // And a bit of HTTP-code in C++ function: + + goto http; + http://txlib.ru // See valuable refs here :) + +$ return true; + + #undef ABOUT_NAME_ + } + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ [Internal] Console-support functions (_txConsole...) +//! @name (_txConsole...) +//================================================================================================================= +//! @{ + +HWND _txConsole_Attach() + { +$1 HWND console = Win32::GetConsoleWindow(); + +$ if (!console) + { +$ FreeConsole(); +$ AllocConsole(); + } + +$ console = Win32::GetConsoleWindow(); +$ if (!console) return NULL; + + // Linux::Wine v1.2.2+ compatibility. + // Beer compatibility will be added in future versions. + // : wine . + +$ if (Win32::wine_get_version) + { +$ Win32::GetNumberOfConsoleFonts = NULL; +$ Win32::GetCurrentConsoleFont = NULL; +$ Win32::SetConsoleFont = NULL; + } + + // Windows + +$ SetConsoleCP (_TX_CP); // 1251 +$ SetConsoleOutputCP (_TX_CP); // 1251 + + // , Unicode- + // (wprintf, ...). gcc L"unicode-" + // , g++: -finput-charset=CP1251 -fexec-charset=CP1251. + +$ setlocale (LC_CTYPE, _TX_LC_CTYPE); // "Russian" +$ if (!Win32::wine_get_version) _wsetlocale (LC_CTYPE, _TX_LC_CTYPE_W); // L"Russian_Russia.ACP" + +$ static bool done = false; +$ if (done) return console; + + // . + +$ if (!Win32::wine_get_version) + { $ _txConsole_SetUnicodeFont(); } + +#ifndef _CONSOLE + + // -, subsystem != console + +$ *stdin = *_fdopen (_open_osfhandle ((DWORD)(ptrdiff_t) GetStdHandle (STD_INPUT_HANDLE), _O_TEXT), "r"); +$ fflush (stdout); *stdout = *_fdopen (_open_osfhandle ((DWORD)(ptrdiff_t) GetStdHandle (STD_OUTPUT_HANDLE), _O_TEXT), "w"); +$ fflush (stderr); *stderr = *_fdopen (_open_osfhandle ((DWORD)(ptrdiff_t) GetStdHandle (STD_ERROR_HANDLE), _O_TEXT), "w"); + +$ setvbuf (stdin, NULL, _IONBF, 0); +$ setvbuf (stdout, NULL, _IONBF, 0); +$ setvbuf (stderr, NULL, _IONBF, 0); + +$ std::ios::sync_with_stdio(); + +#endif + + // That's all, folks + +$ done = true; +$ return console; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline bool _txConsole_OK() + { +$1 return Win32::GetConsoleWindow() != NULL; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txConsole_Detach (bool activate) + { +$1 HWND console = Win32::GetConsoleWindow(); +$ if (!console) return false; + +$ EnableWindow (console, true); +$ ShowWindow (console, SW_SHOW); + +$ if (activate) + { +$ SetForegroundWindow (console); +$ BringWindowToTop (console); + } + +$ return !!FreeConsole(); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txConsole_Draw (HDC dc) + { +$1 _TX_IF_ARGUMENT_FAILED (dc) return false; + +$ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE); + +$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}}; +$ BOOL ok = GetConsoleScreenBufferInfo (out, &con); +$ if (!ok) return false; + +$ POINT size = { con.srWindow.Right - con.srWindow.Left + 1, + con.srWindow.Bottom - con.srWindow.Top + 1 }; + +$ SIZE fontSz = { 12, 16 }; +$ Win32::GetTextExtentPoint32 (dc, "W", 1, &fontSz) asserted; + +$ COLORREF pal [16] = { 0x000000, 0x800000, 0x008000, 0x808000, 0x000080, 0x800080, 0x008080, 0xC0C0C0, + 0x808080, 0xFF0000, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFF }; + +$ for (int y = 0; y < size.y; y++) + { + static char chr [_TX_BUFSIZE + 1] = ""; // [con.dwSize.X + 1]; maybe will be truncated + static WORD atr [_TX_BUFSIZE + 1] = {0}; // [con.dwSize.X + 1]; maybe will be truncated + COORD coord = { (short) (con.srWindow.Left), (short) (y + con.srWindow.Top) }; + DWORD read = 0; + + if (!ReadConsoleOutputCharacter (out, chr, SIZEARR (chr) - 1, coord, &read)) continue; + if (!ReadConsoleOutputAttribute (out, atr, SIZEARR (atr) - 1, coord, &read)) continue; + + for (int x = 0, xEnd = size.x; x < size.x; x = xEnd) + { + Win32::SetTextColor (dc, pal [ atr[x] & 0x0F]); + Win32::SetBkColor (dc, pal [(atr[x] >> 4) & 0x0F]); + Win32::SetBkMode (dc, (atr[x] & 0xF0)? OPAQUE : TRANSPARENT); + + for (xEnd = x+1; atr[xEnd] == atr[x] && xEnd < size.x; xEnd++) ; + + Win32::TextOut (dc, ROUND (fontSz.cx * (x + con.srWindow.Left)), + ROUND (fontSz.cy * y), chr + x, xEnd - x) asserted; + } + } + +$ Win32::SetTextColor (dc, pal [ con.wAttributes & 0x0F]); +$ Win32::SetBkColor (dc, pal [(con.wAttributes >> 4) & 0x0F]); +$ Win32::SetBkMode (dc, TRANSPARENT); + +$ if (_txConsole_IsBlinking && + In (con.dwCursorPosition, con.srWindow) && + GetTickCount() % _txCursorBlinkInterval*2 > _txCursorBlinkInterval && + GetForegroundWindow() == txWindow()) + { +$ Win32::TextOut (dc, ROUND (fontSz.cx * (con.dwCursorPosition.X - con.srWindow.Left)), + ROUND (fontSz.cy * (con.dwCursorPosition.Y - con.srWindow.Top)) + 1, + "_", 1) asserted; + } + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- +//{ Welcome to the Duck Side! Together we will rule the Bathroom! +//----------------------------------------------------------------------------------------------------------------- + +bool _txConsole_SetUnicodeFont() + { + // ... + +$1 if (Win32::GetCurrentConsoleFontEx && Win32::SetCurrentConsoleFontEx) + { +$ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE); + +$ Win32::CONSOLE_FONT_INFOEX info = { sizeof (info) }; +$ if (!Win32::GetCurrentConsoleFontEx (out, false, &info)) return false; + +$ info.FontFamily = 0x36; // Unicode fixed-pitch +$ if (!*info.FaceName) info.dwFontSize.Y = (SHORT) (info.dwFontSize.Y + 2); // Terminal font is too small +$ wcsncpy_s (info.FaceName, L"Lucida Console", SIZEARR (info.FaceName)); + +$ return !!Win32::SetCurrentConsoleFontEx (out, false, &info); + } + + // ... + +$ const unsigned uniFont = 10; // The Internet and W2K sources know this magic number +$ const unsigned uniSize = 20; // Size of the font desired, should be > max of Raster Fonts +$ bool ok = true; + + // Force Windows to use Unicode font by creating and run the console shortcut tuned to use that font. + +$ HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE); + +$ if (Win32::GetNumberOfConsoleFonts && Win32::GetNumberOfConsoleFonts() <= uniFont) + { +$ HRESULT init = Win32::CoInitialize (NULL); +$ size_t sz = 0; + +$ char link [MAX_PATH] = ""; +$ getenv_s (&sz, link, sizeof (link) - 1, "TEMP"); +$ strncat_s (link, "\\~txLink.lnk", sizeof (link) - 1); + +$ char comspec [MAX_PATH] = ""; +$ getenv_s (&sz, comspec, sizeof (comspec), "COMSPEC"); + +$ (void) _unlink (link); + +$ _txCreateShortcut (link, comspec, "/c exit", NULL, NULL, SW_SHOWMINNOACTIVE, NULL, 0, uniSize) asserted; + +$ ok = (Win32::ShellExecuteA (NULL, NULL, link, NULL, NULL, SW_SHOWMINNOACTIVE) > (void*)32); // Sic! + if (ok) { $ _txWaitFor (FindWindow (NULL, "~txLink"), _TX_TIMEOUT); } + +$ (void) _unlink (link); + +$ if (init == S_OK) Win32::CoUninitialize(); + } + + // If Unicode font is not already set, do set it. + +$ CONSOLE_FONT_INFO cur = {0}; + if (Win32::GetCurrentConsoleFont) { $ Win32::GetCurrentConsoleFont (out, false, &cur); } + +$ ok &= (cur.nFont >= uniFont); + if (!ok) { $ ok &= Win32::SetConsoleFont && Win32::SetConsoleFont (out, uniFont); } + +$ HWND console = Win32::GetConsoleWindow(); +$ InvalidateRect (console, NULL, false); +$ UpdateWindow (console); + +$ return ok; + } + +//----------------------------------------------------------------------------------------------------------------- +//{ The nightmare helpers + +#define _TX_TRY { goto __tx_try; } __tx_try: { int __tx_error = S_OK; (void)__tx_error; +#define _TX_CHECKED( cmd ) { if (FAILED (__tx_error = (cmd))) goto __tx_catch; } +#define _TX_FAIL { __tx_error = E_FAIL; goto __tx_catch; } +#define _TX_RETRY { __tx_error = S_OK; goto __tx_try; } +#define _TX_OK ( SUCCEEDED (__tx_error) ) +#define _TX_CATCH goto __tx_finally; __tx_catch: +#define _TX_RETURN goto __tx_finally; +#define _TX_FINALLY __tx_finally: +#define _TX_ENDTRY } + +//} +//----------------------------------------------------------------------------------------------------------------- + +// + +bool _txCreateShortcut (const char shortcutName[], + const char fileToLink[], const char args[] /*= NULL*/, const char workDir[] /*= NULL*/, + const char description[] /*= NULL*/, int cmdShow /*= SW_SHOWNORMAL*/, const char iconFile[] /*= NULL*/, int iconIndex /*= 0*/, + int fontSize /*= 0*/, COORD bufSize /*= ZERO (COORD)*/, COORD wndSize /*= ZERO (COORD)*/, COORD wndOrg /*=ZERO (COORD)*/) + { +$1 _TX_IF_ARGUMENT_FAILED (shortcutName && *shortcutName) return false; +$ _TX_IF_ARGUMENT_FAILED (fileToLink && *fileToLink) return false; + +$ IShellLink* shellLink = NULL; +$ Win32::IShellLinkDataList* dataList = NULL; +$ IPersistFile* file = NULL; + +$ HRESULT init = Win32::CoInitialize (NULL); + + _TX_TRY + { +$ _TX_CHECKED (Win32::CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, Win32::IID_IShellLink, (void**) &shellLink)); +$ if (!shellLink) _TX_FAIL; + +$ shellLink->SetPath (fileToLink); +$ shellLink->SetArguments (args); +$ shellLink->SetWorkingDirectory (workDir); +$ shellLink->SetDescription (description); +$ shellLink->SetShowCmd (cmdShow); +$ shellLink->SetIconLocation (iconFile, iconIndex); + +$ _TX_CHECKED (shellLink->QueryInterface (Win32::IID_IShellLinkDataList, (void**) &dataList)); +$ if (!dataList) _TX_FAIL; + +$ Win32::NT_CONSOLE_PROPS props = + {{sizeof (props), NT_CONSOLE_PROPS_SIG}, + + 0x07, 0xF5, // wFillAttribute, wPopupFillAttribute + {bufSize.X, bufSize.Y}, // dwScreenBufferSize + {wndSize.X, wndSize.Y}, // dwWindowSize + {wndOrg.X, wndOrg.Y}, // dwWindowOrigin + 0, // nFont + 0, // nInputBufferSize + {0, (short) fontSize}, // dwFontSize + 0x36, 400, L"Lucida Console", // uFontFamily, uFontWeight, FaceName. We're dancing for this! + 15, // uCursorSize + 0, 1, 1, 0, // bFullScreen, bQuickEdit, bInsertMode, bAutoPosition + 50, 4, 0, // uHistoryBufferSize, uNumberOfHistoryBuffers, bHistoryNoDup + + {0x000000, 0x800000, 0x008000, 0x808000, 0x000080, 0x800080, 0x008080, 0xC0C0C0, + 0x808080, 0xFF0000, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFF} + }; + +$ _TX_CHECKED (dataList->AddDataBlock (&props)); + +$ _TX_CHECKED (shellLink->QueryInterface (Win32::IID_IPersistFile, (void**) &file)); +$ if (!file) _TX_FAIL; + +$ wchar_t wName[MAX_PATH] = L""; +$ MultiByteToWideChar (_TX_CP, 0, shortcutName, -1, wName, MAX_PATH) || ZeroMemory (wName, sizeof (wName)); + +$ _TX_CHECKED (file->Save (wName, true)); + } + +$ _TX_CATCH +$ _TX_FINALLY + +$ if (file) file ->Release(); +$ if (dataList) dataList ->Release(); +$ if (shellLink) shellLink->Release(); + +$ if (init == S_OK) Win32::CoUninitialize(); + +$ return _TX_OK; + _TX_ENDTRY + } + +//} +//----------------------------------------------------------------------------------------------------------------- + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ [Internal] Memory DC functions (_txBuffer...) +//! @name " " ( , _txBuffer...) +//================================================================================================================= +//! @{ + +HDC _txBuffer_Create (HWND wnd, const POINT* size, HBITMAP bitmap) + { +$1 txAutoLock _lock; + +$ HDC wndDC = GetDC (wnd); +$ if (!wndDC) return NULL; + +$ RECT r = {0}; +$ if (wnd) GetClientRect (wnd, &r) asserted; +$ POINT sz = { r.right - r.left, r.bottom - r.top }; +$ if (!size) size = &sz; + +$ HDC dc = Win32::CreateCompatibleDC (wndDC); +$ if (!dc) TX_DEBUG_ERROR ("Cannot create buffer: CreateCompatibleDC() failed"); + +$ HBITMAP bmap = bitmap? bitmap : Win32::CreateCompatibleBitmap (wndDC, size->x, size->y); +$ if (!bmap) TX_DEBUG_ERROR ("Cannot create buffer: CreateCompatibleBitmap() failed"); + +$ Win32::SelectObject (dc, bmap) asserted; + +$ if (!bitmap) Win32::PatBlt (dc, 0, 0, size->x, size->y, BLACKNESS) asserted; + +$ ReleaseDC (wnd, wndDC) asserted; + +$ return dc; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txBuffer_Delete (HDC* dc) + { +$1 _TX_IF_ARGUMENT_FAILED (dc) return false; +$ if (!*dc) return false; + +$ if (!Win32::GetObjectType (Win32::GetCurrentObject (*dc, OBJ_BITMAP))) return false; + +$ txAutoLock _lock; + +$ _txBuffer_Select (Win32::GetStockObject (NULL_PEN), *dc) asserted; +$ _txBuffer_Select (Win32::GetStockObject (NULL_BRUSH), *dc) asserted; +$ _txBuffer_Select (Win32::GetStockObject (SYSTEM_FONT), *dc) asserted; +$ _txBuffer_Select (Win32::CreateCompatibleBitmap (*dc, 0, 0), *dc) asserted; + +$ Win32::DeleteObject (Win32::GetCurrentObject (*dc, OBJ_BITMAP)) asserted; + +$ Win32::DeleteDC (*dc) asserted; + +$ *dc = NULL; + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool _txBuffer_Select (HGDIOBJ obj, HDC dc /*= txDC()*/) + { +$1 _TX_IF_ARGUMENT_FAILED (obj) return false; +$ _TX_IF_ARGUMENT_FAILED (dc) return false; + +$ if (!Win32::GetObjectType (obj)) TX_DEBUG_ERROR ("Invalid GDI object type"); + +$ txAutoLock _lock; + +$ obj = Win32::SelectObject (dc, obj); +$ if (obj) Win32::DeleteObject (obj) asserted; + +$ return obj != NULL; + } + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ Diagnostics +//! @name +//================================================================================================================= +//! @{ + +void _txOnSignal (int sig/* = 0*/, int fpe/* = 0*/) + { + if (!sig && !fpe) + { +$1 signal (SIGSEGV, (void(*)(int))_txOnSignal) != SIG_ERR asserted; +$ signal (SIGFPE, (void(*)(int))_txOnSignal) != SIG_ERR asserted; +$ signal (SIGABRT, (void(*)(int))_txOnSignal) != SIG_ERR asserted; +$ signal (SIGILL, (void(*)(int))_txOnSignal) != SIG_ERR asserted; +$ signal (SIGTERM, (void(*)(int))_txOnSignal) != SIG_ERR asserted; +$ return; + } + + const char* sSig = ": "; + const char* sFPE = ": "; + + #define GET_DESCR_( str, code, descr ) case (code): { (str) = #code ": " descr; break; } + + switch (sig) + { + GET_DESCR_ (sSig, SIGSEGV, " . !") + GET_DESCR_ (sSig, SIGILL, " . .") + GET_DESCR_ (sSig, SIGABRT, " , abort().") + GET_DESCR_ (sSig, SIGTERM, " .") + GET_DESCR_ (sSig, SIGFPE, " , 0 - ") + default: break; + } + + if (sig == SIGFPE) switch (fpe) + { + GET_DESCR_ (sFPE, 0x81 /* _FPE_INVALID */, " ") + GET_DESCR_ (sFPE, 0x82 /* _FPE_DENORMAL */, "") + GET_DESCR_ (sFPE, 0x83 /* _FPE_ZERODIVIDE */, " ") + GET_DESCR_ (sFPE, 0x84 /* _FPE_OVERFLOW */, " ") + GET_DESCR_ (sFPE, 0x85 /* _FPE_UNDERFLOW */, " ") + GET_DESCR_ (sFPE, 0x86 /* _FPE_INEXACT */, " ") + GET_DESCR_ (sFPE, 0x87 /* _FPE_UNEMULATED */, " ") + GET_DESCR_ (sFPE, 0x88 /* _FPE_SQRTNEG */, " ") + GET_DESCR_ (sFPE, 0x8A /* _FPE_STACKOVERFLOW */, " ") + GET_DESCR_ (sFPE, 0x8B /* _FPE_STACKUNDERFLOW */, " ") + GET_DESCR_ (sFPE, 0x8C /* _FPE_EXPLICITGEN */, " ") + default: break; + } + + #undef GET_DESCR_ + + _fpreset(); + + if (sig == SIGFPE && fpe) + _txError (NULL, 0, NULL, "signal (%d, 0x%02X): %s, %s." _ sig _ fpe _ sSig _ sFPE); + else + _txError (NULL, 0, NULL, "signal (%d): %s" _ sig _ sSig); + + _txExit = true; + + _txCleanup(); + } + +//----------------------------------------------------------------------------------------------------------------- + +void _txOnUnexpected() + { + _txError (NULL, 0, NULL, + "std::unexpected(): . catch-. catch (...). \n\n" + " () , , ."); + } + +//----------------------------------------------------------------------------------------------------------------- + +void _txOnTerminate() + { + _txError (NULL, 0, NULL, + "std::terminate(): - main() . \n\n" + " try/catch , catch (...), , ."); + } + +//----------------------------------------------------------------------------------------------------------------- + +const char* _txError (const char file[] /*= NULL*/, int line /*= 0*/, const char func[] /*= NULL*/, + const char msg [] /*= NULL*/, ...) + { + va_list arg; va_start (arg, msg); + + static int nCalls = 0; nCalls++; + + DWORD winerr = GetLastError(); + int crterr = errno; + int doserr = _doserrno; + unsigned threadId = GetCurrentThreadId(); + + bool isFatal = (msg && *msg == '\a')? (msg++, true) : false; + bool fmtOnly = (msg && *msg == '\f')? (msg++, true) : false; + + static char what[_TX_BIGBUFSIZE] = ""; + static char str [_TX_BIGBUFSIZE] = ""; + char *s = what; + + #define SZARG_(n) sizeof (what) - 1 - (n) - (s-what) _TX_TRUNCATE + + s += _snprintf_s (s, SZARG_(1), "TXLib :\n\n"); + + s += _snprintf_s (s, SZARG_(1), ": %s, ", txGetModuleFileName()); + if (file) s += _snprintf_s (s, SZARG_(1), ": %s, ", file); + if (line) s += _snprintf_s (s, SZARG_(1), ": %d, ", line); + if (func) s += _snprintf_s (s, SZARG_(1), ": %s.", func); + s += _snprintf_s (s, SZARG_(1), "\n\n"); + + if (msg) s += _snprintf_s (s, SZARG_(1), "%s: ", (file || line || func)? "" : ""), + s += _vsnprintf_s (s, SZARG_(1), msg, arg), + s += _snprintf_s (s, SZARG_(1), "\n\n"); + + s += _snprintf_s (s, SZARG_(1), "#%d: %s, Instance: 0x%p, Flags: %c%c%c%c%c%c, Thread: 0x%08X%s", + nCalls, _TX_VERSION, (void*) &_txInitialized, + "cC"[_txConsole], "mM"[_txMain], "dD"[_txIsDll], "rR"[_txRunning], "eE"[_txExit], "tT"[_txAllowTrace], + threadId, + (threadId == _txMainThreadId)? " (Main)" : + (threadId == _txCanvas_ThreadId)? " (Canvas)" : ""); + + if (winerr) s += _snprintf_s (s, SZARG_(0), ", GetLastError(): %lu (", winerr), + s += FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, winerr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), + s, (DWORD) (sizeof (what) - (s-what)), NULL) - 2, + s -= (s[-1] == '.')? 1 : 0, + s += _snprintf_s (s, SZARG_(1), ")"); + + if (crterr) s += _snprintf_s (s, SZARG_(1), ", errno: %d (%s)", crterr, (strerror_s (str, crterr), str)); + + if (doserr) s += _snprintf_s (s, SZARG_(1), ", _doserrno: %d (%s)", doserr, (strerror_s (str, doserr), str)); + + s += _snprintf_s (s, SZARG_(1), ". %s\n", std::uncaught_exception()? "std::uncaught_exception(): true." : ""); + + if (_txInTX > 0 && !(_txLine == line && file && _stricmp (_txFile, file) == 0)) + s += _snprintf_s (s, SZARG_(1), "From: %s (%d) %s.\n", _txFile, _txLine, _txFunc); + + #undef SZARG_ + va_end (arg); + + struct tools + { + static char* compressSpaces (char* dest, const char* src) + { + char* dst = dest; + + for (char last = ' '; *src; src++) + if (isspace ((unsigned char)(*src))) { if (last != ' ') *dst++ = last = ' '; } + else *dst++ = last = *src; + + if (dst > dest && dst[-1] == ' ') dst--; + *dst++ = '\n'; *dst++ = 0; + + return dest; + } + + static char* replace (char* dest, const char* src, char find, char repl) + { + size_t i = 0; + for (; src[i]; i++) dest[i] = (src[i] == find)? repl : src[i]; + dest[i] = 0; + + return dest; + } + }; + +$ txOutputDebugPrintf ("%s - %s", _TX_VERSION, tools::compressSpaces (str, what)); + + if (fmtOnly) return what; + + tools::replace (str, what, '\v', ' '); + printf ("\n" "--------------------------------------------------\n" + "%s" + "--------------------------------------------------\n", str); + + tools::replace (str, what, '\v', '\n'); + txMessageBox (str, isFatal? " " : " ", MB_ICONSTOP | MB_TOPMOST | MB_SYSTEMMODAL); + + if (!isFatal) return what; + + if (!IsDebuggerPresent()) exit (EXIT_FAILURE); + +// vvvvvvvvvvvvvvvvvv + DebugBreak(); //>>> . . +// ^^^^^^^^^^^^^^^^^^ + + return what; //>>> (F10/F11). (Alt+7). + } + +//----------------------------------------------------------------------------------------------------------------- + +int txOutputDebugPrintf (const char format[], ...) + { + if (!format) return 0; + + bool msgbox = (*format == '\a')? (format++, true) : false; + bool print = (*format == '\f')? (format++, true) : false; + + char str[_TX_BIGBUFSIZE] = ""; + + va_list arg; va_start (arg, format); + int n = _vsnprintf_s (str, sizeof (str) - 1 _TX_TRUNCATE, format, arg); + va_end (arg); + + OutputDebugString (str); + + if (print) + fprintf (stderr, "%s", str); + + if (msgbox) + txMessageBox (str, ", ", MB_ICONEXCLAMATION | MB_TOPMOST); + + return n; + } + +//----------------------------------------------------------------------------------------------------------------- + +unsigned txMessageBox (const char* text, const char* header, unsigned flags /*= 0*/) + { + static wchar_t textW [_TX_BIGBUFSIZE * sizeof (wchar_t)] = L"[NULL text]"; + static wchar_t headerW [_TX_BUFSIZE * sizeof (wchar_t)] = L"[NULL header]"; + + if (text) MultiByteToWideChar (_TX_CP, 0, text, -1, textW, SIZEARR (textW)) || memset (textW, 0, sizeof (textW)); + if (header) MultiByteToWideChar (_TX_CP, 0, header, -1, headerW, SIZEARR (headerW)) || memset (headerW, 0, sizeof (headerW)); + + HWND wnd = _txCanvas_Window; + return MessageBoxW ((wnd? wnd : Win32::GetConsoleWindow()), textW, headerW, flags | MB_SETFOREGROUND | MB_TOPMOST); + } + +//----------------------------------------------------------------------------------------------------------------- + +const char* txGetModuleFileName (bool fileNameOnly /*= true*/) + { + static char name[MAX_PATH] = ""; + + if (!*name) GetModuleFileName (NULL, name, sizeof (name) - 1) || strcpy_s (name, ""); + assert (*name); + + if (fileNameOnly) return name; + + static char fullName[MAX_PATH] = ""; + strncpy_s (fullName, name, sizeof (fullName) - 1); + + char* title = strrchr (fullName, '\\'); if (!title) title = fullName; + char* ext = strrchr (fullName, '.'); if (!ext) ext = fullName + strlen (fullName); + + size_t sz = sizeof (fullName) - (ext - fullName) - 1; + + #if defined (_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES) && _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES + strncpy_s (ext, sz, " - TXLib", sz); + #else + strncpy (ext, " - TXLib", sz); + #endif + + return title + 1; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txNotifyIcon (unsigned flags, const char title[], const char format[], ...) + { +$1 _TX_IF_ARGUMENT_FAILED (format) return false; + +$ va_list arg; va_start (arg, format); +$ bool ok = true; + + #if defined (_WIN32_IE) && (_WIN32_IE >= 0x0500) + +$ NOTIFYICONDATA nid = { sizeof (nid) }; + +$ nid.uFlags = NIF_ICON | NIF_TIP | NIF_INFO; +$ nid.hWnd = NULL; +$ nid.uID = 1; +$ nid.hIcon = _txCreateTXIcon (16); assert (nid.hIcon); +$ strncpy_s (nid.szTip, "TXLib Information", sizeof (nid.szTip)); +$ strncpy_s (nid.szInfoTitle, (title? title : "TXLib "), sizeof (nid.szInfoTitle) - 1); +$ _vsnprintf_s (nid.szInfo, sizeof (nid.szInfo) _TX_TRUNCATE, format, arg); +$ nid.dwInfoFlags = flags; + +$ txOutputDebugPrintf (_TX_VERSION " - Icon notification: %s: %s\n", nid.szInfoTitle, nid.szInfo); + +$ ok &= !!Shell_NotifyIcon (NIM_ADD, (::NOTIFYICONDATA*) &nid); +$ ok &= !!Shell_NotifyIcon (NIM_MODIFY, (::NOTIFYICONDATA*) &nid); + +$ if (nid.hIcon) DestroyIcon (nid.hIcon) asserted; + + #else + +$ char nid_szInfo[_TX_BUFSIZE] = ""; +$ _vsnprintf_s (nid_szInfo, sizeof (nid_szInfo) _TX_TRUNCATE, format, arg); +$ txOutputDebugPrintf (_TX_VERSION " - Icon notification (NOT displayed): %s: %s\n", title, nid_szInfo); +$ ok = false; + +$ (void)flags; (void)title; + + #endif + +$ va_end (arg); +$ return ok; + } + +//! @} +//} +//================================================================================================================= + +//================================================================================================================= +//{ TXLib API implementation +// TXLib API +//================================================================================================================= + +inline const char* txVersion() + { + return _TX_VERSION; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline unsigned txVersionNumber() + { + return _TX_VER; + } + +//----------------------------------------------------------------------------------------------------------------- + +POINT txGetExtent() + { +$1 _TX_IF_TXWINDOW_FAILED return ZERO (POINT); + +$ RECT r = {0}; +$ GetClientRect (txWindow(), &r); + +$ POINT size = { r.right - r.left, r.bottom - r.top }; +$ return size; + } + +//----------------------------------------------------------------------------------------------------------------- + +int txGetExtentX() + { +$1 return txGetExtent().x; + } + +//----------------------------------------------------------------------------------------------------------------- + +int txGetExtentY() + { +$1 return txGetExtent().y; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline HDC& txDC() + { +$1 return _txCanvas_BackBuf[0]; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline HWND txWindow() + { +$1 return _txCanvas_Window; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txDestroyWindow() + { +$1 if (!txWindow()) return false; + +$ if (SendNotifyMessage (txWindow(), (_txMain? WM_CLOSE : WM_DESTROY), 0, 0) == 0) return false; + +$ if (_txMain) + { +$ txNotifyIcon (NIIF_WARNING, NULL, "\n" ", txDestroyWindow(). \n\n" + " main(), .\n"); +$ Sleep (_TX_TIMEOUT); + } + +$ _txWaitFor (!_txCanvas_Window, _TX_TIMEOUT); + +$ return _txCanvas_Window == NULL; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txSetColor (COLORREF color, double thickness /*= 1*/) + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ return _txBuffer_Select (Win32::CreatePen ((color == TX_TRANSPARENT? PS_NULL : PS_SOLID), ROUND (thickness), color)) + && + txGDI ((Win32::SetTextColor (txDC(), color))); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txColor (double red, double green, double blue) + { +$1 if (red > 1) red = 1; if (red < 0) red = 0; +$ if (green > 1) green = 1; if (green < 0) green = 0; +$ if (blue > 1) blue = 1; if (blue < 0) blue = 0; + +$ return txSetColor (RGB (ROUND (red * 255), ROUND (green * 255), ROUND (blue * 255))); + } + +//----------------------------------------------------------------------------------------------------------------- + +COLORREF txGetColor() + { +$1 _TX_IF_TXWINDOW_FAILED return CLR_INVALID; + +$ HGDIOBJ obj = txGDI ((Win32::GetCurrentObject (txDC(), OBJ_PEN))); +$ assert (obj); if (!obj) return CLR_INVALID; + +$ union { EXTLOGPEN extLogPen; LOGPEN LogPen; } buf = {{0}}; + +$ int size = Win32::GetObject (obj, 0, NULL); +$ Win32::GetObject (obj, sizeof (buf), &buf) asserted; + +$ return (size == sizeof (LOGPEN))? buf.LogPen.lopnColor : buf.extLogPen.elpColor; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txSetFillColor (COLORREF color) + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ return _txBuffer_Select ((color == TX_TRANSPARENT)? Win32::GetStockObject (HOLLOW_BRUSH) : + Win32::CreateSolidBrush (color)); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txFillColor (double red, double green, double blue) + { +$1 if (red > 1) red = 1; if (red < 0) red = 0; +$ if (green > 1) green = 1; if (green < 0) green = 0; +$ if (blue > 1) blue = 1; if (blue < 0) blue = 0; + +$ return txSetFillColor (RGB (ROUND (red * 255), ROUND (green * 255), ROUND (blue * 255))); + } + +//----------------------------------------------------------------------------------------------------------------- + +COLORREF txGetFillColor() + { +$1 _TX_IF_TXWINDOW_FAILED return CLR_INVALID; + +$ HGDIOBJ obj = txGDI ((Win32::GetCurrentObject (txDC(), OBJ_BRUSH))); +$ assert (obj); if (!obj) return CLR_INVALID; + +$ LOGBRUSH buf = {0}; +$ txGDI ((Win32::GetObject (obj, sizeof (buf), &buf))) asserted; + +$ return buf.lbColor; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txSetROP2 (int mode /*= R2_COPYPEN*/) + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ return txGDI (!!(Win32::SetROP2 (txDC(), mode))); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txClear() + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ POINT size = txGetExtent(); +$ return txGDI (!!(Win32::PatBlt (txDC(), 0, 0, size.x, size.y, PATCOPY))); + } + +//----------------------------------------------------------------------------------------------------------------- + +inline bool txSetPixel (double x, double y, COLORREF color) + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ txGDI ((Win32::SetPixel (txDC(), ROUND (x), ROUND (y), color))); + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline bool txPixel (double x, double y, double red, double green, double blue) + { +$1 if (red > 1) red = 1; if (red < 0) red = 0; +$ if (green > 1) green = 1; if (green < 0) green = 0; +$ if (blue > 1) blue = 1; if (blue < 0) blue = 0; + +$ return txSetPixel (x, y, RGB (ROUND (red * 255), ROUND (green * 255), ROUND (blue * 255))); + } + +//----------------------------------------------------------------------------------------------------------------- + +inline COLORREF txGetPixel (double x, double y) + { +$1 _TX_IF_TXWINDOW_FAILED return CLR_INVALID; + +$ return txGDI ((Win32::GetPixel (txDC(), ROUND (x), ROUND (y)))); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txLine (double x0, double y0, double x1, double y1) + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ txGDI ((Win32::MoveToEx (txDC(), ROUND (x0), ROUND (y0), NULL))) asserted; +$ txGDI ((Win32::LineTo (txDC(), ROUND (x1), ROUND (y1) ))) asserted; + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txRectangle (double x0, double y0, double x1, double y1) + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ txGDI ((Win32::Rectangle (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1)))) asserted; + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txPolygon (const POINT points[], int numPoints) + { +$1 _TX_IF_TXWINDOW_FAILED return false; +$ _TX_IF_ARGUMENT_FAILED (points) return false; + +$ return txGDI (!!(Win32::Polygon (txDC(), points, numPoints))); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txEllipse (double x0, double y0, double x1, double y1) + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ txGDI ((Win32::Ellipse (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1)))) asserted; + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txCircle (double x, double y, double r) + { +$1 return txEllipse (x-r, y-r, x+r, y+r); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txArc (double x0, double y0, double x1, double y1, double startAngle, double totalAngle) + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ POINT center = { ROUND ((x0 + x1) /2), ROUND ((y0 + y1) /2) }; + +$ double start = startAngle * txPI/180, + end = (startAngle + totalAngle) * txPI/180; + +$ return txGDI (!!(Win32::Arc (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1), + ROUND (center.x + 1E3*cos (start)), ROUND (center.y - 1E3*sin (start)), + ROUND (center.x + 1E3*cos (end)), ROUND (center.y - 1E3*sin (end))))); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txPie (double x0, double y0, double x1, double y1, double startAngle, double totalAngle) + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ POINT center = { ROUND ((x0 + x1) /2), ROUND ((y0 + y1) /2) }; + +$ double start = startAngle * txPI/180, + end = (startAngle + totalAngle) * txPI/180; + +$ return txGDI (!!(Win32::Pie (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1), + ROUND (center.x + 1E3*cos (start)), ROUND (center.y - 1E3*sin (start)), + ROUND (center.x + 1E3*cos (end)), ROUND (center.y - 1E3*sin (end))))); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txChord (double x0, double y0, double x1, double y1, double startAngle, double totalAngle) + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ POINT center = { ROUND ((x0 + x1) /2), ROUND ((y0 + y1) /2) }; + +$ double start = startAngle * txPI/180, + end = (startAngle + totalAngle) * txPI/180; + +$ return txGDI (!!(Win32::Chord (txDC(), ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1), + ROUND (center.x + 1E3*cos (start)), ROUND (center.y - 1E3*sin (start)), + ROUND (center.x + 1E3*cos (end)), ROUND (center.y - 1E3*sin (end))))); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txFloodFill (double x, double y, + COLORREF color /*= TX_TRANSPARENT*/, DWORD mode /*= FLOODFILLSURFACE*/) + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ if (color == TX_TRANSPARENT) color = txGetPixel (x, y); + +$ return txGDI (!!(Win32::ExtFloodFill (txDC(), ROUND (x), ROUND (y), color, mode))); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txTextOut (double x, double y, const char text[]) + { +$1 _TX_IF_TXWINDOW_FAILED return false; +$ _TX_IF_ARGUMENT_FAILED (text) return false; + +$ int len = (int) strlen (text); +$ txGDI (!!(Win32::TextOut (txDC(), ROUND (x), ROUND (y), text, len))) asserted; + +$ SIZE size = {0}; +$ txGDI ((Win32::GetTextExtentPoint32 (txDC(), text, len, &size))) asserted; + +$ RECT r = { ROUND (x), ROUND (y), ROUND (x + size.cx), ROUND (y + size.cy) }; +$ InvalidateRect (txWindow(), &r, false) asserted; + +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txDrawText (double x0, double y0, double x1, double y1, const char text[], + unsigned format /*= DT_CENTER | DT_VCENTER | DT_WORDBREAK | DT_WORD_ELLIPSIS*/) +{ +$1 _TX_IF_TXWINDOW_FAILED return false; +$ _TX_IF_ARGUMENT_FAILED (text) return false; + +$ RECT r = { ROUND (x0), ROUND (y0), ROUND (x1), ROUND (y1) }; + +$ if (!strchr (text, '\n')) format |= DT_SINGLELINE; + +$ unsigned prev = txSetTextAlign (TA_LEFT | TA_TOP | TA_NOUPDATECP); + + if (Win32::DrawText) { $ txGDI ((Win32::DrawText (txDC(), text, -1, &r, format))) asserted; } + +$ txSetTextAlign (prev); + +$ return true; +} + +//----------------------------------------------------------------------------------------------------------------- + +bool txSelectFont (const char name[], double sizeY, + double sizeX /*= -1*/, + int bold /*= FW_DONTCARE*/, + bool italic /*= false*/, + bool underline /*= false*/, + bool strikeout /*= false*/, + double angle /*= 0*/) + { +$1 _TX_IF_TXWINDOW_FAILED return false; +$ _TX_IF_ARGUMENT_FAILED (name) return false; + +$ _txBuffer_Select (txFontExist (name)? + Win32::CreateFont (ROUND (sizeY), ROUND ((sizeX >= 0)? sizeX : sizeY/3), + ROUND (angle*10), 0, bold, italic, underline, strikeout, + RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, FIXED_PITCH, name) + : + Win32::GetStockObject (SYSTEM_FIXED_FONT)); +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +SIZE txGetTextExtent (const char text[]) + { +$1 SIZE size = {0}; + +$ _TX_IF_TXWINDOW_FAILED return size; +$ _TX_IF_ARGUMENT_FAILED (text) return size; + +$ txGDI ((Win32::GetTextExtentPoint32 (txDC(), text, (int) strlen (text), &size))) asserted; + +$ return size; + } + +//----------------------------------------------------------------------------------------------------------------- + +int txGetTextExtentX (const char text[]) + { +$1 return txGetTextExtent (text) .cx; + } + +//----------------------------------------------------------------------------------------------------------------- + +int txGetTextExtentY (const char text[]) + { +$1 return txGetTextExtent (text) .cy; + } + +//----------------------------------------------------------------------------------------------------------------- + +unsigned txSetTextAlign (unsigned align /*= TA_CENTER | TA_BASELINE*/) + { +$1 _TX_IF_TXWINDOW_FAILED return 0; + +$ return txGDI ((Win32::SetTextAlign (txDC(), align))); + } + +//----------------------------------------------------------------------------------------------------------------- + +LOGFONT* txFontExist (const char name[]) + { +$1 _TX_IF_TXWINDOW_FAILED return NULL; +$ _TX_IF_ARGUMENT_FAILED (name) return NULL; + +$ static LOGFONT font = {0}; +$ font.lfCharSet = DEFAULT_CHARSET; +$ strncpy_s (font.lfFaceName, name, sizeof (font.lfFaceName) - 1); + +$ struct tools + { + static int CALLBACK enumFonts (const LOGFONT* fnt, const TEXTMETRIC*, DWORD, LPARAM data) + { +$ _TX_IF_ARGUMENT_FAILED (fnt) return 0; +$ _TX_IF_ARGUMENT_FAILED (data) return 0; + + #ifndef __STRICT_ANSI__ +$ return _strnicmp (fnt->lfFaceName, ((LOGFONT*)data)->lfFaceName, LF_FACESIZE); + + #else +$ return strncmp (fnt->lfFaceName, ((LOGFONT*)data)->lfFaceName, LF_FACESIZE); + + #endif + } + }; + +$ return txGDI ((Win32::EnumFontFamiliesEx (txDC(), &font, tools::enumFonts, (LPARAM) &font, 0))) == 0? &font : NULL; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txSelectObject (HGDIOBJ obj) + { +$1 _TX_IF_TXWINDOW_FAILED return false; +$ _TX_IF_ARGUMENT_FAILED (obj) return false; + +$ return _txBuffer_Select (obj); + } + +//----------------------------------------------------------------------------------------------------------------- + +HDC txCreateCompatibleDC (double sizeX, double sizeY, HBITMAP bitmap /*= NULL*/) + { +$1 _TX_IF_TXWINDOW_FAILED return NULL; + +$ POINT size = { ROUND (sizeX), ROUND (sizeY) }; +$ HDC dc = _txBuffer_Create (txWindow(), &size, bitmap); +$ assert (dc); if (!dc) return NULL; + +$ if (!_txCanvas_UserDCs) return dc; + +$ txAutoLock _lock; +$ _txCanvas_UserDCs->push_back (dc); + +$ if (_txCanvas_UserDCs->size() >= _TX_BUFSIZE) + { $ txNotifyIcon (NIIF_WARNING, NULL, " %d HDC, .", (int) _txCanvas_UserDCs->size()); } + +$ return dc; + } + +//----------------------------------------------------------------------------------------------------------------- + +HDC txLoadImage (const char filename[], unsigned imageFlags /*= IMAGE_BITMAP*/, unsigned loadFlags /*= LR_LOADFROMFILE*/) + { +$1 _TX_IF_TXWINDOW_FAILED return NULL; +$ _TX_IF_ARGUMENT_FAILED (filename && *filename) return NULL; + +$ HBITMAP image = (HBITMAP) Win32::LoadImage ((loadFlags & LR_LOADFROMFILE)? NULL : GetModuleHandle (NULL), + filename, imageFlags, 0, 0, loadFlags); +$ if (!image) return NULL; + +$ HDC dc = txCreateCompatibleDC (0, 0, image); + +$ if (!(loadFlags & LR_LOADFROMFILE)) return dc; + +$ static std::map loadTimes; +$ std::string file = filename; +$ unsigned time = GetTickCount(); + +$ if ((long) (time - loadTimes [file]) < _TX_TIMEOUT) + { $ txNotifyIcon (NIIF_WARNING, NULL, " \"%s\" , .", filename); } + +$ loadTimes [file] = time; + +$ return dc; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txDeleteDC (HDC* pdc) + { +$1 _TX_IF_TXWINDOW_FAILED return false; +$ _TX_IF_ARGUMENT_FAILED (pdc) return false; + +$ HDC dc = *pdc; +$ bool ok = _txBuffer_Delete (pdc); +$ if (!ok) return false; + +$ if (!_txCanvas_UserDCs) return ok; + +$ txAutoLock _lock; +$ std::vector ::iterator i = std::find (_txCanvas_UserDCs->begin(), _txCanvas_UserDCs->end(), dc); +$ if (i != _txCanvas_UserDCs->end()) { std::swap (*i, _txCanvas_UserDCs->back()); _txCanvas_UserDCs->pop_back(); } + +$ return ok; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txDeleteDC (HDC dc) + { +$1 _TX_IF_TXWINDOW_FAILED return false; + +$ return txDeleteDC (&dc); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txBitBlt (HDC dest, double xDest, double yDest, double width, double height, + HDC src, double xSrc /*= 0*/, double ySrc /*= 0*/, DWORD rOp /*= SRCCOPY*/) + { +$1 _TX_IF_TXWINDOW_FAILED return false; +$ _TX_IF_ARGUMENT_FAILED (dest) return false; +$ _TX_IF_ARGUMENT_FAILED (src) return false; + +$ return txGDI (!!(Win32::BitBlt (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height), + src, ROUND (xSrc), ROUND (ySrc), rOp))); + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txTransparentBlt (HDC dest, double xDest, double yDest, double width, double height, + HDC src, double xSrc /*= 0*/, double ySrc /*= 0*/, COLORREF transColor /*= TX_BLACK*/) + { +$1 _TX_IF_TXWINDOW_FAILED return false; +$ _TX_IF_ARGUMENT_FAILED (dest) return false; +$ _TX_IF_ARGUMENT_FAILED (src) return false; + +$ return (Win32::TransparentBlt)? + txGDI (!!(Win32::TransparentBlt (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height), + src, ROUND (xSrc), ROUND (ySrc), ROUND (width), ROUND (height), transColor))) + : + txGDI (!!(Win32::BitBlt (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height), + src, ROUND (xSrc), ROUND (ySrc), SRCCOPY))), false; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txAlphaBlend (HDC dest, double xDest, double yDest, double width, double height, + HDC src, double xSrc /*= 0*/, double ySrc /*= 0*/, double alpha /*= 1.0*/) + { +$1 _TX_IF_TXWINDOW_FAILED return false; +$ _TX_IF_ARGUMENT_FAILED (dest) return false; +$ _TX_IF_ARGUMENT_FAILED (src) return false; + +$ if (alpha < 0) alpha = 0; +$ if (alpha > 1) alpha = 1; + +$ BLENDFUNCTION blend = { AC_SRC_OVER, 0, (BYTE) ROUND (alpha * 255), AC_SRC_ALPHA }; + +$ return (Win32::AlphaBlend)? + txGDI (!!(Win32::AlphaBlend (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height), + src, ROUND (xSrc), ROUND (ySrc), ROUND (width), ROUND (height), blend))) + : + txGDI (!!(Win32::BitBlt (dest, ROUND (xDest), ROUND (yDest), ROUND (width), ROUND (height), + src, ROUND (xSrc), ROUND (ySrc), SRCCOPY))), false; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline int txUpdateWindow (int update /*= true*/) + { +$1 return _txCanvas_SetRefreshLock (update >= 0? !update : -update); + } + +//----------------------------------------------------------------------------------------------------------------- + +inline int txBegin() + { +$1 _txCanvas_SetRefreshLock (_txCanvas_RefreshLock + 1); + +$ return _txCanvas_RefreshLock; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline int txEnd() + { +$1 _txCanvas_SetRefreshLock (_txCanvas_RefreshLock - 1); + +$ return _txCanvas_RefreshLock; + } + +//----------------------------------------------------------------------------------------------------------------- + +double txSleep (double time) + { +$1 LARGE_INTEGER start = {{0}}; +$ QueryPerformanceCounter (&start) asserted; + +$ LARGE_INTEGER freq = {{0}}; +$ QueryPerformanceFrequency (&freq) asserted; + +$ int lock = _txCanvas_RefreshLock; +$ _txCanvas_RefreshLock = 0; + +$ HWND wnd = txWindow(); + if (wnd) { $ RedrawWindow (wnd, NULL, NULL, RDW_INVALIDATE | RDW_INTERNALPAINT | RDW_UPDATENOW) asserted; } + +$ Sleep (ROUND (time)); + +$ _txCanvas_RefreshLock = lock; + +$ LARGE_INTEGER stop = {{0}}; +$ QueryPerformanceCounter (&stop) asserted; + +$ return 1000.0 * (double) (stop.QuadPart - start.QuadPart) / (double) freq.QuadPart; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txLock (bool wait /*= true*/) + { +$1 if (_txCanvas_RefreshLock <= 0 || _txExit) Sleep (0); + +$ if (wait) { $ return EnterCriticalSection (&_txCanvas_LockBackBuf), true; } + else { $ return !!TryEnterCriticalSection (&_txCanvas_LockBackBuf); } + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txUnlock() + { +$1 LeaveCriticalSection (&_txCanvas_LockBackBuf); + +$ if (_txCanvas_RefreshLock <= 0 || _txExit) Sleep (0); +$ return false; + } + +//----------------------------------------------------------------------------------------------------------------- + +template +inline T txUnlock (T value) + { +$1 txUnlock(); +$ return value; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline POINT txMousePos() + { +$1 _TX_IF_TXWINDOW_FAILED return ZERO (POINT); + +$ return _txMousePos; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline int txMouseX() + { +$1 return _txMousePos.x; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline int txMouseY() + { +$1 return _txMousePos.y; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline int txMouseButtons() + { +$1 _TX_IF_TXWINDOW_FAILED return 0; + +$ return _txMouseButtons; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txSetConsoleAttr (unsigned color /*= 0x07*/) + { +$1 return !!SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), (WORD) color); + } + +//----------------------------------------------------------------------------------------------------------------- + +unsigned txGetConsoleAttr() + { +$1 CONSOLE_SCREEN_BUFFER_INFO con = {{0}}; +$ GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &con); + +$ return con.wAttributes; + } + +//----------------------------------------------------------------------------------------------------------------- + +POINT txSetConsoleCursorPos (double x, double y) + { +$1 POINT fontSz = txGetConsoleFontSize(); + +$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}}; +$ GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &con) asserted; + +$ COORD pos = { (short) ROUND (1.0 * x / fontSz.x + con.srWindow.Left), + (short) ROUND (1.0 * y / fontSz.y + con.srWindow.Top ) }; + +$ SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), pos) asserted; + +$ POINT prev = { ROUND (1.0 * (con.dwCursorPosition.X - con.srWindow.Left) / fontSz.x), + ROUND (1.0 * (con.dwCursorPosition.Y - con.srWindow.Top ) / fontSz.y) }; +$ return prev; + } + +//----------------------------------------------------------------------------------------------------------------- + +POINT txGetConsoleCursorPos() + { +$1 POINT fontSz = txGetConsoleFontSize(); + +$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}}; +$ GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &con) asserted; + +$ POINT pos = { ROUND (1.0 * (con.dwCursorPosition.X - con.srWindow.Left) / fontSz.x), + ROUND (1.0 * (con.dwCursorPosition.Y - con.srWindow.Top ) / fontSz.y) }; +$ return pos; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txClearConsole() + { +$1 HANDLE out = GetStdHandle (STD_OUTPUT_HANDLE); + +$ CONSOLE_SCREEN_BUFFER_INFO con = {{0}}; +$ GetConsoleScreenBufferInfo (out, &con) asserted; + +$ COORD start = {con.srWindow.Left, con.srWindow.Top}; + +$ DWORD len = (con.srWindow.Right - con.srWindow.Left + 1) * + (con.srWindow.Bottom - con.srWindow.Top + 1); + +$ DWORD written = 0; +$ FillConsoleOutputCharacter (out, 0x20 /*' '*/, len, start, &written) asserted; +$ FillConsoleOutputAttribute (out, con.wAttributes, len, start, &written) asserted; + +$ SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), start) asserted; + +$ return written == len; + } + +//----------------------------------------------------------------------------------------------------------------- + +POINT txGetConsoleFontSize() + { +$1 CONSOLE_FONT_INFO font = {0, {8, 16}}; + +$ if (Win32::GetCurrentConsoleFont) + { $ Win32::GetCurrentConsoleFont (GetStdHandle (STD_OUTPUT_HANDLE), false, &font) asserted; } + +$ SIZE size = { font.dwFontSize.X, font.dwFontSize.Y }; +$ txGDI (Win32::GetTextExtentPoint32 (_txCanvas_BackBuf[1], "W", 1, &size)); + +$ POINT sizeFont = { size.cx, size.cy }; +$ return sizeFont; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txTextCursor (bool blink /*= true*/) + { +$1 bool old = _txConsole_IsBlinking; + +$ _txConsole_IsBlinking = blink; + +$ return old; + } + +//----------------------------------------------------------------------------------------------------------------- + +bool txPlaySound (const char filename[] /*= NULL*/, DWORD mode /*= SND_ASYNC*/) + { +$1 _TX_IF_ARGUMENT_FAILED (!(filename && !*filename)) return false; + +$ mode |= SND_FILENAME | SND_NODEFAULT | SND_NOWAIT; +$ if (mode & SND_LOOP) mode = (mode & ~SND_SYNC) | SND_ASYNC; + +$ if (!filename) mode = SND_PURGE; + +$ return !!Win32::PlaySound (filename, NULL, mode); + } + +//----------------------------------------------------------------------------------------------------------------- + +// +--<<< , :) +// V , + +WNDPROC txSetWindowsHook (WNDPROC wndProc /*= NULL*/) + { +$1 WNDPROC old = _txAltWndProc; _txAltWndProc = wndProc; +$ return old; + } + +//----------------------------------------------------------------------------------------------------------------- + +// +--<<< , , . +// | ! - . +// | +// v +bool txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture() + { +$1 txMessageBox (" . . :\n\n" + + "txIDontWantToHaveAPauseAfterMyProgramBeforeTheWindowWillClose_AndIWillNotBeAskingWhereIsMyPicture()\n\n" + + " [] , . " + " , - , .\n\n" + + " . TXLib.h, " + " , .\n\n" + + " Ctrl+O, TXLib.h ( , " + " TXLib), Ctrl+F \"txIDontWant\". !\n\n", + + " ", MB_ICONSTOP); + + // The truth is out there... (C++files) + +$ return false; + } + +//----------------------------------------------------------------------------------------------------------------- + +// Bingo! Now you are learned to use the Sources, Luke. And may the Source be with you. + +inline bool txDisableAutoPause() + { +$1 _txExit = true; +$ return true; + } + +//----------------------------------------------------------------------------------------------------------------- + +void txDrawMan (int x, int y, int sizeX, int sizeY, COLORREF color, double handL, double handR, double twist, + double head, double eyes, double wink, double crazy, double smile, double hair, double wind) + { +$1 const char msg[] = "\0/ - !\0/ !\0/ !\0/"; + static unsigned count = GetTickCount(), L = 0; + +$ COLORREF lineColor = txGetColor(); + COLORREF fillColor = txGetFillColor(); + +$ txSetColor (TX_DARKGRAY); + txSetFillColor (TX_TRANSPARENT); + +$ txRectangle (x - sizeX/2, y - sizeY, x + sizeX/2, y); + txCircle (x, y, 4); + +$ txSetColor (color); + txSetFillColor (color); + +$ txLine (x + twist * sizeX, y - 0.35 * sizeY, x, y - 0.7 * sizeY); + +$ txLine (x, y - 0.7 * sizeY, x - sizeX/2, y - (0.7 + handL) * sizeY); + txLine (x, y - 0.7 * sizeY, x + sizeX/2, y - (0.7 + handR) * sizeY); + +$ txLine (x + twist * sizeX, y - 0.35 * sizeY, x - sizeX/2, y); + txLine (x + twist * sizeX, y - 0.35 * sizeY, x + sizeX/2, y); + +$ txCircle (x, y - (0.85 + head) * sizeY, 0.15 * sizeY); + +$ txLine (x, y - (1 + head) * sizeY, x + wind/10 * sizeX, y - (1 + head + hair/10) * sizeY); + txLine (x, y - (1 + head) * sizeY, x + (wind/10 - 0.1) * sizeX, y - (1 + head + hair/10) * sizeY); + txLine (x, y - (1 + head) * sizeY, x + (wind/10 + 0.1) * sizeX, y - (1 + head + hair/10) * sizeY); + +$ txSetColor (~color & 0xFFFFFF); + txSetFillColor (~color & 0xFFFFFF); + +$ txLine (x, y - (0.8 + head - 0.05 * smile/2) * sizeY, x - 0.05 * sizeY, y - (0.8 + head + 0.05 * smile/2) * sizeY), + txLine (x, y - (0.8 + head - 0.05 * smile/2) * sizeY, x + 0.05 * sizeY, y - (0.8 + head + 0.05 * smile/2) * sizeY), + txNotifyIcon (4, (const char*)!! (L+'L')[msg], "\n%s\n", msg + (count++ % 3)["\"<"]); + +$ txCircle (x - 0.05 * sizeY, y - (0.9 + head - 0.02 * crazy) * sizeY, eyes * (1 + 0.5*wink) * 0.02 * sizeY), + txCircle (x + 0.05 * sizeY, y - (0.9 + head + 0.02 * crazy) * sizeY, eyes * (1 - 0.5*wink) * 0.02 * sizeY), + Sleep (1000 + count%2); + +$ txSetColor (lineColor); + txSetFillColor (fillColor); + } + +//----------------------------------------------------------------------------------------------------------------- + +void txDump (const void* address, const char name[] /*= "txDump()"*/) + { + const unsigned char* p = (const unsigned char*) address; + int x = 0; + + txSetConsoleAttr (0x0F); + printf ("\n%8.8s ", name? name : ""); + + txSetConsoleAttr (0x0E); + for (x = 0; x < 16; x++) printf ("%02X ", x); + for (x = 0; x < 16; x++) printf ("%X", x); + + for (int y = 0; y < 16; y++, p += 16) + { + txSetConsoleAttr (0x0E); + printf ("\n" "%8p ", p); + + for (x = 0; x < 16; x++) { txSetConsoleAttr (0x0A + x/4%2); printf ("%02X ", p[x]); } + for (x = 0; x < 16; x++) { txSetConsoleAttr (0x0A + x/4%2); printf ("%c", isprint (p[x])? p[x] : '.'); } + } + + txSetConsoleAttr (0x07); + printf ("\n"); + } + +//----------------------------------------------------------------------------------------------------------------- + +double txQueryPerformance() + { +$1 int maxTime = 500; +$ int maxSamples = 100; +$ POINT size = {500, 500}; + +$ HDC dc = _txBuffer_Create (txWindow(), &size, NULL); +$ assert (dc); if (!dc) return -1; + +$ DWORD mask = (DWORD) SetThreadAffinityMask (GetCurrentThread(), 1); +$ assert (mask); + +$ LARGE_INTEGER freq = {{0}}; +$ QueryPerformanceFrequency (&freq) asserted; + +$ LARGE_INTEGER start = {{0}}; +$ QueryPerformanceCounter (&start) asserted; + +$ int samples = 0; +$ while (samples++ < maxSamples) + { +$ LARGE_INTEGER cur = {{0}}; +$ QueryPerformanceCounter (&cur) asserted; + +$ double t = 1000.0 * (double) (cur.QuadPart - start.QuadPart) / (double) freq.QuadPart; +$ if (t > maxTime) break; + + // Draw test scene + +$ for (int y = 0; y < size.y; y += 10) + for (int x = 0; x < size.x; x += 10) Win32::TextOut (dc, x, y, "*", 1); + +$ Win32::Ellipse (dc, 0, 0, size.x, size.y); +$ Win32::ExtFloodFill (dc, size.x/2, size.y/2, TX_TRANSPARENT, FLOODFILLSURFACE); + +$ txBitBlt (dc, size.x/2, 0, size.x/2, size.y/2, dc, 0, 0) asserted; +$ txBitBlt (dc, size.x/2, size.y/2, size.x/2, size.y/2, dc, 0, size.y/2) asserted; +$ txBitBlt (dc, 0, size.y/2, size.x/2, size.y/2, dc, 0, 0) asserted; +$ txBitBlt (dc, size.x/2, size.y/2, size.x/2, size.y/2, dc, size.x/2, 0) asserted; + } + +$ mask = (DWORD) SetThreadAffinityMask (GetCurrentThread(), mask); +$ assert (mask); + +$ _txBuffer_Delete (&dc); + +$ return 15.0 * samples / sqrt (1.0 * size.x * size.y); + } + +//----------------------------------------------------------------------------------------------------------------- + +int txExtractColor (COLORREF color, COLORREF component) + { +$1 switch (component) + { + case TX_RED: + case TX_HUE: $ return (color >> 0) & 0xFF; + + case TX_GREEN: + case TX_SATURATION: $ return (color >> 8) & 0xFF; + + case TX_BLUE: + case TX_LIGHTNESS: $ return (color >> 16) & 0xFF; + + default: $ return CLR_INVALID; + } + } + +//----------------------------------------------------------------------------------------------------------------- + +COLORREF txRGB2HSL (COLORREF rgbColor) + { +$1 int r = txExtractColor (rgbColor, TX_RED), + g = txExtractColor (rgbColor, TX_GREEN), + b = txExtractColor (rgbColor, TX_BLUE); + +$ double m1 = MAX (MAX (r, g), b) / 255.0, + m2 = MIN (MIN (r, g), b) / 255.0, + dm = m1 - m2, + sm = m1 + m2, + + ir = r / 255.0, + ig = g / 255.0, + ib = b / 255.0, + + ih = 0, + is = 0, + il = sm / 2; + +$ const double prec = 0.001; + +$ if (fabs (dm) < prec) + { +$ is = dm / ((sm <= 1)? sm : (2-sm)); + +$ double cr = (m1 - ir) / dm, + cg = (m1 - ig) / dm, + cb = (m1 - ib) / dm; + +$ if (fabs (ir - m1) < prec) ih = cb - cg; +$ if (fabs (ig - m1) < prec) ih = 2 + cr - cb; +$ if (fabs (ib - m1) < prec) ih = 4 + cg - cr; + } + +$ ih = (ih >= 0)? ih*60 : ih*60 + 360; + +$ return RGB (ROUND (ih / 360 * 255), ROUND (is * 255), ROUND (il * 255)); + } + +//----------------------------------------------------------------------------------------------------------------- + +COLORREF txHSL2RGB (COLORREF hslColor) + { +$1 struct xRGB + { + static double calc (double h, double m1, double m2) + { +$ if (h < 0) h += 360; +$ if (h > 360) h -= 360; + +$ return (h < 60)? m1 + (m2-m1) * h / 60 : + (h < 180)? m2 : + (h < 240)? m1 + (m2-m1) * (240-h) / 60 : + m1; + } + }; + +$ int h = txExtractColor (hslColor, TX_HUE), + s = txExtractColor (hslColor, TX_SATURATION), + l = txExtractColor (hslColor, TX_LIGHTNESS); + +$ double ih = h / 255.0 * 360.0, + il = l / 100.0, + is = s / 100.0, + + m2 = (il <= 0.5)? il * (1 + is) : il + is - il * is, + m1 = 2 * il - m2, + + ir = s? xRGB::calc (ih + 120, m1, m2) : il, + ig = s? xRGB::calc (ih, m1, m2) : il, + ib = s? xRGB::calc (ih - 120, m1, m2) : il; + +$ return RGB (ROUND (ir * 255), ROUND (ig * 255), ROUND (ib * 255)); + } + +//----------------------------------------------------------------------------------------------------------------- + +template +inline bool In (T x, T a, T b) + { + return a <= x && x <= b; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline bool In (const POINT& pt, const RECT& rect) + { + _TX_IF_ARGUMENT_FAILED (&pt) return 0; + _TX_IF_ARGUMENT_FAILED (&rect) return 0; + + return In (pt.x, rect.left, rect.right) && + In (pt.y, rect.top, rect.bottom); + } + +//----------------------------------------------------------------------------------------------------------------- + +inline bool In (const COORD& pt, const SMALL_RECT& rect) + { + _TX_IF_ARGUMENT_FAILED (&pt) return 0; + _TX_IF_ARGUMENT_FAILED (&rect) return 0; + + return In (pt.X, rect.Left, rect.Right) && + In (pt.Y, rect.Top, rect.Bottom); + } + +//----------------------------------------------------------------------------------------------------------------- + +inline int random (int range) + { + return rand() % range; + } + +//----------------------------------------------------------------------------------------------------------------- + +inline double random (double left, double right) + { + return left + (right - left) * ((double) rand() / RAND_MAX); + } + +//----------------------------------------------------------------------------------------------------------------- + +template +inline T zero() +#ifdef _MSC_VER_6 + { T __zero = {0}; return __zero; } + +#else + { T __zero = { }; return __zero; } + +#endif + +//} +//================================================================================================================= + +//================================================================================================================= +//{ txDialog methods implementation +// txDialog +//================================================================================================================= + +txDialog::txDialog () : + layout_ (NULL) + {$1} + +//----------------------------------------------------------------------------------------------------------------- + +txDialog::txDialog (const Layout* layout) : + layout_ (layout) + {$1} + +//----------------------------------------------------------------------------------------------------------------- + +const txDialog::Layout* txDialog::setLayout (const Layout* layout) + { +$1 return std::swap (layout_, layout), layout; + } + +//----------------------------------------------------------------------------------------------------------------- + +INT_PTR txDialog::dialogBox (WORD resourceID) + { +$1 const char* resName = (char*)(ptrdiff_t) resourceID; + +$ if (!FindResource (NULL, resName, RT_DIALOG)) return TX_DEBUG_ERROR (" %d" _ resourceID), 0; + +$ return DialogBoxParam (NULL, resName, NULL, dialogProc__, (LPARAM) this); + } + +//----------------------------------------------------------------------------------------------------------------- + +INT_PTR txDialog::dialogBox (const txDialog::Layout* layout /*= NULL*/, size_t bufsize /*= 0*/) + { +$1 if (!layout) layout = layout_; +$ if (!layout) return TX_DEBUG_ERROR (" "), 0; + +$ if (!bufsize) bufsize = 1024; + +$ DLGTEMPLATE* tmpl = (DLGTEMPLATE*) GlobalAlloc (GPTR, bufsize); +$ if (!tmpl) return TX_DEBUG_ERROR ("GlobalAlloc(): "), 0; + +$ const Layout* dlg = &layout[0]; +$ const Layout def = { DIALOG, NULL, 0, 0,0,0,0, WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_CENTER, "MS Shell Dlg", 8 }; + +$ void* ptr = _tx_DLGTEMPLATE_Create (tmpl, bufsize, + (dlg->style? dlg->style : def.style) | DS_SETFONT, 0, 0, + dlg->x, dlg->y, dlg->sx, dlg->sy, + dlg->caption? dlg->caption : def.caption, + dlg->font? dlg->font : def.font, + dlg->fontsize? dlg->fontsize : def.fontsize, NULL); +$ WORD i = 0; +$ for (i = 1; layout[i].wndclass != END; ++i) + { +$ const Layout* item = &layout[i]; + +$ ptr = _tx_DLGTEMPLATE_Add (ptr, bufsize - ((char*)ptr - (char*)tmpl), + item->style | WS_VISIBLE, 0, item->x, item->y, item->sx, item->sy, + item->id, (const char*) item->wndclass, item->caption); + } + +$ tmpl->cdit = (unsigned short) (i-1); +$ INT_PTR res = DialogBoxIndirectParam (NULL, tmpl, NULL, dialogProc__, (LPARAM) this); + +$ GlobalFree (tmpl); + +$ return res; + } + +//----------------------------------------------------------------------------------------------------------------- + +int txDialog::dialogProc (HWND, UINT, WPARAM, LPARAM) + { +$1 return FALSE; + } + +//----------------------------------------------------------------------------------------------------------------- + +ptrdiff_t CALLBACK txDialog::dialogProc__ (HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam) + { +$1 static txDialog* this__ = NULL; + +$ if (msg == WM_INITDIALOG) this__ = (txDialog*) lParam; +$ if (!this__) return FALSE; + +$ switch (msg) + { + case WM_INITDIALOG: $ SetForegroundWindow (wnd); break; + + case WM_COMMAND: $ switch (LOWORD (wParam)) + { + case IDOK: + case IDCANCEL: $ SetForegroundWindow (txWindow()); + $ EndDialog (wnd, (INT_PTR) this__); break; + default: $ break; + } + + default: $ break; + } + +$ return this__-> dialogProc (wnd, msg, wParam, lParam); + } + +//----------------------------------------------------------------------------------------------------------------- + +void* _tx_DLGTEMPLATE_Create (void* globalMem, size_t bufsize, DWORD style, DWORD exStyle, + WORD controls, short x, short y, short cx, short cy, + const char caption[], const char font[], WORD fontsize, HANDLE menu) + { +$1 _TX_IF_ARGUMENT_FAILED (globalMem) return NULL; + +$ WORD* pw = (WORD*) globalMem; + +$ DLGTEMPLATE* tmpl = ((DLGTEMPLATE*&) pw)++; + +$ tmpl->style = style; +$ tmpl->dwExtendedStyle = exStyle; +$ tmpl->cdit = controls; +$ tmpl->x = x; +$ tmpl->y = y; +$ tmpl->cx = cx; +$ tmpl->cy = cy; + +$ *pw++ = (WORD)(ptrdiff_t) NULL; +$ *pw++ = (WORD)(ptrdiff_t) menu; + +$ if (caption) + { +$ pw += MultiByteToWideChar (_TX_CP, 0, caption? caption : "", -1, (wchar_t*) pw, + (int) (bufsize? bufsize - ((char*)pw - (char*)globalMem) : 0xFFFF)); + } + +$ if (style & DS_SETFONT) + { +$ *pw++ = fontsize; +$ pw += MultiByteToWideChar (_TX_CP, 0, font? font : "", -1, (wchar_t*) pw, + (int) (bufsize? bufsize - ((char*)pw - (char*)globalMem) : 0xFFFF)); + } + +$ return pw; + } + +//----------------------------------------------------------------------------------------------------------------- + +void* _tx_DLGTEMPLATE_Add (void* dlgTemplatePtr, size_t bufsize, DWORD style, DWORD exStyle, + short x, short y, short cx, short cy, + WORD id, const char wclass[], const char caption[]) + { +$1 _TX_IF_ARGUMENT_FAILED (dlgTemplatePtr) return NULL; + +$ WORD* pw = (LPWORD) dlgTemplatePtr; // Force align at word boundary +$ (ULONG&) pw += 3; +$ (ULONG&) pw >>= 2; +$ (ULONG&) pw <<= 2; + +$ DLGITEMTEMPLATE* tmpl = ((DLGITEMTEMPLATE*&) pw)++; + +$ tmpl->style = style; +$ tmpl->dwExtendedStyle = exStyle; +$ tmpl->x = x; +$ tmpl->y = y; +$ tmpl->cx = cx; +$ tmpl->cy = cy; +$ tmpl->id = id; + +$ if (HIWORD (wclass) == 0xFFFF) + { +$ *pw++ = (WORD) (HIWORD ((ptrdiff_t) wclass)); +$ *pw++ = (WORD) (LOWORD ((ptrdiff_t) wclass)); + } + else if (wclass) + { +$ pw += MultiByteToWideChar (_TX_CP, 0, const_cast (wclass), -1, (wchar_t*) pw, + (int) (bufsize? bufsize - ((char*)pw - (char*)dlgTemplatePtr) : 0xFFFF)); + } + else + { +$ *pw++ = 0; + } + +$ if (caption) + { +$ pw += MultiByteToWideChar (_TX_CP, 0, caption, -1, (wchar_t*) pw, + (int) (bufsize? bufsize - ((char*)pw - (char*)dlgTemplatePtr) : 0xFFFF)); + } + else + { +$ *pw++ = 0; + } + +$ *pw++ = 0; + +$ return pw; + } + +//} +//================================================================================================================= + +//================================================================================================================= +//{ Cleaning up the utility macros +// +//================================================================================================================= + +#undef $ + +//} +//================================================================================================================= + +//! @endcond +//} +//================================================================================================================= + +/*! @cond INTERNAL */ + +} } // namespace TX, anonymous namespace + +/*! @endcond */ + +//----------------------------------------------------------------------------------------------------------------- +//{ Easy using of TX:: and some of std:: +//----------------------------------------------------------------------------------------------------------------- + +using namespace TX; // Allow easy usage of TXLib functions + +using ::std::cin; // Predefined usings to avoid "using namespace std" +using ::std::cout; +using ::std::cerr; +using ::std::string; + +//} +//----------------------------------------------------------------------------------------------------------------- + +//================================================================================================================= +//{ [Experimental] Debugging macros +//! @name +//================================================================================================================= + +//{---------------------------------------------------------------------------------------------------------------- +//! @ingroup Misc +//! @brief +//! +//! +//! @warning . +//! +//! @title : @table +//! @tr $ (x) @td @c x . +//! @tr $_(x) @td @c x . +//! @tbr +//! @tr $$ (expr) @td , , . @n +//! "", , +//! expr . +//! @tr $$_(expr) @td , $$(expr), . +//! @tbr +//! @tr $$$ (expr) @td , $$(expr), ( ). +//! @tr $$$_(expr) @td , $$$(expr), . +//! @tbr +//! @tr $$$$ @td . +//! @tr $$$$_ @td ( ). +//! @tr $n @td ( @c '\\n'). +//! @endtable +//! +//! @title : @table +//! @tr @c $d @td - @td @td @c $T @td +//! @tr @c $b @td - @td @td @c $B @td - +//! @tr @c $g @td - @td @td @c $G @td - +//! @tr @c $c @td - @td @td @c $C @td - +//! @tr @c $r @td - @td @td @c $R @td - +//! @tr @c $m @td - @td @td @c $M @td - +//! @tr @c $y @td @td @td @c $Y @td - +//! @tr @c $t @td @td @td @c $D @td - +//! @endtable +//! @title @table +//! @tr @c $a @td Assertion @td - @td +//! @td @c $A @td Assertion bold @td @td +//! @tr @c $i @td Information @td - @td +//! @td @c $I @td Information bold @td @td +//! @tr @c $w @td Warning @td - @td +//! @td @c $W @td Warning bold @td @td +//! @tr @c $e @td Error @td - @td +//! @td @c $E @td Error bold @td @td +//! @tr @c $f @td Fatal @td - @td +//! @td @c $F @td Fatal bold @td - @td +//! @tr @c $l @td Location @td - @td +//! @td @c $L @td Location bold @td - - @td +//! @endtable +//! @title @table +//! @tr @c $s @td . . +//! @endtable +//! +//! @see assert(), asserted, __TX_FILELINE__, __TX_FUNCTION__, TX_ERROR +//! +//! @usage @code +//! $g // green +//! int x = 5; +//! int y = $(x) + 1; +//! $$( x = $(y) + 2 ); +//! +//! $r // red +//! double xy = $$( pow (x, y) ); +//! +//! $$$$ +//! double h = $$(( $(x) = x*x, y = y*y, sqrt ($(x+y)) )); +//! +//! $$( txCreateWindow (800, 600) ); +//! +//! $d // default color +//! $$$( if ($(xy) < $(h)) { $s return $(h); } ) +//! +//! $$$$ +//! @endcode +//}---------------------------------------------------------------------------------------------------------------- + +#ifndef __TX_DEBUG_MACROS +#define __TX_DEBUG_MACROS (" $-") + +//! @cond INTERNAL + +#define $_(var) _txDump (var) + +#define $(var) ( _txDump ((var), "[" #var " = ", "] ") ) + +#define $$(cmd) ( std::cerr << "\n[" __TX_FILELINE__ ": " #cmd "]\n", \ + _txDump ((cmd),"\n[" __TX_FILELINE__ ": " #cmd ": ", ", DONE]\n") ) + +#define $$_(cmd) ( std::cerr << "\n[" __TX_FILELINE__ ": " #cmd "]\n", \ + _txDump ((cmd), "[" __TX_FILELINE__ ": " #cmd ": ", ", DONE]\n") ) + +#define $$$(cmd) { std::cerr << "\n[" __TX_FILELINE__ ": " #cmd "]\n"; \ + _txDumpSuffix ("\n[" __TX_FILELINE__ ": " #cmd " DONE]\n"); { cmd; } } + +#define $$$_(cmd) { std::cerr << "\n[" __TX_FILELINE__ ": " #cmd "]\n"; \ + _txDumpSuffix ( "[" __TX_FILELINE__ ": " #cmd " DONE]\n"); { cmd; } } + +#define $$$$ { txOutputDebugPrintf ("\f\n"); \ + { $s $l txOutputDebugPrintf ("\f" "[%s (%d) %s]", __FILE__, __LINE__, __TX_FUNCTION__); } txOutputDebugPrintf ("\f\n"); } + +#define $$$$_ { txOutputDebugPrintf ("\f\n"); \ + { $s $l txOutputDebugPrintf ("\f" "[%s]", __func__); } txOutputDebugPrintf ("\f\n"); } + +#define $n std::cerr << "\n"; + +#define $s _txSaveConsoleAttr __txSaveConsoleAttr; + +#define $T txSetConsoleAttr (0x00); +#define $B txSetConsoleAttr (0x01); +#define $G txSetConsoleAttr (0x02); +#define $C txSetConsoleAttr (0x03); +#define $R txSetConsoleAttr (0x04); +#define $M txSetConsoleAttr (0x05); +#define $Y txSetConsoleAttr (0x06); +#define $d txSetConsoleAttr (0x07); +#define $D txSetConsoleAttr (0x08); +#define $b txSetConsoleAttr (0x09); +#define $g txSetConsoleAttr (0x0a); +#define $c txSetConsoleAttr (0x0b); +#define $r txSetConsoleAttr (0x0c); +#define $m txSetConsoleAttr (0x0d); +#define $y txSetConsoleAttr (0x0e); +#define $t txSetConsoleAttr (0x0f); + +#define $i txSetConsoleAttr (0x1b); +#define $I txSetConsoleAttr (0x1e); +#define $a txSetConsoleAttr (0x2a); +#define $A txSetConsoleAttr (0x2e); +#define $e txSetConsoleAttr (0x4f); +#define $E txSetConsoleAttr (0x4e); +#define $w txSetConsoleAttr (0x5d); +#define $W txSetConsoleAttr (0x5e); +#define $f txSetConsoleAttr (0xc0); +#define $F txSetConsoleAttr (0xc5); +#define $l txSetConsoleAttr (0x80); +#define $L txSetConsoleAttr (0x87); + +//----------------------------------------------------------------------------------------------------------------- + +#if !defined (_MSC_VER_6) + +template inline +const T& _txDump (const T& value, const char* prefix = "", const char* suffix = "") + { + std::cerr << prefix << value << suffix; + return value; + } + +#endif + +template inline + T& _txDump ( T& value, const char* prefix = "", const char* suffix = "") + { + std::cerr << prefix << value << suffix; + return value; + } + +struct _txDumpSuffix + { + const char* suffix_; + + inline _txDumpSuffix (const char* suffix = "") : suffix_ (suffix) {} + inline ~_txDumpSuffix() { std::cerr << suffix_; } + + _txDumpSuffix (const _txDumpSuffix&); + _txDumpSuffix& operator = (const _txDumpSuffix&); + }; + +struct _txSaveConsoleAttr + { + unsigned attr_; + + inline _txSaveConsoleAttr() : attr_ (txGetConsoleAttr ()) {} + inline _txSaveConsoleAttr (WORD attr) : attr_ (txGetConsoleAttr ()) { txSetConsoleAttr (attr); } + inline ~_txSaveConsoleAttr() { txSetConsoleAttr (attr_); } + }; + +//! @endcond + +#endif + +//} +//================================================================================================================= + +//----------------------------------------------------------------------------------------------------------------- +//{ Compiler- and platform-specific +// +//----------------------------------------------------------------------------------------------------------------- +//! @cond INTERNAL + +#if defined (_GCC_VER) && (_GCC_VER >= 420) + + #pragma GCC optimize ("strict-aliasing") + + #if (_GCC_VER >= 460) + #pragma GCC diagnostic pop + + #else + #pragma GCC diagnostic warning "-Wstrict-aliasing" + #pragma GCC diagnostic warning "-Wshadow" + #endif + + // Still block this warnings to avoid reporting about "= {0}" or "= {}" init style, + // and old style cast used in Windows.h RGB() macro. + + #pragma GCC diagnostic ignored "-Wmissing-field-initializers" + #pragma GCC diagnostic ignored "-Wold-style-cast" + + // These warnings really occur at end of compilation, so block them too. + + #pragma GCC diagnostic ignored "-Wunreachable-code" + #pragma GCC diagnostic ignored "-Wunused-label" + #pragma GCC diagnostic ignored "-Winline" + +#endif + +//----------------------------------------------------------------------------------------------------------------- + +#if defined (_MSC_VER) + + #pragma warning (default: 4127) // conditional expression is constant + #pragma warning (default: 4351) // new behavior: elements of array will be default initialized + + #pragma warning (default: 4511) // copy constructor could not be generated + #pragma warning (default: 4512) // assignment operator could not be generated + #pragma warning (default: 4663) // C++ language change: to explicitly specialize class template + #pragma warning (default: 4702) // unreachable code + + #if (_MSC_VER >= 1400) // MSVC 8 (2005) or greater + #pragma warning (default: 26135) // missing locking annotation + #pragma warning (default: 28125) // the function must be called from within a try/except block + #pragma warning (default: 28159) // consider using another function instead + #endif + + // This warning really occur at end of compilation, so still block it. + + #pragma warning (disable: 4514) // unreferenced inline function has been removed + #pragma warning (disable: 4710) // function not inlined + #pragma warning (disable: 4786) // identifier was truncated to '255' characters in the debug information + +#endif + +#if defined (__INTEL_COMPILER) + + #pragma warning (default: 174) // remark: expression has no effect + #pragma warning (default: 304) // remark: access control not specified ("public" by default) + #pragma warning (default: 522) // remark: function redeclared "inline" after being called + #pragma warning (default: 981) // remark: operands are evaluated in unspecified order + #pragma warning (default: 1684) // conversion from pointer to same-sized integral type (potential portability problem) + +#endif + +//! @endcond +//} +//----------------------------------------------------------------------------------------------------------------- + +#endif // __TXLIB_H_INCLUDED + +//================================================================================================================= +// EOF +//================================================================================================================= + + + + + + + + + + + + diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/WindowsFormsApplication1.csproj b/WindowsFormsApplication1/WindowsFormsApplication1/WindowsFormsApplication1.csproj index 655406d..c100748 100644 --- a/WindowsFormsApplication1/WindowsFormsApplication1/WindowsFormsApplication1.csproj +++ b/WindowsFormsApplication1/WindowsFormsApplication1/WindowsFormsApplication1.csproj @@ -94,6 +94,9 @@ True + + + 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 G|Nb4x+8_J? literal 0 HcmV?d00001 diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.CoreCompileInputs.cache b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..4a365b6 --- /dev/null +++ b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +a71191b9b8c49cadecaa2e05cc537d361f14ffd5 diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.FileListAbsolute.txt b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..7cf3d24 --- /dev/null +++ b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.FileListAbsolute.txt @@ -0,0 +1,11 @@ +C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe.config +C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe +C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.pdb +C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csprojAssemblyReference.cache +C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.CompileForm.resources +C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.MainForm.resources +C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.Properties.Resources.resources +C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csproj.GenerateResource.cache +C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csproj.CoreCompileInputs.cache +C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.exe +C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.pdb diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.GenerateResource.cache b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.GenerateResource.cache new file mode 100644 index 0000000000000000000000000000000000000000..c234aab85094343fb070ed245ef2ae1cf40e2aef GIT binary patch literal 1079 zcma)4U279T6y0sIX*M6aK}r#Q2;zf~uq2eAFF|ZdYO#T8O7TIIN%k%d+3bXw-O~6A z{1qbj?7#8BKj541VtvqihFVJ-r1#5L*EcBH0hru4Eo&O}BiZ8M&9v3v0uf&TYO8?!s&Vb6k z646j#M(byjC=b+pAvEa#6ay8}fmX*dB3(vd%tI^kYnsxLNOCevS#UhBT3*Gq_xG&( zD-`TqIsg0fN005SD!7|(Q<+yT1VIk~{BbH3tJCMDU*Qx0ic+b{sXh`i9V$H!*(oQb z8UVNmzy7~!ovXK5*@AS&#(BkFQ@Ng!v6}+WT8{^6Puog%T_27J3-X=UwsTr|m(Y?QNik0iAyM@#_hC4IG7NU>~9Z5Tg1AiTft| literal 0 HcmV?d00001 diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csprojAssemblyReference.cache b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csprojAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..ed0ffd227bebc96db995c0c1ca9026ff8034a9ca GIT binary patch literal 2388 zcmcJQ*>2N76o#F(Sqg-$Yz0!*mR6%gp`{=d1Zg8A0u)jeE+VRleUc6td(s&vZFoMO zfOp`IcPQsLUBEKj*^+-R`6u65#xqvJvaCZq=t{?Q66MQVVQXbn*JrPWLON`Vo4#Rn zrD3VO4cZ9htyPyc zmMgr*GX$H9X0*n}2e;*OAIO#O3JJkeYIgDyMj<8GK89e}Yi@RZ-jP62=Tj(YlK)z> zXecxlcN*OGm7Y4vr- z1^&i?4<5DFFh|O44%v2`?9Z+YKzRgxjT5vE1F6O?cz(buAkU4H_epq;+BdABv^%L~ z5s^-u$e@qZHJUcNagwNOP2ueYr96YQoj7Tf(piLvSRf}~3#+$wxgG>LokLtN7TobS zr}@6{dI7A2FdhrcHMY`HbOH=5M|-hgj&l+k*JP!~Ezl!j!(`fDKy0kjo^~WkutcjY zP5t~ul1n6)NoGi{kX$9XMsl6x2FWbRO_EzE85+BIIw$_z`X*@x8_^;y!oeM_&M8+p zX*~N$?xh_Vn5>~K%Ve}a0-fx7mX%B<6IMQ#pgqbeeQzHA{E?$ozfdS-Z_^c*So{s;!LF_V literal 0 HcmV?d00001 diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.pdb b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.pdb new file mode 100644 index 0000000000000000000000000000000000000000..07cb90d24d94f44858768ea433d86c18917c5500 GIT binary patch literal 58880 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 F_&=r_QWyXL literal 0 HcmV?d00001 From 3f326a6848ca20c7da20e830395831deb4c1e285 Mon Sep 17 00:00:00 2001 From: DarkCat09 Date: Thu, 8 Oct 2020 19:11:40 +0400 Subject: [PATCH 4/4] Removed binary and obj/* files --- .../Debug/WindowsFormsApplication1.exe.config | 3 --- .../bin/Debug/WindowsFormsApplication1.pdb | Bin 58880 -> 0 bytes ...mework,Version=v4.6.1.AssemblyAttributes.cs | 4 ---- .../DesignTimeResolveAssemblyReferences.cache | Bin 823 -> 0 bytes ...ignTimeResolveAssemblyReferencesInput.cache | Bin 7535 -> 0 bytes ...dowsFormsApplication1.CompileForm.resources | Bin 180 -> 0 bytes ...WindowsFormsApplication1.MainForm.resources | Bin 180 -> 0 bytes ...Application1.Properties.Resources.resources | Bin 415791 -> 0 bytes ...Application1.csproj.CoreCompileInputs.cache | 1 - ...rmsApplication1.csproj.FileListAbsolute.txt | 11 ----------- ...sApplication1.csproj.GenerateResource.cache | Bin 1079 -> 0 bytes ...sApplication1.csprojAssemblyReference.cache | Bin 2388 -> 0 bytes .../obj/Debug/WindowsFormsApplication1.pdb | Bin 58880 -> 0 bytes 13 files changed, 19 deletions(-) delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe.config delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.pdb delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/.NETFramework,Version=v4.6.1.AssemblyAttributes.cs delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/DesignTimeResolveAssemblyReferences.cache delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.CompileForm.resources delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.MainForm.resources delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.Properties.Resources.resources delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.CoreCompileInputs.cache delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.FileListAbsolute.txt delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.GenerateResource.cache delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csprojAssemblyReference.cache delete mode 100644 WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.pdb diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe.config b/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe.config deleted file mode 100644 index 3dbff35..0000000 --- a/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.exe.config +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.pdb b/WindowsFormsApplication1/WindowsFormsApplication1/bin/Debug/WindowsFormsApplication1.pdb deleted file mode 100644 index 07cb90d24d94f44858768ea433d86c18917c5500..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58880 zcmeI52YglK-N(+xKUB5t7`SF zRIS!(l~!A9aodU(Q7cw$ZN*vZeyvuk@AvnNo0AAAzBH7=^T|Ko^Xxs(xKm1sD#|O% z=T)WU49Mx*H*Ly{ytHBI85#RF?T|YoK*h~pP|0N$*HViu_Wu7bD1r4~?Nxhn2@J2* zhQHjCi(-$=`#!(RjF~pjf`%YL^$5QDDg}P^RRg2n`|rQE1h!WHJ@?lCe{Y4?$=T}k z%-FiLGYVpu-}l&>HD7!@bJA^ZewetV{e5mU2m;wjqUxn12Guo+TJOEyO-f*E{a+Jd zbo`fI*{RFjB#V2Kxt$W&TmRcBoISwm)44~CeYDXtEmzG5)=&Lm{KkjJPrCZ8*Eh9X zHP-6)x$d0VE$2Pc^8P+S@M+_T_wTo{_j&iW+<)A;7cOaj_LaA{O><>*#>U^BwEv80 z@xDzTeDB^P);={Wy!_$c{IRTc-r`ortbMA&?AO-}7R z@VXzr_Vn$i^tt7a^PYHM^qT2c-F{2kPP=8{>;Z}1S@nO-3$6bYd;Ih>mR|Gar8oS2 zR?B#kQ!g9THXYXcN4ItT)h%=W zG3WEgk9gy-moC|_>eBHW58N#aXAem9&Z_^D%ch^a?z1Pibbs)G*`H20?}_Wq=-;x< z2Om^-Zm{l+O-EM0vi>!L*Bp4%ldlYTXZ5pB6)*g#@93Eif1cjv`lmWSf5`BHxt~wl1B!CD z%;L_f{}Fw!?)UrG-=6*VQ`*FH+TWJC&-gFGifQNmdHPq6zM5BYN#otJaQ1*i@2vVi zeMG-$xo`ZmVxQJmb~~|Ihwgtpu=tQC#xKsi|2LyQN&KzN6MH~W?v`2HS@nP2Cz-z+ zJ?W4KGhhD4O^=QJpPR4gbz`IZPWa0MRZpLr`}DErblxosXAem9&Z_?>X0$%6;wJ+> z{LQmX-Yh<(;QL>$D{nRYPoLbHcG^dmq<*sOkv*U&cgrm9tokoMZO!BNKYaekw{HJ9 z@8BPHoLc$DoRz3*^3vKmJ}6Mm6VrdZrdWKq@t)akzT|zjtG7cDL+O{h?m&-%)yja3DsSa(5Qa}$*% z^UD$yyC~Dek?89w_jy!vWj$tho{z7d@;AAp%yiXyYQm*1x_Zjpl){p-dhVo)h_ar0 zXfl_(pnE2>y9@f}H0HAMvU=>Ci<1%7Q~RA(Q9i$-us-LQ#WgY3QyyoOlvUT~2wUmn ztEc=?hqRljl0;?x^n_h!Ri^KPo=VO7bW|kMu`7CQO*&>Is;WxL=I`p_sPxI$1*K6w z_k{f1#N6un`RRv`pP5HzPb?{~SlI6DT=srq;J3syU83BJ!8t>J{GYMbrQMyxb~6xs_eit$K%dyQch%{pD7@Ms8&nb*oz@xqHEnQ+74yS=5T{Y1G{@0MHHMcu0Bd$%uqZ|PNXt5HC1Wfyg;(Z;(yV^fR2$gM^pxs_ei ztwtg5c3j70zm{8#PI4=|s9TL(-tFNldybb|jc9T!yQo`@G~R8{`i?Pjs}V?UWfyge z(O&icECH%27#j3xsbDs^uzssfPAxB%c%I zVw{AK=BtBo>F;e8qZ$He}BT{s^P-$gY3Aqj!R>L-s zFvCp9k!@HF8H2;+5WnGiNcn_%VUGe1#}Gg(cpBUvUJYBrwUDsF2Vh(HIOHY`@iZme zETk_o0a@v;XF$nJCzIe2h}^X!txW^v>3zhOUo2Vn#Bat^5Og38q6&B*+~kS5BbI;7jc~K-Bhl7LRqcAN9RxG39x}!fE_JB9Sp71BI7kmfyhH>hy59|c{!ojc~JPh`S zN5OP>92@{^^16&X+>G4kunv?~h40Lld=VmD*<-G76cAEJprQ zmHJb<>oYzBgCmK>KDB2~o($AeZ8 zcQX@9s}yzA@5}{^ImPS&G4Bv@>+U+F>+nuVqyVL5{gcLW9byE-TWFD%+kPCywFxl|S#cgPW^}Gnwv1_*_DVR=N-Sra6G{>ZIG$ zd#oMijZF0ijbg!yg`_ds4ri&6q8O`^it#`74JyTC%jO|bF}1pCadp*%!m{GhgzJ|p ziL){O<=4CK;_^XtCi9UqquZ!4!wU*Z%Zmz2D>J@pe$3o^Fp2W{X&j5iGAT>t$IrzZ zU49solZrVlwG9Q?q=$6U$1f zN(xI$PEM#q%gYjFX8cM2rg~L=5w%C?zF zh8ASlb~u4FrxAwydq2DDxT^KQD#XqYF*8@7rELU3H(j78n~*wTKGl5Ohjm1c~gsZ0#)e*#FP)_3P<6{(83b8(;4hOfwWjHcD15t4DaGE7>oI0_ ztLR?A9Cxj?k?M>1&sLc4zV~Iwnn8Qrkg7846}{A;^@`?stygS3i_j@Q%}K{FLmwwY zUSP-aSm4Ka@)js9Qe9k}U7_-$ID0|z7_z=GYoL*^2YSWb6HbA+adGFN^Kp+caqo+3 zAOHK<*|9p79P25gY4S{dLzydn)j@ys?V;98tlt9if9A!IG7i^3)&Suxa0t8= z4uwC4!{B;296kg`z=xs2eH4<1@G(gFE&n4NgZ@Q07TU5*L+A6;iuLM3WHRO23h8dx zhTVbmD(@P%*|p03S}g3C9!t&(YICcMkAS{w^PL0L254z3AAv`p-wdb2zrh*sLpT$D z29Jd5)JMT)@Mzc#&Vn}m{Yb}t$nnT=NJpd((i`cCoRF-W34~|I>sWH!Pr*!WOG;(d z8Xim7v`to`K}fw2DrrF3_!cL_TZ)+-Ut?Men?BVT`nIM%qxRhbYEtmwtM4d$>ObrZ z_lLAgvuEf7v2%G-5A$`?gS<3Hx+mkmwm}fsaW-bgU&TEMS%tZj`ic-L@p!=6Aqe+_lu6hTPKN#A6gVEL?M;VjdsR?v??R}ycP%^;-UHS49)N0l zo1og>pCM%v{sXFgG^5OqhwWhj>;vb(VXzQRg>zv(oCizbe0U*T0B?XL@Gf`)d=xH( z&p_H!xCJhT|AZ&PI1RS~wu6C9ne0Uc(h|8N33X46lc$z#qX= z;m_b{@YnEk_$WLBJ_(mY+XqI`4zm!Af4RskcP%s7bwSksZb4+PYmFCb!()*{k^V>y z(#z?!7nB?IS@mh{|E3~xHxbE1#v|(6vY(Eeg($46kUT_Tj6)QL-1#u%Mt&5Q_R~II zpGJinP2*tnhdEK2 zZpbL47}=}-y(K``Nv_k^xu_0^M9DatI)On?RTJ2gzr(o&$-2m%{n2lAZWMSo(Y5L~ z?bmm7t*_?b*ZOTqkk;Lrk4GirkD0Wf)m}5%jyt<{+y%D5ylZl-=x_Rh+NS0we|JpR z+QVM82ed!czwgJoMG{MuMB}J?+llKVHIZI>Nu=CINls7*{%uJ>;X40(q8X}sj zq@wHLM(A5IMrcQ&b#QyAb+BDuXl~U!UVH4&{VXYs9d|Nr_%k(Q_#gZ)TK^keI?s!w zw=MPmDubpO|LdIpUWGfk_4d*F-`+WIZbczaYR}*4=efSV{aIj^Nwl4xe3qE2QWugb zV`a}%vx|#!78F+4L)9HQ`%&3M&$&|Ee39)VgY9s0rjIW-QJUcXna;u0hqMmT9zpKC z8<{V~Y(1hK)+NrbzZcaca)wuyY1_Bbup?*CN;mVUIlqb>8)uuLdvEp(e2dQm@q0!4 zPkqSeVMgIe2^H5ka~ADRqV1T_7{8h`v+?WQD?bx3TaBAGFm`5D{LFRnGuf!v^0E2LP$NOjcGNXv zSZWF$O_pg5)6194EZ16Ra!F+s_R7PX#Pt%33iTw&3|?24*nJN*v* z#GG;0JzLIj@y^$j1l`ib6?vHir~Ix+Q}LAr0ipZt3FYGaErUx)mS{O{Ar z=0SC=;@vmW#-jbi`&&R*M^GQl)2zQv_){51{S}u~6f7>RTA=jG-+JQehrhRo;8o{O z@i7e%L`76fXSp5B|OHDfIgWL3{dh=<$7QfwbTiDI|)!0V8)$$v?KXk#4w_%-+ z(Pm=dALGlr1o1Ot@iX6zpY>vV#pCg_*T&EJVLW^~e(v?L^IOHwpBKNNY3#zg;w#UO zUvx|S;+64BD&wn;jbC_6?9%Jvm;P`3vghNMuZyq#pZKM#V^>_EeE75e7Mko)t5iWw zQEjQ`xqJm0CkxC&6Xg{JwHt!UVlZv!aYX*TADJ)3>|x|$%+GgWsa_NXYm($x6Rj7U zu5W)I&5f50S`%iheY`M!=6m*@TBLu4E`RU1ya}AwrMBx~>&@m*Pf;eDH*3jnNCSC_ zj@e4LpL+%~xk+(mmsDxQm(tV4ryIoM%9kEpSjrvPNr`3CcutuECY9L=()uwXzuvu{ zGilGsGAqJfaejw!z|NO#;)CSh-?L3&0+Tw+!u;<{ng{wc`*$x2CYKi$+q4cRpX(9% z@$P*6GS(&28Xe~;Hl4N9wi{^k@~!sK1P~ch8)!_8wTmrheQV0&FgO3Na{1wWF{$X{ zscU_HxP3LZoJ!F1GX*nP&=gfAiYJy8CzjIM%jR=C{JWHGtufY@ZDS@jsi79;e^=7d zw3llScK!C9?uYyJg382??f!nHxgmvl-$=Z4!_+Jv@4xAO<;O0+FYA!PDaOgvg+AV$ zaKBRdQ2YIm@V6j#?H)7hcty#u6U@;Cilz{%d`Ol#o98-YeA74`YW!v_3j0CYQaB9K zIN2lV9$N>bBckVH+9N%YE@p3}cC0npIE3yR`ulo5-ierNuQd%aHibt(iX)r_sk1Nv zSwe;jy7h>>jcEE`)kgKQZO5ZNHPC}N*mL++4qsp zkoY3^^>h||U^2XGv9oLTm|4H0RXHW^DbZ(4c(m7$@-p`=G_UGDi#jnwXsEtNw=(xC zsp4?3b2r>^G?e=+*c*GBzp?B|NiE9WV?5ok4l)Fb@Hu^{5IQW_~e-q}Qe+%ZqhU95H zOoe%n=PFD%`#7?6HQ{xDw1qGW($-v=+8M`|=QP@JJIYk`okr-soM&R*$%*V}{Ykq? zM&C-UC22-#P`WqShLrhxltajMXS1_YxJM-GO6z{RuZSi0Ch7wlFqfK4T1m3GKa>hp zHuOi`M-J7#rb7BbfS*v~7X2oq+|B)?L*WecGa(Y52pQkQ^Wf1?bwd9Ne*}+#_rTfk zL8$wUzlZto6L=ilmxL6+_HYjD3k%^0I2RrYi{MOH3==Q`b>2T8o(C7eYas0#I;92k`xB|Wg&xY^9bKvKYaVTs~T~Vgte((a= z8D0nn!If}4ya*l*FNV6$b_qNMu7a1tOW_)L8TC})~EcO`3&#kZnwhxw1;V0atUn5%l!2y;7n z#=GDrkiHe%0ck72PvJxGPWUjC`$yr=&_4$6hHpapdZ@8+EzE^KhvVTdpsjbsqH#=P z;shkk=xsZgfcfFbG?QOhSo2)W4nrmzy`PWh(}CTa$C7*YMwrb(q<%@9L>>GJwtz~r z%4i+>Ht>F!34aa8!Qa5Ir%}%+k4%>PmQ=sTj+y;7-qgo}&6rC)NEnKfvZ@s)WoG8U zN8rKOQ+8$!{4MN(UTM=f`#bci{U>0KGtYw?&>sq)gsPXPpz^;Fu7L8-SP?vp{(QIz zQrE#VkU9*WgT!gv5l8R`^u!T75B~-?L$#eh!p3Ak;prKa7tw2cehK!6FT;WG&+srP zcY2=T74%c#Utl@>E7WrhTi{A4ciNY}hW=9cI=lt z>%IeQjs8H`1|9O^$zpisv=h8S{U@uJE7ET<`sKLmxC`y$d@*x$gpdpzjKM z!W`HO>iJCBPlP;k6V7+~g|H9$QpnmOTnYQZi=6#skhUG(>Gb!&bo6WC0QeltfPZlI zn_(vUPn`arkUkN94*3Zo6!+7JsbD`HOq>GSK`9^x|zoK+UwYC8<%Py{G#O^fwShwx5IVf0;z5|kF+*q^u#!LpC^t2VqnlIRfc}c{4QpCLt zM`;<&j-t1oPDHg~jZr&IS;pMPk%)v9jeFiU%%f?I#%;s-dfbDFeB@fB&7YDc(v9z3cc1EN5lDW7F^)$ zPk^)0FNDX!r7#~ZgU7*>;qmYksQjGacs^8Ly#y9uuCl4!kA{*mzb_j@xsF9dNgk4o z3_`Myafq!~+kU5`Z)^NpeTLC*ZExr6WCgD6d1*{@qESuwztmmNC5wo;L?yre0EH-V}YKvt7)GbaBI&yW9IA=t?s)A z>ve%zLO6<_x;D?@QrDsEscUooL|vP;82d=G_BstJHtOE2z3?2WS1pGs!!zNr@GLkV zu7KSGr}jg++8P%TvMhQmwIkARoKJa{=&-d4kz@O#ka zAp@PCE3{X#`;!_ojURe;p{736ckNkfEP2Md4`!?633U}=EA3aq7Eo#0A6|pLHT*v8 z4zGnhoW1gLJ^J482T-%x4N!Tz5!$rcIl;COJ(JlSTc7s4T4_|9%_2~}BiWbh#!h^j zrG1z*lD@Ddc1okt#&y^Rwt}4@=?=R<>`Xty&ZT7#rao@fvG#2>&oR#=0(<@%3v@24 z_%&utP{TyAD>m^n&YJU>G^lzeP7@z-nm$7R`Nrp%HPeyRupCl;;mMFOAv_zB_fYjh zzYD()>38P5CLP{|egIqtGvH$|6SAk^*}foT51Sw`G=$Q}H%R|O*b7ofv$D%KVS&)9rC`uoL;~;IEktqmi zPv)%dhmiRsyaUpv!(T#1S#$0)0d7J+5&j7t2H%GC>+lme8U71SgH7Z1oU0$4j(#kh z0jI&4Z~;6LR>PyIm!dmg2A z^>ye6!|UN>_yaf_-T)WEo8VHo2CjlXf;YmO;eGHH_!ztuYA^p|_&&S?{tNyTwrXV0 zKe|HtNH`q+4339)!x``%I0xPf7s31Ba`;Pl8T=Kz8Pd1HweWuUD0~3E2p@#+z=vS0 zG52lZe(({P1|Nm};bU+-d;;df4R8^B60U$x!As%q;q~wtxE4MOH^ArMtMCu-pYVCu zsEIuX=mcLtKLGv_9tK~8N5enEV)zO?1^xxDgnxxM!B^p3a0`48z6O5}Ux#nNx8axY zZ?H{MyRYvD|BgNfz6)o=_uz@}eRv-H0R8}e2!9Sgf=|Ma;THJ6@N@VHY_*Tw-}i=} zqR)b#!K2|nVHx}!o(;c%*TR3nTOnguct89KJ_VU3!na@yegfmLK{LCL?F1X49{?M} zT*%lLPKQl-4|5T0h5k&qKfD}j|9u;51Mh?F;Zv{!{4+cd{sVS|4fhR#G}sDuhCN^x zI1F}$lVLYF8)|>N5cY;kA!BX06844H!G7>(us>W6)8W%_Ap8>?1V4d;VWZ}D-+C|{ zioPGzK6NA<4iAN+;7q7}=|ZS|>8Wrmyc9CFhd+SX@J`4a7d{TPXLtb~3O|6_D|`hf z!WR44J;FhdIUyVZwHFu%wHG)BYA>Yp@D_2CHGymW%H0gfGH%@Fn;-d>K9qS-XTU!B?PN^XlEAEX2QKBrS~E;xvMKmgTj|+Kdkar zIVnDsgThlfv?p$fD35ZdbSf{(yHBIaQzADi1G!QAQQ4`iWUgz)q3{*X(TL)fKeY|T zsr)N!#i{#FO5nA}Ir z6^_gmuIkITDTSl>l|JQJamepC>8rQmMrH+w!fTKCa`a&?!A#|-{QGkB<$E}0QxIPl z%A4AN+Q)H-{CIy#zx=7pRJLlTqIaXQM)COi?8ddqRbi@5Wv4tUtttoAi|md^RDbq; z^p9DpF}<2^h5_?!HZeqWpZ$HLG5eu@NG>u5S&Hbr;(L&1k#~@0DXgiGTqGX}k*kpP z$Y$hIq(wv4Nyubm0TLp*ckno}1^EJL&7MKe!cIf>Bt`LX24J73-rzFMS|O>J!c(=5 zF-F_@{+IlCciVdpq-~H!XeK;EUH?13|8+m@$SalwsXfS$$;&pr|0Va{&Gyo|BhQbj z3{&cSr|d%#bq`|8jC<3r%vsVW&koskg)(NF#2UgrhsTma&vAyC5VzrC$Z|aVDP)-( zz65PgU|$G(!hkyH z1@)XyZ`@6SebE=fe(*HdAL<+@9o`BDKs~pU0oOswCz3a%U*n|YWJGz<+#kqyYMf%bZN9|_%$TKT?N=bWpLZ{^JF95_=S;~cZKJ)SJW~(Jb$w=jqN*S_F|Ux< z8f5>io;$`J?J;1eHp=&dw$!zrL#_Mnq1v}s1BpA&$DLkeK0dZ1&zCFh{#n;i1ZwjU zGtX%%4y6eq}_wV5k#_P9lEPV0N8~?6ss8ia_}@;MLDBb;YA|JZtgi$2?V>s#p3?V=Ofl*?e1-Q4 zqAqem=~Q{zWSVr2!u<`1++O9S>BCfFAAb5K0I1~WfT zg}AZ(hZ!dgkRY6Z2c)K-RIpgUqMl(-1e2 z^{Miwy|UJz+CytiT9X#VY5Q}`^lh|e9x2rYYB*sjEh9{r_MWZQCx@VC-K;q*%!Z@k z(Qphr9*%{z*Z*1{>zqYr6*cj%!maJ6G1F(!YEKfVjHJd9j^fWT;n{nyFIv zD#N#(N<<*#LtiK0RF6P+|jr9X5V2$-W zvt`D5zyIg{gc-9 z?}FoB<=DWEFlHU(-v?iyhJs>VODgI+^*Ns&ok#ee%$ibIRyaRVA%|MOt%lw3FTdWs z%%4S{X4_ZrR~JqP&LkBT{Utdj@!JK9F*4~l?(}~uk-^c66m}oPlzofSJ@$x%Y(Rg>{ ztVQug_b%({ds23$wAb{>)XqLG<#Fb$$t83D|M}Bc${NSD!2 zzat~1^4UxUyo01*)(go(@{uZJ6>h-O-Et zrdZy^Ju>P4PQ8f-(O|@v9TU#|*{Rliyz}>(^VggDl=~B%{}Sh}GiEaH?ac3T;SBNd zId?BO`l`OaT=7Y}dUl)H%r|<3j@tlwGcb)V1fb*w&I12Apm!52A-ruD+=Ilp1E_3P0cJ8Yk zo49bNxOo5W^lM#ucs|O+)6#_>BflC9Q!occr8yd4AGh{dQRC=!7c?#y9EVY>K;bu) z|5~Os8ri$>xnhN&MM6ZWOvrMeXWh1@YW%lw=}*RFd_?k>wAglP6hoScW-HOfx0Z=G z304|?*(KeC7?N4<25HWycP@h0*yqKUp4(hli{WFVuE3CJ9z6w&h(D-eB?UC&kAg6P?b^~h#q3-Uhl z1)|>+X^o^I{SbXiAQ#!IcJC7C6f`$`o}R4DIpCQ(rEkIbvZ{(@1=Gq)^lK;`g6_s% zRn1%bwSEAuZO}VnmoYR$DznDVM&l=P(1PCkv3AbSK<&M1;)w@#qv_o$?s(wb4%Qj5 zb4#Cz2iy2jrbt{G>y!S6)TD2PF|Yj*DIce`b8&K@?#tneh#&uhNZyaNbADK$cXH`` zoc-fP&W|0|jT<}W){MjY z&8m2??H{)C{;fObzo=$RRr^bg{fx^3j} z?T;1Kjq@8>bE!Y4Y-b&r;`=1&^Lf%*F(ugcIx^{pGP+G6woDajgbz#&=X9HIr{=urKp9X&2TU?XQ zcZj!v>A$tdKWlE|$e<7SvRKWyL>x5_3q|r~?VKOlzb^|tqhsUn&llOXzBRY*Gb3fU z#khA5&_u$w=FWX&Z=mvMyq$K?*pK6kl|CP82aUJW4w8NtBco$~ldX*XO?>!_Z@yix zCj2I*&3yf)lCKl%#^z^WWDYB(jIH0A8#msMwR3)`N1vZ9#!u~=F5Zu|bAG5xUoX=r zXB&^bdE(t$bLXCV{I*JKyd_OCVi$ z%$$Kkh7V$fw#tXS^|;yv`Rrn)^n3+HRZDFu2WN~QK_^0OKc0h zk?n%`hI}1p&gIGhI}*>dit@#YimH-CWx5~bDuaQ;@`mN+X&o%J{dhYi%QD36 zj+CX3cSfSBir;^!4CvT7<1+>_Ef}@^cn{V)_D0R*|F@3U{@kwV+v%gm6crR`ol{!4 zET^=vvT_&?t`E!^H+=k1U%A^)Lx<#ExgBY!JHCv{5SR;EmPGG?>9Fe>U@*ZRF%-6xZ(Yp36(J=|J-%}&1=`_eY- z9%Q`L^Ey&>!_@DY>OQzsT|50YX8|K;A-RKe@ttuJmy{Y@1hq`w99{YJN%oImK z{`CFw1Dsi1JAI2hdmDE826(nhOI?5Z=Cpp(MyjrzzE{ilAGT_z@3`hztFQUfZ<^fb z=Ha?w>icy5`TM$d`c9hGuu^sHQhL_3rMhW9#qP*$*y-C>ZpizZzbx#0 z`>Y$Ez6a&M(O=h2zk}%Oh;EZqDn|WIntvX~6_2r(ot^{q&*#u>l1g@uWbxe+*HG%( z>Deo`n?^Nu6y#6Oval33s;-@$EpbzQ&AmKa%AcMY@$Nkpi0t$%h|fb^yF(&j`ZRfe zdT)xRZB$*mW3lVy?AX30Rh$uaUqwpHe!X`VZgn0a<;}!qdI}PE4XDY6K_k+yr+W6` z`S^V?jU)cQuB=XBoQS-E%%rl8PvJWtl=EK^z8@0&i+CQ!T;D0uZ_LUq--8HF!8~VV z{*jgZL{xruQKBOMsFKR+!qOR4)x{;{`IY6>6-9~siUhxDpRW^->51Y(y}Xvctp(w> zE$k{dy{NL@BCJ^o@1j_96O|?N`H{eSjNYy(>oLOexhLf3CgxVp&rd&m{LDPon29Cj z6$|?vMT=thGy0^#=|j^q)3Ylp6N~1SF3YZ}swm-1hc#RMwS=05V!ls@PSEN%1zLXB zV~l9Aowb^~wW46uCt{&ry6mxQiSF4=AeDBNmG_AU+ zl`E$-ky_Q(Os@9Y+wSFmVF|2G&y1~0JEK5t;l9V#toh>OnUijN^TWg??eA-$_m&1Q zMl9609}FmCmZ}T}R8|xXSdb_zPE^b-EiYPV4d&@YYe3P+{A#l(D%7IrB(o^0+{&V8 z5sRVt;nEH*|u8)-3U7vvB$Wp2Pi^7!q zt|MiP`>OgMOd@salcdo_ z4UFSM^DBRvmp^FqMsqDae#}_}M~C`t7S1-T=p3md=M{2rE9N@W8HHhMs4#S1bS-BW zy8a>VbV_mn;k1H(!<|2q!HD~y_T1-s&NuX4)4}-T_%rB+z8Sn8@n<(L9Wh8r+pBi- z66itt(~wad=IO3eR~m-B`^0%GjcOfrzX0>^B0AGsK%2XPaMEZkY3TD|>rDG?4c!+$ z64Wq|`XT+1bYuXMflws+Mufi8Z|>g=fjXNWhNwPt zj?4Rc`lf?`ndN64+Y;drM$%34DhV F_&=r_QWyXL diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/.NETFramework,Version=v4.6.1.AssemblyAttributes.cs b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/.NETFramework,Version=v4.6.1.AssemblyAttributes.cs deleted file mode 100644 index 3aa5318..0000000 --- a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/.NETFramework,Version=v4.6.1.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.6.1", FrameworkDisplayName = ".NET Framework 4.6.1")] diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/DesignTimeResolveAssemblyReferences.cache deleted file mode 100644 index 4e4a9744a892b79088544c5a2c6f6270cc39c06e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 823 zcmcIi%Wl&^6dgOZ>qi$^v0`C%phhEGA*CQis2Cz73KSA`Wq~I4bvw$~Q_YME;rsXk z{(&9;Q09gxKn3g=$!8uucg~rkOB_PTwH-L)*mo_wd&w&$wQLN1(sNPM1=A}{3#nj~ zo`KR_cGG-9bDGg?loq`(y@F{6y-`ez($jt^c=ZC-3%P=By3EGSqPDVfhEKzlGQU- z8L9TR?@6rPLbjJofeP{7IsXKnJ=DP&6Fq1`2E_N1@YdGHYgO}(iCxXNH%E^*HashU zE+QWRg zaI;3OA%?QaDzb|xw&3IHU}yigzWb#o4lsdDKVUS2R@R>VRxazj8ZLF9v0t>W%oQlN u>8y(DIwT4mR3pRBC)Z!Ugcx}o$3cR#%_F1ZY@9zN4jMrpH;MZ!3c(52Bi@lt0&+b|2`__qMB9Zt9FZ!nI$`Bg&rErwg zvSzFep+oMKP3Q_~tw`UO!CGN8o7n)Rg$$nO7pxrpWiu(f0|<@cUN*BHRz2bT z3eAdq55ep;%Y5ught=Q z&NsQ|$$fB_wFbZHHCGP|1T-pr6!peE`?;lY%{16R1*K&K^@>RYwY^NNc5urJm7 zPF00hv2OB2T~T^2#(S3vD_qsVbi0+qss{54o#+Rm9!LcRsBxT%wLlvjUvG3R$B#eX zsO7HJ^oBUw#hs7JkN3)W7^gO;hFK5_93zzgeZAotuFAlbv$M|4j=o+$RdBhXWDRGC zqMA@p7uu+1uR{t0GeA=~gN}|*#xazsQ&lfzAl`$ze|B*}=!VCe1bDh*JJD{nI<70} zfYwqi%tk_2S%05)V!dqZv<)(CsK0qyvf6B{cXo zMkYmOoXll3u~W1<}SjxvA}f2f`SO?9wP0BpOx+P>&Rc!%4$!bxQt-GLD=m$VQDTOAV@t< zkb>g)w5>-GeT!gzoM7!&mleIcBFOI$(uouDt?xxZ-y_gY+(0ix@PW`qh*S)y@PG>U z_0Xr^N-`o`+j!XK>(Om3euJ^?z1Hb3*8DxveR+L+7&bWRqI2(09?Hd$_x)b{KI{I? zt+BDxLwxFWt~5z1`XzupLi0M7CvTb*TZHi#Z$^rEik~F)7D>9}gGrK{`=~Tc`i`zN zX*?P)%c7Y+TsiY+g(LO@)=nJ$A_7AP$#lZJhMVVzSy(=ESULO5ym`ca#QOfo#vFRO zdRXH7#JuTL{fOnU=)8nbRRnDznI;iNQkp$M6VLLpS#-S>OXd{0!(G%T=}3Pf%%vz@ ZD3|CO{%i2``>$X922a24uQ6Mf{{_xjis@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.MainForm.resources b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.MainForm.resources deleted file mode 100644 index 6c05a9776bd7cbae976fdcec7e3a254e93018279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.Properties.Resources.resources b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.Properties.Resources.resources deleted file mode 100644 index e423b9a0d5208a564fb83eeccd4966b87c2ebc16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415791 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 G|Nb4x+8_J? diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.CoreCompileInputs.cache b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.CoreCompileInputs.cache deleted file mode 100644 index 4a365b6..0000000 --- a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -a71191b9b8c49cadecaa2e05cc537d361f14ffd5 diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.FileListAbsolute.txt b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.FileListAbsolute.txt deleted file mode 100644 index 7cf3d24..0000000 --- a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,11 +0,0 @@ -C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe.config -C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.exe -C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\WindowsFormsApplication1.pdb -C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csprojAssemblyReference.cache -C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.CompileForm.resources -C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.MainForm.resources -C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.Properties.Resources.resources -C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csproj.GenerateResource.cache -C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.csproj.CoreCompileInputs.cache -C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.exe -C:\Users\Acer\VisualStudio\source\repos\MultRedactor\WindowsFormsApplication1\WindowsFormsApplication1\obj\Debug\WindowsFormsApplication1.pdb diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.GenerateResource.cache b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csproj.GenerateResource.cache deleted file mode 100644 index c234aab85094343fb070ed245ef2ae1cf40e2aef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1079 zcma)4U279T6y0sIX*M6aK}r#Q2;zf~uq2eAFF|ZdYO#T8O7TIIN%k%d+3bXw-O~6A z{1qbj?7#8BKj541VtvqihFVJ-r1#5L*EcBH0hru4Eo&O}BiZ8M&9v3v0uf&TYO8?!s&Vb6k z646j#M(byjC=b+pAvEa#6ay8}fmX*dB3(vd%tI^kYnsxLNOCevS#UhBT3*Gq_xG&( zD-`TqIsg0fN005SD!7|(Q<+yT1VIk~{BbH3tJCMDU*Qx0ic+b{sXh`i9V$H!*(oQb z8UVNmzy7~!ovXK5*@AS&#(BkFQ@Ng!v6}+WT8{^6Puog%T_27J3-X=UwsTr|m(Y?QNik0iAyM@#_hC4IG7NU>~9Z5Tg1AiTft| diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csprojAssemblyReference.cache b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.csprojAssemblyReference.cache deleted file mode 100644 index ed0ffd227bebc96db995c0c1ca9026ff8034a9ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2388 zcmcJQ*>2N76o#F(Sqg-$Yz0!*mR6%gp`{=d1Zg8A0u)jeE+VRleUc6td(s&vZFoMO zfOp`IcPQsLUBEKj*^+-R`6u65#xqvJvaCZq=t{?Q66MQVVQXbn*JrPWLON`Vo4#Rn zrD3VO4cZ9htyPyc zmMgr*GX$H9X0*n}2e;*OAIO#O3JJkeYIgDyMj<8GK89e}Yi@RZ-jP62=Tj(YlK)z> zXecxlcN*OGm7Y4vr- z1^&i?4<5DFFh|O44%v2`?9Z+YKzRgxjT5vE1F6O?cz(buAkU4H_epq;+BdABv^%L~ z5s^-u$e@qZHJUcNagwNOP2ueYr96YQoj7Tf(piLvSRf}~3#+$wxgG>LokLtN7TobS zr}@6{dI7A2FdhrcHMY`HbOH=5M|-hgj&l+k*JP!~Ezl!j!(`fDKy0kjo^~WkutcjY zP5t~ul1n6)NoGi{kX$9XMsl6x2FWbRO_EzE85+BIIw$_z`X*@x8_^;y!oeM_&M8+p zX*~N$?xh_Vn5>~K%Ve}a0-fx7mX%B<6IMQ#pgqbeeQzHA{E?$ozfdS-Z_^c*So{s;!LF_V diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.pdb b/WindowsFormsApplication1/WindowsFormsApplication1/obj/Debug/WindowsFormsApplication1.pdb deleted file mode 100644 index 07cb90d24d94f44858768ea433d86c18917c5500..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58880 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 F_&=r_QWyXL

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≪3D&g6?2t!Rr|ujh*e1d?v%EWWS%0CrUH$ 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 TVR{@u9{ltF4FCp9n0EfZ3OTth diff --git a/README.md b/README.md index ff5b162..9303587 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,21 @@ # MultRedactor -Редактор мультиков -Задачи -https://docs.google.com/spreadsheets/d/1ka-DjMCEskMYwHZOzJRvlgEZpGA5g-WNFh_pH3sF3y4/edit#gid=1972460334 +## Что это? +_MultRedactor_ - удобный графический редактор мультфильмов. Вы создаёте персонажей, задаёте им параметры, а эта программка преобразует всё в исходный код C++, и, по нажатию соответствующей кнопки, скомпилирует его. Правда удобно? + +## Как использовать? +1. Запустите приложение. +2. В левой части окна, в поле ввода, напишите название мультфильма. +3. Всё в той же левой части выберите фон. +4. Нажмите кнопку "Добавить персонажа". +5. Выберите вид движения, границы (```x,y``` начала и ```x,y``` конца), тайминг (в секундах) и картинку. +6. Назовите своего персонажа (необязательно) и нажмите кнопку "Сохранить персонажа". +7. Если нужно, добавьте ещё персонажей. +8. Нажмите кнопку "Сохранить мульт", выберите расположение файлов и введите название главного файла. Естественно, нужно нажать "Сохранить". +9. Через некоторое время появится сообщение "Готово!". Нажмите кнопку "Компилировать". В открывшемся окошечке всё и так понятно расписано, здесь пояснять ничего не буду. +10. По окончанию компиляции появится сообщение "Готово!". Да, теперь точно готово. Перейдите в каталог с мультфильмом - там найдёте *.exe-файл. Это готовый мультик. + +## TODO + - Написать нормальную инструкцию с картинками + - Доделать код движения персонажей, т.к. сейчас это всё очень криво... + - https://docs.google.com/spreadsheets/d/1ka-DjMCEskMYwHZOzJRvlgEZpGA5g-WNFh_pH3sF3y4/edit#gid=1972460334 diff --git a/WindowsFormsApplication1/.vs/WindowsFormsApplication1/v16/.suo b/WindowsFormsApplication1/.vs/WindowsFormsApplication1/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..beb2b32b256cebe253ba3e57f82b6614b07e04b3 GIT binary patch literal 32768 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 Me=h39Z= " + p.time1 + ") && (myTime <= " + p.time2 + ")) {" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".angle = " + name + ".angle + 360 / 20 * " + p.circles + " / (" + p.time2 + "-" + p.time1 + ");" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".x = (" + p.x1 + " + " + p.x2 + ")/2 + (" + p.x1 + " - " + p.x2 + ")/2 * cos (" + name + ".angle * 3.1416 / 180);" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".y = (" + p.y1 + " + " + p.y2 + ")/2 + (" + p.y1 + " - " + p.y2 + ")/2 * sin (" + name + ".angle * 3.1416 / 180);" + Environment.NewLine); - File.AppendAllText(filename, " txTransparentBlt(txDC(), " + name + ".x, " + name + ".y, " + - p.width + "/" + p.sprite + ", " + - p.height + "," + + StreamWriter sw = new StreamWriter(filename, true); + sw.Write(" if ((myTime >= " + p.time1 + ") && (myTime <= " + p.time2 + ")) {" + Environment.NewLine); + sw.Write(" " + name + ".angle = " + name + ".angle + 360 / 20 * " + p.circles + " / (" + p.time2 + "-" + p.time1 + ");" + Environment.NewLine); + sw.Write(" " + name + ".x = (" + p.x1 + " + " + p.x2 + ")/2 + (" + p.x1 + " - " + p.x2 + ")/2 * cos (" + name + ".angle * 3.1416 / 180);" + Environment.NewLine); + sw.Write(" " + name + ".y = (" + p.y1 + " + " + p.y2 + ")/2 + (" + p.y1 + " - " + p.y2 + ")/2 * sin (" + name + ".angle * 3.1416 / 180);" + Environment.NewLine); + sw.Write(" txTransparentBlt(txDC(), " + name + ".x, " + name + ".y, " + + p.width + "/" + p.sprite + ", " + + p.height + "," + name + ".texture, " + p.width + "/" + p.sprite + " * " + name + ".nomer_kadra, 0, RGB(255, 255, 255));" + Environment.NewLine); - File.AppendAllText(filename, Environment.NewLine); - File.AppendAllText(filename, " " + name + ".nomer_kadra++;" + Environment.NewLine); - File.AppendAllText(filename, Environment.NewLine); - File.AppendAllText(filename, " if (" + name + ".nomer_kadra >= " + p.sprite + ")" + Environment.NewLine); - File.AppendAllText(filename, " {" + Environment.NewLine); - File.AppendAllText(filename, " " + name + ".nomer_kadra = 0;" + Environment.NewLine); - File.AppendAllText(filename, " }" + Environment.NewLine); - File.AppendAllText(filename, " }" + Environment.NewLine); - File.AppendAllText(filename, Environment.NewLine); + sw.Write(Environment.NewLine); + sw.Write(" " + name + ".nomer_kadra++;" + Environment.NewLine); + sw.Write(Environment.NewLine); + sw.Write(" if (" + name + ".nomer_kadra >= " + p.sprite + ")" + Environment.NewLine); + sw.Write(" {" + Environment.NewLine); + sw.Write(" " + name + ".nomer_kadra = 0;" + Environment.NewLine); + sw.Write(" }" + Environment.NewLine); + sw.Write(" }" + Environment.NewLine); + sw.Write(Environment.NewLine); + sw.Close(); } } } diff --git a/WindowsFormsApplication1/WindowsFormsApplication1/CompileForm.Designer.cs b/WindowsFormsApplication1/WindowsFormsApplication1/CompileForm.Designer.cs new file mode 100644 index 0000000..1f0b23d --- /dev/null +++ b/WindowsFormsApplication1/WindowsFormsApplication1/CompileForm.Designer.cs @@ -0,0 +1,142 @@ +namespace WindowsFormsApplication1 +{ + partial class CompileForm + { + ///