Springen naar inhoud


- - - - -
C# 2015 SOLVED

Dynamisch Geplaatste Buttons Worden Slechts Gedeeltelijk Getekend Bij Opstart Programma



  • Log in a.u.b. om te beantwoorden
Er zijn 7 reacties in dit onderwerp

#1 doebi

doebi

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 535 berichten
    Laatst bezocht 24 nov 2017 21:13

Geplaatst op 24 november 2017 - 15:50

Hallo,

in C# 2017 windows forms application

Nog niet zoveel met C# gedaan, daarom een deze oefening :grin:

Ik heb een klasse gemaakt XButton (nog in ontwerp)
Als ik het programma start, dat wordt er slecht een gedeelte van de XButton getekend.
Eens de button aangeklikt wordt, dat wordt de XButton getekend zoals verwacht.
Ik heb al met refresh en invalidate geprobeerd, maar het lijkt niet te helpen.

Als je het form enkele keren vertrekt op je scherm dan wordt het ook plots goed getekend.

Bijlage screenshot van 2 XButtons die aangeklikt werden, de rest is nog niet getekend ...


Extra niet relevante info
Het is de bedoeling dat ik met 9 x 9  XButton's een sudoku maak, waarop je kan klikken en dewelke
toont welke cijfers nog mogelijk zijn.

Hoofdprogramma :

Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;



using System.Collections;
using System.IO;
using System.Reflection;





namespace WindowsFormsApp2
{


public partial class Form1 : Form
{
Assembly _assembly;
Stream _imageStream;
StreamReader _textStreamReader;

const int BoxWidth = 72;
const int BoxHeight = 72;

public class ClsCell
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
private int col;
public int Col
{
get
{
return col;
}
set
{
col = value;
}
}
private int row;
public int Row
{
get
{
return row;
}
set
{
row = value;
}
}
private int bitsPossible;
public int BitsPossible
{
get
{
return bitsPossible;
}
set
{
bitsPossible = value;
}
}
public int Value;
}



ClsCell[] MyBoard = new ClsCell[9 * 9];
XButton[] SuperBoard = new XButton[9 * 9];


// XButton XButton1 = new XButton(BoxWidth,BoxHeight,5.ToString(),17);




public Form1()
{
InitializeComponent();
this.Width = 10 * BoxWidth;
this.Height = 10 * BoxHeight;

GenerateBoard();





/*
XButton1.Click += new EventHandler(XButton1_Click);
*/

}



private void Form1_Load(object sender, System.EventArgs e)
{
try
{
_assembly = Assembly.GetExecutingAssembly();
_imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp");
_textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
}
catch
{
MessageBox.Show("Error accessing resources!");
}

}



public int GetRowAndCol(int Row,int Col)
{
return Row + (Col * 9);
}

public String GetCellName(int Row,int Col)
{
return "CELL" + Convert.ToInt16( GetRowAndCol(Row,Col)).ToString();
}

public void GenerateBoard()
{
for (int Row = 0; Row < 9; Row++)
{
for (int Col = 0; Col < 9; Col++)
{

SuperBoard[GetRowAndCol(Row, Col)] =
new XButton(Col * BoxWidth, Row * BoxHeight, BoxWidth, BoxHeight, "0", 0,
Color.DarkBlue, Color.Black, Color.Green, Color.Red);
SuperBoard[GetRowAndCol(Row, Col)].Invalidate();

this.Controls.Add(SuperBoard[GetRowAndCol(Row, Col)]);

}
}


}



}
}




XButton class :

