又一奇怪的DX编程问题,有源代码付上!

lyzcom 2001-07-16 09:20:09
我在用VC+DX7编程时,发现一个奇怪的现象:
我的桌面分辩率是800*600。如果我的DX程序也初始为800*600,一切就是正常的。
但是当我的程序初始为640*480时,用Ellipse或TextOut函数显示出来的东西,就
不正常了——有时候有,有时候什么反应也没有。
如反过来,颗分辩率高为640*480,那么DX程序也只有设为640*480的分辩率时,一
切才会正常。
好奇怪。为什么DX程序一定要和桌面色深一样呢?我可是用全屏模式的啊!而且,
他也不是每一次一定不正常,有时正常,有时不正常,这是为什么呢?我把我的代码
贴出来,请高手帮我看看,小弟给你磕头了!

#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd);
LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL InitDDraw();
void FreeDDraw();
void InitFail(char *str);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
.MSG msg;
.WNDCLASS GameWindow;
.//窗口类参数设定
.GameWindow.cbClsExtra=NULL;
.GameWindow.cbWndExtra=NULL;
.GameWindow.hCursor=NULL;
.GameWindow.hIcon=LoadIcon(hInstance, IDI_APPLICATION);
.GameWindow.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
.GameWindow.style=CS_HREDRAW|CS_VREDRAW;
.GameWindow.hInstance=hInstance;
.GameWindow.lpfnWndProc=WinProc;
.GameWindow.lpszClassName="天才王国";
.GameWindow.lpszMenuName=NULL;
.//注册窗口
.RegisterClass(&GameWindow);
.//创建窗口
.hwnd=CreateWindowEx(0, "天才王国", "天才王国", WS_POPUP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL);
.if(!hwnd) InitFail("初始化窗口出错,可能没有足够的内存!");
.ShowWindow(hwnd, nShowCmd);
.UpdateWindow(hwnd);
.//初始化DX
.if(InitDDraw()==FALSE)
InitFail("初始化DirectX出错,请正确安装DirectX7.0!");
.//消息处理
.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;
}

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

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

case WM_DESTROY:
FreeDDraw();...
PostQuitMessage(0);
break;
}

return DefWindowProc(hWnd, message, wParam, lParam);
}

BOOL InitDDraw()
{
.HRESULT ddrval;
.DDSCAPS2 ddscaps;
.LPDIRECTDRAW _lpDD;
.DDSURFACEDESC2 ddsd;
.//创建原始DX对象
.ddrval=DirectDrawCreate(NULL, &_lpDD, NULL);
.if(ddrval!=DD_OK) return FALSE;
.//取得DX6的IDRAW4接口
.ddrval=_lpDD->QueryInterface(IID_IDirectDraw4, (LPVOID *)&lpDD);
.if(ddrval!=DD_OK) return FALSE;
.else {//释放原始DX对象
.._lpDD->Release();
.._lpDD=NULL; }
.//设置DX与WINDOWS协作级别为独占和全屏模式
.ddrval=
lpDD->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
.if(ddrval!=DD_OK) return FALSE;
.//设置显示模式
.ddrval=lpDD->SetDisplayMode(640, 480, 16, 0, 0);
.if(ddrval!=DD_OK) return FALSE;
.//创建主表面
.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;
.ddrval=lpDD->CreateSurface(&ddsd, &lpDDPrimary, NULL);
.if(ddrval!=DD_OK) return FALSE;
.//创建后台缓冲区
.ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
ddrval=lpDDPrimary->GetAttachedSurface(&ddscaps, &lpDDBack);
if (ddrval!=DD_OK) return FALSE;
.//获取设备句柄
.ddrval=lpDDPrimary->GetDC(&hdc);
.if(ddrval!=DD_OK) return FALSE;

.return TRUE;
}

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

void InitFail(char *str)
{
.FreeDDraw();
.MessageBox(hwnd, str, "Error", MB_OK);
.DestroyWindow(hwnd);
}
...全文
116 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
c_z_y 2001-07-16
  • 打赏
  • 举报
回复
GetDC();
画完以后要立即释放,这不同于mfc,GetDC();以后,显存是被锁定的,搞不好会死机。
另外你要监测surface是否lost,必要时restore。
gbstar2021 2001-07-16
  • 打赏
  • 举报
回复
gz
Kevin_qing 2001-07-16
  • 打赏
  • 举报
回复
primary->GetDC();
TextOut();
primary->ReleaseDC();//现在才应该正常显示

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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