DX高手快来啊!小弟请教!

lyzcom lyzcom 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我按照你说的,先ReleaseDC(..)后再lpDDPrimary->Flip(NULL, 0);可是屏幕全部是花的,人那些花屏的图案中可以看出,好像是WINDOWS当前的桌面被“花”上来了。这又是为什么啊?还是我原来的那些程序。但是同样的程序,在WIN2000下一切正常,也有什么花屏。而且,就算在WIN98下,只要不用缓冲,直接画到屏幕上,也没有问题啊?这是怎么回事?
#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>

LPDIRECTDRAW4 lpDD;
LPDIRECTDRAWSURFACE4 lpDDPrimary;
LPDIRECTDRAWSURFACE4 lpDDBack;
BOOL bActive = TRUE;
HWND hwnd;
HDC hdc;

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
BOOL InitWindow(HINSTANCE, int);
HRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
BOOL InitFail(char *);
BOOL InitDDraw(void);
void FreeDDraw(void);
HRESULT FindLostSurface();
void ScreenFlip();
void Draw();



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
MSG msg;

if(!InitWindow(hInstance, nShowCmd)) return FALSE;
if(!InitDDraw()) return InitFail("初始化 DirectX 出错");

Draw();

while(1)
{
if(PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
{
if(msg.message==WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(bActive)
{
}
else WaitMessage();
}

return msg.wParam;
}

static BOOL InitWindow(HINSTANCE hInstance, int nShowCmd)
{
WNDCLASS wc;

wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
wc.lpfnWndProc = WinProc;
wc.lpszClassName = "天才王国";
wc.lpszMenuName = "天才王国";
wc.style = CS_HREDRAW ¦ CS_VREDRAW;
wc.hInstance = hInstance;

RegisterClass(&wc);

hwnd = CreateWindowEx(NULL, "天才王国", "天才王国", WS_POPUP, 0, 0,
GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
NULL, NULL, hInstance, NULL);
if(!hwnd) return FALSE;

ShowWindow(hwnd, nShowCmd);
UpdateWindow(hwnd);

return TRUE;
}

HRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_ACTIVATEAPP:
bActive = TRUE;
break;

case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostMessage(hWnd, WM_CLOSE, NULL, NULL);
break;
}
break;

case WM_DESTROY:
FreeDDraw();
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}

BOOL InitFail(char *str)
{
FreeDDraw();
MessageBox(hwnd, str, "Error!", MB_OK);
DestroyWindow(hwnd);
return FALSE;
}

void FreeDDraw()
{
if(lpDD != NULL)
{
if(lpDDPrimary != NULL)
{
lpDDPrimary->Release();
lpDDPrimary = NULL;
lpDDBack=NULL;
}

lpDD->Release();
lpDD = NULL;
}
}

BOOL InitDDraw()
{
LPDIRECTDRAW _lpDD;
DDSCAPS2 ddscaps;
DDSURFACEDESC2 ddsdesc;

//Create Draw Surface , Set Mode
if(FAILED(DirectDrawCreate(NULL, &_lpDD, NULL))) return FALSE;
if(FAILED(_lpDD->QueryInterface(IID_IDirectDraw4, (LPVOID *)&lpDD))) return FALSE;
if(FAILED(lpDD->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE ¦ DDSCL_FULLSCREEN))) return FALSE;
if(FAILED(lpDD->SetDisplayMode(800, 600, 16, 0, 0))) return FALSE;
UpdateWindow(hwnd);

//Release Primitive DD
_lpDD->Release(); _lpDD = NULL;

//Create Primary Surface
ZeroMemory(&ddsdesc, sizeof(ddsdesc));
ddsdesc.dwSize = sizeof(ddsdesc);
ddsdesc.dwFlags = DDSD_CAPS ¦ DDSD_BACKBUFFERCOUNT;
ddsdesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE ¦ DDSCAPS_FLIP ¦ DDSCAPS_COMPLEX;
ddsdesc.dwBackBufferCount = 1;
if(FAILED(lpDD->CreateSurface(&ddsdesc, &lpDDPrimary, NULL))) return FALSE;

//Create a back buffer
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
if(FAILED(lpDDPrimary->GetAttachedSurface(&ddscaps, &lpDDBack))) return FALSE;

return TRUE;
}

void Draw()
{
lpDDBack->GetDC(&hdc);

SetBkColor(hdc, RGB(255, 0, 0));
SetTextColor(hdc, RGB(255, 255, 255));
TextOut(hdc, 100, 100, "abcdefg", lstrlen("abcdefg"));
ScreenFlip();

lpDDBack->ReleaseDC(hdc);
}

