关于bltFast问题,无法显示图像,在线等待,错误在draw_slide函数中的bitfast

flyukeer 2008-03-22 12:53:24
// PicSlide.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#define INITGUID
#include <stdio.h>
#include <ddraw.h>
#include <mmsystem.h>
static char szClass[]="XmplHr3Class";
static char szCaption[]="Example - Hour 3";


LPDIRECTDRAW7 lpDD=NULL;
LPDIRECTDRAWSURFACE7 lpDDSPrimary=NULL;
LPDIRECTDRAWSURFACE7 lpDDSBack=NULL;
LPDIRECTDRAWCLIPPER lpClip=NULL;
#define IMAGE_COUNT 7
char file_names[IMAGE_COUNT][256]={"23.bmp",
"24.bmp",
"25.bmp",
"26.bmp",
"27.bmp",
"28.bmp",
"29.bmp"
};
static BOOL Init(HINSTANCE hInstance,int nCmdShow);
LPDIRECTDRAWSURFACE7 lpSlides[IMAGE_COUNT];
int cur_image=0;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LPDIRECTDRAWSURFACE7 bitmap_surface(LPCTSTR file_name);
void draw_slide();
#define SafeRelease(x) if (x) {x->Release();x=NULL;}
void Cleanup();

static BOOL Init(HINSTANCE hInstance,int nCmdShow)
{
WNDCLASS wcex;
HRESULT hRet;


wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = sizeof(DWORD);
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szClass;
if (!RegisterClass(&wcex))
{
return FALSE;
}

int ScreenWidth=GetSystemMetrics(SM_CXSCREEN);
int ScreenHeight=GetSystemMetrics(SM_CYSCREEN);
HWND hWnd;
hWnd=CreateWindow(szClass,szCaption,WS_VISIBLE|WS_POPUP,0,0,ScreenWidth,ScreenHeight,NULL,NULL,hInstance,NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);

hRet=DirectDrawCreateEx(NULL,(LPVOID *)&lpDD,IID_IDirectDraw7,NULL);
if (hRet != DD_OK)
{
return FALSE;
}

hRet=lpDD->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
// hRet=lpDD->SetCooperativeLevel(hWnd,DDSCL_NORMAL);
if (hRet != DD_OK)
{
return FALSE;
}
hRet=lpDD->SetDisplayMode(1280,800,16,0,0);
if (hRet!=DD_OK)
{
return FALSE;
}
DDSCAPS2 ddscaps;
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddscaps,sizeof(DDSCAPS2));
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount=1;

hRet=lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL);
if (hRet!=DD_OK)
{
return FALSE;
}

ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
hRet=lpDDSPrimary->GetAttachedSurface(&ddscaps,&lpDDSBack);

if (hRet!=DD_OK)
{
return FALSE;
}
lpSlides[0]=bitmap_surface(file_names[0]);

draw_slide();

// hRet=lpDD->CreateClipper(NULL,&lpClip,NULL);
// if (hRet!=DD_OK)
// {
// return FALSE;
// }
// lpClip->SetHWnd(0,hWnd);
// lpDDSPrimary->SetClipper(lpClip);

