pDC-gtMoveTo0rect.Height-1 pDC-gtLineTo00 pDC-gtLineTorect.Width-10 if pen2Created pen2.CreatePenPS_SOLID 1 downCol pDC-gtSelectObject amppen2 if pen1Created pen1.DeleteObject pen1Created FALSE //画右下边缘 pDC-gtMoveTorect.Width-10 pDC-gtLineTorect.Width-1rect.Height-1 pDC-gtLineTo0rect.Height-1 pDC-gtMoveTorect.Width-21 pDC-gtLineTorect.Width-2rect.Height-2 pDC-gtLineTo0rect.Height-2 if pen2Created//删除quotpen2quot画笔对象 pen2.DeleteObject pen2Created FALSE if pen1Created pen1.CreatePenPS_SOLID 1 edgeCol pOldPen pDC-gtSelectObject amppen1 if pen1Created pen1.DeleteObject pen1Created FALSE if pOldPen NULL pDC-gtSelectObject pOldPen void CAviButton::DrawItemLPDRAWITEMSTRUCT lpDrawItemStruct // TODO: Add your code to draw the specified item CRect rect GetClientRectrect if ::IsWindowAnimateCtrl //在按钮上生成一个动画控件 AnimateCtrl.CreateWS_CHILD WS_VISIBLErectthis0 //打开 avi 文件并显示第一帧 AnimateCtrl.Openm_nAviID AnimateCtrl.GetClientRectrect CDC pDC CDC::FromHandlelpDrawItemStruct-gthDC UINT nState lpDrawItemStruct-gtitemState CRect buttonRect GetClientRectbuttonRect //绘制按钮 DrawButtonpDC nState buttonRectBOOL CAviButton::CreateLPCTSTR lpszClassName LPCTSTR lpszWindowNameDWORDdwStyle const RECTamp rect CWnd pParentWnd UINT nID CCreateContext pContext // TODO: Add your specialized code here and/or call the base class return CWnd::CreatelpszClassName lpszWindowName dwStyle rect pParentWnd nID pContextvoid CAviButton::OnMouseMoveUINT nFlags CPoint point // TODO: Add your message handler code here and/or call default ClientToScreenamppoint CRect rcWindow GetWindowRectrcWindow //判断鼠标是否经过按钮 BOOL bNewMouseOverButton rcWindow.PtInRectpoint if bNewMouseOverButton ampamp IsWindowEnabled if ::IsWindowAnimateCtrl ampamp bPlaying AnimateCtrl.Play0-11 bPlaying TRUE SetCapture else bPlaying FALSE ReleaseCapture CButton::OnMouseMovenFlags point/////////////////////////////////BOOL CTestAviButtonDlg::OnInitDialog CDialog::OnInitDialog …………………//此处代码省略; m_AviButton.LoadAviIDR_AVI return TRUE // return TRUE unless you set the focus to a control 四、小结 通过 CAnimateCtrl 类和按钮控件的自画功能的结合,本实例实现了动画按钮,如果该类和工具条、状态条等控件结合,还可以实现在上述控件上播放动画视频流的效果。
用 Visual C设计屏幕抓图程序(加入日期:2006-9-9)【收藏文章】【对此文发表评论】【保存文章至硬盘】【打印文章】【字体:大 中 小】 在 Windows 操作系统中,当用户按下quotPrintScreenquot按钮后,Windows自动将当前屏幕的图像拷贝到系统剪贴板中, 这时可以通过quot画笔quot这个小程序将剪贴板中的内容保存成图像文件,可以看出,如果需要将当前屏幕保存下来还是比较麻烦的,能否可以自己编写一个应用程序,自动将当前屏幕的内容保存到一个图像文件中去呢?这个答案是肯定的, 本实例应用程序就是利用通用的热键管理 DLL 库实现的热键功能, 在收到热键通知后截取屏幕的内容并保存到 bmp 文件中。
例如我们设置图片保存路径为 c:,热键为 F9 Control,然后按 Change按钮设置好热键,那么当我们按下 CTRLF9 后,当前界面将以 BMP 图像文件的格式被保存在 C:目录下。
一、实现方法 热键管理 DLL 实际上是一个键盘钩子,由它来监视系统的键盘事件。
如果有和程序登记符合的按键组合就通知该程序的窗口。
为了应用方便,本实例把它做成了一个标准的管理库来为其它的程序通过热键服务,它有两个输出函数:AddHotkey()和 DeleteHotkey(),程序只需要调用这两个函数就可以了,如果编译之后不用改变热键,则只需要 AddHotkey 就可以了。
DLL 中的所有的全局变量都放在一个共享段中,定义如下:pragma data_segquotshareddataquotHHOOK hHook NULL //钩子句柄UINT nHookCount 0 //挂接的程序数目static UCHAR HotKeyMAX_KEY 0 //热键虚拟键码static UCHAR HotKeyMaskMAX_KEY 0 //组合掩码control4alt2shift1static HWND hCallWndMAX_KEY 0 //window handle associated withhotkeystatic int KeyCount 0static UCHAR MaskBits 0 //00000 Ctrl4 amp Alt2 amp Shift1pragma data_seg 关于共享段,有几点重要的说明:一是必须在链接选项里指定该段为共享:一种方法是在 project-gtsettings-gtlink-gtobject/library 中加上/section:shareddatarws;第二种方法是在 def 文件的 sections 里加上一句shareddata read write shared;第三种指定共享段的方法在程序里加上一句pragma commentlinkerquotsection:shareddatarwsquot。
二是所有的变量必须初始化,否则链接程序会把它放到普通数据段。
三是如果不初始化变量,需要在段外用quot__declspecallocatequotshareddataquot 变量类型 变量名quot的方式定义。
DLL 中的两个输出函数分别用来添加/删除热键,函数代码如下:BOOL __declspecdllexport __stdcall AddHotkeyHWND hWndUCHARcKeyUCHAR cMask BOOL bAddedFALSE forint index0indexltMAX_KEYindex ifhCallWndindex0 hCallWndindexhWnd HotKeyindexcKey HotKeyMaskindexcMask bAddedTRUE KeyCount break return bAdded//删除热键BOOL __declspecdllexport __stdcall DeleteHotkeyHWND hWndUCHAR cKeyUCHAR cMask BOOL bRemovedFALSE forint index0indexltMAX_KEYindex ifhCallWndindexhWnd ifHotKeyindexcKeyampampHotKeyMaskindexcMask hCallWndindexNULL HotKeyindex0 HotKeyMaskindex0 bRemovedTRUE KeyCount-- break return bRemoved DLL 中的钩子函数如下:LRESULT CALLBACK KeyboardProcint nCodeWPARAM wParamLPARAM lParam BOOL bProcessedFALSE ifHC_ACTIONnCode iflParamamp0xc00000000xc0000000// 有键松开 switchwParam case VK_MENU: MaskBitsampALTBIT break case VK_CONTROL: MaskBitsampCTRLBIT break case VK_SHIFT: MaskBitsampSHIFTBIT break default: //judge the key and send message break forint index0indexltMAX_KEYindex ifhCallWndindexNULL continueifIsWindowhCallWndindexampampHotKeyindexwParamampampHotKeyMaskindexMaskBits SendMessagehCallWndindexWM_HOTKEYwParamWM_KEYUP bProcessedTRUE else iflParamamp0xc000ffff1 //有键按下 switchwParam case VK_MENU: MaskBitsALTBIT break case VK_CONTROL: MaskBitsCTRLBIT break case VK_SHIFT: MaskBitsSHIFTBIT break default: //judge the key and send message break forint index0indexltMAX_KEYindex ifhCallWndindexNULL continueifIsWindowhCallWndindexampampHotKeyindexwParamampampHotKeyMaskindexMaskBits SendMessagehCallWndindexWM_HOTKEYwParamWM_KEYDOWN bProcessedTRUE ifbProcessed //一般按键事件,为监视键盘的程序留出余地 forint index0indexltMAX_KEYindex i
上一篇:
VC++俄罗斯方块课程设计报告(含源代码)
下一篇:
对普通机床的认识