void ScreenFlip()
{
HRESULT ddrval;
while(1)
{
ddrval = lpDDPrimary->Flip(NULL, 0);

if(ddrval == DD_OK) break;
if(ddrval == DDERR_SURFACELOST)
{
ddrval = FindLostSurface();
if(ddrval != DD_OK) InitFail("内存错误");
}
if(ddrval != DDERR_WASSTILLDRAWING) break;
}
}

HRESULT FindLostSurface()
{
HRESULT ddrval;

ddrval = lpDDPrimary->Restore();
ddrval = lpDDBack->Restore();

return ddrval;
}
...全文

相关推荐

【雷达信号处理】数字下变频(DDC)(Matlab代码实现)

内容概要:本文详细介绍了《【雷达信号处理】数字下变频(DDC)(Matlab代码实现)》这一技术资源,聚焦于数字下变频(DDC)在雷达信号处理中的核心作用与实现方法。内容系统阐述了DDC的基本原理,包括混频、低通滤波和抽取等关键步骤,如何将高频回波信号高效转换为便于后续处理的基带信号。文档提供了完整的Matlab代码实现方案,涵盖算法设计、参数设置与仿真验证全过程,有助于深入理解DDC在实际雷达系统中的应用。此外,资源还关联了时频特征匹配、多体制信号处理等相关技术方向,体现了其在现代雷达信号处理体系中的综合价值。; 适合人群:具备信号与系统、数字信号处理基础知识的研究生、科研人员及从事雷达、通信、电子工程等领域的工程技术人员。; 使用场景及目标:① 深入学习数字下变频(DDC)的工作原理及其在雷达系统中的具体实现;② 利用Matlab开展雷达信号处理算法的仿真实验与性能分析;③ 支持课程项目、科研课题开发或学术论文复现等任务,提升理论与实践结合能力。; 阅读建议:建议结合Matlab环境动手运行并调试所提供的代码,对照理论推导理解各模块功能;同时可参考文档中提及的相关信号处理技术,拓展对雷达系统整体架构的认知。

长安程序猿

科技中介服务机构如何构建差异化的服务能力与竞争优势?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

高校技术转移办公室人员如何利用AI工具高效管理科技成果与技术经纪人对接工作?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

【AI大模型毕业设计】LLM大模型 基于LangChain美食菜谱分享网站+AI智能助手(FastAPI+Vue3) 完整版 源码+sql脚本+论文

这个是完整源码 【AI大模型毕业设计】LLM大模型 基于LangChain美食菜谱分享网站+AI智能助手(FastAPI+Vue3) 完整版 源码+sql脚本+论文 数据库是mysql 菜谱信息分散在短视频、社交平台和零散网页中,家庭烹饪者往往只能看到结果,却难以按食材、口味和步骤核对一份可执行的做法。与此同时,通用对话模型能够组织语言,却容易编造用量和火候。把经过人工审核的菜谱整理成可检索的知识,再让对话模型依据这些资料回答问题,能够同时保留社区分享和可核对的依据。 本文设计并实现了带AI智能助手的美食菜谱分享网站。系统采用前后端分离结构:前端使用 Vue3、Vue Router、Pinia 和 Element Plus 构建前台门户与管理后台,后端使用 Python 和 FastAPI 提供菜谱、互动、审核和统计接口,业务数据保存在 MySQL 数据库 db_recipe 中。智能问答遵循检索增强生成的思路,与 LangChain 中检索器、提示模板、对话记忆和流式回调所描述的链路一致;考虑到审核状态、权限和流式输出需要与业务服务紧密配合,本系统用 Python 显式完成文档拼装、向量写入、相似度检索和提示词组装,向量存放在 Chroma 中,嵌入与对话通过兼容接口调用通义千问。 网站提供注册登录、菜谱浏览检索、发布与审核、点赞收藏评论、公告轮播、个人中心,以及依据站内菜谱进行的流式问答。管理端可以维护用户、分类、评论和知识库,并在首页用图表查看用户规模、菜谱分类和近七日趋势。测试围绕账号、审核、互动和问答四类路径展开,结果表明主要功能能够按设计完成,回答可以回指相关菜谱。

caofeng891102

国央企创新负责人如何通过平台推动企业与高校院所的协同创新?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN
评论 1
收藏 已收藏
分享
返回顶部
lyzcom
VC/MFC 16,550 成员 421,606 内容