vc编程技术大型项目源码.docx

上传人:b****6 文档编号:5283865 上传时间:2022-12-14 格式:DOCX 页数:74 大小:69.07KB
下载 相关 举报
vc编程技术大型项目源码.docx_第1页
第1页 / 共74页
vc编程技术大型项目源码.docx_第2页
第2页 / 共74页
vc编程技术大型项目源码.docx_第3页
第3页 / 共74页
vc编程技术大型项目源码.docx_第4页
第4页 / 共74页
vc编程技术大型项目源码.docx_第5页
第5页 / 共74页
点击查看更多>>
下载资源
资源描述

vc编程技术大型项目源码.docx

《vc编程技术大型项目源码.docx》由会员分享,可在线阅读,更多相关《vc编程技术大型项目源码.docx(74页珍藏版)》请在冰豆网上搜索。

vc编程技术大型项目源码.docx

vc编程技术大型项目源码

VisualC++开发环境

在VisualC++开发环境为控件提供的自绘制功能使程序员能够充分发挥自己的创造性来设计比较漂亮的程序界面。

所谓AVI按钮是指每当鼠标从按钮上经过时就播放一段按钮提示的AVI,在许多的游戏程序以及三维动画软件中(如摩托英豪、Cool3D等)都广泛的采用了这种AVI按钮。

它使得程序的用户界面很具有动感,也使得我们的程序至少看上去更专业,本实例借助VisualC++强大的控件自绘制功能来实现这种AVI按钮的原理及实现。

  一、实现方法

  为了实现能够播放AVI视频流的动画按钮,还是需要利用控件的重载功能,这部分内容本书已经在《实例:

实现XP风格的按钮》中介绍了,这里就不再赘述了,读者可以参考该实例查阅相关内容。

本实例主要探讨如何使用MFC的CanimateCtrl动画类播放AVI格式的视频流,视频流可以来自一个AVI文件,也可以来自资源。

在程序中合理地使用动画控件,可以使程序的界面更加形象生动。

  MFC的CAnimateCtrl类封装了动画控件,该类的Create()成员函数负责创建动画控件,其声明为:

BOOLCreate(DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);

  函数中的参数dwStyle是如表一所示的控件风格的组合,参数rect指定了控件的尺寸,pParentWnd指向父窗口,nID是控件的ID。

若创建成功则函数返回TRUE。

风格含义

ACS_CENTER使动画片居于控件中央,并使动画片打开后控件窗口的尺寸和位置保持不变。

如果不指定该风格,则控件的尺寸会自动调整来适应动画片的大小。

  

ACS_TRANSPARENT使动画片的背景透明(不输出动画片的背景色)。

ACS_AUTOPLAY一旦打开动画片后就一直重复播放。

表一、动画控件的风格

  除表中的风格外,一般还要为动画控件指定WS_CHILD、WS_VISIBLE和WS_BORDER窗口风格。

例如,要创建一个能自动播放的动画控件,应该指定其风格为WS_CHILD|WS_VISIBLE|WS_BORDER|ACS_AUTOPLAY。

  CAnimateCtrl类主要的成员函数包括:

BOOLOpen(LPCTSTRlpszFileName)、BOOLOpen(UINTnID)、BOOLPlay(UINTnFrom,UINTnTo,UINTnRep)、BOOLSeek(UINTnTo)、BOOLStop()、BOOLClose()等。

  上述的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文件才能被播放:

1)AVI文件必须是无声的,不能有声道;2)AVI文件必须是未压缩的,或是用RLE算法压缩的;3)AVI的调色板必须保持不变。

另外,动画控件最大的一个局限性在于它只能显示系统调色板中缺省的颜色,因此如果用动画控件来播放一个256色的AVI文件,那么播放效果看起来就象一个16色的动画一样,很不理想。

总之,动画控件只能播放一些简单的,颜色数较少的AVI动画。

