vc编程技术大型项目源码Word格式.docx
- 文档编号:18264949
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:74
- 大小:69.07KB
vc编程技术大型项目源码Word格式.docx
《vc编程技术大型项目源码Word格式.docx》由会员分享,可在线阅读,更多相关《vc编程技术大型项目源码Word格式.docx(74页珍藏版)》请在冰豆网上搜索。
上述所有函数都是调用成功返回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类型的文件向项目中添加"
格式的资源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>
classCAviButton:
publicCButton
{
//Construction
public:
CAviButton();
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
virtual~CAviButton();
//Generatedmessagemapfunctions
protected:
//{{AFX_MSG(CAviButton)
afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#endif
////////////////////////////CAviButton.CPP文件;
#include"
stdafx.h"
TestAviButton.h"
AviButton.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
CAviButton:
:
CAviButton()
m_nAviID=0;
bPlaying=FALSE;
}
~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
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);
LineTo(1,1);
LineTo(rect.Width()-1,1);
MoveTo(0,rect.Height()-1);
LineTo(0,0);
LineTo(rect.Width()-1,0);
if(pen2Created=pen2.CreatePen(PS_SOLID,1,downCol))
pDC->
pen2);
if(pen1Created)
pen1.DeleteObject();
pen1Created=FALSE;
//画右下边缘
MoveTo(rect.Width()-1,0);
LineTo(rect.Width()-1,rect.Height()-1);
LineTo(0,rect.Height()-1);
MoveTo(rect.Width()-2,1);
LineTo(rect.Width()-2,rect.Height()-2);
LineTo(0,rect.Height()-2);
if(pen2Created)//删除"
pen2"
画笔对象
pen2.DeleteObject();
pen2Created=FALSE;
if(pen1Created=pen1.CreatePen(PS_SOLID,1,edgeCol))
if(pOldPen!
=NULL)
SelectObject(pOldPen);
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
rect,CWnd*pParentWnd,UINTnID,CCreateContext*pContext)
Addyourspecializedcodehereand/orcallthebaseclass
returnCWnd:
Create(lpszClassName,lpszWindowName,dwStyle,
rect,pParentWnd,nID,pContext);
OnMouseMove(UINTnFlags,CPointpoint)
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();
}
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("
))变量类型变量名"
的方式定义。
DLL中的两个输出函数分别用来添加/删除热键,函数代码如下:
BOOL__declspec(dllexport)__stdcallAddHotkey(HWNDhWnd,UCHAR
cKey,UCHARcMask)
BOOLbAdded=FALSE;
for(intindex=0;
index<
MAX_KEY;
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;
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:
=~CTRLBIT;
caseVK_SHIFT:
=~SHIFTBIT;
default:
//judgethekeyandsendmessage
for(in
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vc 编程 技术 大型 项目 源码
![提示](https://static.bdocx.com/images/bang_tan.gif)