知识大全 用Visual C++实现带阴影弹出窗口的技术
Posted 阴影
篇首语:水滴集多成大海,读书集多成学问。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Visual C++实现带阴影弹出窗口的技术相关的知识,希望对你有一定的参考价值。
用Visual C++实现带阴影弹出窗口的技术 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
一.问题的提出 在WINDOWS的WINHELPER帮助系统中大量使用一类带阴影的弹出窗口 这类窗口非常简洁 并具有立体感 它们用来显示一些只读信息 此类弹出窗口不同于一般的窗口 它们没有标题和滚动杆 但都具有带阴影的边框 并且其窗口的大小随显示字符串多少而自动调节 当显示信息弹出之后 任何来自键盘或鼠标的消息都将导致弹出窗口的消失 然而WINDOWS API接口中没有现成的函数来实现此项功能 即使是最新版的 VISUAL C++ MFC也没有提供现成的类和函数来实现带阴影的此类窗口 为此 笔者基于面向对象的程序设计思想 从CWnd派生一个新类来实现这个功能 并且将该类窗口的所有函数完全封装在一起 使用就像调用 MessageBox() 函数显示信息一样简单 二.实现方法的几个关键部分说明如下
要解决怎样画非用户区的问题:当WINDOWS需要创建一个窗口时 它发送两个消息 WM_NCPAINT和 WM_PAINT到应用程序消息队列 WM_NCPAINT用于重画窗口的非用户区 如标题 边框和滚动杆 本程序正是响应WM_NCPAINT消息来重画带阴影的弹出窗口的边框 画客户区很简单 只需响应WM_PAINT消息处理字符的显示即可 如何动态调整弹出窗口的尺寸:大家知道 在一个矩形内显示文本串时 常用函数DrawText(HDC hDC LPTSTR lpszText int cbCount RECT FAR* lpRect UINT fuFormat) 但是 此时我们的带阴影的弹出窗口并为建立 当然不能利用它来显示 然而 我们注意到上述函数中的最后一个参数FuFormat 它是文字格式的组合 其中有一个鲜为人知的参数 DT_CALCRECT 使用这个参数 字符串不显示 但它根据当前字体测量待显示串的高度 本程序正是根据这个参数来确定弹出窗口的大小 并以此建立一个随字符串大小而变化的窗口 下面给出其实现该功能的片断:
void CShadowWnd::ShowText(CString sText) dc CreateDC( DISPLAY NULL NULL NULL); //创建一个显示设备描述表 dc SelectObject(GetStockObject(SYSTEM_FONT)); //选择字体到设备描述表 CRect rect( MAXWIDTH );// //获得待显示的字符串 sText 的实际高度和宽度 并将其存入矩形rect中 dc DrawText(sText rect DT_WORDBREAK|DT_CENTER|DT_CALCRECT|DT_NOPREFIX); 怎样获取对系统的控制权: 在带阴影的弹出窗口显示之后 怎样获取对系统的控制权 使得当用户按下键盘任意键或鼠标时都将使带阴影的弹出窗口消失 这里采取的方法是 当弹出窗口创建和显示之后 立即进入一个消息循环 从应用程序队列中获取所有消息 并判断是否为鼠标消息或键盘消息 如是 则摧毁窗口结束 并将控制权归还给调用程序 实现片断如下: //进入消息循环 获取全部消息 控制整个系统 MSG Msg; BOOL bDone; SetCapture(); bDone=FALSE; while(!bDone) if(PeekMessage(&Msg NULL PM_REMOVE)) if(ssage==WM_KEYDOWN||ssage==WM_SYSKEYDOWN|| ssage==WM_LBUTTONDOWN||ssage==WM_RBUTTONDOWN) bDone=TRUE; else TranslateMessage(&Msg); DispatchMessage(&Msg); ReleaseCapture(); DestroyWindow(); …… 带阴影的类 CShadowWnd 类的头文件及其实现文件的全部细节 //头文件: #if !defined(AFX_SHADOWWND_H__B A _ CC_ D _AC F_ F __INCLUDED_) #define AFX_SHADOWWND_H__B A _ CC_ D _AC F_ F __INCLUDED_ #if _MSC_VER >= #pragma once #endif // _MSC_VER >= // ShadowWnd h : header file // ///////////////////////////////////////////////////////////////////////////// // CShadowWnd window class CShadowWnd : public CWnd // Construction public: CShadowWnd(); // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //AFX_VIRTUAL(CShadowWnd) public: virtual BOOL Create(const RECT& rect CWnd* pParentWnd); //AFX_VIRTUAL // Implementation public: CString m_sShowText; void ShowReadOnlyText(CString sText); CBrush m_bmpBrush; virtual ~CShadowWnd();
// Generated message map functions protected: //AFX_MSG(CShadowWnd) afx_msg void OnNcPaint(); afx_msg void OnPaint(); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); //AFX_MSG DECLARE_MESSAGE_MAP() ; ///////////////////////////////////////////////////////////////////////////// //AFX_INSERT_LOCATION // Microsoft Developer Studio will insert additional declarations immediately before the previous line #endif // !defined(AFX_SHADOWWND_H__B A _ CC_ D _AC F_ F __INCLUDED_) //实现文件 // ShadowWnd cpp : implementation file // #include stdafx h #include Shadow h #include ShadowWnd h #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //定义常数 static int aPattern[]= xAA x xAA x xAA x xAA x ;//阴影位图数组 #define SPOPUP_SHADOWWIDTH //阴影宽度 #define SPOPUP_SHADOWHEIGHT //阴影高度 #define MAXWIDTH //显示字符矩形的最大宽度 ///////////////////////////////////////////////////////////////////////////// // CShadowWnd CShadowWnd::CShadowWnd() CBitmap bmp; bmp CreateBitmap( (void* )aPattern);//创建一个阴影位图 m_bmpBrush CreatePatternBrush(&bmp); //创建一把阴影刷 CShadowWnd::~CShadowWnd() BEGIN_MESSAGE_MAP(CShadowWnd CWnd) //AFX_MSG_MAP(CShadowWnd) ON_WM_NCPAINT() ON_WM_PAINT() ON_WM_CREATE() //AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CShadowWnd message handlers BOOL CShadowWnd::Create(const RECT& rect CWnd* pParentWnd) // TODO: Add your specialized code here and/or call the base class const char* pClassName=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW); return CWnd::CreateEx(WS_EX_STATICEDGE pClassName Shadow window WS_POPUP rect left rect top rect right rect bottom pParentWnd >GetSafeHwnd() NULL);
void CShadowWnd::OnNcPaint() // TODO: Add your message handler code here CWindowDC dc(this); CRect rc; GetWindowRect(&rc); rc right =rc left; //width rc bottom =rc top; //height rc top= ; rc left= ; m_bmpBrush UnrealizeObject(); CBrush* OldBrush=dc SelectObject(&m_bmpBrush); //画底部阴影 dc PatBlt(rc left+SPOPUP_SHADOWWIDTH rc bottom SPOPUP_SHADOWHEIGHT rc right SPOPUP_SHADOWWIDTH SPOPUP_SHADOWHEIGHT PATCOPY); //画右边阴影 dc PatBlt(rc right SPOPUP_SHADOWWIDTH rc top+SPOPUP_SHADOWHEIGHT SPOPUP_SHADOWWIDTH rc bottom PATCOPY); dc SelectObject(OldBrush); //restore old brush CBrush* pBrush=CBrush::FromHandle(GetSysColorBrush(COLOR_WINDOWFRAME)); rc right =SPOPUP_SHADOWWIDTH; rc bottom =SPOPUP_SHADOWHEIGHT; dc FrameRect(rc pBrush); //画边框 // Do not call CWnd::OnNcPaint() for painting messages void CShadowWnd::OnPaint() CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CRect rect; GetClientRect(&rect); rect left+= ; rect top+= ; rect right =SPOPUP_SHADOWWIDTH; rect bottom =SPOPUP_SHADOWHEIGHT; dc SetTextColor(RGB( ));//设置显示文本颜色 dc DrawText(m_sShowText rect DT_WORDBREAK|DT_NOPREFIX); // Do not call CWnd::OnPaint() for painting messages void CShadowWnd::ShowReadOnlyText(CString sText) m_sShowText=sText; //存入显示字符串 CDC dc; dc CreateDC( DISPLAY NULL NULL NULL); //创建一个显示设备描述表 dc SelectObject(GetStockObject(SYSTEM_FONT)); //选择字体到设备描述表 CRect rect( MAXWIDTH ); //获得待显示的字符串 sText 的实际高度和宽度 dc DrawText(sText rect DT_WORDBREAK|DT_CENTER|DT_CALCRECT|DT_NOPREFIX); //为矩形留些余量 rect right+= *SPOPUP_SHADOWWIDTH; rect bottom+= *SPOPUP_SHADOWHEIGHT; this >Create(rect );//创建窗口 this >ShowWindow(SW_SHOW); //显示窗口 this >UpdateWindow(); //立刻更新窗口 //进入消息循环 获取全部消息 控制整个系统 MSG Msg; BOOL bDone; SetCapture(); bDone=FALSE; while(!bDone) if(PeekMessage(&Msg NULL PM_REMOVE)) if(ssage==WM_KEYDOWN||ssage==WM_SYSKEYDOWN|| ssage==WM_LBUTTONDOWN||ssage==WM_RBUTTONDOWN) bDone=TRUE; else TranslateMessage(&Msg); DispatchMessage(&Msg); ReleaseCapture(); DestroyWindow(); int CShadowWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) if (CWnd::OnCreate(lpCreateStruct) == ) return ; // TODO: Add your specialized creation code here CenterWindow(); return ; 四 使用方法: 将该类增加到一个项目文件中 在你欲使用函数的类(一般为视类或框架窗口类)中增加一个成员变量(如:CshadowWnd m_ShadowWnd) 当需要使用带阴影的弹出窗口显示信息时 调用成员函数(如: m_ShadowWnd ShowText(String sText)即可 无须考虑其实现细节 本程序在Visual C++ 环境下编译通过 此例也说明了对于WINDOWS 下的程序设计 必须掌握OOP 方法 同时也体现 出VISUAL C++ MFC类库的强大功能 cha138/Article/program/net/201311/11375相关参考
知识大全 Visual C++设计超强仿QQ自动伸缩窗口[3]
VisualC++设计超强仿QQ自动伸缩窗口[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 Visual C++设计超强仿QQ自动伸缩窗口[4]
VisualC++设计超强仿QQ自动伸缩窗口[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&
知识大全 Visual C++设计超强仿QQ自动伸缩窗口[2]
VisualC++设计超强仿QQ自动伸缩窗口[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&
用VisualC++2005编写更快的代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 对于C
<SCRIPTlanguage=javascript>functiondefaulin()varexiinurlownwin;url=;exiin=windowopen(urlnowexi
知识大全 每次看一些网页老是弹出广告窗口,都是些杂七杂八的网站,烦死了
哪个手机浏览器能阻止弹出窗口啊!每次看一些网页老是弹出广告窗口,都是些杂七杂八的网站,烦死了!我现在用的火猴浏览器暂时没发现弹窗广告,题主可以用下,。急!浏览器老是阻止弹出窗口。这是那些网站上面的"弹
一般来说显示在最前面的窗口都是因为窗口被激活获得焦点要使窗口永远显示在最前面可以人为的设置窗口在blur时立刻focus或者用模式无模式对话框实现 cha138/Article/p
我的VisualC++入门之路 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!N次失败次成功还学的不
VisualC++中OpenGL编程入门 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Open
VisualC++制作一个Sniffer实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Snif