如果要较满意地播放256色的AVI文件,就要利用MCI接口,这部分内容请读者朋友参阅有关资料。

  二、编程步骤

  1、启动VisualC++6.0,生成一个基于对话框的应用程序,取其项目名为TestAviButton,然后按下Finish按钮来完成工程的创建;

  2、使用ClassWizard菜单命令以CButton为基类创建CAviButton类,生成类的头文件AviButton.h和实现文件AviButton.cpp,同时在类中重载Create()、DrawItem()函数和WM_MOUSEMOVE的消息映射;

  3、打开工程中ID值为IDD_TESTAVIBUTTON_DIALOG的对话框进行编辑,该对话框的提示文本为"将鼠标移至按钮上:

"删除"取消"按钮,将"确定"按钮的属性Styles改为OwnerDraw,并去掉其提示文本"确定";另外执行Insert|Resource…命令,在弹出的对话框中按下Custom…按钮,然后输入"AVI",向程序中添加"AVI"格式的资源,然后选择AVI类型的文件向项目中添加"AVI"格式的资源IDR_AVI;

    4、添加代码,编译运行程序,此时每当我们的鼠标经过按钮时,一个漂亮的AVI按钮就产生了。

    三、实现代码

///////////////////////////////AviButton.h:

headerfile

#if!

defined(AFX_AVIBUTTON_H__5E20D4EF_864E_11D7_886E_F16C81CD642B__INCLUDED_)

#defineAFX_AVIBUTTON_H__5E20D4EF_864E_11D7_886E_F16C81CD642B__INCLUDED_

#if_MSC_VER>1000

#pragmaonce

#endif//_MSC_VER>1000

classCAviButton:

publicCButton

{

 //Construction

 public:

  CAviButton();

 public:

  UINTm_nAviID;

  CAnimateCtrlAnimateCtrl;

  BOOLbPlaying;

  voidLoadAvi(UINTnAviID);

  voidDrawButton(CDC*pDC,UINTnState,CRectrect);

  //Overrides

  //ClassWizardgeneratedvirtualfunctionoverrides

  //{{AFX_VIRTUAL(CAviButton)

   public:

    virtualvoidDrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct);

    virtualBOOLCreate(LPCTSTRlpszClassName,LPCTSTRlpszWindowName,DWORD

dwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID,

CCreateContext*pContext=NULL);

  //}}AFX_VIRTUAL

  //Implementation

 public:

  virtual~CAviButton();

  //Generatedmessagemapfunctions

 protected:

  //{{AFX_MSG(CAviButton)

   afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint);

  //}}AFX_MSG

 DECLARE_MESSAGE_MAP()

};

#endif

////////////////////////////CAviButton.CPP文件;

#include"stdafx.h"

#include"TestAviButton.h"

#include"AviButton.h"

#ifdef_DEBUG

#definenewDEBUG_NEW

#undefTHIS_FILE

staticcharTHIS_FILE[]=__FILE__;

#endif

CAviButton:

:

CAviButton()

{

 m_nAviID=0;

 bPlaying=FALSE;

}

CAviButton:

:

~CAviButton()

{}

voidCAviButton:

:

LoadAvi(UINTnAviID)

{

 m_nAviID=nAviID;

}

BEGIN_MESSAGE_MAP(CAviButton,CButton)

 //{{AFX_MSG_MAP(CAviButton)

  ON_WM_MOUSEMOVE()

 //}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////CAviButtonmessagehandlers

voidCAviButton:

:

DrawButton(CDC*pDC,UINTnState,CRectrect)

