c#如何实现按钮事件如问是否退出啊

c#如何实现按钮事件如问是否退出,然后点击确定就退出了?如何实现这个功能,小弟学编程不久,各位高手来帮忙!

1个回答

在按钮里面写:
if (MessageBox.Show("是否退出", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
Application.Exit();

beyond1120
beyond1120 谢谢!
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C# 当我点击 窗体右上角 “叉”时,如何弹出提示框
C# 当我点击 窗体右上角 “叉”时,如何弹出提示框 当客户点击窗体右上角的关闭按钮时,弹出对话框,您确实要关闭吗,如果客户选择是,就退出了,选择否,就不关闭了,怎么做啊?
C# Winform项目,如何实现关闭退出外部视频客户端程序
在C# Winform项目,有三个Form窗体(form1,form2,form3),在form1窗体有一个button按钮。 目前已经可以在button的点击事件中,通过以下代码实现将“CBOX央视影音”在线视频播放的App客户端打开。 代码如下: Process proc = new Process(); proc.StartInfo.FileName = @"C:\Program Files\CNTV\CBox\CBox.exe"; proc.Start(); 目前遇到一个问题,需用手工点击“关闭”按钮才能关闭这个视频播放客户端。 请问怎么样实现用户按键盘的“ESC”键或在form1窗体关闭时自动退出“CBOX央视影音”的播放客户端以及退出form1窗体。最好能提供相关的源码。谢谢!
C# winform项目,退出应用程序时,报"集合已修改,可能无法执行枚举操作。"错误信息。
在C# winform项目中,有两个form窗体(form1、form2),在form1中有个两个button按钮。 在form1窗体中,点击button1弹出一个form2窗体,点击button2退出整个应用程序。 目前遇到的问题是,在form1窗体中点击button1弹出一个form2窗体后再点击button2退出整个应用程序时,报"集合已修改,可能无法执行枚举操作。"错误信息。 请问如何修改退出整个应用程序代码,谢谢! 附点击button1弹出一个form2窗体代码: form2 frmmess= new form2(); Point pi = new Point(); Point p1 = label1.PointToScreen(label1.Location); Point p2 = label1.Location; pi.X = System.Convert.ToInt32(p1.X - p2.X) + 20; pi.Y = System.Convert.ToInt32(p1.Y - p2.Y) + 20; frmmess.Location = pi; if (frmmess == null || frmmess.IsDisposed) { frmmess = new FrmMessage(); } frmmess.Show(); 附点击button2退出整个应用程序代码: System.Windows.Forms.Application.Exit();
关于C#关闭窗口的问题
我想实现在点击关闭按钮时弹出窗口,提示关闭还是最小化至托盘,我新建了一个窗体,用来当做对话框,在closed事件中弹出它,使用showdialog()方式。但是当我不论点击任何按钮时,他都会退出。下面是我的代码,请教大神如何实现这一功能? //这是点击对话框中确定按钮事件 private void Btn_OK_Click(object sender, EventArgs e) { if(CB_NoTip.Checked) { UtilsClass.OperateAppConfig("IsTip", "false"); } if (RB_MinTask.Checked) { UtilsClass.OperateAppConfig("IsMinTask", "true"); this.DialogResult = DialogResult.Yes; this.Close(); } else if(RB_Exit.Checked) { UtilsClass.OperateAppConfig("IsMinTask", "false"); this.DialogResult = DialogResult.No; } } //这是点击对话框上的取消按钮事件 private void Btn_Exit_Click(object sender, EventArgs e) { DialogResult = DialogResult.None; } //这是主窗体中点击关闭按钮的form_closed事件。 private void MainWindow_FormClosing(object sender, FormClosingEventArgs e) { string isTip = UtilsClass.OperateAppConfig("IsTip"); if (isTip == "true") { ExitWindow exit = new ExitWindow(); DialogResult dr = exit.ShowDialog(); if (DialogResult.Yes == dr) { } else if (DialogResult.No == dr) { Application.Exit(); } else if (DialogResult.None == dr) { exit.Close(); } } else { Application.Exit(); } } 我尝试过使用closing事件,但是在点击对话框上的确定按钮时总会再次弹出对话框
c#异步通讯五子棋 双方倒计时怎么写
我用c#异步通讯做了个五子棋的winform,服务器端和客户端分开的。想利用timer实现双方倒计时要怎么写? client端代码 ``` using System; using System.Drawing; using System.Windows.Forms; using System.IO; namespace GameClient { public partial class FormPlaying : Form { private int tableIndex; private int side; private DotColor[,] grid = new DotColor[15, 15]; //保存颜色,用于消点时进行判断 private Bitmap blackBitmap; private Bitmap whiteBitmap; //命令是否来自服务器 private bool isReceiveCommand = false; private Service service; delegate void LabelDelegate(Label label, string str); delegate void ButtonDelegate(Button button, bool flag); delegate void RadioButtonDelegate(RadioButton radioButton, bool flag); delegate void SetDotDelegate(int i, int j, int dotColor); LabelDelegate labelDelegate; ButtonDelegate buttonDelegate; RadioButtonDelegate radioButtonDelegate; public FormPlaying(int TableIndex, int Side, BinaryWriter bw) { InitializeComponent(); this.tableIndex = TableIndex; this.side = Side; labelDelegate = new LabelDelegate(SetLabel); buttonDelegate = new ButtonDelegate(SetButton); radioButtonDelegate = new RadioButtonDelegate(SetRadioButton); blackBitmap = new Bitmap(Properties.Resources.black); whiteBitmap = new Bitmap(Properties.Resources.white); service = new Service(listBox1, bw); } /// <summary>载入窗体时发生的事件</summary> private void FormPlaying_Load(object sender, EventArgs e) { //默认游戏级别为3级 radioButton3.Checked = true; for (int i = 0; i <= grid.GetUpperBound(0); i++) { for (int j = 0; j <= grid.GetUpperBound(1); j++) { grid[i, j] = DotColor.None; } } labelSide0.Text = ""; labelSide1.Text = ""; labelGrade0.Text = ""; labelGrade1.Text = ""; } /// <summary>设置标签显示信息</summary> /// <param name="Label">要设置的Label</param> /// <param name="string">要设置的信息</param> public void SetLabel(Label label, string str) { if (label.InvokeRequired) { this.Invoke(labelDelegate, label, str); } else { label.Text = str; } } /// <summary>设置button是否可用</summary> /// <param name="Button">要设置的Button</param> /// <param name="flag">是否可用</param> private void SetButton(Button button, bool flag) { if (button.InvokeRequired) { this.Invoke(buttonDelegate, button, flag); } else { button.Enabled = flag; } } /// <summary>设置radioButton选择状态</summary> /// <param name="radioButton">要设置的RadioButton</param> /// <param name="flag">是否选中</param> private void SetRadioButton(RadioButton radioButton, bool flag) { if (radioButton.InvokeRequired) { this.Invoke(radioButtonDelegate, radioButton, flag); } else { radioButton.Checked = flag; } } /// <summary>设置棋子状态</summary> /// <param name="i">第几行</param> /// <param name="j">第几列</param> /// <param name="dotColor">棋子颜色</param> //public void SetDot(int i, int j, DotColor dotColor) //{ // service.AddItemToListBox(string.Format("{0},{1},{2}", i, j, dotColor)); // grid[i, j] = dotColor; // pictureBox1.Invalidate(); //} /// <summary>重新开始新游戏</summary> /// <param name="str">警告信息</param> public void Restart(string str) { MessageBox.Show(str, "", MessageBoxButtons.OK, MessageBoxIcon.Warning); ResetGrid(); SetButton(buttonStart, true); } /// <summary>重置棋盘</summary> private void ResetGrid() { SetLabel(labelGrade0, ""); SetLabel(labelGrade1, ""); for (int i = 0; i <= grid.GetUpperBound(0); i++) { for (int j = 0; j <= grid.GetUpperBound(1); j++) { grid[i, j] = DotColor.None; } } pictureBox1.Invalidate(); } /// <summary>取消棋子</summary> /// <param name="x">x坐标</param> /// <param name="y">y坐标</param> public void UnsetDot(int x, int y,DotColor dotColor) { //service.AddItemToListBox(string.Format("{0},{1},{2}", i, j, dotColor)); //grid[x / 20 - 1, y / 20 - 1] = dotColor; grid[x,y] = dotColor; pictureBox1.Invalidate(); } /// <summary>绘制图像</summary> private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; for (int i = 0; i <= grid.GetUpperBound(0); i++) { for (int j = 0; j <= grid.GetUpperBound(1); j++) { if (grid[i, j] != DotColor.None) { if (grid[i, j] == DotColor.Black) { g.DrawImage(blackBitmap, (i + 1) * 20, (j + 1) * 20); } else { g.DrawImage(whiteBitmap, (i + 1) * 20, (j + 1) * 20); } } } } } /// <summary>设置游戏难度级别</summary> /// <param name="ss">难度级别</param> public void SetLevel(string ss) { isReceiveCommand = true; switch (ss) { case "1": SetRadioButton(radioButton1, true); break; case "2": SetRadioButton(radioButton2, true); break; case "3": SetRadioButton(radioButton3, true); break; case "4": SetRadioButton(radioButton4, true); break; case "5": SetRadioButton(radioButton5, true); break; } isReceiveCommand = false; } /// <summary>当游戏难度级别发生变化时触发的事件</summary> private void radioButton_CheckedChanged(object sender, EventArgs e) { //isReceiveCommand为true表明是接收服务器设置的难度级别触发的此事件 //就不需要再向服务器发送 if (isReceiveCommand == false) { RadioButton radiobutton = (RadioButton)sender; if (radiobutton.Checked == true) { //设置难度级别 //格式:Time,桌号,难度级别 service.SendToServer(string.Format("Level,{0},{1}",tableIndex, radiobutton.Name[radiobutton.Name.Length - 1])); } } } /// <summary>向服务器发送消息</summary> private void buttonSend_Click(object sender, EventArgs e) { //字符串格式:Talk,桌号,对话内容 service.SendToServer(string.Format("Talk,{0},{1}", tableIndex, textBox1.Text)); } /// <summary>对话内容改变时触发的事件</summary> private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Enter) { //字符串格式:Talk,桌号,对话内容 service.SendToServer(string.Format("Talk,{0},{1}", tableIndex, textBox1.Text)); } } /// <summary>点击帮助按钮时触发的事件</summary> private void buttonHelp_Click(object sender, EventArgs e) { string str = "\n本游戏每两人为一组。游戏玩法:\n\n" + "(1)对局双方各执一色棋子。\n\n"+ "(2)空棋盘开局。\n\n" + "(3)黑先、白后,交替下子,每次只能下一子。\n\n" + "(4)只要黑白方中任意一方的棋子有五子连在一起(即五子连珠),可以为横连、纵连、斜连,则该方获胜。\n"; MessageBox.Show(str, "帮助信息"); } /// <summary>点击开始按钮时触发的事件</summary> private void buttonStart_Click(object sender, EventArgs e) { service.SendToServer(string.Format("Start,{0},{1}", tableIndex, side)); this.buttonStart.Enabled = false; } /// <summary>点击退出按钮时触发的事件</summary> private void buttonExit_Click(object sender, EventArgs e) { this.Close(); } /// <summary>关闭窗体时触发的事件</summary> private void FormPlaying_FormClosing(object sender, FormClosingEventArgs e) { //格式:GetUp,桌号,座位号 service.SendToServer(string.Format("GetUp,{0},{1}", tableIndex, side)); } /// <summary>FormRoom中的线程调用此方法关闭此窗体</summary> public void StopFormPlaying() { Application.Exit(); } /// <summary>在pictureBox1中按下鼠标触发的事件</summary> private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { int x = e.X / 20; int y = e.Y / 20; int color=-1; if (!(x < 1 || x > 15 || y < 1 || y > 15)) { if (grid[x - 1, y - 1] == DotColor.None) { // int color = (int)grid[x - 1, y - 1]; if (side == 0) { color = 0; } if (side == 1) { color = 1; } //发送格式:UnsetDot,桌号,座位号,行,列,颜色 service.SendToServer(string.Format( "UnsetDot,{0},{1},{2},{3},{4}", tableIndex, side, x - 1, y - 1, color)); } } } /// <summary> /// 设置玩家信息,格式:座位号,labelSide显示的信息,listbox显示的信息 /// </summary> /// <param name="sideString">指定玩家</param> /// <param name="labelSideString">labelSide显示的信息</param> /// <param name="listBoxString">listbox显示的信息</param> public void SetTableSideText(string sideString, string labelSideString, string listBoxString) { string s = "白方"; if (sideString == "0") { s = "黑方:"; } //判断自己是黑方还是白方 if (sideString == side.ToString()) { SetLabel(labelSide1, s + labelSideString); } else { SetLabel(labelSide0, s + labelSideString); } service.AddItemToListBox(listBoxString); } /// <summary> /// 设置成绩信息,格式:grade0为黑方成绩,grade1为白方成绩 /// </summary> /// <param name="str0">黑方成绩信息</param> /// <param name="str1">白方成绩信息</param> public void SetGradeText(string str0, string str1) { if (side == (int)DotColor.Black) { SetLabel(labelGrade1, str0); SetLabel(labelGrade0, str1); } else { SetLabel(labelGrade0, str0); SetLabel(labelGrade1, str1); } } /// <summary>显示谈话信息</summary> /// <param name="talkMan">谈话者</param> /// <param name="str">要显示的信息</param> public void ShowTalk(string talkMan, string str) { service.AddItemToListBox(string.Format("{0}说:{1}", talkMan, str)); } /// <summary> /// 显示消息 /// </summary> /// <param name="str">要显示的消息</param> public void ShowMessage(string str) { service.AddItemToListBox(str); } } } ``` service方法代码 ``` //------Service.cs----------// using System.Windows.Forms; using System.IO; using System.Net; using System.Net.Sockets; using System; using System.Threading; namespace GameClient { class Service { ListBox listbox; //StreamWriter sw; BinaryWriter bw; bool isExit = false; public Service(ListBox listbox, BinaryWriter bw) { this.listbox = listbox; this.bw = bw; } private struct SendToServerStates { public SendToServerDelegate d; public IAsyncResult result; } /// <summary>异步向服务器端发送数据</summary> public void AsyncSendToServer(string message) { SendToServerDelegate d = new SendToServerDelegate(SendToServer); IAsyncResult result = d.BeginInvoke(message, null, null); while (result.IsCompleted == false) { if (isExit) { return; } Thread.Sleep(50); } SendToServerStates states = new SendToServerStates(); states.d = d; states.result = result; Thread t = new Thread(FinishAsyncSendToServer); t.IsBackground = true; t.Start(states); } /// <summary>处理接收的服务器端数据</summary> private void FinishAsyncSendToServer(object obj) { SendToServerStates states = (SendToServerStates)obj; states.d.EndInvoke(states.result); } delegate void SendToServerDelegate(string message); /// <summary>向服务器发送数据</summary> public void SendToServer(string str) { try { bw.Write(str); bw.Flush(); } catch { AddItemToListBox("发送数据失败"); } } delegate void ListBoxDelegate(string str); /// <summary>在listbox中追加信息<</summary> /// <param name="str">要追加的信息</param> public void AddItemToListBox(string str) { if (listbox.InvokeRequired) { ListBoxDelegate d = AddItemToListBox; listbox.Invoke(d, str); } else { listbox.Items.Add(str); listbox.SelectedIndex = listbox.Items.Count - 1; listbox.ClearSelected(); } } } } ```
C# 无法触发窗口弹出 show方法不生效
要做一个基于UDP的群聊加私聊程序,群聊已经实现了,私聊也已经单独实现了,但是我想让着两个窗体有联系,就想QQ一样,PC1发消息的时候,PC2 自动弹出消息窗口。 登录窗体: using System.Net; namespace NetMeetingExample { public partial class FormLogin : Form { public FormLogin() { InitializeComponent(); } private void Login_Load(object sender, EventArgs e) { this.textBox1.Text = Dns.GetHostName().ToString(); } public static string nicheng; public static string group; private void button1_Click(object sender, EventArgs e) { nicheng = textBox1.Text; group =comboBox1.Text; //this.Opacity = 0; this.DialogResult = DialogResult.OK; } private void button2_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; } } } 群聊窗体: using System.Net; using System.Net.Sockets; using System.Threading; namespace NetMeetingExample { public partial class FormMeeting : Form { private enum ListBoxOperation { AddItem, RemoveItem }; private delegate void SetListBoxItemCallback( ListBox listbox, string text, ListBoxOperation operation); SetListBoxItemCallback listBoxCallback; //使用的IP地址 private IPAddress broderCastIp = IPAddress.Parse("224.100.0.1"); //使用的接收端口号 public static int port = 8001; private UdpClient udpClient; public FormMeeting() { if (FormLogin.group=="101021") { broderCastIp = IPAddress.Parse("224.100.0.1"); } if (FormLogin.group == "101022") { broderCastIp = IPAddress.Parse("224.100.0.2"); } if (FormLogin.group == "101023") { broderCastIp = IPAddress.Parse("224.100.0.3"); } if (FormLogin.group == "101024") { broderCastIp = IPAddress.Parse("224.100.0.4"); } InitializeComponent(); listBoxCallback = new SetListBoxItemCallback(SetListBoxItem); this.Text = FormLogin.group; } private void SetListBoxItem(ListBox listbox, string text, ListBoxOperation operation) { string[] cc;//= splitString[1].Split('@'); if (listbox.InvokeRequired == true) { this.Invoke(listBoxCallback, listbox, text, operation); } else { if (operation == ListBoxOperation.AddItem) { if (listbox == listBoxAddress) { if (listbox.Items.Contains(text) == false) if (text != "") { { cc=text.Split('@'); string oo = cc[0]; listBoxMessage.Items.Add(oo+"进入。"); listbox.Items.Add(text); } } } else { if (text != "[]进入。") { listbox.Items.Add(text); // SetListBoxItem(listBoxMessage, // string.Format("[{0}]进入。",cc[0]), ListBoxOperation.AddItem); } } listbox.SelectedIndex = listbox.Items.Count - 1; listbox.ClearSelected(); } else if (operation == ListBoxOperation.RemoveItem) { cc = text.Split('@'); // SetListBoxItem(listBoxMessage, // string.Format("[{0}]退出。", cc[0]), ListBoxOperation.AddItem); // // listBoxMessage.Items.Add(string.Format("[{0}]退出。", cc[0])); string oo = cc[0]; listBoxMessage.Items.Add(oo+"退出。"); listbox.Items.Remove(text); } } } public static void SendMessage(IPAddress ip, string sendString) { UdpClient myUdpClient = new UdpClient(); //允许发送和接收广播数据报 // myUdpClient.EnableBroadcast = true; //必须使用组播地址范围内的地址 IPEndPoint iep = new IPEndPoint(ip, port); //将发送内容转换为字节数组 byte[] bytes = System.Text.Encoding.UTF8.GetBytes(sendString); try { //向子网发送信息 myUdpClient.Send(bytes, bytes.Length, iep); } catch (Exception err) { MessageBox.Show(err.Message, "发送失败"); } finally { myUdpClient.Close(); } } public static IPAddress ipp; private void FormMeeting_Load(object sender, EventArgs e) { listBoxMessage.HorizontalScrollbar = true; buttonLogin.Enabled = true; buttonLogout.Enabled = false; groupBoxRoom.Enabled = false; IPAddress[] iph = Dns.GetHostAddresses(Dns.GetHostName()); ipp = iph[iph.Length-2]; } /// <summary> /// 接收线程 /// </summary> private void ReceiveMessage() { udpClient = new UdpClient(port); //必须使用组播地址范围内的地址 udpClient.JoinMulticastGroup(broderCastIp); udpClient.Ttl = 50; IPEndPoint remote = null; while (true) { try { //关闭udpClient时此句会产生异常 byte[] bytes = udpClient.Receive(ref remote); string str = Encoding.UTF8.GetString(bytes, 0, bytes.Length); string[] splitString = str.Split(','); int s = splitString[0].Length; //string[] splithostname; // splithostname= splitString[1].Split('@'); string[] mhost; mhost = splitString[1].Split('@'); switch (splitString[0]) { case "Login": //进入会议室 // SetListBoxItem(listBoxMessage, // string.Format("[{0}]进入。", splithostname[0]), ListBoxOperation.AddItem); SetListBoxItem(listBoxAddress, splitString[1], ListBoxOperation.AddItem); string userListString = "List," ; for (int i = 0; i < listBoxAddress.Items.Count; i++) { userListString += "," + listBoxAddress.Items[i].ToString(); } SendMessage(remote.Address, userListString); break; case "List": //参加会议人员名单 for (int i = 1; i < splitString.Length; i++) { SetListBoxItem(listBoxAddress, splitString[i], ListBoxOperation.AddItem); // SetListBoxItem(listBoxMessage, // string.Format("[{0}]进入。", splithostname[0]), ListBoxOperation.AddItem); } break; case "Message": //发言内容 SetListBoxItem(listBoxMessage, string.Format("[{0}]说:{1}", mhost[0], mhost[1]), ListBoxOperation.AddItem); break; case "Logout": //退出会议室 // SetListBoxItem(listBoxMessage, // string.Format("[{0}]退出。", FormLogin.nicheng), // ListBoxOperation.AddItem); // SetListBoxItem(listBoxMessage, // string.Format("[{0}]退出。", splithostname[0]), ListBoxOperation.AddItem); SetListBoxItem(listBoxAddress, FormLogin.nicheng + "@" + remote.Address.ToString(), ListBoxOperation.RemoveItem); break; case "mi": FormChat fc = new FormChat(); fc.Owner = this; fc.Show(); // MessageBox.Show("sfs"); break; } } catch { //退出循环,结束线程 break; } } } private void textBoxMessage_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Return) { if (textBoxMessage.Text.Trim().Length > 0) { SendMessage(broderCastIp, "Message," + FormLogin.nicheng+"@"+ textBoxMessage.Text); textBoxMessage.Text = ""; } } } //窗体已关闭并指定关闭原因前触发的事件 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (buttonLogout.Enabled == true) { MessageBox.Show("请先离开会议室,然后再退出!", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); //不关闭窗体 e.Cancel = true; } } //单击进入会议室按钮触发的事件 private void buttonLogin_Click(object sender, EventArgs e) { Cursor.Current = Cursors.WaitCursor; Thread myThread = new Thread(ReceiveMessage); myThread.Start(); //等待接收线程准备完毕 Thread.Sleep(1000); SendMessage(broderCastIp, "Login,"); buttonLogin.Enabled = false; buttonLogout.Enabled = true; groupBoxRoom.Enabled = true; // SetListBoxItem(listBoxMessage, // string.Format("[{0}]进入。", FormLogin.nicheng), ListBoxOperation.AddItem); SetListBoxItem(listBoxAddress, FormLogin.nicheng + "@" +ipp.ToString(), ListBoxOperation.AddItem); string userListString = "List," + FormLogin.nicheng + "@" + ipp.ToString(); SendMessage(broderCastIp , userListString); Cursor.Current = Cursors.Default; } //单击退出会议室按钮触发的事件 private void buttonLogout_Click(object sender, EventArgs e) { Cursor.Current = Cursors.WaitCursor; SendMessage(broderCastIp, "Logout,"); udpClient.DropMulticastGroup(this.broderCastIp); //等待接收线程处理完毕 Thread.Sleep(1000); //结束接收线程 udpClient.Close(); buttonLogin.Enabled = true; buttonLogout.Enabled = false; groupBoxRoom.Enabled = false; Cursor.Current = Cursors.Default; } private void button1_Click(object sender, EventArgs e) { // string add = "sdfsdf-192.168.22.3"; //string[] omg = add.Split('@'); // MessageBox.Show(omg[1].ToString()); //FormChat FC = new FormChat(); // FC.Owner = this; // FC.Show(); } public static string[] omg; private void listBoxAddress_MouseDoubleClick(object sender, MouseEventArgs e) { string add = listBoxAddress.SelectedItem.ToString(); omg = add.Split('@'); FormChat fc = new FormChat(); fc.Owner = this; fc.Show(); } } } 私聊窗体 using System.Net; using System.Net.Sockets; using System.Threading; namespace NetMeetingExample { public partial class FormChat : Form { /// <summary>接收用</summary> private UdpClient receiveUdpClient; /// <summary>发送用</summary> private UdpClient sendUdpClient; /// <summary>和本机绑定的端口号</summary> private const int port = 18001; /// <summary>本机IP</summary> IPAddress ip; /// <summary>远程主机IP</summary> IPAddress remoteIp; public FormChat() { InitializeComponent(); IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName()); ip = ips[ips.Length - 1]; //为了在同一台机器调试,此IP也作为默认远程IP // remoteIp = ip; remoteIp = IPAddress.Parse(FormMeeting.omg[1]); textBoxRemoteIP.Text = FormMeeting.omg[1]; textBoxSend.Text = "你好!"; } private void buttonSend_Click(object sender, EventArgs e) { Thread t = new Thread(SendMessage); t.IsBackground = true; t.Start(textBoxSend.Text); } private void FormChat_Load(object sender, EventArgs e) { //创建一个线程接收远程主机发来的信息 Thread myThread = new Thread(ReceiveData); //将线程设为后台运行 myThread.IsBackground = true; myThread.Start(); textBoxSend.Focus(); } private void SendMessage(object obj) { string message = (string)obj; sendUdpClient = new UdpClient(0); byte[] bytes = System.Text.Encoding.Unicode.GetBytes(message); IPEndPoint iep = new IPEndPoint(remoteIp, port); try { sendUdpClient.Send(bytes, bytes.Length, iep); AddItem(listBoxStatus, string.Format("向{0}发送:{1}", iep, message)); ClearTextBox(); } catch (Exception ex) { AddItem(listBoxStatus, "发送出错:" + ex.Message); } } private void ReceiveData() { IPEndPoint local = new IPEndPoint(ip, port); receiveUdpClient = new UdpClient(local); IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0); while (true) { try { //关闭udpClient时此句会产生异常 byte[] receiveBytes = receiveUdpClient.Receive(ref remote); string receiveMessage = Encoding.Unicode.GetString( receiveBytes, 0, receiveBytes.Length); AddItem(listBoxReceive, string.Format("来自{0}:{1}", remote, receiveMessage)); } catch { break; } } } delegate void AddListBoxItemDelegate(ListBox listbox, string text); private void AddItem(ListBox listbox, string text) { if (listbox.InvokeRequired) { AddListBoxItemDelegate d = AddItem; listbox.Invoke(d, new object[] { listbox, text }); } else { listbox.Items.Add(text); listbox.SelectedIndex = listbox.Items.Count - 1; listbox.ClearSelected(); } } delegate void ClearTextBoxDelegate(); private void ClearTextBox() { if (textBoxSend.InvokeRequired) { ClearTextBoxDelegate d = ClearTextBox; textBoxSend.Invoke(d); } else { textBoxSend.Clear(); textBoxSend.Focus(); } } private void button1_Click(object sender, EventArgs e) { FormMeeting.SendMessage(remoteIp, "mi," + "hello~"); // SendMessage(broderCastIp, "Message," + textBoxMessage.Text); } } } Program.cs static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); FormLogin fl = new FormLogin(); if (fl.ShowDialog() == DialogResult.OK) { Application.Run(new FormMeeting()); } else { Application.Exit(); } 在私聊窗体里单击BUTTON1会向对端发送“mi”命令从而触发对端的窗体弹出,函数能进去,但窗体就是不弹出,另外将弹出写在button_click下,然后在mi下执行button的_click事件也不能触发,,但是单独单击却能打开,函数是能进来的 求高人解决。。。。。。。。。。
c#异步通讯 tcp连接任意ip怎么修改
c#异步通讯 tcp连接任意ip怎么修改,本机可以工作,但是把Dns.GetHostName()改成指定的ipv6地址连接不上 ``` private int maxPlayingTables; private CheckBox[,] checkBoxGameTables; private TcpClient client = null; private Service service; private StreamWriter sw; private StreamReader sr; private BinaryReader br; private BinaryWriter bw; bool exitWhile = false; private FormPlaying formPlaying; private bool isConnected = false; //是否连接成功 BackgroundWorker connectWork = new BackgroundWorker(); //是否正常退出接收线程 private bool normalExit = false; //命令是否来自服务器 private bool isReceiveCommand = false; //所坐的游戏桌座位号,-1表示未入座,0表示坐到黑方,1表示坐到白方 private int side = -1; public FormRoom() { InitializeComponent(); connectWork.DoWork += new DoWorkEventHandler(connectWork_DoWork); connectWork.RunWorkerCompleted += new RunWorkerCompletedEventHandler(connectWork_RunWorkerCompleted); } private void FormRoom_Load(object sender, EventArgs e) { Random r = new Random((int)DateTime.Now.Ticks); textBoxName.Text = "Player" + r.Next(1, 100); maxPlayingTables = 0; textBoxLocal.ReadOnly = true; textBoxServer.ReadOnly = true; } /// <summary>异步方式与服务器进行连接</summary> void connectWork_DoWork(object sender, DoWorkEventArgs e) { client = new TcpClient(); //此处为方便演示,实际使用时要将Dns.GetHostName()改为服务器域名 //IAsyncResult result = client.BeginConnect(Dns.GetHostName(), 51888,null,null); //while (result.IsCompleted == false) //{ // Thread.Sleep(100); //// //} try { // client.EndConnect(result); client = new TcpClient(Dns.GetHostName(), 51888); e.Result = "login"; } catch (Exception ex) { e.Result = ex.Message; return; } } /// <summary>异步方式与服务器完成连接操作后的处理</summary> void connectWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Result.ToString() == "login") { isConnected = true; groupBox1.Visible = true; textBoxLocal.Text = client.Client.LocalEndPoint.ToString(); textBoxServer.Text = client.Client.RemoteEndPoint.ToString(); buttonConnect.Enabled = false; //获取网络流 NetworkStream netStream = client.GetStream(); //sr = new StreamReader(netStream, System.Text.Encoding.UTF8); //sw = new StreamWriter(netStream, System.Text.Encoding.UTF8); br = new BinaryReader(netStream); bw = new BinaryWriter(netStream); service = new Service(listBox1, bw); service.SendToServer("Login," + textBoxName.Text.Trim()); Thread threadReceive = new Thread(new ThreadStart(ReceiveData)); threadReceive.IsBackground = true; threadReceive.Start(); } else { //AddStatus("连接失败:" + e.Result); MessageBox.Show("与服务器连接失败", "", MessageBoxButtons.OK, MessageBoxIcon.Information); return; //buttonConnect.Enabled = true; } } /// <summary>【登录】按钮的Click事件</summary> private void buttonConnect_Click(object sender, EventArgs e) { buttonConnect.Enabled = false; connectWork.RunWorkerAsync(); //try //{ // //仅作本机测试,实际使用时要将Dns.GetHostName()改为服务器域名 // client = new TcpClient(Dns.GetHostName(), 51888); //} //catch //{ // MessageBox.Show("与服务器连接失败", "", // MessageBoxButtons.OK, MessageBoxIcon.Information); // return; //} //groupBox1.Visible = true; //textBoxLocal.Text = client.Client.LocalEndPoint.ToString(); //textBoxServer.Text = client.Client.RemoteEndPoint.ToString(); //buttonConnect.Enabled = false; ////获取网络流 //NetworkStream netStream = client.GetStream(); //sr = new StreamReader(netStream, System.Text.Encoding.UTF8); //sw = new StreamWriter(netStream, System.Text.Encoding.UTF8); //service = new Service(listBox1, sw); ////登录服务器,获取服务器各桌信息 ////格式:Login,昵称 //service.AsyncSendToServer("Login," + textBoxName.Text.Trim()); //Thread threadReceive = new Thread(new ThreadStart(ReceiveData)); //threadReceive.Start(); } ``` 后面处理接受数据的就不贴了,
C#非静态引用属性 窗体传值 类已经实例化,但是不能引用
其中一个窗体代码 Form3 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; namespace WindowsFormsApp1 { public partial class Form3 : Form { public Counter c1 { get { Counter c1 = new Counter(); c1.dataok = this.intok; c1.datapass = this.intpass; c1.datano = this.intno; c1.datatotal = this.inttotal; return c1; } set { Counter c1 = new Counter(); c1.dataok = this.intok; c1.datapass = this.intpass; c1.datano = this.intno; c1.datatotal = this.inttotal; } } //设置三个对应认可度的变量并赋初值 public int intok = 0; public int intpass = 0; public int intno = 0; public int inttotal = 0; public Form3() { InitializeComponent(); } private void radioButton1_CheckedChanged(object sender, EventArgs e) { if (this.radioButton1.Checked) { this.intok = this.intok + 1; } } private void radioButton2_CheckedChanged(object sender, EventArgs e) { if (this.radioButton2.Checked) { this.intpass = this.intpass + 1; } } private void radioButton3_CheckedChanged(object sender, EventArgs e) { if (this.radioButton3.Checked) { this.intno = this.intno + 1; } } private void Form3_Load(object sender, EventArgs e) { //默认初始未选中 this.radioButton1.Checked = false; this.radioButton2.Checked = false; this.radioButton3.Checked = false; } //当三个按钮有变化时自加 private void button1_Click(object sender, EventArgs e) { //提交时累加 并关闭调查窗口 显示窗口一 if (radioButton1.Checked) c1.dataok++; if (radioButton2.Checked) c1.datapass++; if (radioButton3.Checked) c1.datano++; //如果未选择过任何一个按钮 总数不自加 if (intok != 0 || intno != 0 || intpass != 0) c1.datatotal++; this.Hide(); Form1 frm1 = new Form1(); frm1.Show(); } } } 另一个窗体代码 Form4 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; namespace WindowsFormsApp1 { public partial class Form4 : Form { public Form4() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //用户选择退出时 关闭此窗口 回到窗口一 this.Close(); Form1 frm1 = new Form1(); frm1.Show(); } private void Form4_Load(object sender, EventArgs e) { //页面加载显示 this.label5.Text = c1.datatotal.ToString(); this.label2.Text = c1.dataok.ToString(); this.label3.Text = c1.datapass.ToString(); this.label4.Text = c1.datano.ToString(); } private void label5_Click(object sender, EventArgs e) { } } } Form3中的类已经实例化,Form4引用后c1不能识别,是什么问题呢
C# Winform项目,在不关闭在线视频播放的App客户端前提下,如何实现频道切换。
在C# Winform项目,有个form窗体以及三个button按钮(button1为打开"CCTV-5"体育频道,button2为打开"CCTV-2"财经频道,button3为打开"CCTV-13"新闻频道) 目前已经可以通过以下代码实现在button1按钮中将“CBOX央视影音”在线视频播放的App客户端的"CCTV-5"体育频道打开并进行播放。 button1按钮打开"CCTV-5"体育频代码如下: Process proc = new Process(); proc.StartInfo.FileName = @"C:\Program Files\CNTV\CBox\CBox.exe"; p.StartInfo.Arguments = ""C:\Program Files\CNTV\CBox\CBox.exe" cbox:///url:media=pa://cctv_p2p_hdcctv5@type=p2p@title=CCTV-5 体育@itemid=cctv5@columnid=cctv5@from=13"; proc.Start(); 关闭退出在线视频播放的App客户端代码如下: proc.kill(); 附打开"CCTV-2"财经频道以及"CCTV-13"新闻频道执行参数: 打开"CCTV-2"财经频道执行参数: "C:\Program Files\CNTV\CBox\CBox.exe" cbox:///url:media=pa://cctv_p2p_hdcctv2@type=p2p@title=CCTV-2 财经@itemid=cctv2@columnid=cctv2@from=13 打开"CCTV-13"新闻频道执行参数: "C:\Program Files\CNTV\CBox\CBox.exe" cbox:///url:media=pa://cctv_p2p_hdcctv13@type=p2p@title=CCTV-13 新闻@itemid=cctv13@columnid=cctv13@from=13 目前遇到点困惑, 如何实现在不关闭“CBOX央视影音”在线视频播放的App客户端前提下,通过上面提供的执行参数可以在button2以及button3按钮中打开相应的"CCTV-2"财经频道以及"CCTV-13"新闻频道。 请问如何修改上面的代码实现上面的功能,谢谢!
求助 ,关于C# winform窗体串口在读取一组参数后再一次读取另一组参数的问题
有两个按钮,一个是“开启基本数据按钮设为button1”,另一个是“读取ListBox内部 数据的内容“设为button2,设定是先开启button1接收基本数据后才能开启button2接 收ListBox内的数据,接收协议一共有5位,分别是报头,符号位,数据位,数据位,校验位(没有长度位),当开启button1后界面上的基本数据的TextBox值会不断发生变化。 。当点击button2后(会有个“正在发送,请等待5s”的一个winform窗口弹出。当第二 次再次接收到数据后,会把协议转换成数据添加到ListBox中,但问题来了:为什么有时 点击button2后接收到的数据中ListBox的第一行数据有时是0没收到数据,有时候会读 到数??????????????????? 我这里button1的基本原理是给控制器发送一个协议,控制器收到后吧几个基本数据的 协议发送给winform窗口并将协议转换为基本数据记录到TextBox内,这时数据是无限 接收的,从而几个基本数据会不断地有变化。button2和button1原理类似都是发送一 个协议而给ListBox发送数据,发送完成后退出窗口,ListBox的所有行的值都变化之后 继续接收button1的基础数据。 接收代码: int S, A, B, C, D; private List<byte> memory = new List<byte>(4096); private byte[] bufferbyte = new byte[5]; private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (Closing) return; Control.CheckForIllegalCrossThreadCalls = false; int n = comm.BytesToRead; Byte[] bytes = new Byte[n]; r_count += n;//记录接收的字节 comm.Read(bytes, 0, n); try { this.Invoke((EventHandler)delegate { if (n > 0) { #region 协议解析/分析数据 //<协议解析> bool data_1_catched = false;//缓存记录数据是否捕获到 memory.AddRange(bytes);//缓存数据 while (memory.Count >= 2)//至少要包含头(1字节)+校验(1字节) { if (memory[0] == 0x88) { if (memory.Count < 5) break; //<数据校验> if ((memory[4] != (memory[1] + memory[2] + memory[3]) % 256) && (memory[4] != (memory[1] - 128 + memory[2] + memory[3]) % 256)) { memory.RemoveRange(0, 5); continue; } memory.CopyTo(0, bufferbyte, 0, 5); data_1_catched = true; memory.RemoveRange(0, 5); //<分析数据> if (data_1_catched) { #region 接收协议定义,用于将协议转化为数据 ............................. #endregion #region 将基本数据转化并填充到TextBox ............................. #endregion #region 将ListBox数据协议转化并填充到ListBox ............................. #endregion } } }); Button1方法比较简单,就是两句话: SendData("88", "FF", "01", "01", "01", 10);//是发送协议方法 周期为10ms comm.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); Button2方法: private void ReadListBoxData_Click(object sender, EventArgs e) { WaitingForm waitf = new WaitingForm(); waitf.ShowIcon = false; waitf.label1.Text = "正在处理,请稍后......"; waitf.Show(); //如果不加上此句话,新窗体加载的内容都在队列中等待而不会绘制,从而导致新窗体没有内容。加上的话,新窗体会重新绘制 Application.DoEvents(); for (int ti = 0; ti < 4; ti++) { SendData("88", "FF", "04", "04", "07", 1000); } Thread.Sleep(4000); if (IsNull(bufferbyte) == true) { MessageBox.Show("重复超时,重新读取"); } waitf.Dispose(); //接受完ListBox的数据后,继续接收基本数据 SendData("88", "FF", "01", "01", "01", 10);// comm.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); } 最大的问题再说一下,就是ListBox的第一行数据有的时候能收到数有时候收不到数,但是自己通过把数据转化到字符串框之后,发现第一列的协议都没有问题, 怀疑是和之前的基本数据协议的尾端发生冲突了,求解决办法?? 现在有一个方法是协商控制器,在发送第一组数据之前添加个5位保护协议。有没有 更好的方法???
C#实现delphi程序中DBConn.udl数据库链接工具,请高手解答疑惑
第1步可以获取所有区域网内的服务器名,但是第三步骤无法从特定的服务器名下,通过用户名和密码,得到数据库 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using StudentManager.com.huixin.util; using System.Collections; using System.Data.ProviderBase; using SQLDMO; using System.Data.SqlClient; namespace StudentManager { public partial class DataSourceConfig : Form { //连接数据库的类型 private String sqlConType = ""; public DataSourceConfig() { InitializeComponent(); } //配置数据库链接的窗体关闭时,打开相对应登录窗体 private void DataSourceConfig_FormClosed(object sender, FormClosedEventArgs e) { try { //杀死进程 //System.Diagnostics.Process.GetCurrentProcess().Kill(); //关闭当前窗体 //终止当前进程并为基础操作系统提供指定的退出代码 //System.Environment.Exit(System.Environment.ExitCode); this.Dispose(); this.Close(); //打开登录窗体 LoginForm lf = new LoginForm(); lf.Show(); // LoginForm.loginFrm.Show(); } catch (Exception ex) { Console.WriteLine("连接数据的窗体进程出错了:" + ex.Message); } } //显示组合框的下拉部分时发生 private void comboBox1_DropDown(object sender, EventArgs e) { this.comboBox1.DataSource = SqlLocator.GetLocalSqlServerNamesWithSqlClientFactory(); this.comboBox1.DisplayMember = "ServerName"; } //当用户点击刷新按钮时,将局域网内服务器和实例名给comobox private void button1_Click(object sender, EventArgs e) { this.comboBox1.DataSource = SqlLocator.GetLocalSqlServerNamesWithSqlClientFactory(); this.comboBox1.DisplayMember = "ServerName"; } //在窗体加载时,将Sql Server按钮以及和他相关两个文本框禁用 private void DataSourceConfig_Load(object sender, EventArgs e) { //Windows的按钮默认被选中 this.radioButton1.Select(); this.textBox1.Enabled = false; this.textBox2.Enabled = false; } private void radioButton1_Click(object sender, EventArgs e) { if (this.radioButton1.Checked == true) { sqlConType = "0"; } } private void radioButton2_CheckedChanged(object sender, EventArgs e) { if (this.radioButton2.Checked == true) { sqlConType = "1"; this.textBox1.Enabled = true; this.textBox2.Enabled = true; } } //3.点击数据库链接时显示时,组合框的下拉部分时发生 private void comboBox2_DropDown(object sender, EventArgs e) { //通过第一步输入的服务器实例名,从而找到步骤三中的数据库 //通过判断用户点击的属于哪一种数据库连接方式,从而判断采用什么方法 if (sqlConType == "0") { //用户选择的是Windows方式 this.comboBox2.DataSource = GetDataBaseList(this.comboBox1.SelectedItem.ToString()); this.comboBox2.DisplayMember = ""; } else if (sqlConType == "1") { //用户选择了Sql Server方式 this.comboBox2.DataSource = GetDataBaseList(this.comboBox1.SelectedItem.ToString(),this.textBox1.Text.Trim().ToString(),this.textBox2.Text.Trim().ToString()); this.comboBox2.DisplayMember = ""; } } //得到指定SQL服务器所有数据库的列表 //这种输入Sql Server模式,需要用户名和密码 public ArrayList GetDataBaseList(string ServerName, string UserName, string Pwd) { //一般使用SQLDMO,只能用于sql server2005一般的版本 ArrayList list = new ArrayList(); SqlConnection conn = new SqlConnection("Uid=" + UserName + ";Pwd=" + Pwd + ";Data Source=SQL2012;Integrated Security=false;"); ; SqlCommand cmd = new SqlCommand("select name from sys.databases where database_id > 4", conn); ; try { if (conn.State == ConnectionState.Closed){ conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { list.Add(dr[0]); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { if (conn != null && conn.State == ConnectionState.Open) { conn.Close(); conn.Dispose(); //释放资源 } } /** SQLDMO.Application sqlApp = new SQLDMO.Application(); SQLDMO.SQLServer oServer = new SQLDMO.SQLServer("Data Source="+ServerName+";Persist Security Info=True;UID="+UserName+";PWD="+Pwd+""); oServer.Connect(ServerName,UserName,Pwd); foreach (SQLDMO.Database db in oServer.Databases) { if ((db.Name != null) && (db.SystemObject == false)) { list.Add(db.Name); } } **/ return list; } //这种属于Windows方式 //此时链接数据库时,需要加integrated security=SSPI public ArrayList GetDataBaseList(string ServerName) { //一般使用SQLDMO,只能用于sql server2005一般的版本 ArrayList list = new ArrayList(); SqlConnection conn = new SqlConnection("Data Source=" + ServerName + ";Integrated Security=SSPI;Initial Catalog=mwyqms_2016-03-25"); SqlCommand cmd = new SqlCommand("select name from sys.databases where database_id > 4", conn); ; try { if (conn.State == ConnectionState.Closed) { conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { list.Add(dr[0]); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { if (conn != null && conn.State == ConnectionState.Open) { conn.Close(); conn.Dispose(); //释放资源 } } return list; } } } 效果![图片说明](https://img-ask.csdn.net/upload/201607/03/1467514278_53237.png)
android 引入unity3d做的AR功能,怎么关闭
unity写了一个AR功能导出来之后成为一个android项目,直接运行没有问题,按返回按钮 也能退出app,但是把unity的项目引入到我写的主项目中,那个返回按钮不好使了,可能 是unity写的C#代码关闭了他的application,但是我android这头仍然打开着这个activity ,所以按返回黑屏闪了一下就没什么变化了,并没有退出来,谁知道如何退出啊
关于服务器如何设置一直保持在线的问题
最近做了一个网站,用户点击一个按钮,服务器端会调用Excle程序生成一个Excle文件,然后将连接回传给用户,用户就下载下来。但现在遇到一个问题,服务器必须有远程登录着的时候,Excle才会启动,退出远程后,用户再点按钮,就会报错“Bad Request”,初步想到是让服务器保持在线,但如何设置呢?或者还有其他的好方法吗?
selenium元素已显示点击报错ElementNotInteractableException
代码如下: # 此类封装一些常用的浏览器操作 class BasePage(object): def __init__(self,driver): self.driver = driver # 退出浏览器 def quit_browser(self): self.driver.quit() # 显式等待_元素可见_XPATH def wait_explicit_located(self,x_path): try: WebDriverWait(self.driver, 5).until( EC.visibility_of_all_elements_located((By.XPATH, x_path))) logger.info(u"目标元素已显示 %s" %x_path) except TimeoutException as e: logger.error(u"元素%s显示异常 %s" % (x_path,e)) print u'元素显示异常%s' %x_path self.get_windows_image() #输入 def type(self,selector,text): el = self.find_element(selector) el.clear() try: el.send_keys(text) logger.info("Had type \' %s \' in inputBox" % text) except NameError as e: logger.error("Failed to type in input box with %s" % e) self.get_windows_image() ...... ``` ``` from ZJCH_selenium.framework.base_page import BasePage #此类是登录页面的方法 class LoginPage(BasePage): loginname_box = "xpath=>.//*[@class='login']//*[@class='lg']" pwd_box = "xpath=>.//*[@class='login']//*[@class='pwd']" verification_box = "xpath=>.//*[@class='login']//*[@name='yanzheng']" login_btn = "xpath=>.//*[@class='login']//*[@class='log log1']" #5位验证码定位 yzm1 = "xpath=>.//*[@class='rt']/span[1]" yzm2 = "xpath=>.//*[@class='rt']/span[2]" yzm3 = "xpath=>.//*[@class='rt']/span[3]" yzm4 = "xpath=>.//*[@class='rt']/span[4]" yzm5 = "xpath=>.//*[@class='rt']/span[5]" login_in = "xpath=>.//*[@class='alert_information']/b" #我知道了按钮的定位 def type_loginname(self, text): self.type(self.loginname_box, text) def type_pwd(self, text): self.type(self.pwd_box, text) def get_yzm(self): yzm_1 = self.get_text(self.yzm1) yzm_2 = self.get_text(self.yzm2) yzm_3 = self.get_text(self.yzm3) yzm_4 = self.get_text(self.yzm4) yzm_5 = self.get_text(self.yzm5) yzm = yzm_1 + yzm_2 + yzm_3 + yzm_4 + yzm_5 return yzm #输入验证码 def type_verification(self, text): self.type(self.verification_box, text) #点击登录按钮 def send_login_btn(self): self.click(self.login_btn) #点击我知道了 def send_iknow_btn(self): self.click(self.login_in) ``` ``` import unittest from ZJCH_selenium.framework.browser_engine import BrowserEngine from ZJCH_selenium.pageobjects.login_page import LoginPage #此类是测试登录功能 class test_ZJCH_Login(unittest.TestCase): def setUp(self): browse = BrowserEngine(self) self.driver = browse.open_browser(self) def tearDown(self): self.driver.quit() def test_login(self): loginpage = LoginPage(self.driver) loginpage.wait_explicit_located(".//*[@class='login']") loginpage.type_loginname('admin') #输入用户名 loginpage.type_pwd('123456') #输入密码 yzm = loginpage.get_yzm() #得到验证码 loginpage.type_verification('{}'.format(yzm)) #输入验证码 loginpage.send_login_btn() #点击登录按钮 loginpage.wait_explicit_located(".//*[@class='alert_information']/b") loginpage.send_iknow_btn() #点击确认登录 ![图片说明](https://img-ask.csdn.net/upload/201709/17/1505622234_129486.png) ** 利用unittest执行测试用例,登录页面可以正常登录,点击我知道了按钮后也正常进入系统首页,从网页上看没有任何异常,但用HTMLTestRunner缺报错,如图** ![图片说明](https://img-ask.csdn.net/upload/201709/17/1505623692_398671.png) **我测试过多次,执行到loginpage.wait_explicit_located(".//*[@class='alert_information']/b"),都没有错误,执行loginpage.send_iknow_btn() 就报错(问题是网页操作正常,可以进入系统首页,但为什么生成的测试报告缺有报错), 我试了下把loginpage.send_iknow_btn()去掉,采用 self.driver.find_element_by_xpath(".//*[@class='alert_information']/b").click() 如果采用这句代码就正常运行没有任何报错,这是为什么呢? [我知道了]这个窗口是在验证了用户登录成功后弹出的一个提示窗口,点击就可以进入系统首页的 另:我已经验证过,loginpage.wait_explicit_located(".//*[@class='alert_information']/b")这句显示等待已经成功的等待了【我知道了】窗口显示才执行的loginpage.send_iknow_btn() 到loginpage.wait_explicit_located(".//*[@class='alert_information']/b")都没有任何问题,元素已显示,点击操作也正常,但是生成到报告里就报错,哪位大神能帮我看看是为什么啊,真的想不通,我的HTMLTestRunner应该不会有问题的,其他测试用例都没什么问题** 然后我试了不采用框架,就没有任何报错,代码如下 import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get("http://localhost:8089/chcgypt/login.html") driver.maximize_window() WebDriverWait(driver, 5).until( EC.visibility_of_element_located((By.XPATH, ".//*[@class='login']"))) driver.find_element_by_xpath(".//*[@class='login']//*[@class='lg']").send_keys("admin") #输入用户名 driver.find_element_by_xpath(".//*[@class='login']//*[@class='pwd']").send_keys("123456") #输入密码 #获取验证码并输入 a = driver.find_element_by_xpath(".//*[@class='rt']/span[1]").text b = driver.find_element_by_xpath(".//*[@class='rt']/span[2]").text c = driver.find_element_by_xpath(".//*[@class='rt']/span[3]").text d = driver.find_element_by_xpath(".//*[@class='rt']/span[4]").text e = driver.find_element_by_xpath(".//*[@class='rt']/span[5]").text yzm = a+b+c+d+e driver.find_element_by_xpath(".//*[@class='login']//*[@name='yanzheng']").send_keys(yzm) #点击登录按钮 driver.find_element_by_xpath(".//*[@class='login']//*[@class='log log1']").click() WebDriverWait(driver, 5).until( EC.visibility_of_all_elements_located((By.XPATH, ".//*[@class='alert_information']/b"))) #点击我知道了按钮进入系统 driver.find_element_by_xpath(".//*[@class='alert_information']/b").click() time.sleep(3) driver.current_window_handle #验证是否进入系统首页 WebDriverWait(driver,5).until(EC.presence_of_all_elements_located((By.XPATH,".//*[@class='welcomeToOurWeb']"))) try: WebDriverWait(driver, 5).until( EC.visibility_of_all_elements_located((By.XPATH, ".//*[@class='welcomeToOurWeb']"))) flag = True except TimeoutException: flag = False # 这种方式,就没有任何错误
贪吃蛇程序,开始可正常操作,按下控制按钮后按键操作不能用
我写了个贪吃蛇程序,用c++ + windows编程写的,左边是游戏区,右边有暂停,加减速等按钮,刚开始可正常操作贪吃蛇,但是在按下按钮后再用上下左右操作就没反应了,不知道为什么?求大神解答 #include <windows.h> #include <vector> #include <ctime> #include <iostream> using namespace std; //定义 游戏区 和 控制区 大小 #define BOUND_SIZE 10 //边框大小 #define SNAKE_SIZE 10 //贪吃蛇方块大小 #define GAME_WIDTH 80 //游戏区宽 #define GAME_HEIGHT 60 //长 #define INFO_WIDTH 30 //游戏信息区宽 #define INFO_HEIGHT GAME_HEIGHT //长 #define MAX_NODE 20 //蛇的最大长度 #define MY_TIMER 1 //定时器ID #define DE_INTERVAL 100 //定义贪吃蛇的默认移动速度--500毫秒/节 // 间隔 #define PAUSE_ID 1//暂停按钮 #define SPDUP_ID 2//加减速 #define SPDDOWN_ID 3 #define GAME_AGAIN_ID 4//游戏重新开始 #define BT_SIZE_WIDTH 10//按钮大小 #define BT_SIZE_HEIGHT 5 // 蛇 vector<POINT> vSnake; int headPos, tailPos; // 头尾的位置 int len; // 长度 int interval; // 速度 POINT direct; // 方向 - 横移 bool needsFood = true; // 是否需要食物 POINT ptFood; // 食物坐标 bool bPause = false; // 暂停状态 enum Status {CONTINUE, WIN, LOST}; Status g_status; //游戏状态 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("HelloWin"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, TEXT("The Hello Program"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow (hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage (&msg); DispatchMessage (&msg); } return msg.wParam; } // 初始化蛇 void initSnake() { // 初始两个结点位置 vSnake.clear(); vSnake.resize(MAX_NODE); // 初始长度 len = 2; for (int i = 0; i < len; i++) { vSnake[i].x=i; vSnake[i].y=1; } // 初始尾巴在蛇身的位置 tailPos = 0; headPos = 1; interval = DE_INTERVAL; // 初始速度 direct = {1, 0}; // 初始方向 g_status = CONTINUE; // 初始化游戏状态 needsFood = true; // 需要食物 bPause = false; // 不暂停 } // 获取蛇的结点位置 POINT &getSnakeNode(int index) { int i = tailPos + index; // 尽量在更局部的地方修改变量以增加可维护性-tailPos if(i >= MAX_NODE) { i -= MAX_NODE; } return vSnake[i]; } // 画蛇 void drawSnake(HDC hdc) { int i; POINT ptNode; HBRUSH hBrush = (HBRUSH) GetStockObject (WHITE_BRUSH); //贪吃蛇块上色 SelectObject(hdc, hBrush); /* 也可以for(i = tail; i < head; i++) 但是需要判断head大于界值后从0续起的情况 */ for(i = 0; i < len; i++) { //从蛇尾开始画 ptNode = getSnakeNode(i); Rectangle(hdc, ptNode.x * SNAKE_SIZE + BOUND_SIZE, ptNode.y * SNAKE_SIZE + BOUND_SIZE, (ptNode.x + 1) * SNAKE_SIZE + BOUND_SIZE, (ptNode.y + 1) * SNAKE_SIZE + BOUND_SIZE); } } // 画食物 void drawFood(HDC hdc) { POINT ptNode; int x, y; int i = 0; HBRUSH hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH); if (needsFood) { srand(time(0)); //随机数种子 //获取随机坐标,不为蛇身 while(i != len) { x=rand() % (GAME_WIDTH - 1); y=rand() % (GAME_HEIGHT - 1); for(i = 0; i < len; i++) // 食物是否在蛇身,若在则直接退出 { ptNode = getSnakeNode(i); if(ptNode.x == x && ptNode.y == y) break; } } ptFood.x = x; ptFood.y = y; needsFood = false; } SelectObject(hdc,hBrush); // 选取画刷 Ellipse(hdc, BOUND_SIZE + ptFood.x * SNAKE_SIZE, // 画食物 BOUND_SIZE + ptFood.y * SNAKE_SIZE, BOUND_SIZE + (ptFood.x + 1) * SNAKE_SIZE, BOUND_SIZE + (ptFood.y + 1) * SNAKE_SIZE); } // 刷新蛇的状态(移动) void refreshSnake() { POINT newNode; newNode.x = vSnake[headPos].x + direct.x; newNode.y = vSnake[headPos].y + direct.y; // 吃到食物 - 尾不变,头 + 1 if (!needsFood && newNode.x == ptFood.x && newNode.y == ptFood.y) { len++; needsFood = true; if (len == MAX_NODE) { g_status = WIN; } headPos = headPos + 1 >= MAX_NODE ? 0 : headPos + 1; vSnake[headPos] = newNode; return; } // 蛇撞墙 if (newNode.x < 0 || newNode.x >= GAME_WIDTH || newNode.y < 0 || newNode.y >= GAME_HEIGHT) { g_status = LOST; return; } POINT ptNode; // 蛇碰到自己的身体 for (int i = 0; i < len; i++) { ptNode = getSnakeNode(i); if (ptNode.x == newNode.x && ptNode.y == newNode.y) { g_status = LOST; return; } } headPos = headPos + 1 >= MAX_NODE ? 0 : headPos + 1; tailPos = tailPos + 1 >= MAX_NODE ? 0 : tailPos + 1; vSnake[headPos] = newNode; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; HDC hdc; PAINTSTRUCT ps; RECT rect; HBRUSH hBrush; int nWinW, nWinH, nClientW, nClientH; // 窗口和客户区的长宽 static HWND hPause; //暂停 static HWND hSpdUp; //加速 static HWND hSpdDown; //减速 static HWND hStartAgain; //重新开始 switch (message) { case WM_CREATE: GetWindowRect(hwnd,&rect); // 绘制窗口大小,获取外窗口大小 nWinW = rect.right-rect.left; nWinH = rect.bottom-rect.top; GetClientRect(hwnd,&rect); // 客户区大小,内窗口大小 nClientW = rect.right-rect.left; nClientH = rect.bottom-rect.top; //修改窗口大小,客户区大小+边框大小(nWinX-nClientX外边框) MoveWindow(hwnd, 0, 0, (GAME_WIDTH + INFO_WIDTH) * SNAKE_SIZE + BOUND_SIZE * 3 + (nWinW - nClientW), (GAME_HEIGHT * SNAKE_SIZE + BOUND_SIZE * 2 + (nWinH-nClientH)), TRUE); hStartAgain = CreateWindow(TEXT("BUTTON"), TEXT("重新开始"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 2 * BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE + (INFO_WIDTH - BT_SIZE_WIDTH) * SNAKE_SIZE / 2, (INFO_HEIGHT - BT_SIZE_HEIGHT * 5) * SNAKE_SIZE / 2 - BOUND_SIZE, BT_SIZE_WIDTH * SNAKE_SIZE, BT_SIZE_HEIGHT * SNAKE_SIZE, hwnd, (HMENU) GAME_AGAIN_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); // 重新开始按钮,位置(横,纵,长宽) hPause = CreateWindow(TEXT("BUTTON"), TEXT("暂停"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 2 * BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE + (INFO_WIDTH - BT_SIZE_WIDTH) * SNAKE_SIZE / 2, (INFO_HEIGHT - BT_SIZE_HEIGHT * 3) * SNAKE_SIZE / 2, BT_SIZE_WIDTH * SNAKE_SIZE, BT_SIZE_HEIGHT * SNAKE_SIZE, hwnd, (HMENU) PAUSE_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); // 暂停按钮,位置(横,纵,长宽) hSpdUp = CreateWindow(TEXT("BUTTON"), TEXT("速度加快"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 2 * BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE + (INFO_WIDTH - BT_SIZE_WIDTH) * SNAKE_SIZE / 2, BOUND_SIZE + (INFO_HEIGHT - BT_SIZE_HEIGHT * 3) * SNAKE_SIZE / 2 + BT_SIZE_HEIGHT * SNAKE_SIZE, BT_SIZE_WIDTH * SNAKE_SIZE, BT_SIZE_HEIGHT * SNAKE_SIZE, hwnd, (HMENU) SPDUP_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); //加速按钮,位置(横,纵,长宽) hSpdDown = CreateWindow(TEXT("BUTTON"), TEXT("速度减慢"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 2 * BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE + (INFO_WIDTH - BT_SIZE_WIDTH) * SNAKE_SIZE / 2, BOUND_SIZE + (INFO_HEIGHT - BT_SIZE_HEIGHT * 3) * SNAKE_SIZE / 2 + BOUND_SIZE + BT_SIZE_HEIGHT * SNAKE_SIZE * 2, BT_SIZE_WIDTH * SNAKE_SIZE, BT_SIZE_HEIGHT * SNAKE_SIZE, hwnd, (HMENU) SPDDOWN_ID, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); //减速按钮,位置(横,纵,长宽) initSnake(); SetTimer(hwnd, MY_TIMER, interval, NULL); //设置定时器 return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); hBrush = (HBRUSH) GetStockObject(GRAY_BRUSH); // 给游戏区和控制区上色 SelectObject(hdc, hBrush); Rectangle(hdc, BOUND_SIZE, BOUND_SIZE, // 游戏区 BOUND_SIZE + GAME_WIDTH * SNAKE_SIZE, BOUND_SIZE + GAME_HEIGHT * SNAKE_SIZE); Rectangle(hdc, // 控制区 BOUND_SIZE * 2 + GAME_WIDTH * SNAKE_SIZE, BOUND_SIZE, BOUND_SIZE + (GAME_WIDTH + INFO_WIDTH) * SNAKE_SIZE, BOUND_SIZE + INFO_HEIGHT * SNAKE_SIZE); drawSnake(hdc); drawFood(hdc); EndPaint (hwnd, &ps); return 0; case WM_TIMER: //移动蛇 refreshSnake(); if (g_status != CONTINUE) { KillTimer(hwnd, MY_TIMER); (g_status == WIN) ? MessageBox(NULL, TEXT("你赢了"), TEXT("Win"), MB_OK) : MessageBox(NULL,TEXT("你输了"), TEXT("Fail"), MB_OK); initSnake(); } InvalidateRect(hwnd,NULL,TRUE); return 0; case WM_KEYDOWN: switch(wParam) { case VK_UP: //调节方向(向原来方向或相反方向时不反应) if(direct.x!=0) { direct.x=0; direct.y=-1; } break; case VK_DOWN: if(direct.x!=0) { direct.x=0; direct.y=1; } break; case VK_LEFT: if(direct.y!=0) { direct.x=-1; direct.y=0; } break; case VK_RIGHT: if(direct.y!=0) { direct.x=1; direct.y=0; } break; } return 0; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case GAME_AGAIN_ID: KillTimer(hwnd, MY_TIMER); initSnake(); SetTimer(hwnd, MY_TIMER, interval, NULL); break; case PAUSE_ID: if(bPause) { bPause = false; SetWindowText(hPause, TEXT("暂停")); SetTimer(hwnd, MY_TIMER, interval, NULL); } else { bPause = true; SetWindowText(hPause, TEXT("继续")); KillTimer(hwnd, MY_TIMER); } break; case SPDUP_ID: if(interval >= 100) { interval -= 50; KillTimer(hwnd, MY_TIMER); SetTimer(hwnd, MY_TIMER, interval, NULL); } break; case SPDDOWN_ID: if(interval <= 500) { interval += 50; KillTimer(hwnd, MY_TIMER); SetTimer(hwnd, MY_TIMER, interval, NULL); } break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; case WM_DESTROY: KillTimer(hwnd,MY_TIMER); PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }
pyqt5中如何通过OpenCV读取一帧图像喂入网络呢?
我想通过pyqt5制作一个UI界面封装google object detection api的示例代码,源代码中是识别单张图片,我想通过摄像头输入一帧的图像然后进行识别显示。整个程序如下: ``` # coding:utf-8 ''' V3.0A版本,尝试实现摄像头识别 ''' import numpy as np import cv2 import os import os.path import six.moves.urllib as urllib import sys import tarfile import tensorflow as tf import zipfile import pylab from distutils.version import StrictVersion from collections import defaultdict from io import StringIO from matplotlib import pyplot as plt from PIL import Image from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * class UiForm(): openfile_name_pb = '' openfile_name_pbtxt = '' openpic_name = '' num_class = 0 def setupUi(self, Form): Form.setObjectName("Form") Form.resize(600, 690) Form.setMinimumSize(QtCore.QSize(600, 690)) Form.setMaximumSize(QtCore.QSize(600, 690)) self.frame = QtWidgets.QFrame(Form) self.frame.setGeometry(QtCore.QRect(20, 20, 550, 100)) self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame) self.horizontalLayout_2.setObjectName("horizontalLayout_2") # 加载模型文件按钮 self.btn_add_file = QtWidgets.QPushButton(self.frame) self.btn_add_file.setObjectName("btn_add_file") self.horizontalLayout_2.addWidget(self.btn_add_file) # 加载pbtxt文件按钮 self.btn_add_pbtxt = QtWidgets.QPushButton(self.frame) self.btn_add_pbtxt.setObjectName("btn_add_pbtxt") self.horizontalLayout_2.addWidget(self.btn_add_pbtxt) # 输入检测类别数目按钮 self.btn_enter = QtWidgets.QPushButton(self.frame) self.btn_enter.setObjectName("btn_enter") self.horizontalLayout_2.addWidget(self.btn_enter) # 打开摄像头 self.btn_opencam = QtWidgets.QPushButton(self.frame) self.btn_opencam.setObjectName("btn_objdec") self.horizontalLayout_2.addWidget(self.btn_opencam) # 开始识别按钮 self.btn_objdec = QtWidgets.QPushButton(self.frame) self.btn_objdec.setObjectName("btn_objdec") self.horizontalLayout_2.addWidget(self.btn_objdec) # 退出按钮 self.btn_exit = QtWidgets.QPushButton(self.frame) self.btn_exit.setObjectName("btn_exit") self.horizontalLayout_2.addWidget(self.btn_exit) # 显示识别后的画面 self.lab_rawimg_show = QtWidgets.QLabel(Form) self.lab_rawimg_show.setGeometry(QtCore.QRect(50, 140, 500, 500)) self.lab_rawimg_show.setMinimumSize(QtCore.QSize(500, 500)) self.lab_rawimg_show.setMaximumSize(QtCore.QSize(500, 500)) self.lab_rawimg_show.setObjectName("lab_rawimg_show") self.lab_rawimg_show.setStyleSheet(("border:2px solid red")) self.retranslateUi(Form) # 这里将按钮和定义的动作相连,通过click信号连接openfile槽? self.btn_add_file.clicked.connect(self.openpb) # 用于打开pbtxt文件 self.btn_add_pbtxt.clicked.connect(self.openpbtxt) # 用于用户输入类别数 self.btn_enter.clicked.connect(self.enter_num_cls) # 打开摄像头 self.btn_opencam.clicked.connect(self.opencam) # 开始识别 # ~ self.btn_objdec.clicked.connect(self.object_detection) # 这里是将btn_exit按钮和Form窗口相连,点击按钮发送关闭窗口命令 self.btn_exit.clicked.connect(Form.close) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "目标检测")) self.btn_add_file.setText(_translate("Form", "加载模型文件")) self.btn_add_pbtxt.setText(_translate("Form", "加载pbtxt文件")) self.btn_enter.setText(_translate("From", "指定识别类别数")) self.btn_opencam.setText(_translate("Form", "打开摄像头")) self.btn_objdec.setText(_translate("From", "开始识别")) self.btn_exit.setText(_translate("Form", "退出")) self.lab_rawimg_show.setText(_translate("Form", "识别效果")) def openpb(self): global openfile_name_pb openfile_name_pb, _ = QFileDialog.getOpenFileName(self.btn_add_file,'选择pb文件','/home/kanghao/','pb_files(*.pb)') print('加载模型文件地址为:' + str(openfile_name_pb)) def openpbtxt(self): global openfile_name_pbtxt openfile_name_pbtxt, _ = QFileDialog.getOpenFileName(self.btn_add_pbtxt,'选择pbtxt文件','/home/kanghao/','pbtxt_files(*.pbtxt)') print('加载标签文件地址为:' + str(openfile_name_pbtxt)) def opencam(self): self.camcapture = cv2.VideoCapture(0) self.timer = QtCore.QTimer() self.timer.start() self.timer.setInterval(100) # 0.1s刷新一次 self.timer.timeout.connect(self.camshow) def camshow(self): global camimg _ , camimg = self.camcapture.read() print(_) camimg = cv2.resize(camimg, (512, 512)) camimg = cv2.cvtColor(camimg, cv2.COLOR_BGR2RGB) print(type(camimg)) #strcamimg = camimg.tostring() showImage = QtGui.QImage(camimg.data, camimg.shape[1], camimg.shape[0], QtGui.QImage.Format_RGB888) self.lab_rawimg_show.setPixmap(QtGui.QPixmap.fromImage(showImage)) def enter_num_cls(self): global num_class num_class, okPressed = QInputDialog.getInt(self.btn_enter,'指定训练类别数','你的目标有多少类?',1,1,28,1) if okPressed: print('识别目标总类为:' + str(num_class)) def img2pixmap(self, image): Y, X = image.shape[:2] self._bgra = np.zeros((Y, X, 4), dtype=np.uint8, order='C') self._bgra[..., 0] = image[..., 2] self._bgra[..., 1] = image[..., 1] self._bgra[..., 2] = image[..., 0] qimage = QtGui.QImage(self._bgra.data, X, Y, QtGui.QImage.Format_RGB32) pixmap = QtGui.QPixmap.fromImage(qimage) return pixmap def object_detection(self): sys.path.append("..") from object_detection.utils import ops as utils_ops if StrictVersion(tf.__version__) < StrictVersion('1.9.0'): raise ImportError('Please upgrade your TensorFlow installation to v1.9.* or later!') from utils import label_map_util from utils import visualization_utils as vis_util # Path to frozen detection graph. This is the actual model that is used for the object detection. PATH_TO_FROZEN_GRAPH = openfile_name_pb # List of the strings that is used to add correct label for each box. PATH_TO_LABELS = openfile_name_pbtxt NUM_CLASSES = num_class detection_graph = tf.Graph() with detection_graph.as_default(): od_graph_def = tf.GraphDef() with tf.gfile.GFile(PATH_TO_FROZEN_GRAPH, 'rb') as fid: serialized_graph = fid.read() od_graph_def.ParseFromString(serialized_graph) tf.import_graph_def(od_graph_def, name='') category_index = label_map_util.create_category_index_from_labelmap(PATH_TO_LABELS, use_display_name=True) def load_image_into_numpy_array(image): (im_width, im_height) = image.size return np.array(image.getdata()).reshape( (im_height, im_width, 3)).astype(np.uint8) # For the sake of simplicity we will use only 2 images: # image1.jpg # image2.jpg # If you want to test the code with your images, just add path to the images to the TEST_IMAGE_PATHS. TEST_IMAGE_PATHS = camimg print(TEST_IMAGE_PATHS) # Size, in inches, of the output images. IMAGE_SIZE = (12, 8) def run_inference_for_single_image(image, graph): with graph.as_default(): with tf.Session() as sess: # Get handles to input and output tensors ops = tf.get_default_graph().get_operations() all_tensor_names = {output.name for op in ops for output in op.outputs} tensor_dict = {} for key in [ 'num_detections', 'detection_boxes', 'detection_scores', 'detection_classes', 'detection_masks' ]: tensor_name = key + ':0' if tensor_name in all_tensor_names: tensor_dict[key] = tf.get_default_graph().get_tensor_by_name( tensor_name) if 'detection_masks' in tensor_dict: # The following processing is only for single image detection_boxes = tf.squeeze(tensor_dict['detection_boxes'], [0]) detection_masks = tf.squeeze(tensor_dict['detection_masks'], [0]) # Reframe is required to translate mask from box coordinates to image coordinates and fit the image size. real_num_detection = tf.cast(tensor_dict['num_detections'][0], tf.int32) detection_boxes = tf.slice(detection_boxes, [0, 0], [real_num_detection, -1]) detection_masks = tf.slice(detection_masks, [0, 0, 0], [real_num_detection, -1, -1]) detection_masks_reframed = utils_ops.reframe_box_masks_to_image_masks( detection_masks, detection_boxes, image.shape[0], image.shape[1]) detection_masks_reframed = tf.cast( tf.greater(detection_masks_reframed, 0.5), tf.uint8) # Follow the convention by adding back the batch dimension tensor_dict['detection_masks'] = tf.expand_dims( detection_masks_reframed, 0) image_tensor = tf.get_default_graph().get_tensor_by_name('image_tensor:0') # Run inference output_dict = sess.run(tensor_dict, feed_dict={image_tensor: np.expand_dims(image, 0)}) # all outputs are float32 numpy arrays, so convert types as appropriate output_dict['num_detections'] = int(output_dict['num_detections'][0]) output_dict['detection_classes'] = output_dict[ 'detection_classes'][0].astype(np.uint8) output_dict['detection_boxes'] = output_dict['detection_boxes'][0] output_dict['detection_scores'] = output_dict['detection_scores'][0] if 'detection_masks' in output_dict: output_dict['detection_masks'] = output_dict['detection_masks'][0] return output_dict #image = Image.open(TEST_IMAGE_PATHS) # the array based representation of the image will be used later in order to prepare the # result image with boxes and labels on it. image_np = load_image_into_numpy_array(TEST_IMAGE_PATHS) # Expand dimensions since the model expects images to have shape: [1, None, None, 3] image_np_expanded = np.expand_dims(image_np, axis=0) # Actual detection. output_dict = run_inference_for_single_image(image_np, detection_graph) # Visualization of the results of a detection. vis_util.visualize_boxes_and_labels_on_image_array( image_np, output_dict['detection_boxes'], output_dict['detection_classes'], output_dict['detection_scores'], category_index, instance_masks=output_dict.get('detection_masks'), use_normalized_coordinates=True, line_thickness=8) plt.figure(figsize=IMAGE_SIZE) plt.imshow(image_np) #plt.savefig(str(TEST_IMAGE_PATHS)+".jpg") ## 用于显示ui界面的命令 if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) Window = QtWidgets.QWidget() # ui为根据类Ui_From()创建的实例 ui = UiForm() ui.setupUi(Window) Window.show() sys.exit(app.exec_()) ``` 但是运行提示: ![图片说明](https://img-ask.csdn.net/upload/201811/30/1543567054_511116.png) 求助
下面这段代码,要将选中的复选框删除,但是为什么每次只能删除一半就退出??
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>右部显示区域</title> <script type="text/javascript"> // 当全选按钮被选中时,则下边所有复选框都被选中 window.onload = function(){ // 为删除按钮添加响应时间 document.getElementById("del").onclick = function(){ // 获取所有的复选框 var items = document.getElementsByName("items"); setTrId(items); var len = items.length; for(var i = 0;i < len; i++){ alert(len); alert(i); if(items[i] && items[i].checked == true){ var tr = document.getElementById("tr" + (i + 1)); //alert(tr.id); if(confirm("确定要删除该条记录吗?")){ tr.remove(); /*var items = document.getElementsByName("items"); setTrId(items);*/} } } } // 为每个tr的id赋值 function setTrId(items){ for(var i = 0;i < items.length; i++){ var tr = items[i].parentNode.parentNode.parentNode; tr.id = "tr" + (i + 1); } } } </script> <style type="text/css"> <!-- body { margin-left: 3px; margin-top: 0px; margin-right: 3px; margin-bottom: 0px; } .STYLE1 { color: #e1e2e3; font-size: 12px; } .STYLE1 a{ color:#EEE; text-decoration:none;} .STYLE6 {color: #000000; font-size: 12; } .STYLE10 {color: #000000; font-size: 12px; } .STYLE19 { color: #344b50; font-size: 12px; } .STYLE21 { font-size: 12px; color: #3b6375; } .STYLE22 { font-size: 12px; color: #295568; } .page a{ text-decoration:none;} .STYLE21 a{ text-decoration:none;} --> </style> </head> <body> <table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" id="tbl"> <tr> <td height="30"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td height="24" bgcolor="#353c44"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="6%" height="19" valign="bottom"><div align="center"><img src="images/tb.gif" width="14" height="14" /></div></td> <td width="94%" valign="bottom"><span class="STYLE1"> 管理人员基本信息列表</span></td> </tr> </table></td> <td><div align="right"><span class="STYLE1"> <a href="addAdmin.html">添加</a> &nbsp;<button id="del">删除</button> &nbsp;</span><span class="STYLE1"> &nbsp;</span></div></td> </tr> </table></td> </tr> </table></td> </tr> <tr> <td><table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#a8c7ce"> <tr> <td width="4%" height="20" bgcolor="d3eaef" class="STYLE10"><div align="center"> <input type="checkbox" name="checkboxAll" id="checkboxAll" /> </div></td> <td width="10%" height="20" bgcolor="d3eaef" class="STYLE6"><div align="center"><span class="STYLE10">用户名</span></div></td> <td width="15%" height="20" bgcolor="d3eaef" class="STYLE6"><div align="center"><span class="STYLE10">用户角色</span></div></td> <td width="14%" height="20" bgcolor="d3eaef" class="STYLE6"><div align="center"><span class="STYLE10">联系方式</span></div></td> <td width="16%" height="20" bgcolor="d3eaef" class="STYLE6"><div align="center"><span class="STYLE10">IP地址</span></div></td> <td width="27%" height="20" bgcolor="d3eaef" class="STYLE6"><div align="center"><span class="STYLE10">详细描述</span></div></td> <td width="14%" height="20" bgcolor="d3eaef" class="STYLE6"><div align="center"><span class="STYLE10">基本操作</span></div></td> </tr> <tr> <td height="20" bgcolor="#FFFFFF"><div align="center"> <input type="checkbox" name="items" id="checkbox9" /> </div></td> <td height="20" bgcolor="#FFFFFF" class="STYLE19"><div align="center">admin</div></td> <td height="20" bgcolor="#FFFFFF" class="STYLE19"><div align="center">系统管理员</div></td> <td height="20" bgcolor="#FFFFFF" class="STYLE19"><div align="center">13913612548</div></td> <td height="20" bgcolor="#FFFFFF" class="STYLE19"><div align="center">192.168.0.124</div></td> <td height="20" bgcolor="#FFFFFF" class="STYLE19"><div align="center">用户可以对系统的所有操作进行管理...</div></td> <td height="20" bgcolor="#FFFFFF"><div align="center"><span class="STYLE21"><a href="#">编辑/删除</a></span></div></td> </tr> <tr> <td height="20" bgcolor="#FFFFFF"><div align="center"> <input type="checkbox" name="items" id="checkbox10" /> </div></td> <td height="20" bgcolor="#FFFFFF" class="STYLE19"><div align="center">admin</div></td> <td height="20" bgcolor="#FFFFFF" class="STYLE19"><div align="center">系统管理员</div></td> <td height="20" bgcolor="#FFFFFF" class="STYLE19"><div align="center">13913612548</div></td> <td height="20" bgcolor="#FFFFFF" class="STYLE19"><div align="center">192.168.0.124</div></td> <td height="20" bgcolor="#FFFFFF" class="STYLE19"><div align="center">用户可以对系统的所有操作进行管理...</div></td> <td height="20" bgcolor="#FFFFFF"><div align="center"><span class="STYLE21"><a href="#">编辑/删除</a></span></div></td> </tr> </table></td> </tr> <tr> <td height="30"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="33%"><div align="left"><span class="STYLE22">&nbsp;&nbsp;&nbsp;&nbsp;共有<strong> 50 </strong> 条记录,当前第<strong> 1</strong> 页,共 <strong>5</strong> 页</span></div></td> <td width="67%"><table width="312" border="0" align="right" cellpadding="0" cellspacing="0"> <tr> <td width="50" bgcolor="#DDDDDD"><div align="center" class="page"><a href="right.html">首页</a></div></td> <td width="60"><div align="center" class="page"><a href="right.html">上一页</a></div></td> <td width="60"><div align="center" class="page"><a href="right.html">下一页</a></div></td> <td width="50"><div align="center" class="page"><a href="right.html">末页</a></div></td> <td width="40" class="STYLE22"><div align="center">转到</div></td> <td width="25"><div align="center"> <input type="text" name="textfield" id="textfield" style="width:20px; height:12px; font-size:12px; border:solid 1px #7aaebd;"/> </div></td> <td width="22" class="STYLE22"><div align="center">页</div></td> <td width="45"><button id="qd">确定</button></td> </tr> </table></td> </tr> </table></td> </tr> </table> </body> </html>
win32程序怎么连接数据库并验证正确性
###运行后虽然有界面出现,但是输入了用户名和密码后就卡住了一会,然后退出了,messagebox也没有显示,求大佬点拨,下面是代码: ``` #include <windows.h> #include "resource.h" //....... //资源 BOOL REGISTEWIN(HINSTANCE hInstance,LPSTR lpClassName, WNDPROC wndProc); void SHOWWND(HWND hwnd); void MESSAGE(); void Link(); LRESULT CALLBACK MYPROC(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam); LRESULT CALLBACK SCREEAN1PROC(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam); LRESULT CALLBACK DialogProc1(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam); BOOL Check(SQLHSTMT hStmt); HWND hwndup; HWND hwnd; RETCODE retcode; HINSTANCE hInstance; SQLHENV henv = SQL_NULL_HENV; SQLHDBC hdbc1 = SQL_NULL_HDBC; SQLHSTMT hstmt1 = SQL_NULL_HSTMT; char users[255]={0}; char password[255]={0}; //winmain主程序 int WinMain(HINSTANCE hInstance,HINSTANCE hinstance,LPSTR lpCmdLine,int nShowCmd){ char* name = "name"; char* screen1 = "screen1"; //创建对话框,并判断对话框是否注册成功 HWND hdlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG2),GetDesktopWindow(),(DLGPROC)DialogProc1); if(!hdlg) MessageBox(hwnd,"error","error",MB_OK); SHOWWND(hdlg); //创建管理界面 hwndup = CreateWindow(screen1,TEXT("图书管理界面"),WS_OVERLAPPEDWINDOW,500,100,500,700,NULL,LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1)),hInstance,NULL) ; MESSAGE(); return 0; } //DialogProc1函数 LRESULT CALLBACK DialogProc1(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam){ switch (msg) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: { switch (LOWORD(wparam)) { case IDOK: { HWND h1=NULL; HWND h2=NULL; h1=GetDlgItem(hdlg,0x00009c40) ; h2=GetDlgItem(hdlg,0x00009c41) ; if(h1==NULL&&h2==NULL) printf("GetDlgItem fail!"); //获得user和password SendMessage(h1,WM_GETTEXT,255,(LPARAM)users); SendMessage(h2,WM_GETTEXT,255,(LPARAM)password); printf("%s %s\n",users,password); // // //就是这里,,,,想通过数据库查找user和password // // if(Check(hdlg)==TRUE) MessageBox(hdlg,"error","账户或密码不正确",MB_OK); DestroyWindow(hdlg); hdlg = NULL; hdlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),hwnd,(DLGPROC)DialogProc1); ShowWindow(hdlg,SW_SHOW); } break; case IDCANCEL: { //点击取消按钮关闭对话框,最后关闭窗口 EndDialog(hdlg, IDCANCEL); } break; } } break; case WM_SYSCOMMAND: { if (wparam == SC_CLOSE) { EndDialog(hdlg,TRUE); } } break; } return (INT_PTR)FALSE; } //检查user和password函数 BOOL Check(SQLHSTMT hStmt) { Link(); char * person1 = "select *from Login where users='"; const char * person2 = "' and password="; strcat(person1,users); strcat(person1,person2); strcat(person1,password); SQLRETURN ret = SQLExecDirect(hStmt,(SQLCHAR*)person1,strlen(person1)); if (ret == SQL_SUCCESS) return TRUE; else return FALSE; } void MESSAGE(){ MSG msg = {0}; while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg);//分发消息,将消息分发给回调函数,回调函数callback处理完后,返回给dispatchmessage函数,再继续进行消息循环 } } void Link(){ // UCHAR szDSN[SQL_MAX_DSN_LENGTH+1] = "db_mrbm",//数据源名称 szUID[MAXNAME] = "sa", szAuthStr[MAXNAME] = "0922"; //1.连接数据源 //1.环境句柄 retcode = SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv); retcode = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER); //2.连接句柄 retcode = SQLAllocHandle(SQL_HANDLE_DBC,henv, &hdbc1); retcode = SQLConnect(hdbc1, szDSN, 13, szUID, 2, szAuthStr,4); //判断连接是否成功 if((retcode!=SQL_SUCCESS)&&(retcode!=SQL_SUCCESS_WITH_INFO)){ MessageBox(hwnd,"连接错误","error",MB_OK); }else{printf("连接!/n");} // } ```
MFC 错误 LNK2001 无法解析的外部符号
// SerialTest3Dlg.h : 头文件 // #pragma once #include "afxwin.h" #include "mscomm2.h" #include "stdint.h" #include "stdafx.h" // CSerialTest3Dlg 对话框 class CSerialTest3Dlg : public CDialogEx { // 构造 public: CSerialTest3Dlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_SERIALTEST3_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: HICON m_hIcon; // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() private: CString m_EditReceive;//接收框 CString m_Editsend;//发送框 CComboBox m_comb1;//COM口下拉框 public: CComboBox m_comb2;//波特率下拉框 CMscomm2 m_mscom;//串口控件 afx_msg void OnBnClickedButtonOpen();//打开按钮 afx_msg void OnBnClickedButtonCleanup();//清楚按钮 afx_msg void OnBnClickedButtonClose();//关闭按钮 DECLARE_EVENTSINK_MAP() void OnCommMscomm1();//串口按钮(隐形) CEdit m_Edit; CString m_interpretingdata;//解析数据 afx_msg void OnBnClickedButton5();//发送按钮 }; typedef struct FPGA_INFO_REPORT { uint8_t bWorkMode; //当前工作模式0x00表示初始模式0x01表示扫频模式0x02表示闭环驱动和检测模式0x03表示开环驱动和检测模式0x04表示连续Q值计算模式 uint8_t bCheckMode; //当前检测类型0x01表示开环检测0x02表示闭环检测调试0x03表示闭环检测0x04表示正交校正模式 uint8_t bADMagTimes; //检测信号放大倍数 uint32_t dwSweepTime; //扫频完成时间,毫秒 float fSweepFreq; //扫频得到的谐振频率 float fSweepFreqAmpl; //扫频谐振频率对应的驱动反馈信号幅值 float fDriSignalFreq; //驱动信号频率 float fDriSignalAmpl; //驱动信号幅度 float fDriveFbAmpl; //驱动反馈信号幅度 float fDriveFbPhase; //驱动反馈信号相位 float fBalSignalAmpl; //力平衡信号幅度 float fBalSignalPhase; //力平衡信号相位 float fCheckSignalAmpl; //检测信号幅度 float fCheckSignalPhase; //检测信号相位 float fCheckSignalPalst; //角速度 }FPGA_INFO_REPORT1; // SerialTest3Dlg.cpp : 实现文件 // #include "stdafx.h" #include "SerialTest3.h" #include "SerialTest3Dlg.h" #include "afxdialogex.h" #include <stdlib.h> #include "parser.h" #include <string.h> #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_ABOUTBOX }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CSerialTest3Dlg 对话框 CSerialTest3Dlg::CSerialTest3Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_SERIALTEST3_DIALOG, pParent) , m_EditReceive(_T("")) , m_Editsend(_T("")) , m_interpretingdata(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CSerialTest3Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_Rev, m_EditReceive); DDX_Text(pDX, IDC_EDIT_Tev, m_Editsend); DDX_Control(pDX, IDC_COMBO2, m_comb1); DDX_Control(pDX, IDC_COMBO3, m_comb2); DDX_Control(pDX, IDC_MSCOMM2, m_mscom); DDX_Control(pDX, IDC_EDIT_Rev, m_Edit); DDX_Text(pDX, IDC_EDIT16, m_interpretingdata); } BEGIN_MESSAGE_MAP(CSerialTest3Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_OPEN, &CSerialTest3Dlg::OnBnClickedButtonOpen) ON_BN_CLICKED(IDC_BUTTON_CLEANUP, &CSerialTest3Dlg::OnBnClickedButtonCleanup) ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CSerialTest3Dlg::OnBnClickedButtonClose) //ON_BN_CLICKED(IDC_BUTTON1, &CSerialTest3Dlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON5, &CSerialTest3Dlg::OnBnClickedButton5) END_MESSAGE_MAP() // CSerialTest3Dlg 消息处理程序 BOOL CSerialTest3Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 串口选择组合框 CString str; int i; for (i = 0; i < 5; i++) { str.Format(_T("com %d"), i + 1); m_comb1.InsertString(i, str); } m_comb1.SetCurSel(0);//预置COM口 // 波特率选择组合框 CString str1[] = { _T("4800"),_T("9600"),_T("19200"),_T("38400"),_T("43000"),_T("56000"),_T("57600"),_T("115200") }; for (int i = 0; i < 8; i++) { int judge_tf = m_comb2.AddString(str1[i]); if ((judge_tf == CB_ERR) || (judge_tf == CB_ERRSPACE)) MessageBox(_T("build baud error!")); } m_comb2.SetCurSel(7);//预置波特率为"115200" return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CSerialTest3Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CSerialTest3Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CSerialTest3Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CSerialTest3Dlg::OnBnClickedButtonOpen()//打开串口 按钮程序 { // TODO: 在此添加控件通知处理程序代码 CString str, str1, n; //定义字符串 GetDlgItemText(IDC_BUTTON_OPEN, str); CWnd *h1; h1 = GetDlgItem(IDC_BUTTON_OPEN); //指向控件的caption if (!m_mscom.get_PortOpen()) { m_comb2.GetLBText(m_comb2.GetCurSel(), str1);//取得所选的字符串,并存放在str1里面 str1 = str1 + ',' + 'n' + ',' + '8' + ',' + '1'; //这句话很关键 m_mscom.put_CommPort((m_comb1.GetCurSel() + 1)); //选择串口 m_mscom.put_InputMode(1); //设置输入方式为二进制方式 m_mscom.put_Settings(str1); //波特率为(波特率组合框)无校验,8数据位,1个停止位 m_mscom.put_InputLen(1024); //设置当前接收区数据长度为1024 m_mscom.put_RThreshold(1); //缓冲区一个字符引发事件 m_mscom.put_RTSEnable(1); //设置RT允许 m_mscom.put_PortOpen(true); //打开串口 if (m_mscom.get_PortOpen()) { str = _T("关闭串口"); UpdateData(true); h1->SetWindowText(str); //改变按钮名称为“关闭串口” } } else { m_mscom.put_PortOpen(false); if (str != _T("打开串口")) { str = _T("打开串口"); UpdateData(true); h1->SetWindowText(str); //改变按钮名称为打开串口 } } } void CSerialTest3Dlg::OnBnClickedButtonCleanup()//清除数据按钮 { // TODO: 在此添加控件通知处理程序代码 m_EditReceive = _T(""); //给接收编辑框发送空格符 UpdateData(false); //更新数据 } void CSerialTest3Dlg::OnBnClickedButtonClose()//退出按钮 { // TODO: 在此添加控件通知处理程序代码 m_EditReceive = _T(""); //给接收编辑框发送空格符 UpdateData(false); //更新数据 } BEGIN_EVENTSINK_MAP(CSerialTest3Dlg, CDialogEx) ON_EVENT(CSerialTest3Dlg, IDC_MSCOMM2, 1, CSerialTest3Dlg::OnCommMscomm1, VTS_NONE) END_EVENTSINK_MAP() //CString temp; void CSerialTest3Dlg::OnCommMscomm1()//串口控件(按钮) { // TODO: 在此处添加消息处理程序代码 if (m_mscom.get_CommEvent() == 2) { char str[2048] = { 0 }; long k; CString temp; VARIANT InputData = m_mscom.get_Input(); //读缓冲区 COleSafeArray fs; fs = InputData; //VARIANT型变量转换为COleSafeArray型变量 for (k = 0; k < fs.GetOneDimSize(); k++) { fs.GetElement(&k, str + k); //转换为BYTE型数组 temp.Format(L"%02X",(char*)(str + k));//输出显示16进制 m_EditReceive += temp; // 接收到数据显示在编辑框里面 } SetTimer(1,10,NULL); //延时10ms UpdateData(false); m_Edit.SetSel(-1, 1); this->SetDlgItemTextW(IDC_EDIT_Rev, m_EditReceive);//将接收框内容显示到最后位置 m_Edit.LineScroll(m_Edit.GetLineCount() - 1, 0);//将垂直滚动条滚动到最后一行 FPGA_INFO_REPORT1 info; memcpy(&info, str, sizeof(str)); CString str2; str2.Format(L"当前工作模式:%c\n", info.bWorkMode, "当前检测类型:%c\n", info.bCheckMode, "检测信号放大倍数:%c\n", info.bADMagTimes, "扫频完成时间:%c\n", info.dwSweepTime, "扫频得到的谐振频率:%f\n", info.fSweepFreq, "扫频谐振频率对应的驱动反馈信号幅值:%f\n", info.fSweepFreqAmpl, "驱动信号频率:%f\n", info.fDriSignalFreq, "驱动信号幅度:%f\n", info.fDriSignalAmpl, "驱动反馈信号幅度:%f\n", info.fDriveFbAmpl, "力平衡信号幅度:%f\n", info.fBalSignalAmpl, "力平衡信号相位:%f\n", info.fBalSignalPhase, "检测信号幅度:%f\n", info.fCheckSignalAmpl, "检测信号相位:%f\n", info.fCheckSignalPhase, "角速度:%f\n", info.fCheckSignalPalst); m_interpretingdata =str2; } } void CSerialTest3Dlg::OnBnClickedButton5() { // TODO: 在此添加控件通知处理程序代码 UpdateData(true); //更新控件数据 m_mscom.put_Output(COleVariant(m_Editsend));//把发送编辑框的数据发送出去 } 以上代码报错 :错误 LNK2001 无法解析的外部符号 "public: virtual struct CRuntimeClass * __thiscall CMscomm2::GetRuntimeClass(void)const " (?GetRuntimeClass@CMscomm2@@UBEPAUCRuntimeClass@@XZ) SerialTest3 C:\Users\LFY\Desktop\SerialTest3\SerialTest3\SerialTest3Dlg.obj 1 是什么原因
130 个相见恨晚的超实用网站,一次性分享出来
相见恨晚的超实用网站 持续更新中。。。
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
win10系统安装教程(U盘PE+UEFI安装)
一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱 极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件, 选择安装到U盘(按照操作无需更改) 三、重启进入pe系统 1、关机后,将U盘插入电脑 2、按下电源后,按住F12进入启动项选择(技嘉主板是F12) 选择需要启...
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
java源码分析 Arrays.asList()与Collections.unmodifiableList()
ArrayList支持所有的可选操作(因为一个UnsupportedOperationException异常都没有捕获到),所以要想拥有完备的功能,还是得使用ArrayList啊。 Arrays$ArrayList除了set()操作外,都不支持。 Collections$UnmodifiableRandomAccessList都不支持,名副其实的Unmodifiable不可修改。
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
Java学习笔记(七十二)—— Cookie
概述 会话技术: 会话:一次会话中包含多次请求和响应 一次会话:浏览器第一次给服务器发送资源请求,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求间,共享数据 方式: 客户端会话技术:Cookie,把数据存储到客户端 服务器端会话技术:Session,把数据存储到服务器端 Cookie 概念:客户端会话技术,将数据存储到客户端 快速入门: 使用步骤: 创建C...
程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
程序员该看的几部电影
1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?如何...
蓝桥杯知识点汇总:基础知识和常用算法
文章目录基础语法部分:算法竞赛常用API:算法部分数据结构部分 此系列包含蓝桥杯绝大部分所考察的知识点,以及真题题解~ 基础语法部分: 备战蓝桥杯java(一):一般输入输出 和 快速输入输(BufferedReader&amp;BufferedWrite) 备战蓝桥杯java(二):java编程规范和常用数据类型 备战蓝桥杯java(三):常用功能符以及循环结构和分支结构 备战蓝桥杯java(四...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
实现简单的轮播图(单张图片、多张图片)
前言 刚学js没多久,这篇博客就当做记录了,以后还会完善的,希望大佬们多多指点。ps:下面出现的都是直接闪动,没有滑动效果的轮播图。 单张图片的替换 · ...
强烈推荐10本程序员在家读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
Linux自学篇——linux命令英文全称及解释
man: Manual 意思是手册,可以用这个命令查询其他命令的用法。 pwd:Print working directory 意思是密码。 su:Swith user 切换用户,切换到root用户 cd:Change directory 切换目录 ls:List files 列出目录下的文件 ps:Process Status 进程状态 mkdir:Make directory ...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
智力题(程序员面试经典)
NO.1  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 解法 有时候,严格的限制条件有可能反倒是解题的线索。在这个问题中,限制条件是天平只能用一次。 因为天平只能用一次,我们也得以知道一个有趣的事实:一次必须同时称很多药丸,其实更准确地说,是必须从19瓶拿出药丸进行称重。否则,如果跳过两瓶或更多瓶药...
Java与Python学习通法(1)和(2)序言和编程语言发展史怎么学
dd
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
阿里架构师花近十年时间整理出来的Java核心知识pdf(Java岗)
由于细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容! 整理了一份Java核心知识点。覆盖了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。 欢迎大家加入java学习交流社区 点击加入 可获取文中文档 小编推荐: ...
Python基础知识点梳理
python常见知识点梳理 摘要: 本文主要介绍一些平时经常会用到的python基础知识点,用于加深印象。python的详细语法介绍可以查看官方编程手册,也有一些在线网站对python语法进行了比较全面的介绍,比如菜鸟教程: python3 教程|菜鸟教程 本文主要是介绍基础语法,操作实例在另一篇博客中单独介绍: python语言介绍 python是一门解释型语言,python的设计目标: 一门...
2020年2月全国程序员工资统计,平均工资13716元
趋势 2020年2月,中国大陆程序员平均工资13716员,比上个月增加。具体趋势如图: 各主要程序员城市工资变化 城市 北京,上海,深圳,杭州,广州四地的工资最高。 city 平均工资 最低工资 中位数 最高工资 招聘人数 百分比 北京 18098 3750 15000 45000 20529 9.53% 深圳 16903 5750 15000 37500 30941 1...
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad...
为什么说程序员做外包没前途?
之前做过不到3个月的外包,2020的第一天就被释放了,2019年还剩1天,我从外包公司离职了。我就谈谈我个人的看法吧。首先我们定义一下什么是有前途 稳定的工作环境 不错的收入 能够在项目中不断提升自己的技能(ps:非技术上的认知也算) 找下家的时候能找到一份工资更高的工作 如果你目前还年轻,但高不成低不就,只有外包offer,那请往下看。 外包公司你应该...
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问