C#的outputps动画窗口在哪里里啊

vs2010output窗口缺失debug选项
[问题点数:40分,结帖人cumtmengmeng]
vs2010output窗口缺失debug选项
[问题点数:40分,结帖人cumtmengmeng]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。您所在的位置: &
Visual C#弹出窗口杀手(1)
Visual C#弹出窗口杀手(1)
本文讲解如何利用Visual C#实现阻截弹出窗口的功能
弹出窗口杀手是一个可以自动关闭IE弹出窗口的程序,它工作在系统的托盘中,按照一定的间隔来检测IE窗口,然后关闭弹出窗体。最后,还提供了用热键来杀掉弹出窗口的功能。 虽然已经有类似的用C++写的程序,但是本文讲述的是用C#来实现这些功能,并且本文所讲的方案在查找窗口上的方法要比更快一些。 这是一个崭新的话题,在Internet上我们还可以看到许多类似的程序。但是我也还是要借这个机会来讲述一些下面的技术在C#中如何实现: 系统托盘 程序切换 计时控件 查找窗口 系统热键 生成一个系统托盘程序 首先,产生一个新的C# Windows Form程序, 将NotifyIcon控件从工具箱中拖到窗体中,如下图所示: 在C# windows Form程序中添加托盘&为了保证系统托盘的图标和应用程序的图标一致,我们用一个共同的图标文件a.ico来设置系统托盘的图标和应用程序的图标。 为了使程序不显示在工具栏上,我们可以设置窗体的visible属性为false. 这个可以在窗体属性窗口中直接实现。 this.ShowInTaskbar = 到目前为止,系统托盘已基本好了,但是我们还没有设置右键菜单,也没有使程序显示和隐藏的功能。 程序切换 首先,程序的主窗体可以根据不同的状态来选择显示或者是隐藏,除此之外,我们可以用WindowState设置窗体的状态:
public void HideApp() { this.WindowState = FormWindowState.M Hide(); } public void ShowApp() { Show(); this.WindowState = FormWindowState.N }
一个非常有趣的功能是让用户关闭窗体的时候程序并不是退出,为了实现这个功能,我们必须要重写窗体的OnClosing事件。
protected override void OnClosing(CancelEventArgs e) { // 用最小化来代替关闭操作d e.Cancel = // 最小化,并且隐藏窗体 this.WindowState = FormWindowState.M Hide(); } 当然,我们必须要提供一个必须的退出方法.这个可以在托盘的右键菜单的exit中实现, private void menu_App_Exit(object sender, System.EventArgs e) { NativeWIN32.UnregisterHotKey(Handle, 100); //隐藏托盘 notifyIcon1.Visible = Application.Exit(); }
添加右键菜单&添加一个右键菜单和添加托盘基本一样,从工具箱中添加context menu就可以.右键菜单在你鼠标右键按下的时候是会自动弹出的。 当设置好右键菜单以后,我们必要要根据不同的情况来启用或停用右键菜单,这个可以通过在菜单的BeforePopup设置。Enabled属性来实现。
private void menu_App_BeforePopup(object sender, System.EventArgs e) { if ( this.WindowState == FormWindowState.Minimized ) { App_Show.Enabled = App_Hide.Enabled = } else { App_Show.Enabled = App_Hide.Enabled = } } 计时工具 Net Framework的 Timer能和系统的Win32 timer实现一样的功能。我们要做的就是设置一个timer,然后合理的设置属性。
m_Timer = new System.Timers.Timer(); // explicit namespace (Timer also in System.Threading) m_Timer.Elapsed += new ElapsedEventHandler(OnTimerKillPopup); m_Timer.Interval = m_nI // for instance 3000 milliseconds m_Timer.Enabled = // start timer protected void OnTimerKillPopup(Object source, ElapsedEventArgs e) { m_Timer.Enabled = // pause the timer FindPopupToKill(); m_Timer.Enabled = }
本地win32窗体查找 本程序的实现原理是这样,先检查所有的IE窗口标题,然后于已经有的列表来比较,如果有相同的,我们就关闭这个窗口。 按照上面的方法,我们每n妙使用KillPopup()来检查。比较遗憾的是我们无法使用安全代码来完成所有的工作。我们可以使用 System.Diagnostics.Proces来检查所有的IE进程,然后得到主窗体。但是每一个IE进程可以打开好几个窗口,虽然每一个窗体都于一个进程相关,但是还没有办法来使每一个窗体于进程对应起来。 一个可行的办法使用System.Diagnostics.Process列举出所有的运行的进程,然后System.Diagnostics.ProcessThreadCollection 来得到他们的.Threads属性,为了得到thread Id,我们使用Win32 API EnumThreadWindows(DWORD threadId,WNDENUMPROC lpfn,LPARAM lParam) 来实现,这是一个回调(call back)函数,他可以列举出于进程相关的窗体。当我们得到了窗体的句柄以后,我们可以使用另一个API函数 GetWindowText(HWND hwnd,/*out*/LPTSTR lpString,int nMaxCount)来得到窗体的标题,然后根据已经有的窗体,调用API函数SendMessage(HWND hWnd,int msg,int wParam,int lParam)来关闭窗口。下面使演示代码:
Process[] myProcesses = Process.GetProcessesByName("IEXPLORE"); foreach(Process myProcess in myProcesses) { FindPopupToKill(myProcess); } protected void FindPopupToKill(Process p) { // traverse all threads and enum all windows attached to the thread foreach (ProcessThread t in p.Threads) { int threadId = t.Id; NativeWIN32.EnumThreadProc callbackProc = new NativeWIN32.EnumThreadProc(MyEnumThreadWindowsProc); NativeWIN32.EnumThreadWindows(threadId, callbackProc, IntPtr.Zero /*lParam*/); } } // callback used to enumerate Windows attached to one of the threads bool MyEnumThreadWindowsProc(IntPtr hwnd, IntPtr lParam) { public const int WM_SYSCOMMAND = 0x0112; public const int SC_CLOSE = 0xF060; // get window caption NativeWIN32.STRINGBUFFER sLimitedLengthWindowT NativeWIN32.GetWindowText(hwnd, out sLimitedLengthWindowTitle, 256); String sWindowTitle = sLimitedLengthWindowTitle.szT if (sWindowTitle.Length==0) // find this caption in the list of banned captions foreach (ListViewItem item in listView1.Items) { if ( sWindowTitle.StartsWith(item.Text) ) NativeWIN32.SendMessage(hwnd, NativeWIN32.WM_SYSCOMMAND, NativeWIN32.SC_CLOSE, IntPtr.Zero); // try soft kill }
} public class NativeWIN32 { public delegate bool EnumThreadProc(IntPtr hwnd, IntPtr lParam); [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern bool EnumThreadWindows(int threadId, EnumThreadProc pfnEnum, IntPtr lParam); // used for an output LPCTSTR parameter on a method call [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] public struct STRINGBUFFER { [MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)] public string szT } [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER ClassName, int nMaxCount); [DllImport("user32.dll", CharSet=CharSet.Auto)] public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); }
关于的更多文章
Visual Studio 2010是微软集成开发环境Visual Studio的最新版。
网友评论TOP5
本次的专刊为大家提供了Oracle最新推出的Java SE 8详细的开发教程,从解读到探究Java 8最新
在11月26日举办的第17期51CTO技术沙龙上,有幸请到了
javascript中的异步编程能力都是由BOM与DOM提供的,如
2011年11月是Eclipse诞生十周年的日子,最开始是作为
本书主要介绍了SQL Server 关系数据库系统的应用知识,全面介绍了关系数据模型基础理论,SQL Server数据库系统安装、配
51CTO旗下网站当前位置:
实现类似Excel和Visual C++里文件夹式样的标签控制(一)
实现类似Excel和Visual C++里文件夹式样的标签控制(一)
发布日期: 22:29
浏览次数:1658次
标  签:windows
文章评分:5.0
操  作:
称号:未设置简介:...
文章概要:
众所周知,Excel中一个工作簿可以有多个工作表单(worksheet),每个表单可以通过左下角的标签控制灵活切换,Visual C++也有类似的控制,如在Output窗口中设置有:Build,Debug,Find in Files和Results等标签控制。本文将告诉你如何在自己的程序中实现这种控制......
众所周知,Excel中一个工作簿可以有多个工作表单(worksheet),每个表单可以通过左下角的标签控制灵活切换(如图一),Visual C++也有类似的控制,如在Output窗口中设置有:Build,Debug,Find in Files和Results等标签控制(如图二)。
图一Excel中的标签控制
图二 Visual C++中的标签控制&
我们将这种界面称为文件夹式样的标签控制,以下简称标签控制,而将MFC中的Tab Control称为标签控件。那么标签控制是如何实现的呢?MFC中有没有现成的控件可以利用?&
论坛中有很多人提出过这个问题。看了本文以后,我想这个问题应该有一个圆满的答案。MFC固然给编程带来了极大的方便,但是它并不能代替程序员的编程,MFC只是提供了一个编程框架,应用的实质性代码还是必须由程序员自己来写。同时,MFC的问题也是显而易见的,那就是其GUI素材太丰富,以至于程序员们过分依赖MFC,当想要实现MFC中没有的GUI特性时便不知所措。
下面我们就来看看如何实现图一和图二所示的文件夹式样的标签控制界面。有人可能想到了从现成的标签控件(Tab Control)入手。但是经验证明:为了使用的方便性和更好的可重用性起见,还是不要采取这种方法。我是一个热衷于可重用性的家伙,但是这方面我们在自己的代码中做得还很不够。所以我宁愿自己创建一个窗口类,这样做还有一个好处是你能完全控制代码的修改,不必顾及因现有控件版本的变化而对自己的代码造成的巨大影响和麻烦。我想微软的家伙肯定也希望你这么做。如果你用Spy++查看一下Excel和Visual C++的界面就会发现其文件夹式样的标签控制并不是SysTabControl32s,而是另外创建的窗口类。为什么我们不也来创建一个呢?
请看图三所示的画面,这就是我编写的一个程序FldrTab,它实现了我们所要的界面功能。实现这个UI的C++类是我自己创建的,它叫CFolderTabCtrl。
图三 FldrTab 程序运行画面
有关CFolderTabCtrl的实现细节请参考源代码。其头文件为Ftab.h,实现文件为Ftab.cpp。在分析CFolderTabCtrl的实现原理之前,让我先来说明一下这个类的使用方法。当FldrTab程序的InitInstance函数获得控制权时,它创建一个主对话框的实例,并运行这个对话框:
BOOL CApp::InitInstance()
m_pMainWnd = &
dlg.DoModal();
return FALSE;
&CMyDialog有两个控制:一个是m_wndStaticInfo,另一个是m_wndFolderTab。顾名思义,第一个控制为一个静态文本窗口,它显示选中的标签,第二个是标签控制本身,即CFolderTabCtrl实例。通过调用SubclassDlgItem,CMyDialog::OnInitDialog以常规方式子类化静态文本,遗憾的是它不能子类化标签控制,因为对话框中并没有实际的标签控制窗口。此外也没有办法借助COM技术将此标签控制实现为一个带运行时接口的定制控件。我的办法是在对话框想要放置标签控制的地方创建一个静态文本控件。如图五所示:
图五 用静态文本控件定位标签控制
在OnDialogInit中通过调用一个特殊的函数,在运行时将静态文本替换成标签控制。
m_wndFolderTab.CreateFromStatic(IDC_FOLDERTAB, this);
&CFolderTabCtrl::CreateFromStatic 在静态文本控件的位置上创建一个标签控制,然后删除静态文本控件。这是我创建特殊对话框控制常用的绝招,我认为这个诀窍是超一流的。在调用Create之前,CreateFromStatic调用CFolderTab::GetDesiredHeight来获得控制的高度,而忽略静态文本控件的高度。在非对话框应用中不能调用CreateFromStatic;而是要直接调用CFolderTab::Create。创建了标签控制后,接下来你必须设置标签名字。这里是在CMyDialog中调用现成的Load函数。
m_wndFolderTab.Load(IDR_FOLDERTABS);
&IDR_FOLDERTABS是串资源的ID,它是一个包含新行指示符(“\n”)分割的标签名(“在线杂志第一期\n在线杂志第二期\n……”),一旦创建了控制并调用Load,那么你的标签控制就完全happy了。它看起来就象图三所示的那样。
当然,这时它还不能做任何事情,你还必须处理它们的通知消息。当用户按下一个标签时,CFolderTab便用特殊代码FTN_TABCHANGED向对话框发送一个WM_NOTIFY消息。然后对话框处理这条消息,也就是在上面的静态文本控件中显示一条信息。
void CMyDialog::OnChangedTab(NMFOLDERTAB* nmtab,LRESULT* pRes)
s.Format(_T("选中 %d: %s"),nmtab-&iItem,nmtab-&pItem-&GetText());
m_wndStaticInfo.SetWindowText(s);
NMFOLDERTAB 结构在FTab.h. 文件中定义。
struct NMFOLDERTAB : public NMHDR {
// 项目索引
const CFolderTab* pI // 标签
&这个结构除了NMHDR所包含的成员之外,还有项目索引和指向当前标签CFolderTab的指针,它与CFolderTabCtrl有所不同,从CFolderTab中你可以得到标签的文本。以上就是CFolderTabCtrl的使用方法。
下面我们就来揭示这个C++类的实现原理。前面已经对CreateFromStatic进行了描述,那么CFolderTabCtrl::Load是个什么样的函数呢,这个函数的功能是加载一个串标签名,这个串是用新行指示符(“\n”)分割的字符串,吸取其中的子串,并调用CFolderTabCtrl::AddItem将它添加到每一个标签上。
int CFolderTabCtrl::AddItem(LPCTSTR lpszText)
m_lsTabs.AddTail(new CFolderTab(lpszText));
return m_lsTabs.GetCount() - 1;
&就这么简单,创建一个新的CFolderTab对象并将它添加到一个列表中。与AddItem相对的是RemoveItem函数,它们的实现都在Ftab.cpp文件中,这两个函数分别负责动态添加和删除标签页,而不是存取资源串。然后是GetItem和GetItemCount函数,一看它们的名字你就应该明白它们的作用,前者用来获取CFolderTab标签的索引号(从0开始),后者则返回m_lsTabs.GetCount,即总共有多少标签。此外,你一定想需要有个函数来获取和设置标签文本,没问题,每一个CFolderTab对象都有一个m_sText成员变量来存储标签名,存取方法是GetText和SetText,我想你闭着眼睛都能写出这些代码!
接下来要做的事情很重要,首先是绘制标签。CFolderTabCtrl::OnPaint在循环中遍历所有标签,对每一个标签调用CFolderTab::Draw来进行绘制处理。这里有两个技巧:一个是必须在最后绘制当前选中的标签(m_iCurItem),以便它看起来重叠在最上面。另一个是要绘制其它标签,必须让其它标签知道自己的位置――也就是定义标签的梯形坐标。这是此标签控制的重点所在。下面就来看看实际代码是怎么做的。
CFolderTabCtrl有一个RecomputeLayout函数,它计算所有标签的位置。只要你改变控制的版面,则必须调用它,如添加或删除某个标签以及修改某个标签的名字(它会影响标签大小)。RecomputeLayout的关键代码如下:
int x = 0;
for (int i=0; iComputeRgn(dc, x) - CXOFFSET;
&RecomputeLayout为每一个标签调用CFolderTab的成员函数ComputeRgn。ComputeRgn计算出标签的梯形大小并返回算出的宽度,RecomputeLayout将它与当前x轴坐标相加,然后作为下一个标签的起始x轴坐标进行参数传递,最后减去形状修饰因子CXOFFSET,使得它们看起来有重叠的效果。之所以这么做是因为给定的标签只能决定其大小,不能决定其绝对位置,它需要更多的x轴信息。 一旦ComputeRgn有了x轴坐标,它就可以计算出一个足够大的梯形来容纳标签文本,注意要加一些边空,使文本的显示不会产生混乱。用DT_CALCRECT 调用CDC::DrawText计算文本所占的矩形,然后用结果计算梯形的大小。私有函数GetTrapezoid计算与文本矩形相配的梯形。用象素进行计算确实是一件麻烦和头疼的事情,我不想让你为此也痛苦一番。当CFolderTab::ComputeRgn计算出梯形的坐标,它调用CRgn::CreatePolygonRgn函数强行创建一个多边形区域。
int CFolderTab::ComputeRgn(CDC& dc, int x)
CRect& rc = m_
dc.DrawText(m_sText, &rc, DT_CALCRECT);
// tweak rc to add margins
CPoint pts[4];
GetTrapezoid(rc, pts);
m_rgn.CreatePolygonRgn(pts, 4, WINDING);
return rc.Width();
&当标签的区域确定后,绘制这些标签的工作使你又陷入另一个艰难的象素处理环境。CFolderTab::Draw对选中标签(选中和未选中状态)要显示的颜色和字体进行处理。因为标签将梯形数据存储在CRgn中,因此只要调用CDC::FillRgn即可绘制标签。然后用MoveTos 和LineTos以适当的颜色绘制线条。最后调用DrawText绘制文本。
图六选中/未选中的标签状态&
图六是程序运行时标签选中和未选中的状态示意图。注意线条有的是黑色,有的是灰色以便呈现3D效果(这不是我的设计,而是从Excel借用的)。选中标签为白色(COLOR_WINDOW)并且顶边没有黑色边线。这样做便于与上面的视窗融于一体。为了简单起见,例子程序没有创建这样的视窗,但是在实际应用中,一般都会象Excel和Visual Studio那样有一个甚至多个视窗与每个选中的标签对应,这在后续文章中会慢慢扩充。本文例子程序里选中标签的另外一个特点是使用了小字体,这是从Visual Studio借鉴过来。说到字体,到底应该使用哪一种呢?这里CFolderTabCtrl默认为Arial,你完全可以改用其它的字体,为此CFolderTabCtrl类中提供了一个改变字体的成员函数CFolderTabCtrl::SetFonts。以上讨论的都是标签的绘制问题, 下面来看看事件及行为。有关标签区域计算的重点和难点问题都已经解决,剩下的问题就简单多了。通过解决这些问题,我总结出一条经验,希望与大家分享:无论你是做控制设计还是系统设计,开始都要问一问自己,“我需要什么样的数据结构才能使问题更容易处理?”然后确定如何创建这些数据结构。通常应该只在一个地方进行难点和重点处理,其它的问题便会容易得多,至少你应该这样努力。 当CFolderTabCtrl获悉OnLButtonDown事件,它调用函数HitTest找出鼠标位于哪一个标签上。HitTest在每一个CFolderTab对象上循环,调用CFolderTab的同名函数CFolderTab::HitTest,这个函数再用已经计算好的的梯形坐标调用CRgn::PtInRegion。CRgn必须在这里做好自己的工作。如果HitTest有返回TRUE,则CFolderTabCtrl::HitTest返回标签的索引,此时OnLButtonDown调用的另一个函数是CFolderTabCtrl::SelectItem,以此选中标签。SelectItem没有什么玄机,它将新的值赋给m_iCurItem并使的值失效,选中新标签后重画。完成SelectItem的调用后,OnLButtonDown创建一个NMFOLDERTAB结构并将信息填写到结构,然后向父窗口发送WM_NOTIF消息。对话框和主应用就是这样把握着所发生的一切。
OK,大功告成,例子程序虽然粗糙,但所要的功能基本都实现了。有许多实用的特性我作了保留,例如,用键盘切换标签(这一点可以在主应用中以加速键的方式实现),以及标签的禁用――即防止用选中某个标签。如果你的程序需要这些特性,那就尽一切办法实现它们吧!重要的是实现你需要的功能,而不要画蛇添足。下一部分的内容我们将尝试把CFolderTabCtrl集成到一个实际的MFC程序当中,使得我们的CFolderTabCtrl不再只是一个纯粹的例子。(待续)
最多还可以输入100字
【VIP年会员制套餐】
【C/C++软件工程师实战能力集训大纲】
VC知识库发布了C/C++业界的“本草纲目”
【牛人都在千人一号群! 加群三步走!!!】
第一步:请必须加VC知识库QQ: 为好友;
第二步:请必须关注本站微博:
第三步:申请加入群:.(必须将关注微博截屏发到QQ方可通过!)
【最新2013:】
全部100% VC++源码提供: E-Form++全新大型SCADA & HMI解决方案源码、CAD解决方案源码、Gis解决方案源码 、电力石油化工仿真与图形建模解决方案源码、大量其他高级制图VC++源码下载!
【 新视频发布】
o o o o o o o o o o
Foxmail 新版中有一个《邮件特快专递》的功能。起先搞不懂如何用,后来知道要在“工具->系统选项”那边设置“本地 DNS 服务器的IP地址”。
  觉得这个新功能蛮好用的。不需要通过SMTP代理,可以直接通过本地往邮箱所在的邮件交换器发送邮件。在暑假一开始想在 VC++ 中实现这个功能。用 IRIS 截包后,发现程序中有 mx8.263.net 发送邮箱,不知道这个是什么东西,所以作罢。后来才想到这个就是 263.net 的MX记录主机,原来特快专递的原理就是往这个主机上发送数据就行。...
Foxmail 新版中有一个《邮件特快专递》的功能。起先搞不懂如何用,后来知道要在“工具->系统选项”那边设置“本地 DNS 服务器的IP地址”。
  觉得这个新功能蛮好用的。不需要通过SMTP代理,可以直接通过本地往邮箱所在的邮件交换器发送邮件。在暑假一开始想在 VC++ 中实现这个功能。用 IRIS 截包后,发现程序中有 mx8.263.net 发送邮箱,不知道这个是什么东西,所以作罢。后来才想到这个就是 263.net 的MX记录主机,原来特快专递的原理就是往这个主机上发送数据就行。...
本文介绍了套接字编程的基本知识。...您所在的位置: &
10.2.1 调试菜单和工具栏(2)
10.2.1 调试菜单和工具栏(2)
刘彦博等译
人民邮电出版社
《Visual+Studio技术大全》第10章代码调试,本章,我们会从调试应用程序的基础知识开始。然后再更深层次地讨论Visual Studio 2008的调试器。本节为大家介绍调试菜单和工具栏。
10.2.1 调试菜单和工具栏(2)
调试工具栏
Debug(调试)工具栏提供了快速访问一些Debug菜单中的关键项的功能。使用这个工具栏,你可以管理调试会话。比如,可以启动或继续一个调试会话,停止一个执行会话,逐语句(调试)代码,等等。
图10-14显示了活动调试会话中的Debug工具栏。在设计模式中,Continue按钮的标题是Start Debugging(启动调试),还有很多项都被禁用了。我们给每个工具栏的每个项都做了标注。可以交叉参考这些标注与表10-2来获取更多信息。
(点击查看大图)图10-14 中断模式中的Debug工具栏
表10-2 活动调试会话中的Debug菜单项
注解&在图10-14右部的Breakpoints窗口图标标记为"Debug windows",实际上是一个下拉菜单。这个下拉菜单可供开发人员访问许多调试窗口。参见图10-13关于可从该工具栏项访问的菜单的示例。
【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
本书选取了12位资深从业人员的经典案例分析,并由百度营销研究院
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
马克o桑布恩不仅带来了弗雷德的近况,更将追求卓越的
快乐的员工就一定能干吗?为什么满意度和绩效不一定相
思想决定行为,行为决定习惯,习惯决定性格,性格决定
本书以一个模拟局域网组建为思路,介绍了与局域网组建各主要方面相关的知识及组建、配置方法。本书所介绍的内容主要包括:局域网
51CTO旗下网站也许你也喜欢}

我要回帖

更多关于 ps动画窗口在哪里 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信