Code:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
public class XButton : Button
{
public TextBox myTextBox = new TextBox();
Color Back;
Color Front;
Color BitOn;
Color BitOff;
public XButton(int aLeft,int aTop,int aWidth,int aHeight,string aText,int aBits,Color aBack,Color aFore,Color aBitOff,Color aBitOn)
{
Back = aBack;
Front = aFore;
BitOn = aBitOn;
BitOff = aBitOff;


UseVisualStyleBackColor = false;
TextImageRelation = TextImageRelation.ImageAboveText;
this.FlatStyle = FlatStyle.Flat;
this.FlatAppearance.BorderSize = 0;
this.Top = aTop;
this.Left = aLeft;
this.Width = aWidth;
this.Height = aHeight;
MyBits = aBits;
MyText = aText;
myTextBox.Font = new Font("Arial", 20);
myTextBox.TextAlign = HorizontalAlignment.Center;

this.Controls.Add(myTextBox);


}
public string MyText
{
get { return myTextBox.Text; }
set { myTextBox.Text = value; }
}

private int myBits;
public int MyBits
{
get
{
return myBits;
}
set {
myBits = value;
this.Refresh();
}
}

protected override void OnPaint(PaintEventArgs pevent)
{
this.BackColor = Back;
this.ForeColor = Front;

base.OnPaint(pevent);
myTextBox.Width = 20;
myTextBox.Height = 10;
myTextBox.Top = ((this.Height -8) / 2) - (myTextBox.Height / 2) +8;
myTextBox.Left = (this.Width / 2) - (myTextBox.Width/2);
for (int Bits = 0; Bits < 9; Bits++)
{
pevent.Graphics.FillRectangle(
(MyBits & (1 << Bits)) != 0 ? new SolidBrush(BitOn):new SolidBrush(BitOff ),
Bits * 8, 0, 8, 12);
pevent.Graphics.DrawString( (Bits + 1).ToString(), Font , new SolidBrush(ForeColor) , Bits * 8 , 0 );
}
pevent.Graphics.DrawRectangle(Pens.Black, 0, 0, Width-1, Height-1);
}
}
}




Bijgevoegde Bestanden


Verwacht het onverwachte

#2 Dirk Andries

Dirk Andries

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 977 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 24 november 2017 - 17:04

Bericht bekijkendoebi, op 24 november 2017 - 15:50, zei:

Als ik het programma start, dat wordt er slecht een gedeelte van de XButton getekend.
Eens de button aangeklikt wordt, dat wordt de XButton getekend zoals verwacht.
Ik heb al met refresh en invalidate geprobeerd, maar het lijkt niet te helpen.

Bizar.
Heb niks gewijzigd, alleen de code wat opgeschoond:

C Code:
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsSudoku
{
public partial class FormSudoku : Form
{
	 private const int BoxWidth = 72;
	 private const int BoxHeight = 72;
	 private readonly XButton[,] _superBoard = new XButton[9, 9];

	 public FormSudoku()
	 {
		 InitializeComponent();
		 GenerateBoard();
	 }

	 public void GenerateBoard()
	 {
		 ClientSize = new Size(9 * BoxWidth, 9 * BoxHeight);
		 for (var row = 0; row < 9; row++)
		 {
			 for (var col = 0; col < 9; col++)
			 {
				 _superBoard[row, col] =
					 new XButton(col * BoxWidth, row * BoxHeight, BoxWidth, BoxHeight, "0", 0,
						 Color.DarkBlue, Color.Black, Color.Green, Color.Red);
				 Controls.Add(_superBoard[row, col]);
			 }
		 }
	 }
}
}


en:

C Code:
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsSudoku
{
public sealed class XButton : Button
{
	 private int _myBits;
	 private TextBox TextBox { get; } = new TextBox();
	 public Color BitOn { get; }
	 public Color BitOff { get; }

	 public XButton(int left, int top, int width, int height, string text,
					 int bits, Color backColor, Color foreColor, Color bitOff, Color bitOn)
	 {
		 BackColor = backColor;
		 ForeColor = foreColor;

		 BitOn = bitOn;
		 BitOff = bitOff;
		 UseVisualStyleBackColor = false;
		 TextImageRelation = TextImageRelation.ImageAboveText;
		 FlatStyle = FlatStyle.Flat;
		 FlatAppearance.BorderSize = 0;
		 Top = top;
		 Left = left;
		 Width = width;
		 Height = height;
		 MyBits = bits;
		 MyText = text;
		 TextBox.Font = new Font("Arial", 12);
		 TextBox.TextAlign = HorizontalAlignment.Center;
		 TextBox.Width = 20;
		 TextBox.Height = 10;
		 TextBox.Top = ((Height - 8) / 2) - (TextBox.Height / 2) + 8;
		 TextBox.Left = (Width / 2) - (TextBox.Width / 2);

		 Controls.Add(TextBox);
	 }

	 public string MyText
	 {
		 get => TextBox.Text;
		 set => TextBox.Text = value;
	 }

	 public int MyBits
	 {
		 get => _myBits;
		 set
		 {
			 _myBits = value;
			 Invalidate();
		 }

	 }

	 protected override void OnPaint(PaintEventArgs e)
	 {

		 base.OnPaint(e);
		 for (var bits = 0; bits < 9; bits++)
		 {
			 e.Graphics.FillRectangle(
				 (MyBits & (1 << bits)) != 0 ? new SolidBrush(BitOn) : new SolidBrush(BitOff),
				 bits * 8, 0, 8, 12);
			 e.Graphics.DrawString((bits + 1).ToString(), Font, new SolidBrush(ForeColor), bits * 8, 0);
		 }
		 e.Graphics.DrawRectangle(Pens.Black, 0, 0, Width - 1, Height - 1);
	 }
}
}