{

 COLORREFupCol,downCol,edgeCol;

 edgeCol=RGB(0,0,0);//设置按钮边缘的初始化颜色;

 if((nState&ODS_SELECTED)==ODS_SELECTED)

 {

  //设置按钮被按下时按钮的颜色

  upCol=RGB(0,0,0);

  edgeCol=RGB(128,128,128);

  downCol=RGB(0,0,0);

 }

 else

 {

  //设置按钮正常时按钮的颜色

  upCol=RGB(255,255,255);

  downCol=RGB(128,128,128);

 }

 CPen*pOldPen=NULL;

 BOOLpen1Created;

 CPenpen1;

 BOOLpen2Created;

 CPenpen2;

 if(pen1Created=pen1.CreatePen(PS_SOLID,1,upCol))

  pOldPen=pDC->SelectObject(&pen1);

  //画左上边缘

 pDC->MoveTo(1,rect.Height()-1);

 pDC->LineTo(1,1);

 pDC->LineTo(rect.Width()-1,1);

 pDC->MoveTo(0,rect.Height()-1);

 pDC->LineTo(0,0);

 pDC->LineTo(rect.Width()-1,0);

 if(pen2Created=pen2.CreatePen(PS_SOLID,1,downCol))

  pDC->SelectObject(&pen2);

 if(pen1Created)

 {

  pen1.DeleteObject();

  pen1Created=FALSE;

 }

 //画右下边缘

 pDC->MoveTo(rect.Width()-1,0);

 pDC->LineTo(rect.Width()-1,rect.Height()-1);

 pDC->LineTo(0,rect.Height()-1);

 pDC->MoveTo(rect.Width()-2,1);

 pDC->LineTo(rect.Width()-2,rect.Height()-2);

 pDC->LineTo(0,rect.Height()-2);

 if(pen2Created)//删除"pen2"画笔对象

 {

  pen2.DeleteObject();

  pen2Created=FALSE;

 }

 if(pen1Created=pen1.CreatePen(PS_SOLID,1,edgeCol))

  pOldPen=pDC->SelectObject(&pen1);

 if(pen1Created)

 {

  pen1.DeleteObject();

  pen1Created=FALSE;

 }

 if(pOldPen!

=NULL)

  pDC->SelectObject(pOldPen);

}

voidCAviButton:

:

DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct)

{

 //TODO:

Addyourcodetodrawthespecifieditem

 CRectrect;

 GetClientRect(rect);

 if(!

:

:

IsWindow(AnimateCtrl))

 {

  //在按钮上生成一个动画控件

  AnimateCtrl.Create(WS_CHILD|WS_VISIBLE,rect,this,0);

  //打开avi文件并显示第一帧

  AnimateCtrl.Open(m_nAviID);

  AnimateCtrl.GetClientRect(rect);

 }

 CDC*pDC=CDC:

:

FromHandle(lpDrawItemStruct->hDC);

 UINTnState=lpDrawItemStruct->itemState;

 CRectbuttonRect;

 GetClientRect(buttonRect);

 //绘制按钮

 DrawButton(pDC,nState,buttonRect);

}

BOOLCAviButton:

:

Create(LPCTSTRlpszClassName,LPCTSTRlpszWindowName,DWORD

dwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID,CCreateContext*pContext)

{

 //TODO:

Addyourspecializedcodehereand/orcallthebaseclass

 returnCWnd:

:

Create(lpszClassName,lpszWindowName,dwStyle,

 rect,pParentWnd,nID,pContext);

}

voidCAviButton:

:

OnMouseMove(UINTnFlags,CPointpoint)

{

 //TODO:

Addyourmessagehandlercodehereand/orcalldefault

 ClientToScreen(&point);

 CRectrcWindow;

 GetWindowRect(rcWindow);

 //判断鼠标是否经过按钮

 BOOLbNewMouseOverButton=rcWindow.PtInRect(point);

 if(bNewMouseOverButton&&IsWindowEnabled())

 {

  if(:

:

IsWindow(AnimateCtrl)&&!

bPlaying)

  {

   AnimateCtrl.Play(0,-1,1);

   bPlaying=TRUE;

   SetCapture();

  }

 }

 else

 {

  bPlaying=FALSE;

  ReleaseCapture();

 }

 CButton:

:

OnMouseMove(nFlags,point);

}

/////////////////////////////////

BOOLCTestAviButtonDlg:

:

OnInitDialog()

{

 CDialog:

:

OnInitDialog();

 …………………//此处代码省略;

 m_AviButton.LoadAvi(IDR_AVI);

 returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

}

  四、小结

  通过CAnimateCtrl类和按钮控件的自画功能的结合,本实例实现了动画按钮,如果该类和工具条、状态条等控件结合,还可以实现在上述控件上播放动画视频流的效果。

用VisualC++设计屏幕抓图程序

(加入日期:

2006-9-9)

【收藏文章】【对此文发表评论】【保存文章至硬盘】【打印文章】【字体:

大中小】

