[使用][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

大家帮帮忙啊   谢谢了

自己顶

Tags: , , ,

[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来显示状态时系统出错,不知道问题处在了哪里,请教大家

Tags: , ,

[使用][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

Tags: , ,

[动态][全局][使用]动态全局数组使用所遇到的问题。

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[整型变量];
这里是不可用变量的

Tags: , , ,

[使用][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   网络编程那本书有这个例字,可以找来参照一下

Tags: , ,

[使用][链接][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的问题就是我不会整
请各位朋友帮忙。谢谢!!!

引用 1 楼 tabby 的回复:
给别人的机器重新安装新的ADO驱动..比如mdac2.81

等在我电脑上测试过了等发布的时候再在安装包的时候让它装2.81
问题是现在我电脑上有这个,可是和4.0的连不上啊。。。

你在开始->运行下面执行了regsvr32 msjetoledb40.dll 没有?? 最好重启一下..

引用 3 楼 tabby 的回复:
你在开始->运行下面执行了regsvr32 msjetoledb40.dll 没有?? 最好重启一下..

就是通过这个命令将那个注册表那个值改成4.0的重启后也没有生效。。。。

使用4.0建立数据库没错,连接数据库没错,但是要使用m_pConnection.Excute()创建一个表的时候出错。
然而我将它改成3.51同样的代码就不出错。。
请各位帮帮忙啊。。。

m_pConnection->Excute()

你确认4.0装上去了吗?? 打开控制面板->管理工具->数据源(ODBC),选择驱动程序页签..看看里面的版本是4.0??

引用 7 楼 tabby 的回复:
你确认4.0装上去了吗?? 打开控制面板->管理工具->数据源(ODBC),选择驱动程序页签..看看里面的版本是4.0??

刚看了,除了odbc for oracle是2.5几版本,其他都是4.0版本以上的。

另一位版主,谢谢。
不过不是那个原因。我只是在这打错了,程序里是->,要不然编译就报错了。

现在我比较纳闷的是。。。
我使用4.0的可以创建一个空数据库。。。打开时2000格式的。。。
为什么连接后要执行创建表语句就出现错误呢。
难道4.0和3.51支持的函数,语句不一样?

你用4.0可以执行查询等操作吗? 不是建表..

引用 10 楼 tabby 的回复:
你用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语句看看
注意捕获异常

引用 14 楼 shakaqrj 的回复:
一般不会吧
你试试看不用putcollect
直接用connection execute一条insert语句看看
注意捕获异常

不用putcollect用insert的话在3.51是正常的。4.0还是不行。。。
要不我把代码贴出来,版版帮忙瞅瞅。
其实代码很短。。。
纠结啊纠结,昨天下班都是偷偷摸摸滴。。。

Tags: , , ,

[使用][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( );

谢谢二楼的,我结贴率低是因为回答出来的帖子太少了,大部分都是我自己后来解决了。

Tags: , ,

[使用][菜单][定义]如何使用菜单打开自定义对话框形如help菜单打开About对话框

09月 14th, 2008 by admin
Posted in VC/MFC | No Comments »

比如我建立了一个标识符为IDD_DIALOG1的普通对话框,想和菜单中的一项dialog1对应(点击菜单自动弹出对话框),该怎么做,谢谢!

为你建立的对话框建立一个类,假设类名为CMyDlg,在响应点击菜单消息中构造一个CMyDlg对象,比如CMyDlg   myDlg;然后调用myDlg.DoModal(   );

Tags: , , ,

[使用][程序][测试]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天了。

引用 1 楼 tabby 的回复:
用try捕获了异常吗?显示的异常内容是什么??

执行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里创建了线程会出错啥的,不知道我出错的跟这是不是一样呢。

Tags: , , ,

[微软][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  命令提示 

Tags: , , ,