大虾帮忙------我的翻页(flip)有问题
有2个bmp图形文件,一个放在主页面,另外一个放在缓存.然后定时用flip翻页.但是程序运行时只能看见放在缓存的bmp图形文件能够定时显示,却看不见放在主页面的bmp图形文件显示.这到底是什么问题 ? 是不是显示卡的问题?
有2个bmp图形文件,一个放在主页面,另外一个放在缓存.然后定时用flip翻页.但是程序运行时只能看见放在缓存的bmp图形文件能够定时显示,却看不见放在主页面的bmp图形文件显示.这到底是什么问题 ? 是不是显示卡的问题?
解决方案 »
- vs2010 insert->new form问题
- 最近看《windows程序设计》第五版 遇到的问题急求助//第一次发帖大家支持下啊。。。
- 求推荐几本windows编程入门的书
- 同样是在VC中编译的一句话,为什么一个别人给我的例子程序能通过编译,而我复制粘贴后的代码在自己的程序中编译就错呢?代码见帖子内容
- 自己做的程序员用的小工具,拿出来给大家献丑了
- 我的vc一调试,程序就死.请达人指点
- 请大家帮忙指点,ado使用中的一个小问题
- 一个ADO连接导致内存泄露的问题。
- 这个问题这么问了这么久,都没人能帮我呢?在发布使用了ADO进行数据库编程的程序时,老是提示接口不对...
- 看来大家都不是真心想帮别人的,没有分给就不回复,中国的程序员就这种水平了.
- (急)请问如何自动读取一个目录下面的所有文件?
- 请教一个关于画图程序的问题
http://www.pcvc.net/category/content.asp?sendid=160
//锁住后备画面
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
if (FAILED(lpDDback->Lock(NULL,&ddsd,
DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,
NULL)))
{
MessageBox(NULL,TEXT("primary surface lock error!"),
TEXT("Wrong!"),MB_OK);
return(1);
}
//解锁后备画面
if (FAILED(lpDDback->Unlock(NULL)))
{
MessageBox(NULL,TEXT("primary surface unlock error!"),
TEXT("Wrong!"),MB_OK);
return(1);
} //翻页
while (FAILED(lpDDprimary->Flip(NULL, DDFLIP_WAIT)));
是不是你的处理方式有问题呢?如果只是两个不同页面内容的往复切换,你只要绘制两次就够了,然后不断的flip就可以
因为flip并不改变由前台带回来的内容,但是如果你再次重绘后台就不同了。
//#include "stdafx.h"
#include "canvasr.h"
#include "canvasFrame.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// canvasFrameIMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)LPDIRECTDRAW7 pDD7; //声明DirectDraw对象
LPDIRECTDRAWSURFACE7 pPSur; //声明主绘图页
LPDIRECTDRAWSURFACE7 pBBuf; //声明后缓冲区
LPDIRECTDRAWSURFACE7 pOPla; //声明幕后内存区
DDSCAPS2 caps; //声明DDSCAPS结构
DDSURFACEDESC2 desc; //声明描述结构
HRESULT result; //声明HRESULT类型变量canvasFrame::canvasFrame()
{
Create(NULL,"绘图窗口",WS_POPUP); //建立窗口
hdc = ::CreateCompatibleDC(NULL);
bmp1 = (HBITMAP)::LoadImage(NULL,"back1.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
bmp2 = (HBITMAP)::LoadImage(NULL,"back2.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
::SelectObject(hdc,bmp1); //选择第一张位图
LoadBmp();
pPSur->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
::SelectObject(hdc,bmp2); //选择第二张位图
LoadBmp();
pBBuf->BltFast(0,0,pOPla,CRect(0,0,640,480),DDBLTFAST_WAIT);
}canvasFrame::~canvasFrame()
{
delete hdc;
delete hdc1;
delete bmp1;
delete bmp2;
pDD7->Release();
pPSur->Release();
pOPla->Release();
}
BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd)
//{{AFX_MSG_MAP(canvasFrame)
ON_WM_CREATE()
ON_WM_CHAR()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// canvasFrame message handlersint canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
result = DirectDrawCreateEx(NULL, (VOID**)&pDD7, IID_IDirectDraw7, NULL);
//建立DirectDraw对象
if (result != DD_OK)
MessageBox("建立DirectDraw对象失败!");
result = pDD7->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE |
DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT );
//设定协调层级
if(result !=DD_OK)
MessageBox("设定程序协调层级失败!");
result = pDD7->SetDisplayMode(640,480,16,0,DDSDM_STANDARDVGAMODE); //设定屏幕显示模式
//设定显示模式
if(result !=DD_OK)
MessageBox("设定屏幕显示模式失败!");
memset(&desc,0,sizeof(desc));
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
desc.dwBackBufferCount = 1;
desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
result = pDD7->CreateSurface(&desc,&pPSur,NULL);
//建立主绘图页
if(result !=DD_OK)
MessageBox("建立主绘图页失败!");
caps.dwCaps = DDSCAPS_BACKBUFFER;
result = pPSur->GetAttachedSurface(&caps,&pBBuf);
//连结后缓冲区
if(result !=DD_OK)
MessageBox("连接后缓冲区失败!");
memset(&desc,0,sizeof(desc));
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
desc.dwWidth = 640;
desc.dwHeight = 480;
result = pDD7->CreateSurface(&desc, &pOPla, NULL);
//建立幕后内存区
if(result !=DD_OK)
MessageBox("建立幕后内存区失败!");
SetTimer(1,500,NULL);
return 0;
}void canvasFrame::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CFrameWnd::OnChar(nChar, nRepCnt, nFlags);
if( nChar== VK_ESCAPE ) //判断是否按下 Esc 键
PostMessage(WM_CLOSE ); //传送WM_CLOSE信息
}void canvasFrame::OnTimer(UINT nIDEvent)
{
CFrameWnd::OnTimer(nIDEvent);
pPSur->Flip( NULL , DDFLIP_WAIT ); //翻页
}
void canvasFrame::LoadBmp()
{
result = pOPla->GetDC(&hdc1); //取得DC
if(result !=DD_OK)
MessageBox("取得内存区 DC 失败!");
::BitBlt(hdc1,0,0,desc.dwWidth,desc.dwHeight,hdc,0,0,SRCCOPY);
pOPla->ReleaseDC(hdc1); //释放DC
}