LabwindowsCVI鼠标右键实现菜单功能
VC+++在ListView中添加右键菜单
使用弹出式菜单(PopMenu)弹出式菜单(PopMenu)大家都熟悉,在WIN98的桌面上单击鼠标右键弹出的菜单就是弹出式菜单。
通常情况下,弹出式菜单在鼠标右键单击时弹出,当然,也能够根据需要随时弹出。
在VC++5的MFC中,管理菜单的类叫CMenu。
下面我向大家介绍建立一个弹出式菜单的基本方法。
一、在资源编辑器中建立一个菜单资源新建一个菜单资源,比如把菜单的ID号为IDC_POPMENU。
此菜单有一项两层,即有一个可弹出的菜单项,而此菜单项的弹出内容即为将要建立的弹出式菜单的内容。
至于每一个菜单项的消息映射,和一般的菜单相同。
二、使用CMenu类对象CMenu类的成员函数较多,但建立弹出式菜单只需用到其中几个成员函数。
1、LoadMenu函数功能:从应用程式的可执行文档中加载菜单资源原型:BOOL LoadMenu( UINT nIDResource );其中nIDResource是菜单资源的ID号,这里用的是刚建立的IDC_POPMENU。
2、GetSubMenu函数功能:此函数用于得到子菜单的指针。
原型:CMenu* GetSubMenu( int nPos ) const;nPos为层数,0为第一层子菜单……以此类推。
由于我们需要的是“可弹出项”的第一层子菜单,因此用GetSubMenu(0)来得到第一层子菜单的类指针。
3、TrackPopupMenu函数功能:在指定位置显示弹出菜单,并跟踪所选择的项原型:BOOL TrackPopupMenu( UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect = NULL );其中:nFlags为屏幕坐标属性和鼠标坐标属性屏幕坐标属性:TPM_CENTERALIGN 横向将菜单以x居中TPM_LEFTALIGN 横向将菜单以x左对齐TPM_RIGHTALIGN 横向将菜单以x右对齐鼠标按键属性(只在响应WM_CONTEXTMENU消息时有效):TPM_LEFTBUTTON 连续按? 右键不会连续弹出菜单,鼠标右键不可用于选定菜单项TPM_RIGHTBUTTON 连续按鼠标右键会连续弹出菜单,鼠标右键可用于选定菜单项x,y均为屏幕坐标lpRect 菜单所占的区域。
在winform界面实现右键菜单功能
在winform界⾯实现右键菜单功能没接触之前,感觉模式⽐较困难,其实不然,其实只有短短的⼏部就可以实现呢!⼀、⾸先在页⾯新建contextMenuStrip 菜单项,然后再菜单⾥⾯添加你想要操作的步骤;⼆、就是补⾜⿏标右键事件;protected override void OnMouseUp(MouseEventArgs e){base.OnMouseUp(e);if (e.Button == MouseButtons.Right){contextMenuStrip.Show(this,e.Location);}}这样简单的⼏步就实现呢!当然这是简单的菜单项,如果想让你的菜单更加丰满炫丽,就要为菜单项添加样式呢!这⾥我也将某个菜单的样式代码附上,供⼤家参考!public class ToolStripRendererEx : ToolStripRenderer{private CaptureImageToolColorTable _colorTable;private static readonly int OffsetMargin = 24;private const string MenuLogoString = "";public ToolStripRendererEx() : base(){}public ToolStripRendererEx(CaptureImageToolColorTable colorTable): base(){_colorTable = colorTable;}protected virtual CaptureImageToolColorTable ColorTable{get{if (_colorTable == null){_colorTable = new CaptureImageToolColorTable();}return _colorTable;}}protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e){Color baseColor = ColorTable.BackColorNormal;ToolStrip toolStrip = e.ToolStrip;Graphics g = e.Graphics;g.SmoothingMode = SmoothingMode.AntiAlias;if (toolStrip is ToolStripDropDown){RegionHelper.CreateRegion(e.ToolStrip, e.AffectedBounds);Rectangle rect = e.AffectedBounds;using (GraphicsPath path = GraphicsPathHelper.CreatePath(rect, 8, RoundStyle.All, false)){using (SolidBrush brush = new SolidBrush(ColorTable.BackColorNormal)){g.FillPath(brush, path);}using (Pen pen = new Pen(ColorTable.BorderColor)){g.DrawPath(pen, path);using (GraphicsPath innerPath = GraphicsPathHelper.CreatePath(rect, 8, RoundStyle.All, true)){g.DrawPath(pen, innerPath);}}}}else{LinearGradientMode mode =e.ToolStrip.Orientation == Orientation.Horizontal ?LinearGradientMode.Vertical : LinearGradientMode.Horizontal;RenderBackgroundInternal(g,e.AffectedBounds,ColorTable.BackColorHover,ColorTable.BorderColor,ColorTable.BackColorNormal,RoundStyle.All,false,true,mode);}}protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e){ToolStripButton item = e.Item as ToolStripButton;if (item != null){LinearGradientMode mode =e.ToolStrip.Orientation == Orientation.Horizontal ?LinearGradientMode.Vertical : LinearGradientMode.Horizontal;Graphics g = e.Graphics;g.SmoothingMode = SmoothingMode.AntiAlias;Rectangle bounds = new Rectangle(Point.Empty, item.Size);if (item.BackgroundImage != null){Rectangle clipRect = item.Selected ? item.ContentRectangle : bounds; ControlPaintEx.DrawBackgroundImage(g,item.BackgroundImage,ColorTable.BackColorNormal,item.BackgroundImageLayout,bounds,clipRect);}if (item.CheckState == CheckState.Unchecked){if (item.Selected){Color color = ColorTable.BackColorHover;if (item.Pressed){color = ColorTable.BackColorPressed;}RenderBackgroundInternal(g,bounds,color,ColorTable.BorderColor,ColorTable.BackColorNormal,RoundStyle.All,true,true,mode);return;}else{if (e.ToolStrip is ToolStripOverflow){using (Brush brush = new SolidBrush(ColorTable.BackColorNormal)) {g.FillRectangle(brush, bounds);}return;}}}else{Color color = ControlPaint.Light(ColorTable.BackColorHover);if (item.Selected){color = ColorTable.BackColorHover;}if (item.Pressed){color = ColorTable.BackColorPressed;}RenderBackgroundInternal(e.Graphics,bounds,color,ColorTable.BorderColor,ColorTable.BackColorNormal,RoundStyle.All,true,true,mode);return;}}base.OnRenderButtonBackground(e);}protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e){Rectangle rect = e.Item.ContentRectangle;if (e.ToolStrip is ToolStripDropDown){if (e.Item.RightToLeft == RightToLeft.Yes){//rect.X -= OffsetMargin + 4;}else{rect.X += OffsetMargin + 4;}rect.Width -= OffsetMargin + 8;}RenderSeparatorLine(e.Graphics,rect,ColorTable.BackColorPressed,ColorTable.BackColorNormal,SystemColors.ControlLightLight,e.Vertical);}protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e){if (!e.Item.Enabled){return;}Graphics g = e.Graphics;Rectangle rect = new Rectangle(Point.Empty, e.Item.Size);g.SmoothingMode = SmoothingMode.AntiAlias;if (e.Item.RightToLeft == RightToLeft.Yes){rect.X += 4;}else{rect.X += OffsetMargin + 4;}rect.Width -= OffsetMargin + 8;rect.Height--;if (e.Item.Selected){RenderBackgroundInternal(g,rect,ColorTable.BackColorHover,ColorTable.BorderColor,ColorTable.BackColorNormal,RoundStyle.All,true,true,LinearGradientMode.Vertical);}else{base.OnRenderMenuItemBackground(e);}}protected override void OnRenderImageMargin(ToolStripRenderEventArgs e){if (e.ToolStrip is ToolStripDropDownMenu){Rectangle rect = e.AffectedBounds;Graphics g = e.Graphics;rect.Width = OffsetMargin;if (e.ToolStrip.RightToLeft == RightToLeft.Yes){rect.X -= 2;}else{rect.X += 2;}rect.Y += 1;rect.Height -= 2;g.SmoothingMode = SmoothingMode.AntiAlias;using (LinearGradientBrush brush = new LinearGradientBrush(rect,ColorTable.BackColorHover,Color.White,90f)){Blend blend = new Blend();blend.Positions = new float[] { 0f, .2f, 1f };blend.Factors = new float[] { 0f, 0.1f, .9f };brush.Blend = blend;rect.Y += 1;rect.Height -= 2;using (GraphicsPath path =GraphicsPathHelper.CreatePath(rect, 8, RoundStyle.All, false)) {g.FillPath(brush, path);}}g.TextRenderingHint = TextRenderingHint.AntiAlias;StringFormat sf = new StringFormat(StringFormatFlags.NoWrap);Font font = new Font(e.ToolStrip.Font.FontFamily, 11, FontStyle.Bold);sf.Alignment = StringAlignment.Near;sf.LineAlignment = StringAlignment.Center;sf.Trimming = StringTrimming.EllipsisCharacter;g.TranslateTransform(rect.X, rect.Bottom);g.RotateTransform(270f);if (!string.IsNullOrEmpty(MenuLogoString)){Rectangle newRect = new Rectangle(rect.X, rect.Y, rect.Height, rect.Width);using (Brush brush = new SolidBrush(ColorTable.ForeColor)){g.DrawString(MenuLogoString,font,brush,newRect,sf);}}g.ResetTransform();return;}base.OnRenderImageMargin(e);}protected override void OnRenderItemImage(ToolStripItemImageRenderEventArgs e){Graphics g = e.Graphics;g.InterpolationMode = InterpolationMode.HighQualityBilinear;if (e.Item is ToolStripMenuItem){ToolStripMenuItem item = (ToolStripMenuItem)e.Item;if (item.Checked){return;}Rectangle rect = e.ImageRectangle;if (e.Item.RightToLeft == RightToLeft.Yes){rect.X -= OffsetMargin + 2;}else{rect.X += OffsetMargin + 2;}ToolStripItemImageRenderEventArgs ne =new ToolStripItemImageRenderEventArgs(e.Graphics, e.Item, e.Image, rect);base.OnRenderItemImage(ne);return;}base.OnRenderItemImage(e);}protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e){e.TextColor = ColorTable.ForeColor;if (!(e.ToolStrip is MenuStrip) && (e.Item is ToolStripMenuItem)) {Rectangle rect = e.TextRectangle;if (e.Item.RightToLeft == RightToLeft.Yes){rect.X -= 16;}else{rect.X += 16;}e.TextRectangle = rect;}base.OnRenderItemText(e);}internal void RenderBackgroundInternal(Graphics g,Rectangle rect,Color baseColor,Color borderColor,Color innerBorderColor,RoundStyle style,bool drawBorder,bool drawGlass,LinearGradientMode mode){RenderBackgroundInternal(g,rect,baseColor,borderColor,innerBorderColor,style,8,drawBorder,drawGlass,mode);}internal void RenderBackgroundInternal(Graphics g,Rectangle rect,Color baseColor,Color borderColor,Color innerBorderColor,RoundStyle style,int roundWidth,bool drawBorder,bool drawGlass,LinearGradientMode mode){RenderBackgroundInternal(g,rect,baseColor,borderColor,innerBorderColor,style,8,0.45f,drawBorder,drawGlass,mode);}internal void RenderBackgroundInternal(Graphics g,Rectangle rect,Color baseColor,Color borderColor,Color innerBorderColor,RoundStyle style,int roundWidth,float basePosition,bool drawBorder,bool drawGlass,LinearGradientMode mode){if (drawBorder){rect.Width--;rect.Height--;}using (LinearGradientBrush brush = new LinearGradientBrush(rect, Color.Transparent, Color.Transparent, mode)){Color[] colors = new Color[4];colors[0] = GetColor(baseColor, 0, 35, 24, 9);colors[1] = GetColor(baseColor, 0, 13, 8, 3);colors[2] = baseColor;colors[3] = GetColor(baseColor, 0, 68, 69, 54);ColorBlend blend = new ColorBlend();blend.Positions = new float[] { 0.0f, basePosition, basePosition + 0.05f, 1.0f }; blend.Colors = colors;brush.InterpolationColors = blend;if (style != RoundStyle.None){using (GraphicsPath path =GraphicsPathHelper.CreatePath(rect, roundWidth, style, false)){g.FillPath(brush, path);}if (baseColor.A > 80){Rectangle rectTop = rect;if (mode == LinearGradientMode.Vertical){rectTop.Height = (int)(rectTop.Height * basePosition);}else{rectTop.Width = (int)(rect.Width * basePosition);}using (GraphicsPath pathTop = GraphicsPathHelper.CreatePath(rectTop, roundWidth, RoundStyle.Top, false)){using (SolidBrush brushAlpha =new SolidBrush(Color.FromArgb(80, 255, 255, 255))){g.FillPath(brushAlpha, pathTop);}}}if (drawGlass){RectangleF glassRect = rect;if (mode == LinearGradientMode.Vertical){glassRect.Y = rect.Y + rect.Height * basePosition;glassRect.Height = (rect.Height - rect.Height * basePosition) * 2; }else{glassRect.X = rect.X + rect.Width * basePosition;glassRect.Width = (rect.Width - rect.Width * basePosition) * 2; }ControlPaintEx.DrawGlass(g, glassRect, 170, 0);}if (drawBorder){using (GraphicsPath path =GraphicsPathHelper.CreatePath(rect, roundWidth, style, false)) {using (Pen pen = new Pen(borderColor)){g.DrawPath(pen, path);}}rect.Inflate(-1, -1);using (GraphicsPath path =GraphicsPathHelper.CreatePath(rect, roundWidth, style, false)) {using (Pen pen = new Pen(innerBorderColor)){g.DrawPath(pen, path);}}}}else{g.FillRectangle(brush, rect);if (baseColor.A > 80){Rectangle rectTop = rect;if (mode == LinearGradientMode.Vertical){rectTop.Height = (int)(rectTop.Height * basePosition);}else{rectTop.Width = (int)(rect.Width * basePosition);}using (SolidBrush brushAlpha =new SolidBrush(Color.FromArgb(80, 255, 255, 255))){g.FillRectangle(brushAlpha, rectTop);}}if (drawGlass){RectangleF glassRect = rect;if (mode == LinearGradientMode.Vertical){glassRect.Y = rect.Y + rect.Height * basePosition;glassRect.Height = (rect.Height - rect.Height * basePosition) * 2; }else{glassRect.X = rect.X + rect.Width * basePosition;glassRect.Width = (rect.Width - rect.Width * basePosition) * 2; }ControlPaintEx.DrawGlass(g, glassRect, 200, 0);}if (drawBorder){using (Pen pen = new Pen(borderColor)){g.DrawRectangle(pen, rect);}rect.Inflate(-1, -1);using (Pen pen = new Pen(innerBorderColor)){g.DrawRectangle(pen, rect);}}}}}internal void RenderSeparatorLine(Graphics g,Rectangle rect,Color baseColor,Color backColor,Color shadowColor,bool vertical){float angle;if (vertical){angle = 90F;}else{angle = 180F;}using (LinearGradientBrush brush = new LinearGradientBrush(rect,baseColor,backColor,angle)){Blend blend = new Blend();blend.Positions = new float[] { 0f, .3f, .5f, .7f, 1f };blend.Factors = new float[] { 1f, .3f, 0f, .3f, 1f };brush.Blend = blend;using (Pen pen = new Pen(brush)){if (vertical){g.DrawLine(pen, rect.X, rect.Y, rect.X, rect.Bottom);}else{g.DrawLine(pen, rect.X, rect.Y, rect.Right, rect.Y);}brush.LinearColors = new Color[] {shadowColor, backColor };pen.Brush = brush;if (vertical){g.DrawLine(pen, rect.X + 1, rect.Y, rect.X + 1, rect.Bottom);}else{g.DrawLine(pen, rect.X, rect.Y + 1, rect.Right, rect.Y + 1);}}}}private Color GetColor(Color colorBase, int a, int r, int g, int b){int a0 = colorBase.A;int r0 = colorBase.R;int g0 = colorBase.G;int b0 = colorBase.B;if (a + a0 > 255) { a = 255; } else { a = Math.Max(0, a + a0); }if (r + r0 > 255) { r = 255; } else { r = Math.Max(0, r + r0); }if (g + g0 > 255) { g = 255; } else { g = Math.Max(0, g + g0); }if (b + b0 > 255) { b = 255; } else { b = Math.Max(0, b + b0); }return Color.FromArgb(a, r, g, b);}}public class CaptureImageToolColorTable{private static readonly Color _borderColor = Color.FromArgb(65, 173, 236);private static readonly Color _backColorNormal = Color.FromArgb(229, 243, 251);private static readonly Color _backColorHover = Color.FromArgb(65, 173, 236);private static readonly Color _backColorPressed = Color.FromArgb(24, 142, 206);private static readonly Color _foreColor = Color.FromArgb(12, 83, 124);public CaptureImageToolColorTable() { }public virtual Color BorderColor{get { return _borderColor; }}public virtual Color BackColorNormal {get { return _backColorNormal; } }public virtual Color BackColorHover {get { return _backColorHover; }}public virtual Color BackColorPressed {get { return _backColorPressed; } }public virtual Color ForeColor{get { return _foreColor; }}}。
VC对话框添加右键菜单
VC对话框添加右键菜单VC对话框添加右键菜单(2008-12-21 10:15:24)标签:it 分类:VC++学习实例及资料VC对话框添加右键菜单2006-12-05 22:34一.在资源创建对话框中选择Menu项并单击New按钮自动创建ID为IDR_MENU1的菜单,为该菜单添加一个菜单项File,并在File 菜单项下添加Cut,Copy和Paste三个菜单(为这三个菜单添加消息响应代码)如:void CExampleDlg::OnCut(){AfxMessageBox("Cut"); //弹出对话框}void CExampleDlg::OnCopy(){AfxMessageBox("Copy"); //弹出对话框}void CExampleDlg::OnPaste(){AfxMessageBox("Paste"); //弹出对话框}二.当在窗口内右击时,窗口将接收到WM_CONTEXTMENU消息,在该消息的处理函数中装载右键菜单,并调用CMenu::TrackPopupMenu函数便可显示右键菜单,添加对话框WM_CONTEXTMENU消息处理函数的响应代码如下:void CExampleDlg::OnContextMenu(CWnd* pWnd, CPoint point){CMenu menu;menu.LoadMenu(IDR_MENU1); //读取资源menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN| TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x, point.y, this) //弹出自定义右键菜单}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<在mousemove中使用if(rect.PtInRect(point))MessageBox("hi");不起作用,即使鼠标落入有效区域。
C#-----Winform界面实现右键菜单功能
C#-----Winform界⾯实现右键菜单功能1.新建Form窗体,向其中添加ContextMenuStrip控件2.点击ContextMenuStrip控件属性Items,添加MenuItem或Separator组件3.点击⼀级菜单,添加MenuItem或Separator组件,形成⼆级菜单4.Demo代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace Contextmenu{public partial class frmContextmenu : Form{public frmContextmenu(){InitializeComponent();}private void tSMICenter_Click(object sender, EventArgs e){int height =SystemInformation.WorkingArea.Height;int width = SystemInformation.WorkingArea.Width;int formheight = this.Size.Height;int formwidth = this.Size.Width;int newformx = width / 2 - formwidth / 2;int newformy = height / 2 - formheight / 2;this.SetDesktopLocation(newformx, newformy);}private void tSMILargen_Click(object sender, EventArgs e){this.Width =this.Width+100;this.Height = this.Height + 100;}private void tSMISmaller_Click(object sender, EventArgs e){this.Width = this.Width - 100;this.Height = this.Height- 100;}private void frmContextmenu_MouseClick(object sender, MouseEventArgs e){if (e.Button==MouseButtons.Right){contextMenuStrip.Show(MousePosition.X,MousePosition.Y);}}}}namespace Contextmenu{partial class frmContextmenu{///<summary>///必需的设计器变量。
win8系统怎么给鼠标右键添加菜单功能
win8系统怎么给鼠标右键添加菜单功能
电脑平常操作中会通过鼠标右键菜单中的选项刷新、新建记事本、编辑图片或截图等等功能,在安装第三方软件时也是在鼠标“右键菜单”中新增功能,但有些功能需要用户自己去添加到菜单中才可以使用,那么你知道win8系统怎么给鼠标右键添加菜单功能吗?下面是店铺整理的一些关于win8系统给鼠标右键添加菜单功能的相关资料,供你参考。
win8系统给鼠标右键添加菜单功能的方法:
1、以Win8平台作为例子,把鼠标移动到屏幕的右下方,然后就直接打开Charm超级菜单,搜索并打开“运行”选项;
2、在运行命令框里面直接输入regedit字符,然后就手动打开注册表编辑器;
3、依次定位到HKEY_CLASSES_ROOTDirectoryBackgroundshell,在shell下面直接新建“项。
4、接着在上面的项目里面继续新建子“项”:command,双击这个键值,在里面手动输入QQ、截图以及记事本等各个应用程序的系统路径;
上面所有的操作都完整之后,就已经成功的给ghost win7、Win8.1右键菜单添加了QQ、记事本、截图工具以及滑动关机等多个功能,如下:
win8系统给鼠标右键添加菜单功能的。
LabCVI常见问题及解决方法
LabCVI常见问题及解决方法1.使用CVI9.0调用由VC++6.0编写的DLL,该DLL在VC中调用是可以的,输出方式也是C语言的。
但是在CVI中调用该DLL时,总是提示missing prototype,如何解决?答:设置BUILD OPTION在options->Build optionsc language options中取消Require function prototypes的检测2.CVI中如何向设计好的word表格中添加文字和数据?答:先在表格中需要添加文字和数据的地方做一个“书签”,在CVI中打开该文档后,使用Word_GetProperty (currSelHandle, NULL, Word_SelectionBookmarks, CAVT_OBJHANDLE, &rangeHandle);获得“书签”信息,然后再向该“书签”处添加文字。
3.CVI中如何将波形图控件的图片放到剪贴板中?答:首先使用GetCtrlDisplayBitmap (panel, FORCEPANEL_GRAPH, 1, &bitmap);获得波形图控件的图片,然后使用ClipboardPutBitmap (bitmap);将图片放入到剪贴板中。
4.CVI中是否支持指向函数的指针,如何实现?答:可以实现,如下例:int(*pmax)(int a, int b);int x,y,z;pmax=max;printf("input two numbers:\n");scanf("%d%d",&x,&y);z=(*pmax)(x,y);5.CVI中如何使用非NI公司的硬件产品?该公司提供了一个fp文件。
答:一般来说通常可以调用产品销售商提供的动态链接库,有些大公司也提供fp文件,该文件可以直接使用,就可以达到使用硬件的目的了。
在使用前,可以直接将该文件添加入项目中,也可以在Library中定制fp文件的加载。
【LabVIEW】菜单使用汇总
( 1)指定控件禁用
在前面板控件上面,右键--高级--运行时快捷菜单--禁用。
( 2)全部控件禁用
文件——VI属性——窗口外观——自定义——去掉框图界面中添加事件结构分支标签上右键添加事件分支本vi菜单选择用户
【 LabVIEW】菜单使用汇总 一、运行时菜单
1、编辑--->运行时菜单,编辑好菜单结构。
二、自定义右键快捷菜单
( 1)实现自定义菜单
( 2)自定义菜单禁用某项
设置菜单项信息里,已启用设置为F。 注意:主菜单和子菜单的项标识符如果同名的话,主菜单就被禁用了。
C++实现添加桌面右键新建菜单
C++实现添加桌⾯右键新建菜单对于程序员来说,新建⼀个cpp⽂件是再频繁不过的事情了。
为了⽅便,我们习惯在桌⾯右键新建⽂件,⽽不是新建⼀个⽂本⽂档,然后修改后缀名。
百度⾕歌查询了⼀下,终于知道如何添加注册表。
⼿痒,抽出时间⽤cpp写了⼀个程序,⽅便以后操作。
客户需求是永远⽆法满⾜的,经同学测试,陆续写了三个版本。
接下来直接贴代码~第⼀个版本,只能添加c、cpp、java三种后缀。
/** Author: Haipz* School: HDU* File Name: registry1.0.cpp*/#include <cstdio>#include <cmath>#include <ctime>#include <cctype>#include <cstring>#include <cstdlib>#include <climits>#include <cfloat>#include <iostream>#include <vector>#include <stack>#include <queue>#include <set>#include <map>#include <algorithm>using namespace std;char s[1024], buffer[128], result[1024*4];void work_1() {system("reg add \"HKEY_CLASSES_ROOT\\.c\\ShellNew\" /v \"NullFile\" /t REG_SZ");}void work_2() {system("reg add \"HKEY_CLASSES_ROOT\\.cpp\\ShellNew\" /v \"NullFile\" /t REG_SZ");}void work_3() {system("reg add \"HKEY_CLASSES_ROOT\\.java\\ShellNew\" /v \"NullFile\" /t REG_SZ");}int main() {printf("Add registry for C, C++ and Java\n");printf("Author: Haipz\nSchool: HDU\n");printf("1 for C;\n2 for C++;\n3 for Java.\n");printf("Example: 12 to add C and C++.\n");printf("Please make choice(s): ");gets(s);for (int i = 0; s[i] != '\0'; ++i) {printf("Working...\n");if (s[i] == '1') work_1();else if (s[i] == '2') work_2();else if (s[i] == '3') work_3();else printf("%c is a wrong enter!\n", s[i]);}system("pause");return 0;}第⼆个版本,精简了代码,⽀持添加⽤户输⼊的后缀。
@+labwindows+cvi测试技术及工程应用 2-1
开启Visual Studio 2012右键菜单创建单元测试
开启Visual Studio 2012右键菜单创建单元测试Visual Studio 2012中消失了,在一个方法的名上右键点击发现操作菜单中没有创建单元测试的选项。
通过下面的步骤开启该功能,让我们可以在右键菜单中轻松创建单元测试。
1、点击“工具”菜单下的“自定义”
2、选择自定义窗口中的“命令”选项卡
3、选择自定义窗口中的“上下文菜单”单选按钮
4、点击自定义窗口中的“上下文菜单”单选按钮后的Tfs下来按钮,并选择“编辑器上下文菜单|代码窗口”
5、找到“创建单元测试”并移动到“运行测试”附近,(这点需要注意,如果移动后还未看到菜单出现在右键菜单中,那么再移动一次,直到该菜单出现为止)
6、右键菜单中已出现,但是却发现该菜单不能被点击,处于禁用状态:
7、在该项目的解决方案中创建一个单元测试项目
8、新建单元测试项目后,创建单元测试菜单可用
9、点击“创建单元测试”后,自动创建单元单元测试
10、单元测试创建成功。
利用LabWindowsCVI实现电脑的开、关、注销等功能
利⽤LabWindowsCVI实现电脑的开、关、注销等功能 今天突发奇想,如果能⽤LabWindows/CVI实现电脑的开、关、注销等功能也很有意思,我调试了很长时间,因为每调试⼀次基本上都要重新启动电脑。
这⾥也是⽤了WindowsAPI的⼀些函数,我把代码挂出来,同⼤家共享! 界⾯如下: 代码为:#include "windows.h"#include#include#include "关机函数.h"static int panelHandle;void ShutdownComputer(int kind);int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpszCmdLine, int nCmdShow){if (InitCVIRTE (hInstance, 0, 0) == 0)return -1; /* out of memory */if ((panelHandle = LoadPanel (0, "关机函数.uir", PANEL)) < 0)return -1;DisplayPanel (panelHandle);RunUserInterface ();DiscardPanel (panelHandle);return 0;}//退出按钮int CVICALLBACK QuitCallback (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){switch (event){case EVENT_COMMIT:QuitUserInterface (0);break;}return 0;}//注销按钮int CVICALLBACK logoff (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){switch (event){case EVENT_COMMIT:ShutdownComputer(0);break;}return 0;}//关闭按钮int CVICALLBACK shutdown (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){switch (event){case EVENT_COMMIT:ShutdownComputer(1);break;}return 0;}//关闭电源按钮int CVICALLBACK power (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){switch (event){case EVENT_COMMIT:ShutdownComputer(3);break;}return 0;}//重新启动按钮int CVICALLBACK reboot (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){switch (event){case EVENT_COMMIT:ShutdownComputer(2);break;}return 0;}void ShutdownComputer(int kind){HANDLE hToken;TOKEN_PRIVILEGES tkp;/* 打开进程BOOL OpenProcessToken(HANDLE ProcessHandle, // 当前进程句柄DWORD DesiredAccess, // 处理⽅式PHANDLE TokenHandle // 获得进程句柄);*/if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)); /* 检索指定优先级BOOL LookupPrivilegeValue(LPCTSTR lpSystemName, // 系统名称LPCTSTR lpName, // 优先级名称PLUID lpLuid // 本要唯⼀标识符);*/LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);tkp.PrivilegeCount = 1;tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;/* 调整优先级BOOL AdjustTokenPrivileges(HANDLE TokenHandle, // 获得句柄BOOL DisableAllPrivileges, // 使能选项PTOKEN_PRIVILEGES NewState, // 优先级信息DWORD BufferLength, // 缓存空间PTOKEN_PRIVILEGES PreviousState, // 原始状态缓存PDWORD ReturnLength // 所需缓存空间);*/AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); if (GetLastError() != ERROR_SUCCESS);//关机函数if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0));switch (kind){case 0://注销if (!ExitWindowsEx(EWX_LOGOFF | EWX_FORCE, 0));break;case 1://关闭if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0));break;case 2://重新启动if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0));break;case 3://关闭电源if (!ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0));break;}return;}。
LabWindowsCVI教程
LabWindowsCVI教程第⼀章 : LabWindows/CVI1.1 LabWindows/CVI1.1.1 LabWindows/CVI概述LabWindows/CVI是美国NI(National Instruments)公司开发的⾯向计算机测控领域的虚拟仪器软件开发平台,可以在多种操作系统(WindowsXP/Vista/7、Mac OS和Unix)下运⾏。
LabWindows/CVI 是为C 语⾔程序员提供的集成开发环境(IDE),在此开发环境中可以利⽤C语⾔及其提供的库函数来实现程序的设计、编辑、编译、链接、调试。
使⽤LabWindows/CVI 可以完成以下但不限于以下⼯作:·交互式的程序开发;·具有功能强⼤的函数库,⽤来创建数据采集和仪器控制的应⽤程序;·充分利⽤完备的软件⼯具进⾏数据采集、分析和显⽰;·利⽤向导开发IVI 仪器驱动程序和创建ActiveX 服务器;·为其它程序开发C ⽬标模块、动态连接库(DLL)、C 语⾔库。
图 1‐1 LabWindows/CVI界⾯LabWindows/CVI 的功能强⼤在于它提供了丰富的函数库。
利⽤这些库函数除可实现常规的程序设计外,还可实现更加复杂的数据采集和仪器控制系统的开发。
数据采集。
IVI库、GPIB/GPIB 488.2库、NI-DAQmx库、传统的NI-DAQ库、RS-232库、VISA库、VXI库以及NI-CAN库。
数据分析。
格式化IO库、分析库以及可选的⾼级分析库。
GUI库。
使⽤LabWindows/CVI 的⽤户界⾯编辑器可以创建并编辑图形⽤户界⾯(GUI),⽽使⽤LabWindows/CVI 的⽤户界⾯库函数可以在程序中创建并控制GUI。
此外,LabWindows/CVI为GUI ⾯板的设计,准备了许多专业控件,如:曲线图控件、带状图控件、表头、旋钮和指⽰灯等,以适应测控系统软件开发的需求,利⽤这些控件可以设计出专业的测控程序界⾯。
LabVIEW数据采集编程指南
数据采集编程指南上篇DAQ基础知识简介简介本节主要介绍数据采集技术的基本知识点,包括以下三个斱面的内容:1.一个完整数据采集系统的基本组成部分2.NI提供了基于哪些平台的数据采集硬件产品,它们分别适用于什么样的应用领域3.数据采集设备硬件选型过程中应该关注哪些重要参数数据采集系统的基本组成图1-1 数据采集系统基本组成部分如图1-1所示,一个完整的数据采集系统通常由原始信号、信号调理设备、数据采集设备和计算机四个部分组成。
但有的时候,自然界中的原始物理信号并非直接可测的电信号,所以,我们会通过传感器将这些物理信号转换为数据采集设备可以识别的电压或电流信号。
加入信号调理设备是因为某些输入的电信号并不便于直接迚行测量,因此需要信号调理设备对它迚行诸如放大、滤波、隔离等处理,使得数据采集设备更便于对该信号迚行精确的测量。
数据采集设备的作用是将模拟的电信号转换为数字信号送给计算机迚行处理,或将计算机编辑好的数字信号转换为模拟信号输出。
计算机上安装了驱动和应用软件,斱便我们与硬件交互,完成采集任务,并对采集到的数据迚行后续分析和处理。
对于数据采集应用来说,我们使用的软件主要分为三类,如图1-2所示。
首先是驱动。
NI的数据采集硬件设备对应的驱动软件是DAQmx,它提供了一系列API函数供我们编写数据采集程序时调用。
并且,DAQmx不光提供支持NI的应用软件LabVIEW,LabWindows/CVI的API函数,它对于VC、VB、.NET也同样支持,斱便将您的数据采集程序与其它应用程序整合在一起。
图1-2 数据采集软件架极同时,NI也提供了一款配置管理软件 Measurement and Automation Explorer,斱便我们与硬件迚行交互,并且无需编程就能实现数据采集功能;还能将配置出的数据采集任务导入LabVIEW,并自动生成LabVIEW代码。
关于这款软件的使用斱法,在后面的章节中会详细介绍。
桌面鼠标右键菜单设置(二)
桌面鼠标右键菜单设置(二)鼠标右键菜单新建记事本没了怎么办?在网上看到这篇文章,拿过来分享:鼠标右键菜单中有很多快捷命令,给用户日常操作带来了极大的方便。
但是,不知您注意到没有,当鼠标右键菜单弹出的时候,其中的项目是否合您心意呢?是不是有的命令您并不需要,而您需要的却又不在上面呢?或者是英文选项使您不知其意……哈,如果糊里糊涂地使用右键命令,肯定不能提高工作效率。
那就让我们略施小计,让鼠标右键菜单命令真正为己所用吧。
以下方法,主要通过编辑注册表来实现,所以请一定事先备份注册表。
方法是:点击“开始/运行”,填入“regedit”打开注册表编辑器,选择“导出注册表文件”就可以了。
添加右键命令您所希望使用的命令如果不在右键菜单中,就要靠我们自己把它“加”进去。
让我们来看几个添加实例,把握了基本方法,就可触类旁通,添加一切命令。
用右键快捷命令重启计算机。
“重新启动计算机”是经常需要做的工作,可是它的实现要通过点击“开始/关闭系统/重新启动计算机/确定”好几个步骤的操作,比较麻烦,如果可以通过右键快捷命令随时随地重启就更方便了。
要添加“重新启动计算机”到右键菜单中,方法是:打开注册表编辑器,定位到“HKEY_LOCAL_MACHINE\Software\CLASSES\Directory\shell”,在其下新建一个名为“Restart” 的子键,然后双击右侧窗口中的“默认”,将数值设为“重新启动计算机”。
接下来,在“Restart”子键下再建一个子项,命名为“command”,双击右侧窗口中的“默认”,将数值设为“C:\WINDOWS\RUNDLL.EXE USER.EXE,EXITWINDOWSEXEC”。
回车退出后,鼠标右键单击任意文件夹或“开始”按钮,在弹出的菜单中,用户就可以选择“重新启动计算机”命令了。
除了“回收站”本身,其他文件的右键菜单都没有“清空回收站”命令,那么我们也可以给它加上。
在“HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers”下新建主键“{645FF040-5081-101B-9F08- 00AA002F954E}”,确定后退出注册表,当右击任何文件时,其快捷菜单都会有一个“清空回收站”的选项。
cvi教程
c. 将 Label 项改为 Acquire
说明:通过这种方法可以修改按扭名字,Acquire 中 A 字母前有下画线,是指可
以通过 Alt + A 即可达到按下该按扭的效果(即热键)。
从该菜单中选择:Command Button>>Square Command Button
泛华测控
电话:010-62628052 至 62628055(共四线),传真:010-62628056
第6页便会创建一个方形的按扭。 由于本程序总共需要三个按扭,所以按照上面的步骤再创建两个方形按
或者直接从桌面起动 CVI 的快捷方式,双击桌面 National Instrument CVI 图标
当 LabWindows/CVI 打开后你就会见到如下所示的一个空的项目(Project) 窗:
第一步:创建用户界面
创建控件元素: 从 Project 窗中选择:File>>New>>User Interface(*.uir)…创建一个用户
File 菜单,然后选择 Page Setup 项,最后从弹出的对话框中选择 Options 项。
“说明:通过这种方式你可以修改 Panel 顶端所显示的名字。”
该种字体所写的文字是值得读者注意并记忆的内容。
“
”
该椭圆形框所框住的内容是读者需修改的地方。
泛华测控
电话:010-62628052 至 62628055(共四线),传真:010-62628056
第 10 页
北京中科泛华测控技术有限公司
a. 将 Constant Name 项改为 ACQUIRE
LabVIEW编程实例:如何实现右键快捷菜单功能
LabVIEW编程实例:如何实现右键快捷菜单功能右键快捷菜单是软件界面中常用的一种功能,下面通过例子演示在LabVIEW中如何实现右键菜单的功能。
实例说明软件运行界面如下图所示:在软件界面上放置一波形图控件,在该控件上点击鼠标右键弹出快捷菜单,通过该菜单实现如下功能:更新波形:产生新波形数据并在波形图控件上显示;清除波形:清空波形图控件上的波形;游标设置:显示或隐藏波形图控件上的游标;退出程序:选择该菜单项时退出当前程序的运行。
编程思路对于右键菜单的编程实际上包括两部分内容,一是菜单项的显示功能实现,二是每个菜单项的具体功能实现。
对于前者,可在波形图控件的“快捷菜单激活?”事件中完成菜单项的显示功能。
对于后者,可在波形图控件的“快捷菜单选择(用户)”事件中完成每个菜单项的具体功能实现。
波形图控件的“快捷菜单激活?”事件实现代码在该事件中,LabVIEW提供了当前控件的菜单引用,通过菜单引用调用相关的菜单操作函数完成菜单项的显示。
具体实现代码如下图所示:首先调用删除菜单项函数删除该控件已有的菜单项,随后调用插入菜单项函数依次插入每个菜单项,最后调用设置菜单项信息函数实现游标菜单项的显示、隐藏的勾选设置。
其中,菜单中的分割线通过字符串“APP_SEPAR”作为项标识符进行设置。
游标的显示/隐藏状态通过字符串类型的“游标状态”控件进行设置,需要说明的是,“游标状态”控件在程序中仅仅是作为一个变量使用,用来存储当前的游标是否显示的一个状态,所以在前面板上该控件设置为隐藏即可。
波形图控件的“快捷菜单选择(用户)”事件实现代码在该事件中,LabVIEW会返回当前选择菜单项的项标识符(字符串类型),通过项标识符可确定当前用户选择了哪个菜单项,然后在选择结构里面作该菜单项对应功能的实现即可。
具体实现代码如下图所示:上面代码中,给出了用户选择“更新波形”菜单项时需要实现的具体功能,即产生一个叠加均匀白噪声的正弦波形信号并在波形图控件中显示。
关于CVI中的“鼠标按键事件”
关于CVI中的“鼠标按键事件”- Daniel Zhou关于CVI中的“鼠标按键事件”需要特别留意三个事件:EVENT_COMMIT;EVENT_LEFT_CLICK;EVENT_LEFT_DOUBLE_CLICK;鼠标单击,就会触发“EVENT_LEFT_CLICK”,但是如果鼠标单击过快就只会触发“EVENT_COMMIT”了,因为此时属于“EVENT_LEFT_DOUBLE_CLICK”。
如果希望“EVENT_LEFT_CLICK”和“EVENT_LEFT_DOUBLE_CLICK”获得一样的结果,那么就让两个Case共用同一段代码。
case EVENT_LEFT_CLICK:case EVENT_LEFT_DOUBLE_CLICK:/* insert code here*/break需要特别留意的事情,就是在编译器内Debug的时候,消息响应可能会丢失一些,而不会完全像我们想的那样。
这样的情况下,建议Build一个程序出来测试一下。
注意:如果希望检测按键被长按一定时间,再采取响应的情况,需要用按键状态配合定时器来实现。
用“GetRelativeMouseState”可以很可靠的帮助我们返回鼠标相对某个Button的位置以及它是否按下。
然后根据鼠标左边和按下的状态共同完成条件确认。
例如:////Check if Add botton pressedGetRelativeMouseState (panelHandle,PANEL_INCREMENT,&mouse_x, &mouse_y,&LEFT_KEY_DOWN, &RIGHT_KEY_DOWN,NULL);if(LEFT_KEY_DOWN &&mouse_x>0 &&mouse_x<AddBtn_W &&mouse_y>0 &&mouse_y<AddBtn_H){TimerWorking = TRUE;SetCtrlVal (panelHandle, PANEL_COUNT, ++CountNub);}时间响应的顺序为:先响应Click或者是Double Click,然后在按键释放的时候会响应COMMIT事件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LabwindowsCVI鼠标右键实现菜单功能
(1)在主界面下,新建一个界面,菜单Create中,选择Panel..,直接就生成一个新的面板,双击新建的面板,修改参数。
图1 右键菜单面板参数设置界面
如图1所示,设置界面的名称代码,Constant name 为PANEL_MENU,面板名称Panel title 为“右键菜单”。
(2)为该面板新建菜单,有两种方法,一种是通过软件的菜单Create中Menu Bar...菜单进行新建菜单,一种方法是右键点击PANEL_MENU面板界面的空白处,选择“Menu Bar...”新建菜单。
如图2所示。
按照图中进行设置你需要的菜单内容。
图2 菜单设置界面
(3)在程序启动后,在main函数中添加代码,获取菜单所在界面的句柄,不用该界面。
其代码如下:
int menupanelHandle; //初始化界面句柄
if ((menupanelHandle = LoadPanel (1, "NaI_IEC.uir",
PANEL_MENU)) < 0) //获取界面句柄
return -1;
(4)在主界面中,设置回调函数,设置方式见第1节讲解。
然后在回调函数中添加鼠标右键点击事件。
并在该事件中添加右键菜单源代码,如下:
int a; //初始化菜单句柄变量
case EVENT_RIGHT_CLICK: //右键点击事件
a = GetPanelMenuBar(menupanelHandle); //获得菜单句柄
RunPopupMenu(a,MOR_MENU_MENU,panelHandle,eventData
1,eventData2,0,0,0,0);//显示右键菜单
break;
(5)编译,完成右键菜单功能,如图3所示。
图3 菜单设置界面。