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

[双屏][显示][窗口]双屏显示问题(窗口无法重绘在原始区域)

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

  大家好,我最近需要实现双屏显示功能,显示模式设置为:双屏显示,当将我写的应用程序(单文档)拖放到辅屏然后最大化显示,此时可以实现在辅屏最大化显示,然后将程序最小化再最大化,此时窗口显示丢失,如同显示区域越界一样,主/辅屏都没有窗口显示。

  我将其他应用软件按照以上方法是可以实现重新显示在原位置的,不知道是不是程序中函数用的不对还是程序写的有问题,希望大伙给予解决啊,多谢了!

Tags: , , ,

[何在][初始][显示]如何在DLL初始化的时候显示一个对话框

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

我想在一个MFC DLL初始化的时候显示一个对话框,我这样写的
BOOL CdDllApp::InitInstance()
{
CWinApp::InitInstance();

AFX_MANAGE_STATE(AfxGetStaticModuleState());

dllDlg.Create(IDD_DINJECT, NULL);
dllDlg.ShowWindow(SW_SHOW);

return TRUE;
}

可是当InitInstance返回的时候对话框就不见了,应该怎么做呢?

解决不了

创建一个单独 Thread 在这个Thread内不 显示 窗口 管理还方便

可我就是要有个窗口啊

在CdDllApp::InitInstance中开启一个线程,在线程中创建窗口。
当然,如果不是模态的话,那么不要忘了消息循环。

接分是王道!

接分先!

Tags: , , ,

[显示][缓冲区][位图]怎么显示缓冲区中的位图

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

字符串char* str中是一个位图的数据,怎么将他在对话框中显示出来?请叫了

一同关注,我要从网络得到一个M-JPEG的数据流,放在char* buffer中,怎么将其解码写入文件,或者显示?谢谢

是不是要用到CxImage,我也不太清楚,同问,顶起来。

字符串中是一个从网络接到的完整的位图数据,是一个“*.bmp”文件的二进制数据,我是先把这数据存到硬盘再显示出来,这样太耗费时间了,现在是想直接显示,以提高效率,怎么做啊,等

luKen2000  你是做视频传输吗?跟你做的一样。

这个问题,请你参考一下 openCV里面的highGUI里面的相关代码,其实也很简单。
请参考,openCV源代码里面的下面这个函数,就可以搞定了。
CvvImage::DrawToHDC( HDC hDCDst, RECT* pDstRect );

补充一下,请参考下面两个文件的源代码,就可以搞定了。
http://opencv-extension-library.googlecode.com/svn/trunk/src/CvxWin32.h
http://opencv-extension-library.googlecode.com/svn/trunk/src/CvxWin32.cpp

完整的bmp文件啊,那么有位图头就简单,用SetDIBitsToDevice就可以显示了。

楼上正解…

能给个代码例子吗,出学者,不是很懂,大侠谢了

::SetDIBitsToDevice(hDC, xPos, yPos,
dwWidth, dwHeight,
0, 0, 0, dwHeight,
(VOID*)(lpBuf + sizeof(BITMAPINFOHEADER)), (LPBITMAPINFO)lpBuf, DIB_RGB_COLORS);

CDC dc; 
CClientDC cdc(this); 
   
dc.Attach(cdc.m_hDC); 
   
CDC memDC; 
memDC.CreateCompatibleDC(&dc); 
   
CBitmap bmp; 
bmp.CreateCompatibleBitmap(&dc,100,100); 
//memDC.SelectObject(&bmp); 
    //bmp.CreateBitmap(100,100,1,24,m_pBufferZoom);
LPBITMAPINFO  bmpInfo;
bmpInfo=(BITMAPINFO*) new BYTE[sizeof(BITMAPINFOHEADER) +3 * sizeof(RGBQUAD)];
bmpInfo->bmiHeader.biSize  =  sizeof(BITMAPINFOHEADER); 
bmpInfo->bmiHeader.biWidth  =  100; 
bmpInfo->bmiHeader.biHeight  =  -100; 
bmpInfo->bmiHeader.biPlanes  =  1; 
bmpInfo->bmiHeader.biBitCount  =  24;//24位色 
bmpInfo->bmiHeader.biCompression  =  BI_RGB; 
bmpInfo->bmiHeader.biSizeImage  =  0; 
bmpInfo->bmiHeader.biXPelsPerMeter  =  3000; 
bmpInfo->bmiHeader.biYPelsPerMeter  =  3000; 
bmpInfo->bmiHeader.biClrUsed  =  0; 
  bmpInfo->bmiHeader.biClrImportant  =  0; 
  SetDIBits(dc.m_hDC,bmp,0,100,m_pBufferZoom,bmpInfo,DIB_RGB_COLORS); 
  cdc.BitBlt(0,0,100,100,&memDC,0,0,SRCCOPY);
//我发的是100*100的bmp,,,m_pBufferZoom是缓冲区的数据

Tags: , , ,

[进制][显示]16进制显示的问题

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

 
  设aa=0×5a;
  Edit控件有一int型变量m_aa,我想让:m_aa=aa;并在编辑框中显示为16进制的5a,应该这么办啊?

int a = 0×5a;

CString strText;
strText.Format(_T("%x"), a);

edit.SetWindowText(strText);

只能关联CString类型变量。

Tags: , ,

[编程][toolbar][显示]请教VC编程中toolbar显示问题和关闭程序后发出“咚”声的问题

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

