【VC++开源代码栏目提醒】:网学会员VC++开源代码为您提供VC++编程技术600个大型项目源码(一) - 项目管理参考,解决您在VC++编程技术600个大型项目源码(一) - 项目管理学习中工作中的难题,参考学习。
Visual C 开发环境为控件提供的自绘制功能使程序员能够充分发挥自己的创造性来设计比较漂亮的程序界面。
所谓AVI按钮是指每当鼠标从按钮上经过时就播放一段按钮提示的AVI在许多的游戏程序以及三维动画
软件中如摩托英豪、Cool 3D等都广泛的采用了这种AVI按钮。
它使得程序的用户界面很具有动感也使得我们的程序至少看上去更专业本实例借助Visual C强大的控件自绘制功能来实现这种AVI按钮的原理及实现。
一、实现方法 为了实现能够播放AVI视频流的动画按钮还是需要利用控件的重载功能这部分内容本书已经在《实例实现XP风格的按钮》中介绍了这里就不再赘述了读者可以参考该实例查阅相关内容。
本实例主要探讨如何使用MFC的CanimateCtrl动画类播放AVI格式的视频流视频流可以来自一个AVI文件也可以来自资源。
在程序中合理地使用动画控件可以使程序的界面更加形象生动。
MFC的CAnimateCtrl类封装了动画控件该类的Create成员函数负责创建动画控件其声明为 BOOL Create DWORD dwStyle const RECTamp rect CWnd pParentWnd UINT nID 函数中的参数dwStyle是如表一所示的控件风格的组合参数rect指定了控件的尺寸pParentWnd指向父窗口nID是控件的ID。
若创建成功则函数返回TRUE。
风格 含义 ACS_CENTER 使动画片居于控件中央并使动画片打开后控件窗口的尺寸和位置保持不变。
如果不指定该风格则控件的尺寸会自动调整来适应动画片的大小。
ACS_TRANSPARENT 使动画片的背景透明不输出动画片的背景色。
ACS_AUTOPLAY 一旦打开动画片后就一直重复播放。
表一、动画控件的风格 除表中的风格外一般还要为动画控件指定WS_CHILD、WS_VISIBLE和WS_BORDER窗口风格。
例如要创建一个能自动播放的动画控件应该指定其风格为WS_CHILDWS_VISIBLEWS_BORDERACS_AUTOPLAY。
CAnimateCtrl类主要的成员函数包括BOOL Open LPCTSTR lpszFileName 、BOOL Open UINT nID 、BOOL Play UINT nFrom UINT nTo UINT nRep 、BOOL Seek UINT nTo 、BOOL Stop 、BOOL Close 等。
上述的Open函数从AVI文件或资源中打开视频流如果参数lpszFileName或nID为NULL则系统将关闭以前打开的视频流。
Play函数用来播放选定的视频流参数nFrom指定了播放的开始帧的索引索引值必须小于65536若为0则从头开始播放。
nTo指定了结束帧的索引它的值必须小于65536若为-1则表示播放到视频流的末尾。
nRep是播放的重复次数若为-1则无限重复播放。
Seek函数用来静态地显示视频流的某一帧。
参数nTo是帧的索引其值必须小于65536若为0则显示第一帧若为-1则显示最 后一帧若成功 则函数返回TRUE。
Stop函数用来停止动画片的播放。
Close函数用来关闭并从内存中清除视频流。
上述所有函数都是调用成功返回TRUE否则返回FALSE。
读者朋友们在
学习的过程中要注意动画控件并不能播放所有的AVI文件只有满足下列条件的AVI文件才能被播放1AVI文件必须是无声的不能有声道2AVI文件必须是未压缩的或是用RLE算法
压缩的3AVI的调色板必须保持不变。
另外动画控件最大的一个局限性在于它只能显示系统调色板中缺省的颜色因此如果用动画控件来播放一个256色的AVI文件那么播放效果看起来就象一个16色的动画一样很不理想。
总之动画控件只能播放一些简单的颜色数较少的AVI动画。
如果要较满意地播放256色的AVI文件就要利用MCI接口这部分内容请读者朋友参阅有关资料。
二、编程步骤 1、启动Visual C6.0生成一个基于对话框的应用程序取其项目名为 TestAviButton 然后按下 Finish 按钮来完成工程的创建 2、使用Class Wizard菜单命令以CButton 为基类创建CAviButton 类生成类的头文件 AviButton.h 和实现文件 AviButton.cpp同时在类中重载 Create、DrawItem函数和 WM_MOUSEMOVE的消息映射 3、打开工程中ID值为IDD_TESTAVIBUTTON_DIALOG 的对话框进行编辑该对话框的提示文本为quot将鼠标移至按钮上quot删除quot取消quot按钮将quot确定quot按钮的属性 Styles 改为 OwnerDraw 并去掉其提示文本 quot确定quot另外执行 Insert Resource?? 命令在弹出的对话框中按下 Custom?? 按钮然后输入quotAVIquot向程序中添加quotAVIquot格式的资源然后选择AVI类型的文件向项目中添加quotAVIquot格式的资源IDR_AVI 4、添加
代码编译运行程序此时每当我们的鼠标经过按钮时一个漂亮的AVI按钮就产生了。
三、实现
代码 /////////////////////////////// AviButton.h : header file if definedAFX_AVIBUTTON_H__5E20D4EF_864E_11D7_886E_F16C81CD642B__INCLUDED_ define AFX_AVIBUTTON_H__5E20D4EF_864E_11D7_886E_F16C81CD642B__INCLUDED_ if _MSC_VER gt 1000 pragma once endif // _MSC_VER gt 1000 class CAviButton : public CButton AFX_VIRTUAL // Implementation public: virtual CAviButton // Generated message map functions protected: //AFX_MSG DECLARE_MESSAGE_MAP endif ////////////////////////////CAviButton.CPP文件 include quotstdafx.hquot include quotTestAviButton.hquot include quotAviButton.hquot ifdef _DEBUG define new DEBUG_NEW undef THIS_FILE static char THIS_FILE __FILE__ endif CAviButton::CAviButton CAviButton::CAviButton void CAviButton::LoadAviUINT nAviID BEGIN_MESSAGE_MAPCAviButton CButton //AFX_MSG_MAP END_MESSAGE_MAP ///////////////////// CAviButton message handlers void CAviButton::DrawButtonCDC pDC UINT nState CRect rect else CPen pOldPen NULL BOOL pen1Created CPen pen1 BOOL pen2Created CPen pen2 if pen1Created pen1.CreatePenPS_SOLID 1 upCol pOldPen pDC-gtSelectObject amppen1 //画左上边缘 pDC-gtMoveTo1rect.Height-1 pDC-gtLineTo11 pDC-gtLineTorect.Width-11 pDC-gtMoveTo0rect.Height-1 pDC-gtLineTo00 pDC-gtLineTorect.Width-10 if pen2Created pen2.CreatePenPS_SOLID 1 downCol pDC-gtSelectObject amppen2 if pen1Created //画右下边缘 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画笔对象 if pen1Created pen1.CreatePenPS_SOLID 1 edgeCol pOldPen pDC-gtSelectObject amppen1 if pen1Created if pOldPen NULL pDC-gtSelectObject pOldPen void CAviButton::DrawItemLPDRAWITEMSTRUCT lpDrawItemStruct CDC pDC CDC::FromHandlelpDrawItemStruct-gthDC UINT nState lpDrawItemStruct-gtitemState CRect buttonRect GetClientRectbuttonRect //绘制按钮 DrawButtonpDC nState buttonRect BOOL CAviButton::CreateLPCTSTR lpszClassName LPCTSTR lpszWindowName DWORD dwStyle const RECTamp rect CWnd pParentWnd UINT nID CC reateContext pContext void CAviButton::OnMouseMoveUINT nFlags CPoint point else CButton::OnMouseMovenFlags point ///////////////////////////////// BOOL CTestAviButtonDlg::OnInitDialog 四、小结 通过CAnimateCtrl类和按钮控件的自画功能的结合本实例实现了动画按钮如果该类和工具条、状态条等控件结合还可以实现在上述控件上播放动画视频流的效果。
用用用用Visual CVisual CVisual CVisual C设计屏幕抓图程序
设计屏幕抓图程序设计屏幕抓图程序设计屏幕抓图程序 加入日期加入日期加入日期加入日期:2006:2006:2006:2006----9999----9999 【【【【收藏文章收藏文章收藏文章收藏文章】【】【】【】【对此文发表评论对此文发表评论对此文发表评论对此文发表评论】【】【】【】【保存文章至硬盘保存文章至硬盘保存文章至硬盘保存文章至硬盘】】】】【【【【打印文章打印文章打印文章打印文章】【】【】【】【字体字体字体字体大大大大 中中中中 小小小小】】】】 在Windows操作系统中当用户按下quotPrintScreenquot按钮后Windows自动将当前屏幕的图像拷贝到
系统剪贴板中这时可以通过quot画笔quot这个小程序将剪贴板中的内容保存成图像文件可以看出如果需要将当前屏幕保存下来还是比较麻烦的能否可以自己编写一个应用程序自动将当前屏幕的内容保存到一个图像文件中去呢这个答案是肯定的本实例应用程序就是利用通用的热键管理DLL库实现的热键功能在收到热键通知后截取屏幕的内容并保存到bmp文件中。
例如我们设置图片保存路径为c热键为F9 Control然后按Change按钮设置好热键那么当我们按下CTRLF9后当前界面将以BMP图像文件的格式被保存在C目录下。
一、实现方法 热键管理DLL实际上是一个键盘钩子由它来监视系统的键盘事件。
如果有和
程序登记符合的按键组合就通知该程序的窗口。
为了应用方便 本实例把它做成了一个标准的管理库来为其它的程序通过热键服务它有两个输出函数AddHotkey和DeleteHotkey程序只需要调用这两个函数就可以了如果编译之后不用改变热键则只需要AddHotkey就可以了。
DLL中的所有的全局变量都放在一个共享段中定义如下 pragma data_segquotshareddataquot HHOOK hHook NULL //钩子句柄 UINT nHookCount 0 //挂接的程序数目 static UCHAR HotKeyMAX_KEY //热键虚拟键码 static UCHAR HotKeyMaskMAX_KEY //组合掩码 control4alt2shift1 static HWND hCallWndMAX_KEY //window handle associated with hotkey static int KeyCount 0 static UCHAR MaskBits 0 //00000 Ctrl4 amp Alt2 amp Shift1 pragma 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 hWndUCHAR cKeyUCHAR cMask return bAdded //删除热键 BOOL __declspecdllexport __stdcall DeleteHotkeyHWND hWnd UCHAR cKeyUCHAR cMask return bRemoved DLL中的钩子函数如下 LRESULT CALLBACK KeyboardProcint nCodeWPARAM wParamLPARAM lParam forint index0indexltMAX_KEYindex else iflParamamp0xc000ffff1 forint index0indexltMAX_KEYindex ifbProcessed return CallNextHookEx hHook nCode wParam lParam 抓图程序是一个基于对话框的程序它在建立对话框的时候调用前面的 DLL登记热键因此需要将hook.lib添加到工程里在程序里给出两个DLL函数的定义也可以写个头文件再包含进来以下
代码 BOOL __declspecdllexport__stdcall AddHotkeyHWNDUCHAR keyUCHAR mask BOOL __declspecdllexport__stdcall DeleteHotkeyHWNDUCHAR keyUCHAR mask 为了添加应用程序对热键通知事件的响应程序中用的办法是重载WindowProc函数该函数
代码如下 LRESULT CCaptureDlg::WindowProcUINT message WPARAM wParam LPARAM lParam ???? //其它处理及默认处理 将屏幕图像保存到BMP文件中的任务是由函数SaveBmp来完成的具体实现参见
代码部分。
另外为了顺利实现屏幕抓图程序中还实现了quot托盘quot功能由于这一部分本书在实例中已经专门介绍过了所以不再赘述读者朋友可以参考相关实例。
最后需要提醒读者朋友们注意的是源程序的编译与使用时要先编译hook.dll并将其放在系统目录win2000/NT是system3298/ME是system然后编译对话框程序运行即可。
二、编程步骤 1、 启动Visual C生成一个DLL项目和一个基于对话框的应用程序项目并将两个项目分别命名为quotHookquot和quotCapturequot 2、 在quotHookquot项目中导出AddHotkey、DeleteHotkey函数 3、 在quotCapturequot项目中按照图一所示设置对话框的界面具体设置参见
代码部分 4、 使用Class Wizard在quotCapturequot项目中添加按钮的鼠标单击消息响应函数并重载对话框的WindowProc函数 5、 添加
代码编译运行程序。
三、程序
代码 /////////////////////////////////////////////////////////// Hook.h : main header file for the HOOK DLL if definedAFX_HOOK_H__AEBFF705_C93A_11D5_B7D6_0080C82BE86B__INCLUDED_ define AFX_HOOK_H__AEBFF705_C93A_11D5_B7D6_0080C82BE86B__INCLUDED_ if _MSC_VER gt 1000 pragma once endif // _MSC_VER gt 1000 ifndef __AFXWIN_H__ error include stdafx.h before including this file for PCH endif include quotresource.hquot // main symbols class CHookApp : public CWinApp AFX_VIRTUAL //AFX_MSG DECLARE_MESSAGE_MAP LRESULT CALLBACK KeyboardProcint nCodeWPARAM wParam LPARAM lParam BOOL __declspecdllexport__stdcall AddHotkeyHWNDUCHAR keyUCHAR mask BOOL __declspecdllexport__stdcall DeleteHotkeyHWNDUCHAR keyUCHAR mask BOOL InitHotkey BOOL UnInit endif ////////// Hook.cpp : Defines the initialization routines for the DLL. include quotstdafx.hquot include quothook.hquot include ltwindowsx.hgt ifdef _DEBUG define new DEBUG_NEW undef THIS_FILE static char THIS_FILE __FILE__ endif define MAX_KEY 100 define CTRLBIT 0x04 define ALTBIT 0x02 define SHIFTBIT 0x01 pragma data_segquotshareddataquot HHOOK hHook NULL UINT nHookCount 0 static UCHAR HotKeyMAX_KEY //hotkey static UCHAR HotKeyMaskMAX_KEY //flag for hotkey value is VK_CONTRL or VK_NEMU or VK_SHIFT static HWND hCallWndMAX_KEY //window associated with hotkey static int KeyCount 0 static UCHAR MaskBits 0 //00000 Ctrl Alt Shift pragma data_seg HINSTANCE hins void VerifyWindow BEGIN_MESSAGE_MAPCHookApp CWinApp //AFX_MSG_MAP END_MESSAGE_MAP CHookApp::CHookApp CHookApp theApp LRESULT CALLBACK KeyboardProcint nCodeWPARAM wParamLPARAM lParam forint index0indexltMAX_KEYindex else iflParamamp0xc000ffff1 forint index0indexltMAX_KEYindex ifbProcessed return CallNextHookEx hHook nCode wParam lParam BOOL InitHotkey else hHookSetWindowsHookExWH_KEYBOARDHOOKPROCKeyboardProchins0 ifhHookNULL nHookCount return hHookNULL BOOL UnInit BOOL unhooked UnhookWindowsHookExhHook ifunhookedTRUE return unhooked BOOL __declspecdllexport __stdcall AddHotkeyHWND hWndUCHAR cKeyUCHAR cMask return bAdded BOOL __declspecdllexport __stdcall DeleteHotkeyHWND hWndUCHAR cKeyUCHAR cMask return bRemoved void VerifyWindow BOOL CHookApp::InitInstance int CHookApp::ExitInstance ////////////////////////////////////////////////////////////////////// CaptureDlg.h : header file if definedAFX_CAPTUREDLG_H__97B51708_C928_11D5_B7D6_0080C82BE86B__INCLUDED_ define AFX_CAPTUREDLG_H__97B51708_C928_11D5_B7D6_0080C82BE86B__INCLUDED_ if _MSC_VER gt 1000 pragma once endif // _MSC_VER gt 1000 class CCaptureDlg : public CDialog C ComboBox m_Key BOOL m_bControl BOOL m_bAlt BOOL m_bShift CString m_Path CString m_Number //AFX_DATA // ClassWizard generated virtual function overrides //AFX_VIRTUAL // Implementation protected: HICON m_hIcon // Generated message map functions //AFX_MSG DECLARE_MESSAGE_MAP endif ////////////////////// CaptureDlg.cpp : implementation file include quotstdafx.hquot include quotCapture.hquot include quotCaptureDlg.hquot include ltwindowsx.hgt pragma commentlibquothook.libquot ifdef _DEBUG define new DEBUG_NEW undef THIS_FILE static char THIS_FILE __FILE__ endif define IDM_SHELL WM_USER1 BOOL __declspecdllexport__stdcall AddHotkeyHWNDUCHAR keyUCHAR mask BOOL __declspecdllexport__stdcall DeleteHotkeyHWNDUCHAR keyUCHAR mask UCHAR Key_Table class CAboutDlg : public CDialog //AFX_DATA // ClassWizard generated virtual function overrides //AFX_VIRTUAL // Implementation protected: //AFX_MSG DECLARE_MESSAGE_MAP CAboutDlg::CAboutDlg : CDialogCAboutDlg::IDD AFX_DATA_INIT void CAboutDlg::DoDataExchangeCDataExchange pDX AFX_DATA_MAP BEGIN_MESSAGE_MAPCAboutDlg CDialog //AFX_MSG_MAP END_MESSAGE_MAP CCaptureDlg::CCaptureDlgCWnd pParent /NULL/ : CDialogCCaptureDlg::IDD pParent AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon AfxGetApp-gtLoadIconIDR_MAINFRAME void CCaptureDlg::DoDataExchangeCDataExchange pDX AFX_DATA_MAP BEGIN_MESSAGE_M APCCaptureDlg CDialog //AFX_MSG_MAP END_MESSAGE_MAP BOOL CCaptureDlg::OnInitDialog SetIconm_hIcon TRUE // Set big icon SetIconm_hIcon FALSE // Set small icon m_Key.SetCurSel0 RegisterHotkey CMenu pMenuGetSystemMenuFALSE pMenu-gtDeleteMenuSC_MAXIMIZEMF_BYCOMMAND pMenu-gtDeleteMenuSC_SIZEMF_BYCOMMAND pMenu-gtDeleteMenuSC_RESTOREMF_BYCOMMAND return TRUE // return TRUE unless you set the focus to a control void CCaptureDlg::OnSysCommandUINT nID LPARAM lParam else void CCaptureDlg::OnPaint else HCURSOR CCaptureDlg::OnQueryDragIcon void CCaptureDlg::OnCancel void CCaptureDlg::OnAbout void CCaptureDlg::OnBrowse void CCaptureDlg::SaveBmp CDC dc dc.CreateDCquotDISPLAYquotNULLNULLNULL CBitmap bm int WidthGetSystemMetricsSM_CXSCREEN int HeightGetSystemMetricsSM_CYSCREEN bm.CreateCompatibleBitmapampdcWidthHeight CDC tdc tdc.CreateCompatibleDCampdc CBitmappOldtdc.SelectObjectampbm tdc.BitBlt00WidthHeightampdc00SRCCOPY tdc.SelectObjectpOld BITMAP btm bm.GetBitmapampbtm DWORD sizebtm.bmWidthBytesbtm.bmHeight LPSTR lpDataLPSTRGlobalAllocPtrGPTRsize BITMAPINFOHEADER bih bih.biBitCountbtm.bmBitsPixel bih. biClrImportant0 bih.biClrUsed0 bih.biCompression0 bih.biHeightbtm.bmHeight bih.bi.