geeft:

Bijlage  sudoku.png   33,66K   1 downloads
Trust me, I have no idea what I'm talking about.

#3 Dirk Andries

Dirk Andries

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 977 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 24 november 2017 - 17:33

Bericht bekijkenDirk Andries, op 24 november 2017 - 17:04, zei:

Bizar.
Heb niks gewijzigd, alleen de code wat opgeschoond:
...
geeft:

Dit gezegd, de manier waarop je nu je XButton probeert samen te stellen is niet echt de beste methode voor wat je beoogt.
Je zal nog rare dingen merken bij het tekenen.

Als je niet al te veel aan je insteek wil wijzigen: gebruik een custom control die samengesteld is, i.p.v. af te leiden van Button.
Trust me, I have no idea what I'm talking about.

#4 Dirk Andries

Dirk Andries

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 977 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 24 november 2017 - 17:35

Bericht bekijkenDirk Andries, op 24 november 2017 - 17:33, zei:

Als je niet al te veel aan je insteek wil wijzigen: gebruik een custom control die samengesteld is, i.p.v. af te leiden van Button.

Ook nog: maak ook een control voor je superboard (de volledige sudoku).
Trust me, I have no idea what I'm talking about.

#5 doebi

doebi

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 535 berichten
    Laatst bezocht 24 nov 2017 21:13

Geplaatst op 24 november 2017 - 17:37

Hallo, dank u.
Ik probeer de schoonheidswijzigingen terug te kopiëren van uw naar mij code (intussen was m'n code al wat uitgebreid met de nodige events voor het aanklikken en het wijzigen van de textboxes), verwijderen van niet meer gebruikte code enz.
maar zie niet direct wat het probleem kan zijn. :-(

Werkt me dus nog steeds niet.
Ik zie op uw screenshot overigens ook dat de XButton in de linker bovenhoek ook niet helemaal getekend is -wel beter dan bij mij.
Misschien m'n grafische kaart of de drivers ?

Ik blijf nog wat verder zoeken.

Groeten
Verwacht het onverwachte

#6 doebi

doebi

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 535 berichten
    Laatst bezocht 24 nov 2017 21:13

Geplaatst op 24 november 2017 - 17:39

Citeren


Geplaatste afbeeldingDirk Andries, op 24 november 2017 - 16:33, zei:


Als je niet al te veel aan je insteek wil wijzigen: gebruik een custom control die samengesteld is, i.p.v. af te leiden van Button.


Ook nog: maak ook een control voor je superboard (de volledige sudoku).

Dat lijkt nog een goeie oefening voor mij als beginner c# :smile:
Verwacht het onverwachte

#7 doebi

doebi

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 535 berichten
    Laatst bezocht 24 nov 2017 21:13

Geplaatst op 24 november 2017 - 18:22

Update,

in m'n onpaint event stond
Code:
[list]
	[*][color=black][background=inherit]this.BackColor = Back;  [/background][/color]
	[*][color=black][background=inherit]this.ForeColor = Front;[/background][/color]
[/list]


Na dit te wijzigen werkt het naar behoren.

Solved , thnx
Verwacht het onverwachte

#8 Dirk Andries

Dirk Andries

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 977 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 25 november 2017 - 00:17

Bericht bekijkendoebi, op 24 november 2017 - 18:22, zei:


in m'n onpaint event stond
Code:
	this.BackColor = Back;
	this.ForeColor = Front;


Na dit te wijzigen werkt het naar behoren.

Ja, dat had ik er uitgehaald, samen met nog wat andere dingen.
Les: in een Paint method nooit de properties wijzigen die nieuwe invalidate veroorzaken (zoals het zetten van voor- en achtergrond kleuren, of de tekst van een control wijzigen, ...)
Trust me, I have no idea what I'm talking about.




0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[C# 2015 SOLVED] Untitled 1

Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)