求助 结构体二维数组
只能初始化 1个数组。。。。
如何注释掉 Array1Init(), 就可以初始化Array2。
另有一个问题。。。
拖动窗口,改变窗口大小后。
重新输出后,数字 9 变成 402653193.
不知道,什么原因。
程序代码:
#pragma once struct POINT { int _X; int _Y; }; struct UNIT { POINT Zero; int Wide; int Number; }; struct MyStruct { POINT inPoint; int width, height; int fontSize; }; namespace NumberGame { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Form1 摘要 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: 在此处添加构造函数代码 // } protected: /// <summary> /// 清理所有正在使用的资源。 /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::TableLayoutPanel^ tableLayoutPanel1; protected: private: System::Windows::Forms::PictureBox^ pictureBox1; private: System::Windows::Forms::PictureBox^ pictureBox2; private: /// <summary> /// 必需的设计器变量。 /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容。 /// </summary> void InitializeComponent(void) { this->tableLayoutPanel1 = (gcnew System::Windows::Forms::TableLayoutPanel()); this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox()); this->pictureBox2 = (gcnew System::Windows::Forms::PictureBox()); this->tableLayoutPanel1->SuspendLayout(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->BeginInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox2))->BeginInit(); this->SuspendLayout(); // // tableLayoutPanel1 // this->tableLayoutPanel1->ColumnCount = 2; this->tableLayoutPanel1->ColumnStyles->Add((gcnew System::Windows::Forms::ColumnStyle(System::Windows::Forms::SizeType::Percent, 66.66666F))); this->tableLayoutPanel1->ColumnStyles->Add((gcnew System::Windows::Forms::ColumnStyle(System::Windows::Forms::SizeType::Percent, 33.33333F))); this->tableLayoutPanel1->Controls->Add(this->pictureBox1, 0, 0); this->tableLayoutPanel1->Controls->Add(this->pictureBox2, 1, 0); this->tableLayoutPanel1->Dock = System::Windows::Forms::DockStyle::Fill; this->tableLayoutPanel1->Location = System::Drawing::Point(0, 0); this->tableLayoutPanel1->Name = L"tableLayoutPanel1"; this->tableLayoutPanel1->RowCount = 1; this->tableLayoutPanel1->RowStyles->Add((gcnew System::Windows::Forms::RowStyle(System::Windows::Forms::SizeType::Percent, 100))); this->tableLayoutPanel1->Size = System::Drawing::Size(784, 522); this->tableLayoutPanel1->TabIndex = 0; // // pictureBox1 // this->pictureBox1->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(192)), static_cast<System::Int32>(static_cast<System::Byte>(255)), static_cast<System::Int32>(static_cast<System::Byte>(192))); this->pictureBox1->Dock = System::Windows::Forms::DockStyle::Fill; this->pictureBox1->Location = System::Drawing::Point(3, 3); this->pictureBox1->Name = L"pictureBox1"; this->pictureBox1->Size = System::Drawing::Size(516, 516); this->pictureBox1->TabIndex = 0; this->pictureBox1->TabStop = false; // // pictureBox2 // this->pictureBox2->BackColor = System::Drawing::Color::FromArgb(static_cast<System::Int32>(static_cast<System::Byte>(255)), static_cast<System::Int32>(static_cast<System::Byte>(192)), static_cast<System::Int32>(static_cast<System::Byte>(192))); this->pictureBox2->Dock = System::Windows::Forms::DockStyle::Fill; this->pictureBox2->Location = System::Drawing::Point(525, 3); this->pictureBox2->Name = L"pictureBox2"; this->pictureBox2->Size = System::Drawing::Size(256, 516); this->pictureBox2->TabIndex = 1; this->pictureBox2->TabStop = false; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 12); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->ClientSize = System::Drawing::Size(784, 522); this->Controls->Add(this->tableLayoutPanel1); this->Name = L"Form1"; this->Text = L"Form1"; this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load); this->Resize += gcnew System::EventHandler(this, &Form1::Form1_Resize); this->tableLayoutPanel1->ResumeLayout(false); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->EndInit(); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox2))->EndInit(); this->ResumeLayout(false); } #pragma endregion private: static int barrier = 3; private: static int P2row = 0; private: static int P2col = 0; private: static int P2left = 0; private: static int P2top = 0; private: static int P2wide = 0; private: UNIT** Array1; private: UNIT** Array2; private: void Array1Init() { //------Array1初始化------------- Array1 = new UNIT*[barrier]; for(int i=0; i<barrier; i++) { Array1[i] = new UNIT; // Array1[i]->fontSize = i; } int wide = (this->pictureBox1->Width-12)/barrier; for(int i=0; i<barrier; i++) for(int j=0; j<barrier; j++) { Array1[i][j].Wide = wide; //Array1[i][j].Number = 0; Array1[i][j].Number = i*barrier+j+1; Array1[i][j].Zero._X = j*wide + 6; Array1[i][j].Zero._Y = i*wide + 6; } } //private: void Array2Init() // { // //------Array2初始化------------- // Array2 = new UNIT*[P2row]; // for(int i=0; i<P2col; i++) // { // Array2[i] = new UNIT; // // Array2[i]->fontSize = i; // } // int wide = (this->pictureBox2->Width-2*P2left)/P2col; // } private: MyStruct get_format(Point^ inpoint, int wide, int num) { int imgWide = (wide * 3) / 2; int fontsize = 0;// wide / len; System::Drawing::Font^ drawFont; SizeF layoutSize = SizeF(wide, wide); Graphics^ g = CreateGraphics(); StringFormat^ sformat = gcnew StringFormat(); sformat->Alignment = StringAlignment::Center; sformat->LineAlignment = StringAlignment::Center; sformat->FormatFlags = StringFormatFlags(0); SizeF sizeF(0, 0); while (sizeF.Width < wide) { fontsize++; drawFont = gcnew System::Drawing::Font("宋体", fontsize); sizeF = g->MeasureString(num.ToString(), drawFont, *inpoint, sformat); delete drawFont; } MyStruct _format; _format.fontSize = fontsize; _format.inPoint._X = inpoint->X + (wide - sizeF.Width) / 2; _format.inPoint._Y = inpoint->Y + (wide - sizeF.Height) / 2 + 5; _format.height = sizeF.Height; _format.width = sizeF.Width; delete sformat; delete g; return _format; } private: void draw_p1_num(Point^ inpoint, int wide, int num) { Bitmap^ drawimg = gcnew Bitmap(this->pictureBox1->Image); Graphics^ g = Graphics::FromImage(drawimg); SolidBrush^ MyBrush = gcnew SolidBrush(this->pictureBox1->BackColor); g->FillRectangle(MyBrush, Rectangle(inpoint->X + wide / 20, inpoint->Y + wide / 20, (wide * 9) / 10, (wide * 9) / 10)); MyBrush->Color = Color::Black; inpoint->X += wide / 10; inpoint->Y += wide / 10; int d = (wide * 4) / 5; Rectangle rectEllip = Rectangle(inpoint->X, inpoint->Y, d, d); g->FillEllipse(MyBrush, rectEllip); MyStruct drawformat = get_format(inpoint, rectEllip.Width, num); System::Drawing::Font^ drawFont = gcnew System::Drawing::Font("宋体", drawformat.fontSize); Rectangle rectFont = Rectangle(drawformat.inPoint._X, drawformat.inPoint._Y, drawformat.width, drawformat.height); MyBrush->Color = this->pictureBox1->BackColor; g->DrawString(num.ToString(), drawFont, MyBrush, Point(drawformat.inPoint._X, drawformat.inPoint._Y)); this->pictureBox1->Image = (Image^)drawimg->Clone(); delete drawFont; delete g; delete drawimg; } private: void p1_all_out() { for(int i=0; i<barrier; i++) for(int j=0; j<barrier; j++) { draw_p1_num(Point(Array1[i][j].Zero._X, Array1[i][j].Zero._Y), Array1[i][j].Wide, Array1[i][j].Number); } } private: void SetMaxSize() { int maxwidth = Screen::PrimaryScreen->WorkingArea.Width; int maxheight = Screen::PrimaryScreen->WorkingArea.Height; if(maxwidth > ((maxheight - 39)*3)/2+16) maxwidth = ((maxheight - 39)*3)/2+16; else if(maxheight> ((maxwidth-16)*2)/3+39) maxheight = ((maxwidth-16)*2)/3+39; //this->MaximumSize.Width = maxwidth; //this->MaximumSize.Height = maxheight; this->MaximumSize = System::Drawing::Size( maxwidth, maxheight); } private: void DrawChart2(int num) { int Swidth = (this->pictureBox2->Width - 12) / num; int totality = ((this->pictureBox2->Width - 12) / Swidth) * ((this->pictureBox2->Height - 12) / Swidth); while (totality >= num * num) { Swidth++; totality = ((this->pictureBox2->Width - 12) / Swidth) * ((this->pictureBox2->Height - 12) / Swidth); } Swidth--; int col = (this->pictureBox2->Width - 12) / Swidth; int row = (barrier * barrier) % col == 0 ? (barrier * barrier) / col : (barrier * barrier) / col + 1; int left = (this->pictureBox2->Width - col * Swidth) / 2; int top = (this->pictureBox2->Height - row * Swidth) / 2; P2col = col; P2row = row; P2left = left; P2top = top; P2wide = Swidth; Bitmap^ drawimg = gcnew Bitmap(this->pictureBox2->Width, this->pictureBox2->Height); Graphics^ g = Graphics::FromImage(drawimg); Pen^ mypen = gcnew Pen(Color::Green, 1); for (int i = 0; i <= row; i++) g->DrawLine(mypen, Point(left, i * Swidth + top), Point(col * Swidth + left, i * Swidth + top)); for (int i = 0; i <= col; i++) g->DrawLine(mypen, Point(i * Swidth + left, top), Point(i * Swidth + left, row * Swidth + top)); this->pictureBox2->Image = (Image^)drawimg->Clone(); delete g; delete drawimg; } private: void DrawChart(int num) { Bitmap^ drawimg = gcnew Bitmap(pictureBox1->Width, pictureBox1->Height); Graphics^ g = Graphics::FromImage(drawimg); Pen^ mypen = gcnew Pen(Color::Red, 1); int Swidth = (pictureBox1->Width - 12) / num; for (int i = 0; i <= num; i++) g->DrawLine(mypen, Point(6, i * Swidth + 6), Point(num * Swidth + 6, i * Swidth + 6)); for (int i = 0; i <= num; i++) g->DrawLine(mypen, Point(i * Swidth + 6, 6), Point(i * Swidth + 6, num * Swidth + 6)); this->pictureBox1->Image = (Image^)drawimg->Clone(); delete g; delete drawimg; } private: void calc_point() { int wide = (this->pictureBox1->Width-12)/barrier; for(int i=0; i<barrier; i++) for(int j=0; j<barrier; j++) { Array1[i][j].Wide = wide; //Array1[i][j].Number = 0; //Array1[i][j].Number = i*barrier+j+1; Array1[i][j].Zero._X = j*wide + 6; Array1[i][j].Zero._Y = i*wide + 6; } } private: System::Void Form1_Resize(System::Object^ sender, System::EventArgs^ e) { Control^ control = dynamic_cast<Control^>(sender); //拖动窗口比例缩放,确保pictureBox1 Size 为正方形. int swidth = control->Size.Width; int sheight = control->Size.Height; if(sheight > 28) //sheight > 28 窗口不是最小化。 { int maxwidth = Screen::PrimaryScreen->WorkingArea.Width; int maxheight = Screen::PrimaryScreen->WorkingArea.Height; if(swidth > maxwidth) swidth = maxwidth; sheight = ((swidth-16)*2)/3+39; if(sheight>maxheight) { sheight = maxheight; swidth = ((sheight - 39)*3)/2+16; } control->Size = System::Drawing::Size(swidth, sheight); //this->pictureBox1->Image=nullptr; //this->pictureBox2->Image=nullptr; DrawChart(barrier); DrawChart2(barrier); calc_point(); p1_all_out(); } } private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { SetMaxSize(); //设置窗口最大尺寸 DrawChart(barrier); //绘制图片框1,的表格 DrawChart2(barrier); //绘制图片框2,的表格 Array1Init(); //Array1数组初始化 //Array2Init(); //Array2数组初始化 p1_all_out(); //输出图片框1全部单元格。 } }; }
Form1.rar
(3.15 KB)