录像屏幕的指定区域并保存为多帧Gif图像 使用CxImage类 程序+源码
保存多帧Gif图像的程序
压缩包内“CxImageDemo.rar”是源码,“CxImageDemo.exe”是对应的Release版主程序,“截图6.0版.exe”是一个不相关的程序,放在压缩包里的原因在下面给出。
该程序(CxImageDemo.exe)使用VC6,使用CxImage类,UNICODE编译。
具有功能:
1、主打功能为录像屏幕的指定区域并保存为Gif图像;
2、浏览主流图片,但是gif图像不支持动态播放,只显示第一帧;
3、支持拖放图像文件到界面进行打开;
4、由于程序主打功能是录像指定区域并保存为Gif图像,所以菜单栏的保存和另存为功能没做;
屏幕录像操作过程:
详见程序主界面工具栏最右面的三个小图标tips提示。
值得注意的是,选择的矩形区域支持镜像操作,即如果是从右上角到左下角拉取矩形框,则录制出来的Gif图像会左右翻转;另外保存gif多帧图像是使用的CxImage类,该类保存的Gif彩色图像质量较差且占用内存较大(不关我的事),因此请不要录制太长时间!
录制出来的Gif图像显示效果怎么样?由于该程序没做Gif多帧图像的显示功能(主打功能是录制),因此你可以用附带的另一个“截图6.0版.exe”程序进行打开测试(该程序基于GDI+库,也支持拖放文件进行打开操作,点击鼠标中键自动调整窗口大小)。
如想编译此源码,请确保已配置好CxImage环境。
有问题联系:hastings1986@163.com
ImageEx类显示gif动画实例程序+源码 该类继承自GDI+库的Image类
使用GDI+库显示gif动态图片,该类接口如下:
可以看出,该ImageEx完全继承了基类的接口函数。
说明:
如果打开非多帧图片,该类几乎完全等价于基类,比如你可以把该类的对象代入Graphics类系列的成员函数中;
如果打开的是多帧的图片,你只要打开图片后不调用InitAnimation函数(它会创建线程),则上述做法依然可以;
但如果调用InitAnimation函数后(单帧图像没关系,因为不会创建线程),则不可以了,
所有的基类继承过来的接口成员函数和配合gdi+库其他类的函数调用都是不可以的,因为没有作线程同步,
你只能调用下面位数不多的几个public成员函数,调用Destroy成员函数后,则就可以了,因为它会关闭线程。
其实你会发现下面的public成员函数操作的成员变量都是新增的成员变量,没涉及到线程同步问题。
class ImageEx : public Image
{
public:
//以长度为nSize的内存pBuff中的内容构造图像
ImageEx(const void* pBuff, size_t nSize, BOOL useEmbeddedColorManagement = FALSE);
//以类型为sResourceType,名称为sResource的资源构造图像
ImageEx(LPCTSTR sResourceType, LPCTSTR sResource, BOOL useEmbeddedColorManagement = FALSE);
//以文件构造图像
ImageEx(LPCTSTR filename, BOOL useEmbeddedColorManagement = FALSE);
//调用Destroy成员函数
~ImageEx();
public:
//如果已经构造的对象是动画,则创建动画线程,并返回true,
//如果为静态图像或已经创建过动画线程,则也返回false
// 图像将绘制在m_hWnd客户区的rect区域,会拉伸,支持镜像
bool InitAnimation(HWND hWnd, RECT rect);
//判断是否为动画
bool IsAnimatedGIF() { return m_nFrameCount > 1; }
//设置动画暂停与否
void SetPause(bool bPause);
//判断动画是否处于暂停状态
bool IsPaused() { return m_bPause; }
//关闭动画,事实上基类Image中还有的两个成员变量没有关闭,因为析构函数会调用基类析构函数进行关闭的
void Destroy();
//另外的非public的东西省略..
};
用法:
MFC对话框程序在下面添加:
BOOL CTestDlgDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//其它的初始化代码
// GDI+
//m_image为ImageEx指针类型成员变量,"GIF"为资源类型,"HEARTS"为资源名称
m_image = new ImageEx( _T("GIF"), _T("HEARTS") );
RECT rc;
GetClientRect(&rc);
m_image->InitAnimation(this->m_hWnd, rc);//创建gif播放线程
return TRUE; // return TRUE unless you set the focus to a control
}
CTestDlgDlg::~CTestDlgDlg()
{
// GDI+
delete m_image;
}
其中的m_image = new ImageEx( _T("GIF"), _T("HEARTS") );你可以换成ImageEx类的另外两个构造函数
使用GDI+的SDI单文档程序 浏览图片 内含步骤说明 适合完全不会的新手
//以下假设你已经配置好VC6的GDI+环境
1.新建一个基于CScrollView的单文档程序,
2.在stdafx.h内添加如下代码:
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include "GdiPlus.h"
using namespace Gdiplus;
#pragma comment(lib,"gdiplus.lib")
3.在GdiApp.h里的CGdiAppApp中加入两个成员:
GdiplusStartupInput m_gdiplusStartupInput;//
ULONG_PTR m_pGdiToken;//
4.在GdiApp.cpp中的CGdiAppApp构造函数CGdiAppApp()添加如下代码:
GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);//
5.在GdiApp.h里给CGdiAppApp添加一个析构函数~CGdiAppApp();
6.在GdiApp.cpp中添加CGdiAppApp的析构函数~CGdiAppApp():
CGdiAppApp::~CGdiAppApp()//
{
GdiplusShutdown(m_pGdiToken);//
}
7.在GdiAppView.h的CGdiAppView中添加成员变量:
Bitmap* m_pbmp;
并在GdiAppView.cpp中的GdiAppView构造函数和析构函数中添加如下代码:
CGdiAppView::CGdiAppView():m_pbmp(0)//
{
// TODO: add construction code here
}
CGdiAppView::~CGdiAppView()
{
delete m_pbmp;//
m_pbmp=0;//
}
8.按Ctrl+W,在弹出的对话框里选择Message Maps选项卡
class name选择CGdiAppView
Object IDs里选中ID_FILE_OPEN
然后在Message里双击COMMAND
弹出的对话框选择Ok
这时会在Member functions:里多出一条刚添加进去的消息映射函数
双击它会自动跳转进入GdiAppView.cpp中的void CGdiAppView::OnFileOpen()函数处
然后添加如下代码:
void CGdiAppView::OnFileOpen()
{
//见源码处
}
9.为了使8处代码有用,还需要:
在GdiAppView.h里添加两个函数声明:
int A2U(const char* szA,wchar_t* szU,size_t cnt);//
std::wstring A2U(const char* szA);//
并#include
然后在GdiAppView.cpp里加入这两个函数的实现
10.在GdiAppView.cpp中的OnDraw函数中添加显示代码:
void CGdiAppView::OnDraw(CDC* pDC)
{
//见源码处
}
11.结束.有问题联系hastings1986@163.com
//可能你Debug版本编译不过,则打开Gdi+的头文件GdiPlusBase.h
//并修改为如下(其实就加了两个重载版本的new和delete):
#ifndef _GDIPLUSBASE_H
#define _GDIPLUSBASE_H
class GdiplusBase
{
public:
void (operator delete)(void* in_pVoid)
{
DllExports::GdipFree(in_pVoid);
}
void* (operator new)(size_t in_size)
{
return DllExports::GdipAlloc(in_size);
}
void (operator delete[])(void* in_pVoid)
{
DllExports::GdipFree(in_pVoid);
}
void* (operator new[])(size_t in_size)
{
return DllExports::GdipAlloc(in_size);
}
////////////////////////////////
void* (operator new)(size_t in_size,
集成 Base64 Huffman 编解码 程序+源码
该程序集成Base64编解码和Huffman编解码(压缩和解压缩)功能。
具有功能:
1.把文件Base64编码为bmp位图和解码;
2.把文件Base64编码为txt文本和解码;
3.把文件Huffman编码为文件和解码;
4.界面上左边两个Base64编解码按钮是对应上面编辑框里的内容进行Base64编解码的;
说明:
1.Base64编码后文件大小将增大为原有大小的4/3倍左右;
2.Huffman编码后压缩比不定,视文件内字符频率而定,对压缩后的文件(rar文件等)再进行Huffman编码意义不大;
3.附件中的"编解码源码.rar.huff"为该程序的源码(VC6.0),如想查看,须先用该程序进行Huffman解码为rar文件,再rar解压;
4.文件拖曳到程序界面上默认是进行"Base64编码为图片"功能;
5.注意:所有功能的执行都是单线程的,因此对于大文件操作,如果耗时的话,执行期间,界面将假死;
有问题联系:hastings1986@163.com
俄罗斯方块 局域网 联机 录像 程序+源码
以前先后上传过俄罗斯方块1.0版和2.0版,1.0版只支持单机,2.0版在1.0版的基础上加了自己的socket类,实现了局域网联机对战功能,现在上传的是3.0版,又加了个录像功能。(右键打开快捷菜单)
先把2.0版的功能再复制过来一下:
1.服务器端与客户端对战,没有同时开始功能,速度也可以不一样,下落方块的种类也不是按同样的次序,没有道具功能,只是将自己的战况实时传输给对方;
2.由于我的socket类支持多个客户端连接,但是联机时只有两个视窗,一个自己的,一个对家的,所以当多个客户端接入服务器端时具体表现为:服务器端的战况都会广播给所有客户端,相当于大家观看服务器端演示,但是服务器端不显示任何一个客户端的战况;而当只有一个客户端连接服务器端时,才显示这个客户端的战况。
3.加入游戏,断开连接这两个功能在执行时,是另开线程的,我故意让关闭按钮和拖曳客户端区域移动窗口功能失效,看上去像是程序当住了,其实没当住,因为此时拖曳标题栏还是能移动窗口,右键菜单也可以弹出,这个“当住”过程会在3秒钟左右,当客户端比较多时,服务器端的这个时间会相对长一点。
现在简要说一下3.0版的录像文件格式:
录像文件是以32位的BITMAPINFOHEADER类型位图文件的形式保存的,
因为考虑到位图须4字节对齐,而32位的位图具有对齐方面的天然优势,处理方便,
真正的数据区从位图文件的图素区开始,忽略位图的文件头和信息头;
程序里附带有4个录像文件是我打的。
有问题联系:hastings1986@163.com
Windows Media Player 控件做的简易音视频播放器 源码+程序
闲来无事,用Windows Media Player 控件做了个简易的音视频播放器。使用MFC基于对话框,界面也是相当简单。打开一个文件后程序会把该文件当前目录下的其他多媒体文件扫描一遍并加入到Windows Media Player 控件的播放列表中,并顺序播放下去。可以左键点击Client边上的空白处打开CFileDialog对话框,也可以直接拖曳文件到界面上打开文件。
有问题联系:hastings1986@163.com
异形窗口 无任务栏 无标题栏 无边框 支持动态透明Gif图片 可以打开其他图片来改变窗口形状2
2010-08-07上传过一个1.0版的,那个是在XP的SP2系统上测试的。
没有发现单种颜色全透明失效的问题。后来在XP的SP3上运行了一下,发现单种颜色全透明失效!
很惊讶啊!同为XP,相同的函数(SetLayeredWindowAttributes)居然表现出不同的效果!
于是决定稍微改动一下程序,从原来的双缓存改为三缓存(哈哈,没错,是三缓存)。
于是程序运行表现良好了(并且可以使某种颜色的全透明和全部像素以某个透明值显示同时起作用)。
(WIN7上还没测试)。
程序浏览图像用的是GDI+库。
程序默认打开时会播放内置的一个Gif动态图片,窗口形状根据图片动态调整。
你可以打开其他图片以改变窗口的异形形状。
程序界面是一个三无窗口:无任务栏、无标题栏、无边框。
为方便控制,程序具有托盘图标,且托盘图标随Gif图像动态改变。
程序异形窗口用的函数是SetLayeredWindowAttributes,把某种颜色设为全透明。
并且该透明颜色在程序中有两种方法进行设置:
1.打开通用颜色对话框,选择一种颜色;
2.在窗口上双击鼠标,双击处的颜色作为透明色;
附件中的“虫子.gif”图片可以打开试试~~虫子好像在屏幕上爬似的~~
程序附带浏览图片和截屏功能。
注意:保存gif图片只能保存单帧。本来想用Gdi+的SaveAdd方法保存多帧,却发现老是失败并返回Win32Error错误。
网上一搜发现原来Gdi+不支持Gif多帧的保存功能,只支持tiff的多帧保存,而且tiff多帧保存后也没有时间戳。
所以只得放弃。
左键可以拖动窗口移动。
程序只允许运行一个实例。注册了两个热键:Shift+F8和Shift+F9。
有问题联系:hastings1986@163.com
异形窗口 无任务栏 无标题栏 无边框 支持动态透明Gif图片 可以打开其他图片来改变窗口形状
程序浏览图像用的是GDI+库。
程序默认打开时会播放内置的一个Gif动态图片,窗口形状根据图片动态调整。
你可以打开其他图片以改变窗口的异形形状。
程序界面是一个三无窗口:无任务栏、无标题栏、无边框。
为方便控制,程序具有托盘图标,且托盘图标随Gif图像动态改变。
程序异形窗口用的函数是SetLayeredWindowAttributes,把某种颜色设为全透明。
并且该透明颜色在程序中有两种方法进行设置:
1.打开通用颜色对话框,选择一种颜色;
2.在窗口上双击鼠标,双击处的颜色作为透明色;
附件中的“虫子.gif”图片可以打开试试~~虫子好像在屏幕上爬似的~~
程序附带浏览图片和截屏功能。
注意:保存gif图片只能保存单帧。本来想用Gdi+的SaveAdd方法保存多帧,却发现老是失败并返回Win32Error错误。
网上一搜发现原来Gdi+不支持Gif多帧的保存功能,只支持tiff的多帧保存,而且tiff多帧保存后也没有时间戳。
所以只得放弃。
左键可以拖动窗口移动。
程序只允许运行一个实例。注册了两个热键:Shift+F8和Shift+F9。
有问题联系:hastings1986@163.com
Base64编解码程序 附带源码 可以把文件编码为bmp图片
Base64编解码程序
可以把文件编码为bmp图片
当然编码出来的图片当然是很不美观的~~~
注意:不要编码或解码过大的文件~~
因为该程序的所有操作都是在内存中进行的~~
且是单线程的~~
编码出来的位图是BITMAPCOREHEADER类型的~~
并且是8位的,因而有颜色表~~
并且解码也只支持8位的BITMAPCOREHEADER类型位图~~
注意若是从其他无关的位图解码~~
一般是会解码失败的~~
另外:压缩包里还有个查看位图信息的小程序~~
改程序的一切操作都是在数据层直接操作~~
比如水平镜像,就把里面的图素位水平交换一下~~
位图信息查看程序 DIB BITMAPINFOHEADER BITMAPCOREHEADER
查看位图的信息(右键查看):
1.文件头
2.信息头
3.RGB掩码(如果有的话)
显示出来的形式如下:
BITMAPFILEHEADER* = 0x02800048
BITMAPFILEHEADER
.bfType = 0x4D42
.bfSize = 552158
.bfReserved1 = 0
.bfReserved2 = 0
.bfOffBits = 66
BITMAPINFOHEADER
.biSize = 40
.biWidth = 353
.biHeight = 391
.biPlanes = 1
.biBitCount = 32
.biCompression = BI_BITFIELDS
.biSizeImage = 552092
.biXPelsPerMeter = 0
.biYPelsPerMeter = 0
.biClrUsed = 0
.biClrImportant = 0
Red Mask = 00FF0000
Green Mask = 0000FF00
Blue Mask = 000000FF
说明:
1.第一行为内存中malloc出来的地址,由于是虚拟内存,不看也罢
2.该程序不止可以查看BITMAPINFOHEADER类型的位图,
其余三种类型也可查看,分别为:
BITMAPCOREHEADER、BITMAPV4HEADER、BITMAPV5HEADER
3.最后三行的RGB Mask是颜色掩码,对于BITMAPINFOHEADER类型来说,不一定有。
4.右键功能是查看信息,左键是左右镜像操作,由于是底层数据直接每行左右互换,
而对于1、4位深的这两种位图,底层数据操作涉及位操作,而我还在写这个位图类,
故暂不支持,只支持8位以上的水平镜像操作。
5.支持剪切板操作,并且是以CF_DIB或CF_DIBV5呼叫GetClipboardData函数的,
复制时,也是以该参数呼叫SetClipboardData函数的。
你可以复制其他地方的图片过来,以查看图片属性。
6.程序中运行中保存在内存中的图片是BITMAPFILEHEADER*指针,不是HBITMAP,
呼叫的显示函数是SetDIBitsToDevice函数。
7.鼠标在图片上移动是,右边填充鼠标点的颜色,标题栏也有相关显示。
下边显示鼠标点附近11*11像素范围的放大图像,正中间用十字叉线画出。
取色是直接在底层取数据解析。
8.改程序在《windows程序设计》上的一个例子改编而来,并且正在完善该位图类中,
以加入更多丰富的底层操作功能。
改试验程序主要供想研究位图结构的人查看用。
9.windows搞出了4种位图种类,真作孽~~
另,16、24、32位深的位图也可以有颜色表的,该程序已考虑在内。
10.下面四种压缩格式暂不支持:
BI_RLE8、BI_RLE4、BI_JPEG、BI_PNG
11.随带的附件中,有几张不同格式的位图,你可以试验打开查看。
有问题联系:hastings1986@163.com
用mciSendCommand函数做的mp3播放器2.0版
在1.0版基础上加了界面颜色设置功能;文件名排序不区分大小写功能;按钮遵循XP圆润风格;快速定位到正在播放歌曲功能;修正打开非歌曲文件且该文件所在目录下无其它歌曲时,程序崩溃的Bug。此程序为终版,停止更新。
有问题联系:hastings1986@163.com
用mciSendCommand函数做的mp3播放器1.0版
用mciSendCommand函数封装起来的类做的音乐播放器1.0版。很简易的。
过程辨识程序 最小二乘法
过程辨识说明:
对应的是菜单中“最小二乘法”的那个。过程辨识,就是根据一个模型的输入数据及对应的输出数据(采样值,非连续)来预测下一个输入采样点对应的输出会是多少。最后辨识出来的结果是形如下面的表达式:y(k)+a1*y(k-1)+a2*y(k-2)+...+ai*y(k-i)=b1*u(k-1)+b2*u(k-2)+...+bj*u(k-j)+n(k)。y(k)代表第k个采样点时刻的输出值,u(k)代表第k个采样点时刻的输入值,(i<=k,j<=k),n(k)是噪声,很小,可以认为为0。由表达式可以看出,y(k)的值与先前时刻的一系列输入值和输出值都有关联,而不是只与当前时刻的u(k)值有关!这就是“预测”两字体现的含义:根据已给的输入输出采样值,算出上面的表达式,然后再预测下一时刻的输出值。
其他不懂的问题请联系作者:hastings1986@163.com。
多项式拟合程序 过程辨识
拟合功能说明:
对于形如y=a1*x^n+a2*x^(n-1)+...+an*x+a(n+1)的函数,若a1,a2,...,a(n+1)未知,则可以由n+1对不同的(x,y)值求出这些a的值。更进一步的说,给你一条X-Y轴平面里的曲线,或是,已知一系列的(x,y)值,要你用一个近似的一元函数拟合它,该怎么办?这个时候你不知道该一元函数的最高次数是多少,即不知道未知数系数a1,a2,...,a(n+1)的个数。在这里显然要先假设一个n的值,再来算出这些系数值:有n+1个未知数系数要求,就得有n+1对(x,y)的值,这样可以精确算出唯一的解。但是,如果给你的(x,y)值对数多于n+1对该怎么办(因为你碰到的情况几乎都是这样的)?你算出来的近似函数得兼顾所有的(x,y)取样点,使得误差最小。你不能只取所有(x,y)取样点中的n+1对计算,而扔掉了多出来的那些取样点。该程序的拟合功能就是完成这个任务的。它会计算所有的取样点,最后得出一个误差最小的函数。
执行过程如下:
先读取右边两个编辑框内的(x,y)取样点,再弹出一个对话框让你假设一个一元函数,即最高次数n,然后程序会开始计算。注意,若n设的太大,计算过程可能会很久,会造成程序假死现象。得出的结果会直接以函数的形式显示在下面的长条形编辑框内。你可以通过点击“←画图”和“画图→”来进行比较拟合的近似程度。注意,你设置的n值不是越大,就拟合得越好,也不是越小,拟合得越好,原因你细想一下就会明白。程序所用的计算原理是最小二乘法,所用的计算方法是矩阵运算。你可以百度相关知识。
该程序的另外一个“辨识”功能,用到的也是最小二乘法,传递函数等相关知识是大学工科学生会学到的。
其他不懂的问题请联系作者:hastings1986@163.com。
Socket局域网聊天室程序 附带屏幕监控功能
在前面上传的“Socket实例源码”基础上,加了“任意格式图片在内存中转换 例如:bmp在内存中转为jpg”功能,使服务器端具有监控任意客户端屏幕功能。监控步骤如下:服务器发送给客户端一条消息表示要监控你,客户端收到后截屏为bmp,内存中转换为jpg,压缩等级为20(如果屏幕尺寸过大,造成压缩后的jpg图片大小大于200KB,这时会监控失败,但是程序不会出错,也没有内存泄露等的安全问题,只是单纯的失败,表现为服务器端画面停止更新),然后分多次发送这个jpg图像,每次大小为2KB(虽然socket是TCP的,但我仍让它多次发送),服务器端接收完所有的分片后,根据这段jpg内存流创建图像,然后显示,显示完后再发送给客户端一条最开始的那条要监控你的消息,如此往复。监控过程中,右键功能:退出;左键功能:发送那条要监控你的消息,一般情况下没用。
有问题联系:hastings1986@163.com
截图软件6.0版 任意格式图片在内存中转换 例如:bmp在内存中转为jpg
最近搜索了些在内存中转换图片格式的东西,比如截屏后的bmp图片在内存中转为jpg数据流,你可以通过socket发送这段jpg内存数据流,同时,你也可以通过内存数据流逆转换。通过DibFile.h里面的两个函数完成(用的是Gdi+库):
Bitmap* CreateBitmapFromMemory(const void *buf, size_t size);
void* SaveBitmapToMemory(Bitmap *image, void **outbuf, size_t *size, size_t CodecIndex=0, ULONG quality=50);
说明:CodecIndex取值0-4,分别对应转换为jpg、bmp、gif、png、tiff格式,当为0时,参数quality有用,表示转换jpg的质量,取值0-100,数值越小,压缩比越大。注意:outbuf为指针的指针,会在内部malloc内存,以保存转换后的图片数据流。
虽然此软件中没用到这两个函数,但是测试通过。
你可以进行如下测试:把jpg图片以二进制数据读到内存中,然后通过CreateBitmapFromMemory函数构建Bitmap,然后再SaveBitmapToMemory转换为另一段内存中,把这段内存以二进制数据存入文件,并用其他看图软件打开保存后的图片。
其他说明:此软件在先前版本的基础上修正两处Bug:
1.保存图片时,若文件名含有点,会保存失败;
2.若在浏览图片时,另存图片后,滚动滚轮显示未知格式图片。
加入一个功能:保存为jpg图片时,可以选择图片质量。
有问题联系:hastings1986@163.com
Gdi+和Jpgdll 处理Jpeg图像
Gdi+和Jpgdll 处理Jpeg图像
内含说明文档
Gdi+压缩包含有.h文件、.lib文件和.dll文件
俄罗斯方块2.0版 支持局域网联机对战 附带源码
以前上传过俄罗斯方块1.0版,只支持单机,现在的2.0版在1.0版的基础上加了自己的socket类,实现了局域网联机对战功能,并附有源码(服务器端与客户端对战,没有同时开始功能,速度也可以不一样,下落方块的种类也不是按同样的次序,没有道具功能,只是将自己的战况实时传输给对方)。
说明:由于我的socket类支持多个客户端连接,但是联机时只有两个视窗,一个自己的,一个对家的,所以当多个客户端接入服务器端时具体表现为:服务器端的战况都会广播给所有客户端,相当于大家观看服务器端演示,但是服务器端不显示任何一个客户端的战况;而当只有一个客户端连接服务器端时,才显示这个客户端的战况。
注意:加入游戏,断开连接这两个功能在执行时,是另开线程的,我故意让关闭按钮和拖曳客户端区域移动窗口功能失效,看上去像是程序当住了,其实没当住,因为此时拖曳标题栏还是能移动窗口,右键菜单也可以弹出,这个“当住”过程会在3秒钟左右,当客户端比较多时,服务器端的这个时间会相对长一点。
有问题联系:hastings1986@163.com
MFC42UD.dll
VC的动态链接库Debug版本。
把lib放到vc的mfc\lib下,dll放到windows\system32下。
Socket实例源码
windows socket API 封装起来的两个类,服务器端跟客户端分开,且已考虑粘包的处理情况。并利用这两个类做了一个局域网聊天程序。
服务器端:listen一个线程,每accept一个客户端,新开一个线程,专门负责recv,一旦recv到信息,会发送给HWND相应消息,wParam和lParam包含相应信息,HWND在类的Create成员函数中指定。
客户端:一旦connect成功,则新开一线程专门recv,一旦recv到信息,会发送给HWND相应消息,wParam和lParam包含相应信息,HWND在类的Connect成员函数中指定。Connect成员函数有一个参数指定重试连接次数(每次一秒),所以如果服务器没开的话,Connect成员函数不会被一直阻塞住。
一旦有了这两个类,就能很方便地把以前的单机小游戏加上联机对战功能。
注意:若你编译有错误,可能是你没有MFC42UD.dll等这些动态链接库的Debug版本,请在网上下载这些dll或直接编译成Release版本。
黑客帝国数字雨 屏保
黑客帝国数字雨 屏保,在前版本的基础上小改一下,支持多显示器。
截图软件7.1版,支持多显示器
自己借这里中转存储一下,以备不时之需。
在7.0版的基础上,增加如下功能:
1.支持多显示器截屏;
2.计算器中增加insert、home、end、pageup、pagedow五个快捷键;方便建筑电气设计师计算用;
图片解码器 配合截图软件7.0版的接口
附件里含两个截图软件7.0版的解码器,分别使用FreeImage库和OpenCV库解码;
注意的是使用的OpenCV只是1.0版的,因为我用的是VC6,只能用这版;
FreeImageDLL.rar包里的FreeImageDLL.dll是解码器,另一个FreeImage.dll会被FreeImageDLL.dll调用,不能删;
OpenCVDLL.rar包里的OpenCVDLL.dll是解码器,另三个dll会被OpenCVDLL.dll调用,不能删;
注意的是,截图软件7.0版载入解码器后,打开一张图片时,会先尝试用GDI+打开,不能打开时才会用载入的解码器打开;
截图软件7.0版 支持合成和分解TIFF文件
说明:
多帧图像另存为..
打开的图像若是GIF或TIFF格式的且是多帧的,则可以使用该项功能;
为了充分利用CPU,转换过程中主界面会关闭显示;
分解出来的图像是png格式的,会保存在当前图像的同一文件夹下,并且文件名会加上数字序号以示顺序;
另存为多帧TIFF..
首先该软件打开一张图像时会把该图像同一文件夹下的所有图片文件名缓存在软件中,以便滚轮上下浏览;
因而使用该项合成TIFF文件功能实际上是把打开图像所在文件夹下的所有图片合成一张TIFF格式的图片;
所以你得单独找个文件夹把需要合成的图片复制过去,再打开其中任意一张进行操作;
同样,为了充分利用CPU,转换过程中主界面会关闭显示;
操作子菜单中的自动关机功能是指:
你先选中它,然后打开注册表,找到HKEY_CURRENT_USER\Software\截图软件 Made By Haty_Miao;
里面有说明,一旦满足条件,会有2分钟延迟,在两分钟内你还可以取消自动关机;
该程序使用GDI+解码(打开)和编码(保存)图片,虽然GDI+支持图片格式很多,但是仍然有部分格式不支持,
比如JPEG2000、PCX、TGA等,因此为了扩展性考虑,改程序留了一个接口,支持载入自己编写的解码器,
解码器为DLL格式,只需提供如下导出函数即可(导出函数名须为“DecodeImageFromFile”):
HBITMAP DecodeImageFromFile(LPCWSTR szFileName);//注意是UNICODE格式的!
压缩包里附带的CxImageDLL.dll就是一个解码器,看名字就知道是用CxImage解码的^_^;
有问题联系:hastings1986@163.com
集成 Base64 Huffman 编解码 程序+源码 1.1版
该程序集成Base64编解码和Huffman编解码(压缩和解压缩)功能。
具有功能:
1.把文件Base64编码为bmp位图和解码;
2.把文件Base64编码为txt文本和解码;
3.把文件Huffman编码为文件和解码;
4.界面上左边两个Base64编解码按钮是对应上面编辑框里的内容进行Base64编解码的;
说明:
1.Base64编码后文件大小将增大为原有大小的4/3倍左右;
2.Huffman编码后压缩比不定,视文件内字符频率而定,对压缩后的文件(rar文件等)再进行Huffman编码意义不大;
3.附件中的"编解码源码.rar.huff"为该程序的源码(VC6.0),如想查看,须先用该程序进行Huffman解码为rar文件,再rar解压;
4.文件可以拖曳到程序界面上进行操作;
5.注意:所有功能的执行都是单线程的,因此对于大文件操作,如果耗时的话,执行期间,界面将假死;
有问题联系:hastings1986@163.com
Directx 8 SDK d3dx8.h
Directx 8 SDK,解压出来放到VC安装目录,在 工具-选项-目录 那里添加相应的路径。
注册表查看编辑器 + 源码
windows自带的注册表编辑器并没有把所有的项都显示出来,出于好奇,自己写了个简易的注册表编辑器,以查看隐藏的东西~~
界面跟自带的很像,里面的小图标都是从自带里导出来的。
具有的功能:
1.浏览键(key)、值(value);
2.插入、修改REG_SZ、REG_EXPAND_SZ、REG_MULTI_SZ、REG_DWORD、REG_DWORD_BIG_ENDIAN、REG_QWORD六种值类型(value)的名称跟数据;
3.删除所有类型的键值(value);
4.插入键(key),删除不含子键的键(key);
5.左侧树形窗口右键点击时是收缩节点,方便浏览;
6.自带的每个键它都会显示默认(就是名称为空的)键值(value),而我则是严格按照RegEnumValue的结果来显示;
通过使用并跟自带的比较后发现:
XP系统下,自带的隐藏了HKEY_PERFORMANCE_DATA、HKEY_PERFORMANCE_TEXT、HKEY_PERFORMANCE_NLSTEXT的显示,不过这三个键都不含子键,只含值,不知为何,这三个键的默认键值打不开,提示参数不正确。需要注意的是,打开这三个键时,会有点卡。
WIN7下,自带的还隐藏了HKEY_PT的显示,里面似乎REG_QWORD类型的键值很多。
由于我的小程序查错步骤很多,一有错误就会显示出来(要么是弹出消息框,要么是在标题栏显示),因此发现了很多有趣的地方,比如:HKEY_LOCAL_MACHINE\SECURITY和HKEY_LOCAL_MACHINE\SAM\SAM的权限很高,连KEY_READ都打不开,因此自带的没显示这两个键的内容,不知道的还以为确实没内容,其实是注册表API函数打不开的缘故;
另外需要注意的是,打开HKEY_CLASSES_ROOT节点时,由于其子项很多,所以会卡住一会儿,请耐心等待。
里面有一个封装了操作注册表的类CRegKey。
里面还有一个截图软件,其两个附加功能或许对你日常生活有帮助,一个是VC的error lookup程序的功能,一个是表达式计算器的功能,你可以在其托盘隐藏时使用热键Ctrl+F8和Ctrl+F9打开、关闭,非常便捷;
里面还可以参考一下CTreeCtrl的Expand函数只能触发一次TVN_ITEMEXPANDING or TVN_ITEMEXPANDED消息问题的解决方法。
有问题联系:hastings1986@163.com
多文档记事本1.2版,纯windows API开发 含源码
多文档记事本1.2版
纯windows API开发
小巧,精致。
在以前的 基础上新增以下功能:
1、置顶操作
2、支持读取、保存Unicode Big Endian和UTF-8格式文档
3、字数统计可查看当前文档编码格式
Virtual PC sound blaster 16 驱动
Virtual PC 中装了windows后,声卡驱动会没装,网上sound blaster 16的驱动不好找,特意上传在这里。
使用方法:在设备管理器里更新驱动程序,然后手动把目录定到此解压文件夹搜索即可,如果遇到缺少ctlsb16.sys文件,则也浏览这个解压文件夹中,选择其中的ctlsb16.sys文件即可。
EMF查看器 支持半透明 GDI+ 半透明文字
EMF查看器,支持半透明。
一个小的测试软件,为了说明EMF文件也是可以支持半透明的。
压缩包里的两张EMF图片为半透明图片,可以用里面的EmfView.exe查看。
附上GDI+绘制半透明文字的方法:
void Test2()
{
HDC hdc = GetDC(NULL);
Metafile myMetafile(L"MyDiskFile.emf", hdc);//创建MyDiskFile.emf文件
ReleaseDC(NULL,hdc);
Graphics myGraphics(&myMetafile);
Image img(L"位图.bmp");
myGraphics.DrawImage(&img,0,0);//先画个位图,以便在上面画半透明文字,你也可以把"位图.bmp"换成其它格式
Pen myPen(Color(128, 0, 0, 200),20);//a,r,g,b
myGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
myGraphics.DrawLine(&myPen, 0, 0, 100, 100);//再在位图上画条半透明直线
GraphicsPath myGraphicsPath;
FontFamily myFontFamily(L"Times New Roman");
PointF myPointF(5.0f, 50.0f);
myGraphicsPath.AddString(L"水印-版权所有", -1, &myFontFamily, 0, 54, myPointF, NULL);
SolidBrush mySolidBrush(Color(50, 0, 255, 255));//透明度50
myGraphics.FillPath(&mySolidBrush, &myGraphicsPath);//通过对文字路径填充半透明画刷来实现半透明文字
}
winsock API写的简单的HTTP服务器 有源码
winsock API写的简单的HTTP服务器 有源码
非常简陋,只支持单个客户端。
运行该程序后,打开浏览器进行测试。
预下载该服务器上的文件,请在浏览器地址栏按如下格式输入:
192.168.1.188/F:\文档.txt
即:
服务器IP + 斜杠 + 文件全路径名
注意:同意目录下的favicon.ico不要删了。
有问题联系:hastings1986@163.com
局域网文件传输1.0 支持大于4G的文件
此为程序,没有源码。
主打功能是文件传输,附加了两个小功能,按F1试试。
CRegKey 封装操作注册表的类
CRegKey 封装操作注册表的类
典型的使用方法举例:
//添加和删除程序自启动方法
void RegAddTest()
{
TCHAR m_fileName[MAX_PATH];
GetModuleFileName(NULL,m_fileName,MAX_PATH);
CRegKey hKey;
TCHAR str[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
hKey.SetKeyValue(HKEY_LOCAL_MACHINE, str, TEXT("测试"), m_fileName);
}
void RegQueryTest()
{
TCHAR szValue[MAX_PATH];
DWORD dwCount = MAX_PATH;
CRegKey hKey;
TCHAR str[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
hKey.Open(HKEY_LOCAL_MACHINE, str);
if(!hKey.QueryValue(TEXT("测试"), szValue, &dwCount))
cout<<szValue<<'\n';
else
cout<<"Not Found!\n";
}
void RegDeleteTest()
{
CRegKey hKey;
TCHAR str[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
hKey.Open(HKEY_LOCAL_MACHINE, str);
hKey.DeleteValue(TEXT("测试"));
}
黑客帝国数字雨 屏保 时钟 内存池 源码+程序
模仿黑客帝国数字雨的屏保程序。
你可以简单的把程序的后缀名改为.scr,
并放到system32目录下,作为屏保。
多项式拟合 dll 最小二乘法 表达式计算
做了一个dll,具有多项式拟合和表达式计算的功能,导出接口如下:
///////////////////////////////////
/*
获取帮助信息
strOut:保存帮助文本信息
len:表示strOut的缓存长度
返回值:strOut==NULL或len==0时,strOut不写入内容,返回所需缓冲区长度(包括'\0'结尾符);
否则直接返回len
*/
EXPORT size_t Help(char* strOut, size_t len);
/*
计算不含未知数表达式的值
strIn:预计算的表达式
ret:返回计算结果
IsRad:表达式中含有sin之类的三角函数时,表明是按弧度制还是角度制,TRUE表示弧度制
返回值:表示错误码,0代表计算成功,错误码代表的意思可通过调用ErrorStr函数取得
*/
EXPORT int Calculate(const char* strIn, double* ret, BOOL IsRad);
/*
计算含有一个未知数表达式(必须以字母x表示)当x等于value时的值
strIn:预计算的表达式
value:x等于value时
ret:返回计算结果
IsRad:表达式中含有sin之类的三角函数时,表明是按弧度制还是角度制,TRUE表示弧度制
返回值:表示错误码,0代表计算成功,错误码代表的意思可通过调用ErrorStr函数取得
*/
EXPORT int Function(const char* strIn, double value, double* ret, BOOL IsRad);
/*
计算含有一个未知数表达式(必须以字母x表示)当x在区间[low,high)内平均等分为cnt段时各点的值
strIn:预计算的表达式
low:左区间
high:右区间,内部会检查high<low时的情况(会做Swap处理)
cnt:等分的段数(同时也表示xOut和yOut数组的长度)
xOut:返回计算结果的横坐标值
yOut:返回计算结果的纵坐标值
IsRad:表达式中含有sin之类的三角函数时,表明是按弧度制还是角度制,TRUE表示弧度制
返回值:表示错误码,0代表计算成功,错误码代表的意思可通过调用ErrorStr函数取得
*/
EXPORT int Function_Interval(const char* strIn, double low, double high, size_t cnt,
double* xOut, double* yOut, BOOL IsRad);
/*
根据错误码返回其文本描述信息
errNo:错误码,取值范围为[0-9],超过范围时,strOut写入"错误码超过取值范围"
strOut:保存错误码的文本信息
len:表示strOut的缓存长度
返回值:strOut==NULL或len==0时,strOut不写入内容,返回所需缓冲区长度(包括'\0'结尾符);
否则直接返回len
*/
EXPORT size_t ErrorStr(size_t errNo, char* strOut, size_t len);
/*
多项式拟合
xIn:输入采样数据横坐标的集合
yIn:输入采样数据纵坐标的集合
cnt:输入采样数据的对数,即xIn或yIn数组内数据个数,函数假设xIn、yIn数组内数据个数一样多
sztCiShu:sztCiShu代表最高次为sztCiShu-1,即待求未知系数个数为sztCiShu个,sztCiShu须不大于cnt
aOut:保存未知系数的拟合结果,数组长度为sztCiShu
返回值:表示拟合成功与否
*/
EXPORT BOOL Fitting_Double(double* xIn, double* yIn, size_t cnt, size_t sztCiShu,
double* aOut);
/*
也是多项式拟合,只是拟合结果直接表示成了表达式的字符串形式,写入到strOut中
xIn:输入采样数据横坐标的集合
yIn:输入采样数据纵坐标的集合
cnt:输入采样数据的对数,即xIn或yIn数组内数据个数,函数假设xIn、yIn数组内数据个数一样多
sztCiShu:sztCiShu代表最高次为sztCiShu-1,即待求未知系数个数为sztCiShu个,sztCiShu须不大于cnt
strOut:保存未知系数的拟合结果
len:strOut缓冲区的长度
返回值:0表示不能拟合,非零表示能拟合,当:
strOut==NULL或len==0时,strOut不写入内容,返回所需缓冲区长度(包括'\0'结尾符,其实内部已计算过一遍);
否则直接返回len(若len不够长,拟合结果
2.1版 录制屏幕的指定区域并保存为多帧Gif图像 使用CxImage类 程序+源码
保存多帧Gif图像的程序,此为2.1版。
增加功能:
1.保存过程有进度条显示,并可以取消保存操作
2.使用内存池技术
其他功能相对于2.0版不变。
如想编译此源码,请确保已配置好CxImage环境。
有问题联系:hastings1986@163.com
windows平台上支持BITMAPCOREHEADER、BITMAPINFOHEADER、BITMAPV4HEADER、BITMAPV5HEADER四种类型位图的类库
windows平台上支持BITMAPCOREHEADER、BITMAPINFOHEADER、BITMAPV4HEADER、BITMAPV5HEADER四种类型位图的类库!
简单用法举例:
DibBitmap bmp,ret,tmp;
bmp.Open(_T("E:\\bmp.bmp"));//打开
bmp.ConvertBit(4,ret);//转为4位位图,ret保存返回值
ret.RotateLeft(tmp);//向左旋转90度,tmp保存返回值
tmp.Invert();//所有像素反色,即RGB(1,2,3)变为RGB(254,253,252)
tmp.At(10,10)=tmp.At(20,20);//单个像素点的取值和赋值操作
tmp.At(10,20)=ret.At(30,30);//注意,设置成的颜色如果颜色表内不存在,会设置成相近色
tmp.At(20,10)=RGB(255,0,0);
bmp.AlphaBlend(0,0,tmp,128,RGB(255,255,255),true);//tmp以透明度128画到bmp的(0,0)处,其中tmp中的白色会镂空
bmp.Mirror();//bmp水平翻转
bmp.ConvertBit(16,ret,true);//转为5-6-5型16位位图,ret保存返回值
ret.SetClipbrd();//存入剪切板中
ret.Save(_T("E:\\bmp2.bmp"));//保存到文件
该类的头文件接口大致如下:
class DibBitmap
{
BITMAPFILEHEADER* m_pbmfh;
DWORD m_size;//保存m_pbmfh中malloc出来的内存大小,即是capacity//不为0时保证图像是可以处理的
public:
enum BmType{NONE=0,CORETYPE,INFOTYPE,V4TYPE,V5TYPE};
public:
class reference
{
//略..
};
public://DibBitmap01.cpp
DibBitmap();
explicit DibBitmap(LPCTSTR pstrFileName);
explicit DibBitmap(BITMAPFILEHEADER* pbmfh);//只是简单的赋值给成员变量m_pbmfh
DibBitmap(HDC hdc, HBITMAP hBitmap, int BitCount);//1,4,8;16,24,32
DibBitmap(const DibBitmap& rhs);
~DibBitmap();
bool Open(LPCTSTR pstrFileName);//打开失败会Close()
bool Save(LPCTSTR pstrFileName)const;
void Close();
void Swap(DibBitmap& rhs);
DibBitmap& operator=(const DibBitmap& rhs);//不一定申请过新内存
public://DibBitmap01.cpp
BITMAPFILEHEADER* Get();//获取文件头
const BITMAPFILEHEADER* Get()const;
BITMAPINFOHEADER* GetInfoHead();//获取信息头
const BITMAPINFOHEADER* GetInfoHead()const;
RGBQUAD* GetQuad();//获取颜色表//没有颜色表,则返回NULL
const RGBQUAD* GetQuad()const;
BYTE* GetByte();//获取图素位
const BYTE* GetByte()const;
bool GetMask(DWORD* dwMask,bool b565=false)const;
//dwMask个数为四,需要屏蔽码时,依次存入RGB屏蔽码,并返回true
//当为BITMAPV4HEADER以上时,还存入AlphaMask;b565参数同GetClr
bool Attach(BITMAPFILEHEADER* pbmfh);
BITMAPFILEHEADER* Detach();//返回值最后须free掉
HBITMAP CreateBitmap(HDC hdc)const;//返回值最后须DeleteObject掉
HBITMAP CreateDibSection ()const;//返回值最后须DeleteObject掉
BmType Type()const;
DWORD Capacity()const;//返回m_size的值//注意,此值可能小于实际malloc的内存长度
DWORD FileSize()const;//整个文件的大小//不是返回m_size的值,m_size的值大于等于此返回值
DWORD BitsSize()const;//图素位的大小,即去掉文件头,信息头和颜色表之后的大小
DWORD Offset()const;//图素位的偏移量
LONG Width()const;
LONG Height()const;//可能为负值
WORD Planes()const;
WORD BitCount()const;
DWORD ClrUsed()const;
//一般是4,8位图才小于2^(4,8),其余的等于对应颜色数,m_pbmfh为空时返回0,32位图时,返回-1,16位555位图颜色数按565算
public://DibBitmap02.cpp
LPTSTR DisplayDibHeader (LPTSTR szBuffer)const;//szBuffer得大于1200个//返回szBuffer
RGBQUAD GetClr(size_t x,size_t y,bool b565=false)const;
//获取(x,y)处的颜色值,已考虑方向问题,b565只有在16位深位图且没有屏蔽码时才有用,指明是5-5-5还是5-6-5
COLORREF GetRGBClr(size_t x,size_t y,bool b565=false)const;//条件同上//返回的最高位为0
bool GetClipbrd(HWND hwnd);//失败不一定会Close()
void SetClipbrd(HWND hwnd)const;
//If hwnd is NULL, the open clipboard is associated with the current task.
void Mirror(bool bHoriz);//镜像//false表示垂直镜像
public://DibBitmap03.cpp
void Invert(bool b565=false);//反色//在这里b565参数不起任何作用
RGBQUAD Invert(size_t x,size_t y,bool b565=false);//(x,y)处的颜色反色,返回反色后的近似颜色
RGBQUAD SetClr(size_t x,size_t y,RGBQUAD quad,bool b565=false);//设置颜色,返回设置成的最相近的颜色
COLORREF SetRGBClr(size_t x,size_t y,COLORREF clr,bool b565=false);//设置颜色,返回设置成的最相近的颜色
//以下两个函数相当牛逼,可直接引用修改颜色
COLORREF At(size_t x,size_t y,bool b565=false)const;//获取(x,y)处的颜色
reference At(size_t x,size_t y,bool b565=false);//获取(x,y)处的颜色引用,可直接进行修改
void AlphaBlend(int x,int y,const DibBitmap& rhs,BYTE bAlpha,COLORREF clr,bool bClr=false,bool b565=false);
//把rhs以透明度bAlpha画到this中的(x,y)处(可以为负),注意:当&rhs==this时直接返回,啥也不操作
//若bClr为true,则clr参数有用,rhs中颜色值为clr的像素点完全透明
void RotateLeft(DibBitmap& ret)const;
//this旋转(逆时针90度)后存入ret中,若this原先为空,则不改变ret,注意:当&ret==this时直接返回,啥也不操作
void RotateRight(DibBitmap& ret)const;
//this旋转(顺时针90度)后存入ret中,若this原先为空,则不改变ret,注意:当&ret==this时直接返回,啥也不操作
void RotateOpposite();//旋转180度,注意后面没有const,此函数是旋转自身
public://DibBitmap04.cpp
bool ConvertBit(WORD BitCount,DibBitmap& ret,bool b565=false)const;
//转为同类型的不同位数位图//1,4,8;16,24,32,注意:当&ret==this时直接返回,啥也不操作
};
说明:
此类支持四种位图格式:
BITMAPCOREHEADER、BITMAPINFOHEADER、BITMAPV4HEADER、BITMAPV5HEADER。
该类像素点坐标序号从0开始,原点位于位图左上角,不管位图信息头的高度字段是否为负,内部都已作转化处理
暂不支持这四种位图的以下几种情况:
1、biCompression字段为BI_RLE4,BI_RLE8,BI_JPEG,BI_PNG的位图;
2、BITMAPV5HEADER时,bV5CSType字段等于PROFILE_LINKED或PROFILE_EMBEDDED时的位图。
有问题联系:hastings1986@163.com
2.0版 录制屏幕的指定区域并保存为多帧Gif图像 使用CxImage类 程序+源码
保存多帧Gif图像的程序
此为2.0版,考虑到前面的版本录制时太耗CPU,故此版本把耗时的操作全部一起放在了保存操作中,并且另开线程,防止界面僵死。
压缩包内“CxImageDemo.rar”是源码,“CxImageDemo.exe”是对应的Release版主程序,“截图6.0版.exe”是一个不相关的程序,放在压缩包里的原因在下面给出。
该程序(CxImageDemo.exe)使用VC6,使用CxImage类,UNICODE编译。
具有功能:
1、主打功能为录像屏幕的指定区域并保存为Gif图像;
2、浏览主流图片,但是gif图像不支持动态播放,只显示第一帧;
3、支持拖放图像文件到界面进行打开;
4、由于程序主打功能是录像,所以菜单栏的保存和另存为功能没做;
屏幕录像操作过程:
详见程序主界面工具栏最右面的三个小图标tips提示。
值得注意的是,选择的矩形区域支持镜像操作,即如果是从右上角到左下角拉取矩形框,则录制出来的Gif图像会左右翻转;另外保存gif多帧图像是使用的CxImage类,该类保存的Gif彩色图像质量较差且占用内存较大(不关我的事),因此请不要录制太长时间,录制时间越长,保存所需时间越长!
录制出来的Gif图像显示效果怎么样?由于该程序没做Gif多帧图像的显示功能(主打功能是录制),因此你可以用附带的另一个“截图6.0版.exe”程序进行打开测试(该程序基于GDI+库,也支持拖放文件进行打开操作,点击鼠标中键自动调整窗口大小)。
如想编译此源码,请确保已配置好CxImage环境。
有问题联系:hastings1986@163.com
1.1版 录像屏幕的指定区域并保存为多帧Gif图像 使用CxImage类 程序+源码
保存多帧Gif图像的程序
前面那个1.0版上传后才发现有一个严重的GDI资源泄漏问题,于是火速上传此1.1版纠正此问题!
压缩包内“CxImageDemo.rar”是源码,“CxImageDemo.exe”是对应的Release版主程序,“截图6.0版.exe”是一个不相关的程序,放在压缩包里的原因在下面给出。
该程序(CxImageDemo.exe)使用VC6,使用CxImage类,UNICODE编译。
具有功能:
1、主打功能为录像屏幕的指定区域并保存为Gif图像;
2、浏览主流图片,但是gif图像不支持动态播放,只显示第一帧;
3、支持拖放图像文件到界面进行打开;
4、由于程序主打功能是录像指定区域并保存为Gif图像,所以菜单栏的保存和另存为功能没做;
屏幕录像操作过程:
详见程序主界面工具栏最右面的三个小图标tips提示。
值得注意的是,选择的矩形区域支持镜像操作,即如果是从右上角到左下角拉取矩形框,则录制出来的Gif图像会左右翻转;另外保存gif多帧图像是使用的CxImage类,该类保存的Gif彩色图像质量较差且占用内存较大(不关我的事),因此请不要录制太长时间!
录制出来的Gif图像显示效果怎么样?由于该程序没做Gif多帧图像的显示功能(主打功能是录制),因此你可以用附带的另一个“截图6.0版.exe”程序进行打开测试(该程序基于GDI+库,也支持拖放文件进行打开操作,点击鼠标中键自动调整窗口大小)。
如想编译此源码,请确保已配置好CxImage环境。
有问题联系:hastings1986@163.com