[使用][DirectDraw][显示]如何使用DirectDraw 显示图象序列
09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »
我正做一个图象序列显示程序,图象序列是352*288分辨率的,是用directshow捕获的,用StretchDIBits 定时显示图象序列,但是如果要在上面添加文字什么的,闪烁感比较强,所以想采用DirectDraw来实现,我看了CSDN上老的帖子,http://topic.csdn.net/t/20020522/17/744153.html 上面xzhangjie(飞天狐狸)发了一个类
#include "DDraw.h "
class CDDraw
{
public:
void CleanUp();
void DrawDIB(BITMAPINFOHEADER* pBI,char* pData,RECT*rt);
BOOL Init(HWND hWnd,int nWidth,int nHeight);
CDDraw();
virtual ~CDDraw();
private:
HWND m_hDrawWnd;
LPDIRECTDRAW lpDD; // DirectDraw 对象
LPDIRECTDRAWSURFACE lpDDSPrimary; // DirectDraw 主页面
LPDIRECTDRAWSURFACE lpBackdds;
LPDIRECTDRAWCLIPPER lpClipperBack;
};
CDDraw::CDDraw()
{
lpDD=NULL;
lpDDSPrimary=NULL;
lpBackdds=NULL;
lpClipperBack=NULL;
}
CDDraw::~CDDraw()
{
if(lpDD!=NULL)CleanUp();
}
BOOL CDDraw::Init(HWND hWnd,int nWidth,int nHeight)
{
if(hWnd==NULL) return FALSE;
m_hDrawWnd=hWnd;
if(DirectDrawCreate(NULL,&lpDD,NULL)!=DD_OK)return FALSE;
lpDD-> SetCooperativeLevel(hWnd, DDSCL_NORMAL);
DDSURFACEDESC ddsd;
ddsd.dwSize = sizeof( ddsd ); //结构的大小
ddsd.dwFlags = DDSD_CAPS; //指定DDSURFACEDESC结构的ddsCaps成员为可用
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; //指定要创建的是主页面
//创建主页面对象
if ( lpDD-> CreateSurface( &ddsd, &lpDDSPrimary, NULL ) != DD_OK) return FALSE;
if(lpDD-> CreateClipper(NULL,&lpClipperBack,NULL)!=DD_OK) return FALSE;
lpClipperBack-> SetHWnd(0,hWnd);
lpDDSPrimary-> SetClipper(lpClipperBack);
lpClipperBack-> Release();
lpClipperBack=NULL;
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwHeight = nHeight;
ddsd.dwWidth = nWidth;
if(lpDD-> CreateSurface(&ddsd, &lpBackdds, NULL)!=DD_OK) return FALSE;
return TRUE;
}
void CDDraw::DrawDIB(BITMAPINFOHEADER *pBI, char *pData, RECT *rt)
{
RECT srt;
srt.left=0;
srt.top=0;
srt.right=pBI-> biWidth;
srt.bottom=pBI-> biHeight;
HDC hDC;
lpBackdds-> GetDC(&hDC);
SetDIBitsToDevice(
hDC,
0,
0,
pBI-> biWidth, // source rectangle width
pBI-> biHeight, // source rectangle height
0, // x-coord of source lower-left corner
0, // y-coord of source lower-left corner
0, // first scan line in array
pBI-> biHeight, // number of scan lines
pData, // array of DIB bits
(const struct tagBITMAPINFO*)pBI, // bitmap information
DIB_RGB_COLORS // RGB or palette indexes
);
lpBackdds-> ReleaseDC(hDC);
lpDDSPrimary-> Blt(rt,lpBackdds,&srt,0,NULL);
}
void CDDraw::CleanUp()
{
if(lpDD!=NULL)
{
if(lpClipperBack!=NULL)
{
lpClipperBack-> Release();
lpClipperBack=NULL;
}
if(lpDDSPrimary!=NULL)
{
lpDDSPrimary-> Release();
lpDDSPrimary=NULL;
}
if(lpBackdds!=NULL)
{
lpBackdds-> Release();
lpBackdds=NULL;
}
lpDD-> Release();
lpDD=NULL;
}
}
但是无法显示图象序列,序列已从32位转成24位RGB
哪位大哥能告诉我原因啊?谢谢了
我的邮箱:jiaqicx@163.com
大家帮帮忙啊 谢谢了
自己顶
[GetExitCodeThread][使用]关于GetExitCodeThread()的使用
09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »
我再对话框程序中设置了线程终止按钮,来终止两个线程,代码如下:
void CCreateRectDlgDlg::OnTerminateThread()
{
DWORD dwexitcode1=0,dwexitcode2=0;
TerminateThread(m_thread1->m_hThread,dwexitcode1);
TerminateThread(m_thread2->m_hThread,dwexitcode2);
}
m_thread1和m_thread2存放了创建两个线程时AfxBeginThread()的返回值。
对话框中又设置了两个按钮,点击出现线程1或线程2的状态提示框,按钮1代码:
void CCreateRectDlgDlg::OnThread1State()
{
LPDWORD lpexitcode=NULL;
if(GetExitCodeThread(m_thread1->m_hThread,lpexitcode))
{
if (*lpexitcode == STILL_ACTIVE)
MessageBox("线程1在执行");
else
MessageBox("线程1经退出");
}
else
MessageBox("获取退出代码失败");
}
按钮2代码:
void CCreateRectDlgDlg::OnThread2State()
{
LPDWORD lpexitcode=NULL;
if(GetExitCodeThread(m_thread2->m_hThread,lpexitcode))
{
if (*lpexitcode == STILL_ACTIVE)
MessageBox("线程2在执行");
else
MessageBox("线程2经退出");
}
else
MessageBox("获取退出代码失败");
}
问题是:让两个线程开始画图,然后按线程终止按钮终止线程后,再按按钮1或按钮2来显示状态时系统出错,不知道问题处在了哪里,请教大家
[使用][CTabCtrl]SDI中如何使用CTabCtrl
09月 16th, 2008 by admin
Posted in VC/MFC | No Comments »
http://www.codetools.com/useritems/mditabs.asp 在其他帖子中搜到了这个链接,页面已经不存在了..
DLG中可以直接拖拽控件就可以了,在SDI中如何用控件呢?
现在很多软件(比如Google earth)都在侧面有一个工具框,而且可以分页.我想实现那个效果.
停靠侧面工具栏的我已经实现了,但是工具栏不是我要的,我需要一个可以分页的,像CTabCtrl那样的.
并不一定必须CTabCtrl,只要是能分页的就行(我要在页面上添加一些按钮什么的),有其他比较方便实现的控件也可以,谢谢.
http://www.vckbase.com/document/viewdoc/?id=1059
[动态][全局][使用]动态全局数组使用所遇到的问题。
09月 16th, 2008 by admin
Posted in VC/MFC | No Comments »
我想定义一个全局动态数组来传递变量
首先我在StdAfx.h中
extern CPlayer *qqq; //CPlayer是我自己定义的类
接着在 StdAfx.cpp
CPlayer *qqq=new CPlayer[整型变量];
运行后提示incorrect storage class 'auto',定义CPlayer的头文件已经包含进了StdAfx.h,
当我把上面的CPlayer换成int ,或者double 时就没有问题,换成CString时会出现同样的问题?
请能人帮帮我,先谢谢了
CPlayer *qqq=new CPlayer[整型变量];
这相当于定义动态数组,只有基本类型才可能实现一维的动态数组。
这个"整数变量"只能是常量.
我试了试,可以通过的。问题应该不在new这句话本身。
你是想把全局变量定义在stdafx.h这个文件中??
//stdafx.h
CPlayer *qqq
然后在别的.h文件中引用
//***.h
#include "stdafx.h"
extern CPlayer *qqq
全局变量定义可以在xxxxApp.cpp中,然后用时可以:
theApp.yyyy
不要方stdafx中!
CPlayer *qqq=new CPlayer[整型变量];
这里是不可用变量的
[使用][connect]UDP使用connect如何写
09月 16th, 2008 by admin
Posted in VC/MFC | No Comments »
当UDP使用connect时,是不是分服务端和客户端?
是不是和TCP一样客户端调用connect,服务端调用accept?
谁可给个简单的例程看看?谢谢!
楼上的这位,好像没用到connect啊,呵呵。
udp是面向无连接的不需要connect的
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);//TCP:SOCK_STREAM
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);//UDP:SOCK_DGRAM
UDP一般是不需要connect的,但也可以用connect,
我是想知道调用connect时,两端的程序应怎么写。
例子:http://bbs.loveunix.net/viewthread.php?tid=14086
http://bbs.loveunix.net/viewthread.php?tid=14086
这里没有udp使用connect的例子
UDP上使用了connect,你就将接收进行了定向,在调用recvfrom,sendto的时候你就可以改成recv,send了。除了UDP本身的特性没有变外,其它的操作和TCP没有什么不同的
UDP没有connect的概念。只要向目标地址发送数据即可。
UDP调用CONNECT
在末连接UDP套接口上给两个数据报调用函数sendto导致内核执行下列六步:
1.连接套接口;
2.输出第一个数据报
3.断开套接口连接;
4.连接套接口,
5.输出第二个数据报;
6.断开套接口连接
已连接套接口发送两个数据报的导致内核执行如下步骤;
1.连接套接口;
2.输出第一个数据报;
3.输出第二个数据报。
对同一套接口发送时,耗时减少1/3
UDP不需要connect
UDP可以connect, 只是一般情况下没有必要那么做,
UDP上使用了connect,你就将接收进行了定向,在调用recvfrom,sendto的时候你就可以改成recv,send了。除了UDP本身的特性没有变外,其它的操作和TCP没有什么不同的
看看windows网络编程上关于UDP connect的介绍,
模拟TCP三次握手?
调用connect,主要是可以使用recv,send,而不必使用recvfrom,sendto
unix 网络编程那本书有这个例字,可以找来参照一下
[使用][链接][ACCESS]使用Ado链接ACCESS只能使用OLEDB3.51我想使用4.0怎么办(有答案了再加分至少50)
09月 15th, 2008 by admin
Posted in VC/MFC | No Comments »
使用ADO连接ACCESS,发布的时候有些机器是4.0的这样就没法使用我写的dll。。。
现在考虑全部变成4.0的,等发布的时候全给客户端再装个mdac。。。
我查看过注册表Oledb 3.51和Oledb 4.0都有,HKEY_CLASS_ROOT.jod 下的键值是Microsoft.Jet.OLEDB 3.51
刚开始认为是这个决定了我的电脑只能使用Oledb 3.51
网上找资料自己重新注册了msjetoledb4.0.dll
此键值变成了4.0
可是改程序连接为4.0仍出项run-time错误
改成3.51则没错
请问怎么改才能使用Oledb 4.0呢?我电脑上mdac是2.81版的。按理说是由4.0的问题就是我不会整
请各位朋友帮忙。谢谢!!!
等在我电脑上测试过了等发布的时候再在安装包的时候让它装2.81
问题是现在我电脑上有这个,可是和4.0的连不上啊。。。
你在开始->运行下面执行了regsvr32 msjetoledb40.dll 没有?? 最好重启一下..
就是通过这个命令将那个注册表那个值改成4.0的重启后也没有生效。。。。
使用4.0建立数据库没错,连接数据库没错,但是要使用m_pConnection.Excute()创建一个表的时候出错。
然而我将它改成3.51同样的代码就不出错。。
请各位帮帮忙啊。。。
m_pConnection->Excute()
你确认4.0装上去了吗?? 打开控制面板->管理工具->数据源(ODBC),选择驱动程序页签..看看里面的版本是4.0??
刚看了,除了odbc for oracle是2.5几版本,其他都是4.0版本以上的。
另一位版主,谢谢。
不过不是那个原因。我只是在这打错了,程序里是->,要不然编译就报错了。
现在我比较纳闷的是。。。
我使用4.0的可以创建一个空数据库。。。打开时2000格式的。。。
为什么连接后要执行创建表语句就出现错误呢。
难道4.0和3.51支持的函数,语句不一样?
你用4.0可以执行查询等操作吗? 不是建表..
可以执行查询,但是插入或者是建表等对数据库操作的就没法执行过去。。。
找到了一个4.0代码在我电脑上运行没错,改成3.51也能执行。那这样看来我电脑还是可以执行4.0的连接的嘛。
不过他插入表使用putcontent,我打算试试。。
难道是我sql语句太长了,excute不支持。。。
那3.51还支持呢。哎,不管那么多了,想到啥都要试。。。
我刚刚看了下
我注册表中的也是3.5.1
但用4.0正常
谢谢shakaqrj
那我就进一步确定4.0跟注册表那个值没关系了
最新报告
用putcollect就出错。。。怀疑数据库难道也设了权限,一有写入动作就出错。
现在我还有个疑问,最开始我直接用4.0的时候程序提示未注册类别,改成3.51后没错
之后我再改成4.0再也没报过这个错。。。
一般不会吧
你试试看不用putcollect
直接用connection execute一条insert语句看看
注意捕获异常
不用putcollect用insert的话在3.51是正常的。4.0还是不行。。。
要不我把代码贴出来,版版帮忙瞅瞅。
其实代码很短。。。
纠结啊纠结,昨天下班都是偷偷摸摸滴。。。
[使用][ODBC]关于VC++6.0 中使用ODBC的text driver 的用法
09月 14th, 2008 by admin
Posted in VC/MFC | No Comments »
我想请教一下各位,ODBC的text driver怎么用,从配置DNS到软件编写,在VC++6.0下如何实现
–b 结帖率确实太低了~ 是不是解决了问题就不管了的那种??
以下是使用ODBC操作数据库的代码..关于dsn的配置,这个不用讲吧? 这么简单.在控制面板->管理工具->数据源(ODBC)里面配置就行了.
#include "afxdb.h"
//—————————————————————
// Create and open a database object;
// do not load the cursor library
CDatabase db;
//db.OpenEx( NULL, CDatabase::forceOdbcDialog );
db.OpenEx( "DSN=ODBC数据源名称;UID=;PWD=", CDatabase::noOdbcDialog );
// Create and open a recordset object
// directly from CRecordset. Note that a
// table must exist in a connected database.
// Use forwardOnly type recordset for best
// performance, since only MoveNext is required
CRecordset rs( &db );
rs.Open( CRecordset::forwardOnly,
_T( "select * from 表名" ) );
// Create a CDBVariant object to
// store field data
CDBVariant varValue;
// Loop through the recordset,
// using GetFieldValue and
// GetODBCFieldCount to retrieve
// data in all columns
short nFields = rs.GetODBCFieldCount( );
while( !rs.IsEOF( ) )
{
for( short index = 0; index < nFields; index++ )
{
rs.GetFieldValue( index, varValue );
// do something with varValue
AfxMessageBox(*varValue.m_pstring);
}
rs.MoveNext( );
}
rs.Close( );
db.Close( );
谢谢二楼的,我结贴率低是因为回答出来的帖子太少了,大部分都是我自己后来解决了。
[使用][菜单][定义]如何使用菜单打开自定义对话框形如help菜单打开About对话框
09月 14th, 2008 by admin
Posted in VC/MFC | No Comments »
比如我建立了一个标识符为IDD_DIALOG1的普通对话框,想和菜单中的一项dialog1对应(点击菜单自动弹出对话框),该怎么做,谢谢!
为你建立的对话框建立一个类,假设类名为CMyDlg,在响应点击菜单消息中构造一个CMyDlg对象,比如CMyDlg myDlg;然后调用myDlg.DoModal( );
[使用][程序][测试]DLL中使用DAO在MFC程序中测试通过WIN32程序中却提示CDaoException
09月 13th, 2008 by admin
Posted in VC/MFC | No Comments »
由于dll中有使用DAO建立access数据库,所以DLL使用MFCDLL的模板做的使用动态mfc的规则dll。可是这个程序在MFC程序运行正常,在我机器上的win32程序中调用也正常,转移到其他机器上就提示CDaoException。可是我在调试dll时都是能正确执行的,调用完dll退出程序return 0时会弹出一个输入crt0.c路径的提示。dll要实现的建立数据库导入数据功能,查找文件夹下相应的mdb文件和输入内容也是可以正确导入的。网上说出现这错误可能是调用dll后资源没被释放的缘故,msdn上关于dll中使用dao的说明中提到尽量使用动态分配空间,在AfxDaoTerm之前释放已经分配空间。我将代码检查过动态分配的空间也都在退出前删除了。请各位达人指教一下,我已经在这问题上纠结了4,5天了。
执行DAO操作的地方都设置了try catch可是都未捕获到异常。
调试的时候也只是在调用完DLL后主程序退出时发生错误
现在基本定位出错原因了。。。
会出现CDaoException是因为在create或open时CDaoDatabase调用了AfxDaoInit出错。。。
不过还是不清楚为什么在dll里这样调用会出错。。。
debug错误信息是First-chance exception in dlltest.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
这应该是编译器捕获了异常处理了,所以在我机子上它还是能正常运行。可是有些机器编译器捕获到了异常却没处理就导致程序出错了。
哎,到底怎么改啊。。
MSDN上有一篇Your application may fail with an "Access Violation" error message when you use ODBC or DAO in the InitInstance or DLLMain functions of a DLL的文章
好像是说dll里创建了线程会出错啥的,不知道我出错的跟这是不是一样呢。
[微软][detours][使用]微软的detours应该如何使用
09月 11th, 2008 by admin
Posted in VC/MFC | No Comments »
我下载好了,安装好了,然后呢?
使用的时候带上相关的头文件?
http://blog.csdn.net/vcPlayer/archive/2008/07/20/2681758.aspx
UP
我用的是VC++.NET 2003,出错了。
E:Program FilesMicrosoft Visual Studio .NET 2003SDKv1.1src>..in
make
Microsoft (R) 程序维护实用工具 7.10.3077 版
版权所有 (C) Microsoft Corporation。保留所有权利。
Building for 32-bit X86.
if not exist "..include" mkdir "..include"
if not exist "..lib" mkdir "..lib"
if not exist "..in" mkdir "..in"
rc detoured.rc
'rc' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
NMAKE : fatal error U1077: “rc” : 返回代码“0×1”
Stop.
请按任意键继续. . .
开始菜单->Microsoft Visual Studio .NET 2003-> Visual Studio .NET 工具->Visual Studio .NET 2003 命令提示