return TRUE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
if (!Init(hInstance,nCmdShow))
{
return FALSE;
}
while(GetMessage(&msg,NULL,NULL,NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}



LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_LEFT:
cur_image--;
if(cur_image<0)
{
cur_image=IMAGE_COUNT-1;
}
draw_slide();
break;
case VK_RIGHT:
cur_image++;
if (cur_image>IMAGE_COUNT-1)
{
cur_image=0;
}
draw_slide();
break;
case VK_ESCAPE:
DestroyWindow(hWnd);
break;
default:
break;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
LPDIRECTDRAWSURFACE7 bitmap_surface(LPCTSTR file_name)
{
HDC hdc;
HBITMAP bit;
LPDIRECTDRAWSURFACE7 surf;
bit=(HBITMAP)LoadImage(NULL,file_name,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
if (!bit)
return NULL;
BITMAP bitmap;
GetObject(bit,sizeof(BITMAP),&bitmap);
int surf_width=bitmap.bmWidth;
int surf_height=bitmap.bmHeight;

HRESULT hRet;
// ZeroMemory(surf,sizeof(LPDIRECTDRAWSURFACE7));
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize=sizeof(DDSURFACEDESC2);
ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
ddsd.dwWidth=surf_width;
ddsd.dwHeight=surf_height;
hRet=lpDD->CreateSurface(&ddsd,&surf,NULL);
if (hRet!=DD_OK)
{
DeleteObject(bit);
return NULL;
}
else
{
surf->GetDC(&hdc);
HDC bit_dc=CreateCompatibleDC(hdc);
SelectObject(bit_dc,bit);
BitBlt(hdc,0,0,surf_width,surf_height,bit_dc,0,0,SRCCOPY);
surf->ReleaseDC(bit_dc);
}
DeleteObject(bit);
return surf;
}
void draw_slide()
{
HRESULT hRet;
if (!lpSlides[cur_image])
{
lpSlides[cur_image]=bitmap_surface(file_names[cur_image]);
if (!lpSlides[cur_image])
return;
}
// hRet=lpDDSBack->BltFast(0,0,lpSlides[cur_image],NULL,DDBLTFAST_WAIT);
DDBLTFX ddbltfx;
hRet=lpDDSBack->Blt(NULL,lpSlides[cur_image],NULL,DDBLT_WAIT,&ddbltfx);
// switch(hRet)
// {
// case DDERR_EXCEPTION:
// MessageBox(NULL,"DDERR_EXCEPTION","错误",MB_OK);
// break;
// case DDERR_GENERIC:
// MessageBox(NULL,"DDERR_GENERIC","错误",MB_OK);
// break;
// case DDERR_INVALIDOBJECT:
// MessageBox(NULL,"DDERR_INVALIDOBJECT","错误",MB_OK);
// break;
// case DDERR_INVALIDPARAMS:
// MessageBox(NULL,"DDERR_INVALIDPARAMS","错误",MB_OK);
// break;
// case DDERR_INVALIDRECT:
// MessageBox(NULL,"DDERR_INVALIDRECT","错误",MB_OK);
// break;
// case DDERR_NOBLTHW:
// MessageBox(NULL,"DDERR_NOBLTHW","错误",MB_OK);
// break;
// case DDERR_SURFACEBUSY:
// MessageBox(NULL,"DDERR_SURFACEBUSY","错误",MB_OK);
// break;
// case DDERR_SURFACELOST:
// MessageBox(NULL,"DDERR_SURFACELOST","错误",MB_OK);
// break;
// case DDERR_UNSUPPORTED:
// MessageBox(NULL,"DDERR_UNSUPPORTED","错误",MB_OK);
// break;
// case DDERR_WASSTILLDRAWING:
// MessageBox(NULL,"DDERR_WASSTILLDRAWING","错误",MB_OK);
// break;
// }
HDC hdc;
if (DD_OK==lpDDSBack->GetDC(&hdc))
{
SetTextColor(hdc,0x00FF7F00);
SetBkColor(hdc,0x000000);
TextOut(hdc,20,700,"<-Previous Slide",16);
TextOut(hdc,1000,700,"Next Slide ->",13);
SetTextColor(hdc,0x0000FFFF);
TextOut(hdc,400,750,"Press Arrow Keys to Change Slides",33);
lpDDSBack->ReleaseDC(hdc);
}

lpDDSPrimary->Flip(0,DDFLIP_WAIT);

int next_slide=(cur_image>=IMAGE_COUNT-1)?0:cur_image+1;
if (!lpSlides[next_slide])
{
lpSlides[next_slide]=bitmap_surface(file_names[next_slide]);
}
int prev_slide=(cur_image<1)?IMAGE_COUNT-1:cur_image-1;
if (!lpSlides[prev_slide])
{
lpSlides[prev_slide]=bitmap_surface(file_names[prev_slide]);
}
}
void Cleanup()
{
for (int i=0;i<IMAGE_COUNT;i++)
{
SafeRelease(lpSlides[i]);
}
SafeRelease(lpDDSPrimary);
SafeRelease(lpDDSBack);
SafeRelease(lpDD);
}
...全文
135 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
好像没那么简单,呵呵.
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
接分先!
flyukeer 2008-03-26
  • 打赏
  • 举报
回复
怎么没有人回答?问了好多人都找不出原因啊
内容概要:本文系统研究了线性模型预测控制(LMPC)与非线性模型预测控制(NMPC)在四旋翼无人机轨迹跟踪任务的控制性能对比,基于Matlab/Simulink平台搭建完整的仿真控制系统。研究内容涵盖四旋翼无人机的动力学建模、状态空间表达、线性与非线性预测模型构建、滚动时域优化求解以及系统约束处理等关键技术环节,重点从轨迹跟踪精度、动态响应速度、系统稳定性及抗干扰能力等方面对两种控制策略进行对比分析,深入探讨线性化近似方法与精确非线性模型在实际控制效果上的差异,为无人机高性能飞控系统的设计提供理论支撑与仿真验证依据; 适合人群:具备自动控制原理、非线性系统理论、无人机动力学及Matlab/Simulink仿真基础的研究生、科研人员以及从事无人飞行器控制算法开发的工程技术人员; 使用场景及目标:① 掌握模型预测控制(MPC)在强非线性系统如四旋翼的具体应用方法;② 理解LMPC与NMPC在建模假设、优化求解及控制性能上的本质差异;③ 为相关课题的仿真系统搭建、控制算法选型与性能评估提供实践参考;④ 支持课程设计、学位论文撰写或科研项目的算法验证与结果分析; 阅读建议:建议结合提供的Simulink仿真模型,深入剖析状态预测、代价函数设计与实时滚动优化的实现机制,对比不同飞行工况(如高机动轨迹)下的仿真结果,重点关注NMPC在复杂动态环境的性能优势以及LMPC在计算效率与实时性方面的潜力,同时应注意非线性优化带来的计算负担问题及其对工程可实现性的影响。
内容概要:本文档为一篇关于“基于超局部模型无模型预测电流控制(MFPCC)+自抗扰ESO观测器改进模型预测控制仿真”的论文复现资源,重点介绍了在Simulink环境下对三相逆变器系统进行建模与控制策略仿真的研究。核心内容聚焦于采用无模型预测电流控制(MFPCC)结合自抗扰控制的扩张状态观测器(ESO)来提升系统对参数不确定性与外部干扰的鲁棒性,优化电流环动态响应性能。文通过构建超局部模型规避精确系统建模的难题,利用MFPCC实现快速动态响应,并引入ESO实时估计并补偿系统内外部扰动,从而增强整体控制精度与稳定性。通过与传统控制方法的对比仿真,充分验证了该复合控制策略在抑制扰动、提高电流跟踪精度及改善系统鲁棒性方面的优越性,文档同时提供了完整的Simulink仿真模型与实现代码,便于读者复现、调试与深入研究。; 适合人群:具备电力电子、自动控制理论基础,熟悉Simulink仿真环境,从事电机控制、新能源并网、电力变换器控制或预测控制算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 复现并掌握MFPCC与ESO相结合的先进复合控制策略;② 深入研究无模型预测控制在电力电子系统的具体应用与实现方法;③ 探索自抗扰控制ESO观测器在扰动估计与补偿、提升系统鲁棒性方面的关键作用与设计要点;④ 作为毕业设计、科研课题、学术论文复现或工程项目开发的重要技术参考与原型验证平台。; 阅读建议:建议读者结合现代控制理论与电力电子技术基础知识,首先深入理解MFPCC的无模型预测原理与ESO的扰动观测机理,再逐步导入并调试所提供的仿真模型,重点关注控制器参数的整定过程、系统在不同工况下的抗扰性能测试与动态响应指标分析,同时可参考文档列出的其他相关案例进行横向比较与综合学习,以达到融会贯通的效果。

8,324

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