用Visual C++实现带阴影弹出窗口的技术.doc_第1页
用Visual C++实现带阴影弹出窗口的技术.doc_第2页
用Visual C++实现带阴影弹出窗口的技术.doc_第3页
用Visual C++实现带阴影弹出窗口的技术.doc_第4页
用Visual C++实现带阴影弹出窗口的技术.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用VisualC+实现带阴影弹出窗口的技术一问题的提出 在WINDOWS的WINHELPER帮助系统中大量使用一类带阴影的弹出窗口, 这类窗口非常简洁,并具有立体感,它们用来显示一些只读信息.此类弹出窗口不同于一般的窗口,它们没有标题和滚动杆,但都具有带阴影的边框, 并且其窗口的大小随显示字符串多少而自动调节,当显示信息弹出之后,任何来自键盘或鼠标的消息都将导致弹出窗口的消失。 然而WINDOWS API接口中没有现成的函数来实现此项功能,即使是最新版的 VISUAL C+ MFC也没有提供现成的类和函数来实现带阴影的此类窗口。为此,笔者基于面向对象的程序设计思想,从CWnd派生一个新类来实现这个功能,并且将该类窗口的所有函数完全封装在一起,使用就像调用“ MessageBox()”函数显示信息一样简单。 二实现方法的几个关键部分说明如下 ,要解决怎样画非用户区的问题:当WINDOWS需要创建一个窗口时,它发送两个消息:WM_NCPAINT和 WM_PAINT到应用程序消息队列。WM_NCPAINT用于重画窗口的非用户区,如标题,边框和滚动杆,本程序正是响应WM_NCPAINT消息来重画带阴影的弹出窗口的边框;画客户区很简单,只需响应WM_PAINT消息处理字符的显示即可.2.如何动态调整弹出窗口的尺寸:大家知道,在一个矩形内显示文本串时,常用函数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(0,0,MAXWIDTH,0);/ /获得待显示的字符串 sText 的实际高度和宽度,并将其存入矩形rect中 dc.DrawText(sText,rect,DT_WORDBREAK|DT_CENTER|DT_CALCRECT|DT_NOPREFIX); 3.怎样获取对系统的控制权: 在带阴影的弹出窗口显示之后,怎样获取对系统的控制权,使得当用户按下键盘任意键或鼠标时都将使带阴影的弹出窗口消失,这里采取的方法是,当弹出窗口创建和显示之后,立即进入一个消息循环,从应用程序队列中获取所有消息,并判断是否为鼠标消息或键盘消息,如是,则摧毁窗口结束,并将控制权归还给调用程序.实现片断如下: /进入消息循环,获取全部消息,控制整个系统 MSG Msg; BOOL bDone; SetCapture(); bDone=FALSE; while(!bDone) if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE) if(Msg.message=WM_KEYDOWN|Msg.message=WM_SYSKEYDOWN| Msg.message=WM_LBUTTONDOWN|Msg.message=WM_RBUTTONDOWN) bDone=TRUE; else TranslateMessage(&Msg); DispatchMessage(&Msg); ReleaseCapture(); DestroyWindow(); . 带阴影的类 CShadowWnd 类的头文件及其实现文件的全部细节 /头文件: #if !defined(AFX_SHADOWWND_H_B971A958_59CC_11D2_AC8F_0060084237F6_INCLUDED_) #define AFX_SHADOWWND_H_B971A958_59CC_11D2_AC8F_0060084237F6_INCLUDED_ #if _MSC_VER = 1000 #pragma once #endif / _MSC_VER = 1000 / 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_B971A958_59CC_11D2_AC8F_0060084237F6_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=0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55;/阴影位图数组 #define SPOPUP_SHADOWWIDTH 10 /阴影宽度 #define SPOPUP_SHADOWHEIGHT13 /阴影高度 #define MAXWIDTH400 /显示字符矩形的最大宽度 / / CShadowWnd CShadowWnd:CShadowWnd() CBitmap bmp; bmp.CreateBitmap(8,8,1,1,(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(),0,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=0; rc.left=0; 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+=5; rect.top+=5; rect.right-=SPOPUP_SHADOWWIDTH; rect.bottom-=SPOPUP_SHADOWHEIGHT; dc.SetTextColor(RGB(0,0,255);/设置显示文本颜色 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(0,0,MAXWIDTH,0); /获得待显示的字符串 sText 的实际高度和宽度 dc.DrawText(sText,rect,DT_WORDBREAK|DT_CENTER|DT_CALCRECT|DT_NOPREFIX); /为矩形留些余量 rect.right+=3*SPOPUP_SHADOWWIDTH; rect.bottom+=3*SPOPUP_SHADOWHEIGHT; this-Create(rect,0);/创建窗口 this-ShowWindow(SW_SHOW); /显示窗口 this-UpdateWindow(); /立刻更新窗口 /进入消息循环,获取全部消息,控制整个系统 MSG Msg; BOOL bDone; SetCapture(); bDone=FALSE; while(!bDone) if(PeekMessage(&Msg,NULL,0,0,PM_REMOVE) if(Msg.message=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论