-

  在Windows操作系统中,当用户按下"PrintScreen"按钮后,Windows自动将当前屏幕的图像拷贝到系统剪贴板中,这时可以通过"画笔"这个小程序将剪贴板中的内容保存成图像文件,可以看出,如果需要将当前屏幕保存下来还是比较麻烦的,能否可以自己编写一个应用程序,自动将当前屏幕的内容保存到一个图像文件中去呢?

这个答案是肯定的,本实例应用程序就是利用通用的热键管理DLL库实现的热键功能,在收到热键通知后截取屏幕的内容并保存到bmp文件中。

例如我们设置图片保存路径为c:

\,热键为F9+Control,然后按Change按钮设置好热键,那么当我们按下CTRL+F9后,当前界面将以BMP图像文件的格式被保存在C:

\目录下。

  一、实现方法

  热键管理DLL实际上是一个键盘钩子,由它来监视系统的键盘事件。

如果有和程序登记符合的按键组合就通知该程序的窗口。

为了应用方便,本实例把它做成了一个标准的管理库来为其它的程序通过热键服务,它有两个输出函数:

AddHotkey()和DeleteHotkey(),程序只需要调用这两个函数就可以了,如果编译之后不用改变热键,则只需要AddHotkey就可以了。

DLL中的所有的全局变量都放在一个共享段中,定义如下:

#pragmadata_seg("shareddata")

HHOOKhHook=NULL;//钩子句柄

UINTnHookCount=0;//挂接的程序数目

staticUCHARHotKey[MAX_KEY]={0};//热键虚拟键码

staticUCHARHotKeyMask[MAX_KEY]={0};//组合掩码,control=4,alt=2,shift=1

staticHWNDhCallWnd[MAX_KEY]={0};//windowhandleassociatedwithhotkey

staticintKeyCount=0;

staticUCHARMaskBits=0;//00000Ctrl=4&Alt=2&Shift=1

#pragmadata_seg()

  关于共享段,有几点重要的说明:

一是必须在链接选项里指定该段为共享:

一种方法是在project->settings->link->object/library中加上/section:

shareddata,rws;第二种方法是在def文件的sections里加上一句shareddatareadwriteshared;第三种指定共享段的方法在程序里加上一句#pragmacomment(linker,"section:

shareddata,rws")。

二是所有的变量必须初始化,否则链接程序会把它放到普通数据段。

三是如果不初始化变量,需要在段外用"__declspec(allocate("shareddata"))变量类型变量名"的方式定义。

  DLL中的两个输出函数分别用来添加/删除热键,函数代码如下:

BOOL__declspec(dllexport)__stdcallAddHotkey(HWNDhWnd,UCHAR

cKey,UCHARcMask)

{

 BOOLbAdded=FALSE;

 for(intindex=0;index

  if(hCallWnd[index]==0){

   hCallWnd[index]=hWnd;

   HotKey[index]=cKey;

   HotKeyMask[index]=cMask;

   bAdded=TRUE;

   KeyCount++;

   break;

  }

 }

 returnbAdded;

}

//删除热键

BOOL__declspec(dllexport)__stdcallDeleteHotkey(HWNDhWnd,

UCHARcKey,UCHARcMask)

{

 BOOLbRemoved=FALSE;

 for(intindex=0;index

  if(hCallWnd[index]==hWnd){

   if(HotKey[index]==cKey&&HotKeyMask[index]==cMask){

    hCallWnd[index]=NULL;

    HotKey[index]=0;

    HotKeyMask[index]=0;

    bRemoved=TRUE;

    KeyCount--;

    break;

   }

  }

 }

 returnbRemoved;

}

  DLL中的钩子函数如下:

LRESULTCALLBACKKeyboardProc(intnCode,WPARAMwParam,LPARAMlParam)

{

 BOOLbProcessed=FALSE;

 if(HC_ACTION==nCode)

 {

  if((lParam&0xc0000000)==0xc0000000){//有键松开

   switch(wParam)

   {

    caseVK_MENU:

     MaskBits&=~ALTBIT;

     break;

    caseVK_CONTROL:

     MaskBits&=~CTRLBIT;

     break;

    caseVK_SHIFT:

     MaskBits&=~SHIFTBIT;

     break;

    default:

//judgethekeyandsendmessage

     break;

   }

   for(in

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1