[使用][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
大家帮帮忙啊 谢谢了
自己顶
[双屏][显示][窗口]双屏显示问题(窗口无法重绘在原始区域)
09月 14th, 2008 by admin
Posted in VC/MFC | No Comments »
大家好,我最近需要实现双屏显示功能,显示模式设置为:双屏显示,当将我写的应用程序(单文档)拖放到辅屏然后最大化显示,此时可以实现在辅屏最大化显示,然后将程序最小化再最大化,此时窗口显示丢失,如同显示区域越界一样,主/辅屏都没有窗口显示。
我将其他应用软件按照以上方法是可以实现重新显示在原位置的,不知道是不是程序中函数用的不对还是程序写的有问题,希望大伙给予解决啊,多谢了!
[何在][初始][显示]如何在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中开启一个线程,在线程中创建窗口。
当然,如果不是模态的话,那么不要忘了消息循环。
接分是王道!
接分先!
[显示][缓冲区][位图]怎么显示缓冲区中的位图
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是缓冲区的数据
[进制][显示]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类型变量。
[编程][toolbar][显示]请教VC编程中toolbar显示问题和关闭程序后发出“咚”声的问题
09月 10th, 2008 by admin
Posted in VC/MFC | No Comments »
想写一个小程序
是在Codejock.Xtreme.Toolkit.Pro实例中Advanced的基础上修改的
现在遇到两个问题:
1、toolbar左侧显示不正常,会显示此处背景的颜色
2、目前程序运行起来基本正常,但在点击关闭按钮后会发出“咚”的一声
以上两个问题考虑了好几天,还是没找到原因
恳请高手指点!
不胜感激!
关闭时,出现“咚”一声,应该是程序在退出时出错了,你在退出的代码如OnClose中设置断点看看.
可能是有资源或者内存没有正确释放.
[显示][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.
谢谢各位,看来我还是有很多不明白的.晚上回去再试.谢谢
这个方法不行,不过不是谢了。
谢谢你的方法!
[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轴
[消息][显示][窗口]如何抢在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有难度,我先去试试看。
[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);