PRivate void treeView1_MouseDown(object sender, MouseEventArgs e)
...{
if (e.Button == MouseButtons.Right)//判断你点的是不是右键
...{
Point ClickPoint = new Point(e.X, e.Y);
TreeNode CurrentNode = treeView1.GetNodeAt(ClickPoint);
if (CurrentNode != null)//判断你点的是不是一个节点
...{
switch (CurrentNode.Name)//根据不同节点显示不同的右键菜单,当然你可以让它显示一样的菜单
...{
case "errorUrl":
CurrentNode.ContextMenuStrip = contextMenuStripErrorUrl;
break;
}
treeView1.SelectedNode = CurrentNode;//选中这个节点
}
}
}
-
资料引用:www.knowsky/534192.html
if (deptNo != "0")
{
sql += int.Parse(SystemParameter.GetValueByType("QueryOnlySelfNode")) == 1 ? " and DeptNo=@DeptNo" : " and @DeptNo=substring(DeptNo,1,len(@DeptNo))";
splist.AddAParameter("@DeptNo", SqlDbType.VarChar, 12, deptNo);
}
if (apartmentNo != "0")
{
sql += int.Parse(SystemParameter.GetValueByType("QueryOnlySelfNode")) == 1 ? " and ApartmentNo=@ApartmentNo" : " and @ApartmentNo=substring(ApartmentNo,1,len(@ApartmentNo))";
splist.AddAParameter("@ApartmentNo", SqlDbType.VarChar, 16, apartmentNo);
}
查询部门下的用户信息:支持仅查询该部门的用户信息 还是 查询该部门和子部门的用户信息
请在系统设置SystemParameter中设置
WCF:Windows Communication Foundation 窗体通信基础
//指针转化为结构的代码 Test是个结构体
IntPtr p13 = ReadStruct();
Test test13 = (Test)Marshal.PtrToStructure(p13,typeof(Test));
结构中的数组 C++: int a[5]; (C++ wchar wide字符 即unicode字符)
C#声明:
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public int[] a;
C#使用C++结构体时 结构的上面加入属性[StructLayout(LayoutKind.Sequential)]
C#方法和类型使用Pascal命名 成员变量和局部变量使用camel命名 Winform使用Hungarian命名
c++经常使用匈牙利命名,如member variable 使用m_
结构转化为指针的方法:
//Marshal.AllocHGlobal 和WIN32 API, Alloc功能基本一样,
//这个方法不要多用,可能造成内存泄露。
//记住使用Marshal.FreeHGlobal函数释放申请的内存
IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Test)));
Marshal.StructureToPtr(_test,p,false);
C#中一维数组int[] 二维数组int[,] 交错数组int[][] 三维数组int[,,]
int[] dimensionOne=new int[5];
int[,] dimensionTwo=new int[3,4];//3行4列
int[][] dimensionInterlace=new int[3][];//由3个int[]元素组成的数组 每个元素(1个
数组)的数组长度可以是不确定的
int[,,] dimensionThree=new int[2,3,4];
为了定义一个Unicode数据类型,通常使用WCHAR(或wchar_t)来定义一个Unicode字符变量或者字符数组,使用LPWSTR定义一个指向Unicode字符串的指针(w前缀意思为wide 就是unicode)
为了使字符和字符串可以适用于Unicode编码系统,也可以适用于ANSI编码的操作系统,可以将字符或字符串定义为双模式的。通常采用函数TEXT()或_T()宏,它们被定义于tchar.h头文件中。例如,TEXT("hello“)表示一个双模式的字符串,如果编译器发现定义_UNICODE预处理器符号那么TEXT("hello“)就被转换为L"Hello",否则被转换为"Hello".
char *str = { “my first string” }; // ansi字符串
wchar_t *wstr = { L”my first string” }; // unicode字符串
size_t len = strlen(str); // ansi字符串求长度
size_t wlen = wcslen(wstr); // unicode字符串求长度
printf(“%s %ws %d %d”,str,wstr,len,wlen); // 打印两种字符串
当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件一般采用三种方式来决定文本的字符集和编码:
检测文件头标识,提示用户选择,根据一定的规则猜测
最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,
ANSI:
全称是:American National Standard Institute
中文译名: 美国国家标准协会(gb2312、big5、jis都是ANSI编码的子集)
为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。
不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。
BSTR是“Basic STRing”的简称,微软在COM/OLE中定义的标准字符串数据类型。一种通用的字符串类型,可以很容易的匹配到不同编程语言 C# CharSet.Auto
☆LPCTSTR:long pointer constant Text宏
L表示long指针 long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义
P表示这是一个指针
C表示是一个常量
T表示在Win32环境中, 有一个_T宏
STR表示这个变量是一个字符串
☆LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型。LPSTR被定义成是一个指向以NULL(‘\0’)结尾的32位ANSI字符数组指针,而LP
WSTR是一个指向以NULL结尾的64位双字节字符数组指针。CString与LPSTR转换。 'L'代表Long,'P'代表了pointer(即为指针的意思),'STR'意为String的意思。
☆LPCSTR是Win32和VC++所使用的一种字符串数据类型。LPCSTR被定义成是一个指向以NULL(‘\0’)结尾的常量字符的指针。 L表示long指针 P表示这是一个指针 C表示是一个常量 STR表示这个变量是一个字符串
T表示_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。(前缀T表示自动兼容性)
☆LPTSTR与char*等价,表示普通字符/字符串变量,指向字符/字符串的指针。 LP:长指针(long pointer)。 T:win32环境中有一个_T宏,用来标识字符是否采用Unicode编码(两字节表示一个字符),若程序中定义了Unicode,该字符/字符串被作为Unicode字符串,否则就是标准的ANSI(单字节表示一个字符)字符串。 STR:表示这个变量是一个字符串。
在C++程序中
byte和char都占用一个字节,取值范围不同,就像是 unsigned int 和 int的区别一样。
byte和char的取值范围分别是:
byte 0 -- 255 (byte就是unsigned char)
char -128 - 127
//求整数数组中两两之差的绝对值最小的值,只需求出最小差值即可
在写C#TCP通信程序时,发送数据时,只能发送byte数组,处理起来比较麻烦不说,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把byte数组转换为结构体,要在C#中发送结构体,可以按以下方法实现:
1)定义结构体:
//命名空间
using System.Runtime.InteropServices;
//注意这个属性不能少
[StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]
struct TestStruct
{
public int c;
//字符串,SizeConst为字符串的最大长度
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string str;
//int数组,SizeConst表示数组的个数,在转换成
//byte数组前必须先初始化数组,再使用,初始化
//的数组长度必须和SizeConst一致,例test = new int[6];
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public int[] test;
}
2)结构体转byte数组:
/**//// <summary>
/// 结构体转byte数组
/// </summary>
/// <param name="structObj">要转换的结构体</param>
/// <returns>转换后的byte数组</returns>
public static byte[] StructToBytes(object structObj)
{
//
得到结构体的大小
int size = Marshal.SizeOf(structObj);
//创建byte数组
byte[] bytes = new byte[size];
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(structObj, structPtr, false);
//从内存空间拷到byte数组
Marshal.Copy(structPtr, bytes, 0, size);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
/
/返回byte数组
return bytes;
}
3)byte数组转结构体:
/**//// <summary>
/// byte数组转结构体
unicode所有字符/// </summary>
/// <param name="bytes">byte数组</param>
/// <param name="type">结构体类型</param>
/// <returns>转换后的结构体</returns>
public static object BytesToStruct(byte[] bytes,Type type)
{
//得到结构体的大小
int size = Marshal.SizeOf(type);
//byte数组长度小于结构体的大小
if (size > bytes.Length)
{
//返回空
return null;
}
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
/
/将byte数组拷到分配好的内存空间
Marshal.Copy(bytes,0,structPtr,size);
//将内存空间转换为目标结构体
object obj = Marshal.PtrToStructure(structPtr, type);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回结构体
return obj;
}
C++声明前缀
IDC_ Control //有时可简写为ID_
IDD_ Dialog
IDS_ String
IDM_ Menu
IDR_ Resource
IDB_ Bitmap
CDC:class of device-context objects 设备上下文类
HDC:Handle for Device Context 设备上下文句柄
设备上下文(Device Context)是一种包含有关某个设备(如显示器或打印机)的绘制属性信息的 Windows 数据结构。所有绘制调用都通过设备上下文对象进行,这些对象封装了用于绘制线条、形状和文本的 Windows API。设备上下文允许在 Windows中进行与设备无关的绘制。设备上下文可用于绘制到屏幕、打印机或者图元文件。
MFC中获得各个类的指针 句柄 ID总结:
id->句柄(由ID得到句柄)-----------hWnd = ::GetDlgItem(hParentWnd,id);
id->指针(由ID得到指针)-----------CWnd::GetDlgItem();
句柄->id(由句柄得到ID)-----------id = GetWindowLong(hWnd,GWL_ID);
句柄->指针(由句柄得到指针)--------CWnd *pWnd=CWnd::FromHandle(hWnd);
指针->ID(由指针得到ID)----------id = GetWindowLong(pWnd->GetSafeHwnd,GWL_ID);
GetDlgCtrlID();
指针->句柄(由 指针得到句柄)--------hWnd=cWnd.GetSafe
Handle() or mywnd->m_hWnd;
C#线程同步:只有先买电影票 才能看电影 (有先后顺序) 临界区简称为lock Monitor ManualResetHandle WaitHandle Semaphore信号量Mutex
C#线程异步:我一边看电影 一边吃爆米花 (同时进行,完成先后不能确定)
Produce Consume
在实际应用中,生产者往往代表负责从某处简单接收资源的线程,比如来自网络的指令、从服务器返回的查询等等;而消费者线程需要负责解析指令、解析返回的查询结果,然后存储到本地数据库、文件或者呈现给用户等等。消费者线程的任务往往更复杂,执行时间更长,为了提高程序的整体执行效率,消费者线程往往会多于生产者线程,可能3对1,也可能5对2
C#提供lock关键字实现临界区
lock实现临界区是通过“对象锁”的方式,注意是“对象”,所以你只能锁定一个引用类型而不能锁定一个值类型
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论