想写一个小程序
是在Codejock.Xtreme.Toolkit.Pro实例中Advanced的基础上修改的
现在遇到两个问题:
1、toolbar左侧显示不正常,会显示此处背景的颜色
2、目前程序运行起来基本正常,但在点击关闭按钮后会发出“咚”的一声
以上两个问题考虑了好几天,还是没找到原因
恳请高手指点!
不胜感激!

关闭时,出现“咚”一声,应该是程序在退出时出错了,你在退出的代码如OnClose中设置断点看看.
可能是有资源或者内存没有正确释放.

Tags: , , ,

[显示][static][文字]关于显示static文字的问题

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

我所写的一个程序用到了一个static文字控件,我往里面写的内容有点长,结果在我的宽屏显示器上能完全显示出来,但在普屏上只能显示部分,我想问一下要使在普屏上完全显示出来要怎样?
还有是static文件里面我用到了一个摄氏度的符号,结果编译出来时显示是两个问号,请问怎样才能使它显示出符号?
由于 我个人很少用VC,很多都不太懂,麻烦各路英雄指教一下,怎样才能解决这两个小问题,谢谢

1、可以在初始化窗口时逐个控件用MoveWindow重新设置大小和位置。
2、把资源的语言类型改为中文。

在程序初始化里面判断屏幕的大小,根据屏幕的大小来设定自己控件的大小和位置

楼上都有道理,同意

不同的分辨率制定不同的控件位置

同意楼上几位说法,根据屏幕分辨率,或者窗口大小定制文字显示范围。

GetTextExtentExPoint

GetTextExtent

要么缩小字体,要么分行。

如果显示特殊字符,建议考虑richedit,改改属性什么的,和static一样。

建议用EDIT不用STATIC.

谢谢各位,看来我还是有很多不明白的.晚上回去再试.谢谢

引用 1 楼 tunnel115 的回复:
第二个问题,在摄氏度的符号前加/

这个方法不行,不过不是谢了。

引用 2 楼 cnzdgs 的回复:
1、可以在初始化窗口时逐个控件用MoveWindow重新设置大小和位置。
2、把资源的语言类型改为中文。

谢谢你的方法!

Tags: , , ,

[MsChart][名称][显示]为什么MsChart y轴名称显示不清楚

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

VC6下用MsChart,同样的设置,X轴显示正常,Y轴显示字符根本看不清楚
m_Chart.GetPlot().GetAxis(VtChAxisIdX,var).GetAxisTitle().SetText("血压值"); //x轴
m_Chart.GetPlot().GetAxis(VtChAxisIdY,var).GetAxisTitle().SetText(" 分 布 概 率 "); //y轴

Tags: , , ,

[消息][显示][窗口]如何抢在QQ的消息显示到窗口前替换其中内容

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

公司的需求:
做一个QQ辅助转换插件,在QQ收到消息后将消息中的简体中文转换成繁体。

请问如何才能在QQ自己显示消息之前将消息取出并替换?

盼高人指点。

感觉应该钩子拦截该进程,对网络来的数据处理。可能还需要注入代码,当qq运行时,让自己的钩子程序运行。

QQ协议可不是明文的哦。。

所以截取报文的方式肯定不实际。。。。

可以使用消息钩子,和查找窗口类的API如Findwindow,SetWindowText之类的来伪装实现。。。
不过好像有点延时。嘿嘿。。

QQ 消息显示是RichEdit, 拦截QQ的该控件消息,

比如在修改文本的消息EM_REPLACESEL, 先取得修改的简体文本, 转换后再把 消息的参数改掉

谢谢crearo 和 zzz3265 :)

听说QQ有保护措施 HooK有难度,我先去试试看。

Tags: , , ,

[edit][控件][显示]edit控件显示问题

09月 1st, 2008 by admin
Posted in VC/MFC | No Comments »

        //下面这段是选择目录路径
char  buffer[MAX_PATH];
BROWSEINFO  m_pbi;
::ZeroMemory(&m_pbi,sizeof(BROWSEINFO));
m_pbi.hwndOwner = GetSafeHwnd();
m_pbi.pszDisplayName = buffer;
m_pbi.lpszTitle = "请选择信息保存路径";
        m_pbi.ulFlags  = BIF_RETURNONLYFSDIRS;
ITEMIDLIST *idl = SHBrowseForFolder(&m_pbi);
        if(idl) 

    SHGetPathFromIDList(idl,buffer); 
}
///////问题开始
        CString m_edit;
m_edit="我是一个菜鸟";
m_edit+="
";
m_result.SetWindowText(m_edit);  //m_result 是与edit控件相关联的 CEDIT类变量
        MessageBox("i am here"); ///////////关键问题,为什么我必须加上MessageBox,edit控件中才会显示
        “我是一个菜鸟”,否则显示空白???
        是不是与控件获得焦点有关? 请高手指点一下。

你用updatedata(false)试试看

没有刷新,用update()看看或者updatedata,

GetDlgItemText(IDC_EDIT1,m_edit)
是获得控件内容吧,好像还是不行,继续等待。

不会呀,,我用你的程序是可以显示"我是一个菜鸟"的呀,,,若还有其它问题可以加我们的群,,,

应该是没有刷新显示,用在之后加一句UpdateData(false);

///////问题开始
UpdateData();
CString  m_edit;
m_edit="我是一个菜鸟";
m_edit+="
";
m_result.SetWindowText(m_edit);    //m_result  是与edit控件相关联的  CEDIT类变量
UpdateData(FALSE);

///////问题开始 
UpdateData();
CString      m_edit; 
m_edit="我是一个菜鸟"; 
m_edit+="
"; 
m_result.SetWindowText(m_edit);          //m_result      是与edit控件相关联的      CEDIT类变量 
UpdateData(FALSE);

Tags: , , ,