在制作界面的过程中,会出现各种各样的小问题。没问题,一个个解决就好啦。对咯,阿里巴巴矢量库是首选小照片(^U^)ノ~YO。哈哈哈,谁让我是颜控。
1.希望做到界面嵌套的结果。我的想法是在父布局去添加一个panel,panel这个容器可以添加新的form,但是新的问题出现了,子窗体不随着父窗体大小一起改动。因此做了如下修改
Form5 frm = new Form5();
frm.MaximizeBox = true;
frm.TopLevel = false;
frm.FormBorderStyle = FormBorderStyle.None;
frm.BackColor = this.panel2.BackColor;
frm.Dock = this.panel2.Dock;
this.panel2.Controls.Clear();
this.panel2.Controls.Add(frm);
frm.Show();
2.重写form 首先去掉form的边边框框 属性里面FormBorderStyle修改为none
增加一个容器,放上自己喜欢的按钮去做监听事件。
放大监听事件
private void max_click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
}
缩小监听事件
private void min_click(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Maximized)
{
this.WindowState = FormWindowState.Normal;
}
else
{
this.WindowState = FormWindowState.Minimized;
}
}
关闭监听事件
private void close_click(object sender, EventArgs e)
{
this.Close()
; }
这三个小按钮怎么能够一直保持在窗体右侧呢?
哎,怪我对属性了解太少。现在介绍两个:
具体作用详见:http://blog.sina.com.cn/s/blog_7f7cd96601013trt.html
一个是dock 一个是Anchor
Anchor属性
正如名称暗示的那样,这个属性迫使控件将其自身定位在父窗体或父控件中的某个相对或绝对位置。这个属性有四个可以开启或关闭的值:
Top——表示控件中与父窗体(或父控件)相关的顶部应该保持固定。
Bottom——表示控件中与父窗体(或父控件)相关的底边应该保持固定。
Left——表示控件中与父窗体(或父控件)相关的左边缘应该保持固定。
Right——表示控件中与父窗体(或父控件)相关的右边缘应该保持固定。
Dock属性
Dock属性迫使控件紧贴父窗体(或控件)的某个边缘。虽然Anchor属性也可以实现这一点,但是dock属性使得你能够在父窗体中让子窗体可以在上方(或旁边)互相“堆叠”。如果某个子窗体改变了大小,其它停驻在它旁边的子窗体也会随之改变。
和Anchor属性不同的是,你可以将Dock属性设置为一个单值。有效值如下所示:
Top——迫使控件位于父窗体(或控件)的顶部。如果有同一个父窗体的其它子控件也被设置为停驻在顶部的话,那么控件将在彼此上方相互堆叠。
Bottom——迫使控件位于父窗体(或控件)的底部。如果有同一个父窗体的其它子控件也被设置为停驻在底部的话,那么控件将在彼此上方相互堆叠。
Left——迫使控件位于父窗体(或控件)的左边。如果有同一个父窗体的其它子控件也被设置为停驻在左边的话,那么控件将在彼此旁边相互堆叠。
Right——迫使控件位于父窗体(或控件)的右边。如果有同一个父窗体的其它子控件也被设置为停驻在右边的话,那么控件将在彼此旁边相互堆叠。
Fill——迫使控件位于父窗体(或控件)的上方。如果有同一个父窗体的其它子控件也被设置为停驻在上方的话,那么控件将在彼此上方相互堆叠。
None——表示控件将会正常运转。
之后你可能会发现你拖动窗体的时候不会正常移动了,这样很影响用户体验。怎么办呢?
也就是c# 实现用鼠标拖动没有标题栏的窗口
https://blog.csdn.net/soft_123456/article/details/40780157
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd,
int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
// 然后再在窗体的Form_MouseDown事件下添加如下代码
private void Form_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
//还需要注意的是如要使用DllImportAttribute属性需要引入相应的名称空间 即 using System.Runtime.InteropServices; 这样就实现了窗体任意拖动
3.好看的标题栏可以用控件toolstrip,上面加入toolstripbutton
4.小菜鸟一开始还不知道怎么加载动态库呢。
没关系,总结一下就会了。
先把dll放在bin/debug下(Images也可以存放)
标题栏里有添加引用,选择最下面的浏览存放在文件夹里的dll文件就可以了
5.关于TreeView的一些小性质。
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
int index = e.Node.Index+33;//获取当前node的索引值从0开始
//。。。。。。
if (e.Node.Text.Trim() == "1-画面") //如果当前节点的文本为“1—画面”
{
status = 1;
if(k_1==0)
{
this.panel8.Controls.Clear();
u3 = new UserControl3();
this.panel8.Controls.Add(u3);
}
if (k_1 == 1)
{
u3 = new UserControl3();
this.panel8.Controls.Clear();
this.panel8.Controls.Add(u3);
u3.init(s1);
}
}
6.海康主预览学习
//注册设备信息,返回使用用户id
string DVRIPAddress = "192.168.3.9"; //设备IP地址或者域名
Int16 DVRPortNumber = Int16.Parse("8000");//设备服务端口号
string DVRUserName = "test";//设备登录用户名
string DVRPassword = "test12345";//设备登录密ma
CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V30();
m_lUserID = CHCNetSDK.NET_DVR_Login_V30(DVRIPAddress, DVRPortNumber, DVRUserName, DVRPassword, ref DeviceInfo);
if (m_lUserID < 0)
{
iLastErr = CHCNetSDK.NET_DVR_GetLastError();// 返回最后操作的错误码。
str = "NET_DVR_Login_V30 failed, error code= " + iLastErr; //登录失败,输出错误号
MessageBox.Show(str);
return;
}
else
{
//登录成功
//MessageBox.Show("Login Success!");
}
//注册视频流信息,返回结果集
lpPreviewInfo1.hPlayWnd = pictureBox1.Handle;//预览窗口
lpPreviewInfo1.lChannel = Int16.Parse(s);//预te览的设备通道
lpPreviewInfo1.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推
lpPreviewInfo1.dwLinkMode = 0;//连接方式:0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP
lpPreviewInfo1.bBlocked = true; //0- 非阻塞取流,1- 阻塞取流
lpPreviewInfo1.dwDisplayBufNum = 15; //播放库播放缓冲区最大缓冲帧数
IntPtr pUser1 = new IntPtr();
m_lRealHandle1 = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo1, null/*RealData*/, pUser1);
怎么理解Handle,句柄信息呢?
//m_lRealHandle当前设备状态 -1 表示失败,其他值作为 NET_DVR_StopRealPlay 等函数的句柄参数 句柄(Handle)就是对象生成前系统分配的一个ID。既然是系统分配的ID,那肯定每个都不同。
//可以这样理解,国家(理解为系统),国家给每一个人都分配了一个身份证(理解为Handle),有了身份证,你能办理银行业务,你能签证,你能移民,你能享有中国公民因该有的服务。但是你没有,你就是黑户,什么都不能做。
7.海康网络流量上限的问题
要做一个多视频的窗口,每个窗口视频量都是不一样的,因此在打开一个主窗口(当前需要播放的),需要清理非主窗口的视频流,不然会出现网络流量上限的问题,故选择调用停止非主窗口的视频流。
public void stopplay()
{
if(m_lRealHandle1!=0)
if (!CHCNetSDK.NET_DVR_StopRealPlay(m_lRealHandle1))
{
iLastErr = CHCNetSDK.NET_DVR_GetLastError();
str = "NET_DVR_StopRealPlay failed, error code= " + iLastErr;
MessageBox.Show(str);
return;
}
m_lRealHandle1 = 0;
}
8.c#json数据c# {“data”:{“name”:”liming”}怎么封装json数据?
相当于类中类的格式
首先定义一个类:
class Datajson
{
public string Name { get; set; }
public int Age { get; set; }
public Datajson Child { get; set; }
}
Datajson dt = new Datajson();
dt.Age = 14;
dt.Name = "asa";
Datajson dt1 = new Datajson();
dt1.Age = 14;
dt1.Name = "asa";
dt.Child = dt1;
string imfo = JsonConvert.SerializeObject(dt).ToString();
Console.WriteLine(imfo);
//结果:{"Name":"asa","Age":14,"Child":{"Name":"asa","Age":14,"Child":null}}
这就是我想要的数据格式效果,可以根据需求自己改
以后遇到再慢慢补充,慢慢来。