第一个:
C++封装的dll 在C#调用时遇到的一个问题如下:
C++: long xxx (char * ss);
之前C#对应的方法调用为 long xxx(String ss);
然后会遇到传过去的地址只有第一个值存在,后面改用long xxx(byte[] ss);
该用Byte数组来对接dll的Char数组 结果可行。
封装c++/c dll 时需要加上EXTERN_C 以C的形式编译函数 否则函数入口也就是函数名会乱码。
另外在这里扯一句关于OpenCV的事情,Imread(path); 里面填写的地址是可以填写相对地址的。
第二个:
关于WPF中ComboBox的使用问题:
默认ComboBox的IsEditable 属性是 false ,这时候是无法获取和设置其Text的。
这时候就需要将其设置为True,并且如果列表项很少的情况下可以参考下列的设置子项的方式来设置。
获取所选项只需要 xxxx.Text.ToString(); 即可获取到。
第三个:
Resources移植问题:
近期因为项目界面的原因重新做了界面,但是功能性的界面并不需要变更所以直接从原项目复制到新项目,但是发现Resources全部找不到了对应内容,后通过"添加现有项"先获取了Resources文件然后再在其属性中---工具一栏中 填写 PublicResXFileCodeGenerator 方可被XAML内的调用所认知。
第四个:
C# List<>的使用
之前项目中一直都是用数组,因为不可知性必须设置的很大,很占内存而且也不并便于操作,后面选用了List方式,主要用到其中的几个方法如下:
例:List<>xxx
xxx[Index] 获取其值
xxx.Remove("XXXX") 删除第一个符合条件的项
xxx.RemoveAt(Index) 删除符合条件的下标项
xxx.Add("xxx") 添加内容到列表中
List
例如:Winform中
可以选择建立一个Class类比如
class PackClass
{
public String S_ID { get; set; }
public String Data { get; set; }
public String Time { get; set; }
public String PackId { get; set; }
public String PackNum { get; set; }
public String DataZero { get; set; }
public String PhotoDate { get; set; }
public String CS { get; set; }
}
再Form1中调用
//List
List
PackClass pc = new PackClass();
pc.CS = "ccc";//..... 等等赋值
cc.Add(pc);
第五个
有关UDP使用的问题
最近做一个UDP相关的项目,因为初次所以以为只要2边的IP和Port相同即可完成通信,但是实际上私网到公网之间会有个转换协议。
比如:
本机IP 192.168.x.x -> 私网转换(NAT) 166.170.x.x ->公网
对象机IP 177.180.x.x->私网转换(NAT) 196.152.x.x->公网
如果这时候 仅用192.168.x.x 与177.180.x.x 互通是收不到东西的,所以这时候需要先通过服务器来相互握手获取私网转换之后的IP来进行收发对接。
第六个
关于关闭程序的问题
Winform:Application.Exit();
WPF:Application.Current.Shutdown();//关闭主程序
Environment.Exit(0);//强制关闭进程
第七个
近期因为要设计新手指引界面研究了下如何绘制箭头,一开始是用比较笨的办法画了几条直线绘制出来一个箭头,后通过网上看别人的样例知道了Path这个控件可以直接绘制图形和填充,主要借鉴下面这位大佬的方法
http://www.cnblogs.com/xiaokang088/archive/2011/04/30/2032924.html
有兴趣的可以去看看这个文章,主要讲解的Path.Data属性如何应用
第8个
近日因为项目需要,要给软件做一个新手指引,一开始一头雾水,因为那些绘图渲染啥的基本没碰过,并且客户对于几张图片式的介绍并不满意,想要一个动态的操作感,后通过对Canvas的了解,而有了初步的设计。
大致步骤是这样的:
Canvas 作为页面的第一母容器 里面可以放你之前的程序架构设计(假定程序已经完成了基本架构设计了),然后通过设置其ZipIndex 的级别 ,也就是优先级别来决定上下层的关系,这时就萌生了一个想法,可以把指引的方式(比如说最简单的红色箭头+描述语言的方式)作为高层放到原先的程序上去,这样的话就有种最初感觉的指引的感受了。
其中有一个重要的事情就是 Canvas.Left Canvas.Top 是属于同一级的 Canvas.Right Canvas.Bottom 是第二级的 也就是说Left/Top存在的情况下 是优先使用的,这时候如果是通过代码修改设置的话 。那就需要使用ClearValue(Canvas.Left/Top) 来保证你对右和下的设置的正确可用性。
第9个
近期因为项目需要,要再其中加一个算是绘制图形和测量的插件界面,主体思路是 MouseLeftDown 里面获取Shape的初始位置 然后添加到Canvas上去,后面通过MouseMove里面不断的移动鼠标位置来变化这个Shape的属性,但在此处会报出 对象未实例化 的问题,后经查明,是因为 MouseMove触发条件并不是必须鼠标按下,而是抬起来的时候也一直在触发的,所以导致了这个问题,后修复了。
2018.1.22 后面因为还需要对画面进行放大缩小等操作,因此正确的结构应当是所有绘制内容全部放入列表中,生成一个Canvas在其中绘制所有的图形然后将其等比缩放之后再1:1的还原到真实呈现的那层Canvas中去,这样可以保证不会绘制图形的大小不是跟着Canvas的变化也毫无变化。
No.10
关于C# 通过SMTP方式发送邮件,实际上不光需要地址还要对应SMTP服务的专属密码 比如腾讯的即是16位。另外还需要通过SSL的连接方式来以发送端的SMTP服务器产生连接。
2018/2/27
关于Sliver的初步使用
注意在这里 设置Max 和Min 是没问题的 但是一旦涉及到对 Value的设置 就必须加一个属性
IsSelectionRangeEnabled="True"
否则编译就会出错,大致是因为绑定值约束问题。
2018/3/16
C# 关于delegate用法的小应用
Camera.cs
public MainWindow WM
{
get;
set;
}WM.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new MainWindow.DelegateRef(WM.MovePhoto));
MainWindow.xaml.cs
public delegate void DelegateRef();
public void MovePhoto();
2018/4/4
C#外部调用exe(或默认打开软件)的简单应用方式---Process
System.Diagnostics.Process.Start(filePath);
2018/7/5
Win7 sp1 使用Console.writeLine出现进程死掉的原因
因为ASCILL码的7 是代表了系统Bell的状态,频繁输出Console.writeLine(7);会导致一直调用系统的时钟导致假死
此问题在Win10 /Win8 未发现(发现于串口通讯项目)
2018/7/24
对应在Canvas中绘制图形,当底图是一张图片的时候,比较适合的办法是预设好相关的长宽比例之后,放大缩小都应该是成倍数的,这样比较容易实现。
实现方式可以通过动态更改对应Canvas和Image的大小来实现图片的尺寸变化效果。
2019/05/06
C#中 从相机中读取出来的 Byte[] 并不能直接转 BitmapImage ,因为没有图片格式,需要先转换出Bitmap再转换BitmapImage.