如何实现用directX在屏幕上显示一个bmp图片,我写了一段代码,但是执行起来就花屏,360度转体跪求解决方法!

darkdragon1981 2005-03-21 10:39:01
大家能帮我看看程序吗?非常感谢!
如果能解决我的问题,我将感激涕零!55555555555!郁闷好多天了!
代码如下:
#include <windows.h>
#include <windowsx.h>
#include <ddraw.h>
#include "Ddutil.h"
#include "Ddutil.cpp"
LPDIRECTDRAW lpdd;//DIRECTDRAW对象
LPDIRECTDRAWSURFACE lpddsprimary;//主表面对象,即屏幕显示的表面
LPDIRECTDRAWSURFACE lpddsback;//后台表面,主表面要翻转的表面
LPDIRECTDRAWSURFACE lpddsoffscreen;//离屏表面,存放图像的表面
LPDIRECTDRAWPALETTE lpddpal;//调色板

char showline[] = "hello world";
BOOL bActive = TRUE;
HDC hdc;
RECT rect;
//函数声明
void MainGame(void);
BOOL InitDDraw(void);
void FreeDDraw(void);


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HWND hwnd;
MSG Msg;
WNDCLASS wndclass;
char lpszClassName[] = "window";
char lpszTitle[] = "my_window";

wndclass.style = 0;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = lpszClassName;


if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return FALSE;

}

hwnd = CreateWindow(lpszClassName,
lpszTitle,
WS_POPUP,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);

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

if(!InitDDraw())
{
MessageBox(GetActiveWindow(), "initDDrawwERR", "ERR", MB_OK);
FreeDDraw();
DestroyWindow(GetActiveWindow());
return FALSE;
}


while(1)
{
if(PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&Msg, NULL, 0, 0))
return Msg.wParam;
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
else if(bActive)
{
MainGame();
}
}

}

//消息函数
LRESULT CALLBACK WndProc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
ShowCursor(false);
bActive = true;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
}
break;
case WM_DESTROY:

PostQuitMessage(0);
default:
return DefWindowProc(hwnd, message, wParam, lParam);

}
return (0);
}

//初始化DirectDraw
BOOL InitDDraw(void)
{
DDSURFACEDESC ddsd;
DDSCAPS ddscaps;
DDSURFACEDESC ddsdoffscreen;

if(DirectDrawCreate(NULL, &lpdd, NULL) != DD_OK)
return FALSE;
if(lpdd->SetCooperativeLevel(GetActiveWindow(), DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN) != DD_OK)
return FALSE;
if(lpdd->SetDisplayMode(800, 600, 32) != DD_OK)
return FALSE;

ZeroMemory( &ddsd, sizeof( ddsd ) );
ZeroMemory( &ddscaps, sizeof( ddscaps ) );
ZeroMemory( &ddsdoffscreen, sizeof(ddsdoffscreen));

ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX ;
ddsd.dwBackBufferCount = 1 ;
//创建主表面
if(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL) != DD_OK)
return FALSE;
//创建离屏表面
ddsdoffscreen.dwSize = sizeof(ddsdoffscreen);
ddsdoffscreen.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH;
ddsdoffscreen.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsdoffscreen.dwWidth = 640;
ddsdoffscreen.dwHeight = 480;
if(lpdd->CreateSurface(&ddsdoffscreen, &lpddsoffscreen, NULL)!= DD_OK)
return FALSE;
//创建后表面
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;

if(lpddsprimary->GetAttachedSurface(&ddscaps, &lpddsback) != DD_OK)
return FALSE;

return TRUE;

}

void FreeDDraw(void)
{
if(lpdd != NULL)
{
if(lpddsprimary != NULL)
{
lpddsprimary->Release();
lpddsprimary = NULL;
}

if(lpddsback != NULL)
{
lpddsback->Release();
lpddsback = NULL;
}
lpdd->Release();
lpdd = NULL;
}
}

void MainGame()
{
static int i = 0;
lpddpal = DDLoadPalette(lpdd, "mmm.bmp");


if(lpddpal)
lpddsback->SetPalette(lpddpal);
lpddsoffscreen = DDLoadBitmap(lpdd, "mmm.bmp", 0, 0);
rect.left = 0;
rect.top = 0;
rect.right = 300;
rect.bottom = 220;

lpddsback->BltFast(0, 0, lpddsoffscreen, &rect, DDBLTFAST_SRCCOLORKEY|DDBLTFAST_WAIT);


if(lpddsprimary->Flip(NULL, 0) != DD_OK )
{
FreeDDraw();
}


}
请大家帮帮忙!
...全文
558 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
darkdragon1981 2005-03-26
  • 打赏
  • 举报
回复
我的QQ是:8799589,欢迎各位朋友加我,以后有问题就不用总到这里发贴了,还请各位多多指教,如果加我,请注明DX学习,谢谢!
darkdragon1981 2005-03-26
  • 打赏
  • 举报
回复
花屏是指程序运行了之后,屏幕就有波纹闪动,并且看不要显示的图片!请哪位赐教!谢谢!
chijingde 2005-03-26
  • 打赏
  • 举报
回复
//************************************************************
//函数:InitWindow( )
//功能:创建窗口
//************************************************************

static BOOL InitWindow( HINSTANCE hInstance, int nCmdShow )
{
?//定义窗口风格:
?WNDCLASS wc;
?wc.style =NULL;//窗体类的风格
?wc.lpfnWndProc = (WNDPROC)WinProc; //窗口消息处理函数的指针
?wc.cbClsExtra = 0;//分配给窗口类结构之后的额外字节数
?wc.cbWndExtra = 0;//分配给窗口实例之后的额外字节数
?wc.hInstance = hInstance;//窗口所对应的应用程序的句柄
?wc.hIcon = NULL;//窗口的图标
?wc.hCursor = LoadCursor(NULL, IDC_ARROW); //窗口的鼠标
?wc.hbrBackground = CreateSolidBrush (RGB(0, 0, 0)); //黑色的背景
?wc.lpszMenuName = NULL;//MAKEINTRESOURCE(IDR_MENU);//窗口的菜单资源名称
?wc.lpszClassName = "My_Test";//窗口类的名称
?RegisterClass(&wc);//注册窗口

??? //按所给参数创造窗口
???? hWnd = CreateWindow("My_Test",//创建窗口所用的窗口类的名称
?? "24小时学DX_第2个小时",//窗口标题
?? WS_POPUP|WS_MAXIMIZE,//窗口风格,定义为普通型
?? 0,0,//窗口位置的x,y坐标
?? 1024,768,//窗口的宽度,高度
?? NULL,//父窗口句柄
?? NULL,//菜单句柄
?? hInstance,//应用程序句柄
?? NULL);
?if(!hWnd ) return FALSE;
?ShowWindow(hWnd,nCmdShow);//显示窗口
?UpdateWindow(hWnd);//刷新窗口
?InitDDraw();//初始化DX
?return TRUE;
}

//************************************************************
//函数:WinProc( )
//功能:处理窗口消息
//************************************************************

LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
?switch(message)
?{
?case WM_COMMAND:
?? break;
?case WM_KEYDOWN://击键消息
??switch(wParam)
??{
??case VK_ESCAPE:
???PostMessage(hWnd, WM_CLOSE, 0, 0);//给窗口发送WM_CLOSE消息
???break;
??//左右被按下了,改变图片,重画
??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;
??}
??break;
?case WM_DESTROY: //如果窗口被人释放…
??Cleanup();
???? PostQuitMessage(0); //给窗口发送WM_QUIT消息
??break;
??? default://调用缺省消息处理过程
??return DefWindowProc(hWnd, message, wParam, lParam);?
?}?
?return 0;
}

chijingde 2005-03-26
  • 打赏
  • 举报
回复
//************************************************************
//函数:InitDDraw()
//功能:DX初始化函数
//************************************************************
BOOL InitDDraw()
{
?DDSURFACEDESC2 ddsd; // DirectDraw的页面描述
? /*
??? 在一切工作之前,记得加入两个lib文件
??? 在菜单Project-Setting下的Link页的Object/Library Modules栏里加入
??? "ddraw.lib"和"dxguid.lib" ,后者可以不加入,而用#define INITGUID代替
??? PS:最好选择setting for All Configurations
??? 这样会在 debug 和 release 下都有效
? */
? /*
??? 如果要使用DirectDraw,必须创建一个DirectDraw对象,它是DirectDraw接口的核心。
??? 用DirectDrawCreateEx( )函数可以创建DirectDraw对象,
??? DirectDrawCreateEx( )函数是在ddraw.h中定义的,它的原型如下:

?????? HRESULT WINAPI DirectDrawCreateEx(
? ?????? GUID FAR *lpGUID, //指向DirectDraw接口的GUID的指针,NULL表示采用默认(当前)
? ?????? LPVOID *lplpDD,?? //用来接受初始化的DirectDraw对象的地址
? ?????? REFIID iid,?????? //IID_IDirectDraw7,当前版本
? ?????? IUnknown FAR *pUnkOuter? //NULL? 保留
??? );
?????? 所有的DirectDraw函数的返回值都是HRESULT类型,它是一个32位的值。
??? 函数调用成功用 "DD_OK"表示,
??? 所有的错误值标志开头都为"DDERR",如:
??? DDERR_DIRECTDRAWALREADYCREATED
??? DDERR_OUTOFMEMORY
? */
? //这里使用了 if (xxx!=DD_OK) 的方法进行错误检测,这是最常用的方法
???? if (DirectDrawCreateEx(NULL,(LPVOID*)&lpDD, IID_IDirectDraw7, NULL)!= DD_OK)
??return FALSE; //创建DirectDraw对象
? /*
? DirectDrawCreate函数调用成功后,lpDD已经指向了一个DirectDraw对象,
? 它是整个DirectDraw接口的最高层领导,以后的步骤都是在它的控制之下。
? 我们用IDirectDraw7::SetCooperativeLevel( )来设置DirectDraw程序对系统的控制级。
? 它的原型如下:
? HRESULT SetCooperativeLevel (HWND hWnd, DWORD dwFlags )
? 第一个参数是窗口句柄,我们给它hWnd,使DirectDraw对象与主窗口联系上。
???? 第二个参数是控制级标志。这里使用DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN,
? 表示我们期望DirectDraw以独占和全屏方式工作。
????
? 控制级描述了DirectDraw是怎样与显示设备及系统作用的。
? DirectDraw控制级一般被用来决定应用程序是运行于全屏模式(必须与独占模式同时使用),
? 还是运行于窗口模式。但DirectDraw的控制级还可设置如下两项:
???? (1)允许按Ctrl+Alt+Del重新启动(仅用于独占模式,为DDSCL_ALLOWREBOOT)。
???? (2)不允许对DirectDraw应用程序最小化或还原 (DDSCL_NOWINDOWCHANGES)。
????
? 普通的控制级(DDSCL_NORMAL)表明我们的DirectDraw应用程序将以窗口的形式运行。
? 在这种控制级下,我们将不能改变显示器分辨率,或进行换页操作(这是一个重要的操作)。
? 除此之外,我们也不能够调用那些会对显存产生激烈反应的函数,如Lock()。
???? 当应用程序为全屏并且独占的控制级时,我们就可以充分的利用硬件资源了。
? 此时其它应用程序仍可创建页面、使用DirectDraw或GDI的函数,只是无法改变显示模式。
? */
???? if (lpDD->SetCooperativeLevel(hWnd,DDSCL_FULLSCREEN|DDSCL_EXCLUSIVE|
?? DDSCL_ALLOWREBOOT)!= DD_OK)
??????? return FALSE; //设置DirectDraw控制级
? /*
? 下一步我们使用IDirectDraw7::SetDisplayMode( )来设置显示模式,其原形为:
? HRESULT SetDisplayMode(
? DWORD dwWidth,
? DWORD dwHeight, //dwWidth and dwHeight用来设置显示模式的宽度和高度。
? DWORD dwBPP, //dwBPP用来设置显示模式的颜色位数。
? DWORD dwRefreshRate, //dwRefreshRate设置屏幕的刷新率,0为使用默认值。
? DWORD dwFlags //dwFlags现在唯一有效的值是DDSDM_STANDARDVGAMODE,
??????????????? //此值是如果在320×240×8模式下给VGA Mode 13用的,
?????? //我们通常把它设为0即可
?????
? );
? PS:用IDirectDraw7接口的EnumDisplayModes()函数
???? 可以取得当前可用的模式列表。具体用法请查阅DX的帮助
? */
???? if (lpDD->SetDisplayMode(1024,768,32,85,0)!= DD_OK)
??????? return FALSE; //设置显示模式

??? /*
?? 创建一个页面之前,首先需要填充一个DDSURFACEDESC2结构,
?? 它是DirectDraw Surface Description的缩写,意思是DirectDraw的页面描述。
?? 它的结构非常庞大,这里只能作一个最简单的介绍。
?? 要注意的是在填充此结构前一定要将其清空!
?*/

?//开始创建主页面,先清空页面描述
?ZeroMemory(&ddsd, sizeof(ddsd));

?//填充页面描述
??? ddsd.dwSize = sizeof(ddsd);//给dwSize页面描述的大小
?ddsd.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT;//有后台缓存
??? ddsd.ddsCaps.dwCaps =DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|
??DDSCAPS_COMPLEX;//主页面,有后台缓存,有换页链
?ddsd.dwBackBufferCount = 1;//后台缓存数为1
??? /*
?CreateSurface( )函数的第一个参数是被填充了页面信息的DDSURFACEDESC2结构的地址,
?此处为&ddsd;
?第二个参数是接收主页面指针的地址,此处为&lpDDSPrimary;
?第三个参数现在必须为NULL,为该函数所保留。
??? 如果函数调用成功,lpDDSPrimary将成为一个合法的主页面对象。
?由于在前面已经设置了该程序的工作模式为独占和全屏,
?所以,此时主页面所代表的实际上是我们的整个显示屏幕。
?在主页面上所绘制的图形将立即反映到我们的显示屏幕上。
?*/
???? if (lpDD->CreateSurface(&ddsd,&lpDDSPrimary, NULL) != DD_OK )
????? ?return FALSE; //创建主页面

??? ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; //后台缓存页面
??? /*
?在创建主页面的时候,附加页面(这里是后台缓存页面)也同时创建了,
?但是他们没有被你调用的CreateSurface()所返回
?你要通过GetAttachedSurface()函数来取得该接口,
?*/
??? if (lpDDSPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpDDSBuffer)!=DD_OK)
??return FALSE; //创建后台缓存页面
?lpSlides[0]=bitmap_surface(file_names[0]);
?if (!lpSlides[0])
??return FALSE;
?//画图
?draw_slide();
?return TRUE;
}


void Cleanup(void)
{
?//释放接口
?for (int i=0;i??SafeRelease(lpSlides[i]);

?SafeRelease(lpDDSBuffer);
?SafeRelease(lpDDSPrimary);//删除主页面
?SafeRelease(lpDD);//删除ddraw对象
?//ps:与创建的顺序正好相反
}

//************************************************************
//函数:WinMain()
//功能:Windows程序入口函数。创建主窗口,处理消息循环
//************************************************************
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
? if ( !InitWindow(hInstance, nCmdShow ) ) return FALSE; //创建主窗口
? //如果创建不成功则返回FALSE并同时退出程序
? MSG msg;
? //进入消息循环:
? for(;;)
? {
?if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
?{
??if ( msg.message==WM_QUIT) break;
??TranslateMessage(&msg);
??DispatchMessage(&msg);
?}
? }
?? return msg.wParam;
}

chijingde 2005-03-26
  • 打赏
  • 举报
回复
你怎么还include cpp?
那个头文件是干啥的?
没法直接改你的代码
你看这个吧


#define INITGUID
#define SafeRelease(x) if (x) { x->Release(); x=NULL; }
#define IMAGE_COUNT 6 //图片数目

?

char file_names[IMAGE_COUNT][256] = {??
?"E:/CJD/素材/pic/魔兽/1.bmp",
?"E:/CJD/素材/pic/魔兽/2.bmp",
?"E:/CJD/素材/pic/魔兽/3.bmp",
?"E:/CJD/素材/pic/魔兽/4.bmp",
?"E:/CJD/素材/pic/魔兽/5.bmp",
?"E:/CJD/素材/pic/魔兽/6.bmp"
};//图片列表


//函数声明
BOOL InitWindow( HINSTANCE hInstance, int nCmdShow );
LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
int cur_image=0;//当前图片号

//变量说明
HWND hWnd; //窗口句柄

/*=============================================================================
LPDIRECTDRAW7和LPDIRECTDRAWSURFACE7类型(7是版本号)是在ddraw.h头文件里预定义的,
指向IDirectDraw7和IDirectDrawSurface7类型的长型指针(前面加的LP代表Long Point),
从后面用的是"->"而不是"."也可以看出这一点。

DD是DirectDraw的缩写,DDS是DirectDrawSurface的缩写,
因此习惯上我们把变量名起为lpDD和lpDDSXXX。


虽然VC.net自带的DirectX SDK是8.1版的,
但是由于Microsoft从DirectX 8.0起停止了对DirectDraw的更新,
所以DirectDraw目前的最新版本还是7.0。
===============================================================================*/

LPDIRECTDRAW7 lpDD=NULL;// DirectDraw对象的指针
LPDIRECTDRAWSURFACE7 lpDDSPrimary=NULL;// DirectDraw主页面的指针
LPDIRECTDRAWSURFACE7 lpDDSBuffer=NULL;// DirectDraw后台缓存页面的指针
LPDIRECTDRAWSURFACE7 lpSlides[IMAGE_COUNT];//图片存储空间

RECT rect;

?

void MakeRect (int left, int top, int right, int bottom)
{
?rect.bottom = bottom;
?rect.left = left;
?rect.right = right;
?rect.top = top;
}


LPDIRECTDRAWSURFACE7 bitmap_surface(LPCTSTR file_name)
{
?HDC hdc;
?HBITMAP bit;
?LPDIRECTDRAWSURFACE7 surf;
?//载入BMP
?bit=(HBITMAP) LoadImage(NULL,file_name,IMAGE_BITMAP,0,0,
??LR_DEFAULTSIZE|LR_LOADFROMFILE);
?if (!bit)//载入失败,返回NULL
??return NULL;
?//获得BMP尺寸
?BITMAP bitmap;
?GetObject(bit, sizeof(BITMAP), &bitmap );
?//保存BMP尺寸
?int surf_width = bitmap.bmWidth;
?int surf_height = bitmap.bmHeight;

?//创建页面
?HRESULT ddrval;
?DDSURFACEDESC2 ddsd;
?//清空DDSURFACEDESC2结构
?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 =1024;
?ddsd.dwHeight =768;
?//创建离屏页面
?ddrval=lpDD->CreateSurface(&ddsd,&surf,NULL);
?if (ddrval!=DD_OK) {
??//失败的话,释放BMP
??DeleteObject(bit);
??return NULL;
?}
?else //创建成功
?{
??//取得DC
??surf->GetDC(&hdc);
??//与DC取得一致
??HDC bit_dc=CreateCompatibleDC(hdc);
??//
??SelectObject(bit_dc,bit);
??//传送bmp
??BitBlt(hdc,0,0,surf_width,surf_height,bit_dc,0,0,SRCCOPY);
??//释放DC
??surf->ReleaseDC(hdc);
??DeleteDC(bit_dc);
?}
?//释放BMP
?DeleteObject(bit);
?//返回离屏页面指针
?return surf;
}


//------ Function to Draw a Slide ------//
void draw_slide()
{
?//确定我们取得了图片
?if (!lpSlides[cur_image]) {
??lpSlides[cur_image]=bitmap_surface(file_names[cur_image]);
??if (!lpSlides[cur_image])
???return;
?}
?//开始在屏幕上画
?//DrawImage();
?MakeRect (0,0,1024,768);//设定传送rect
?//传送图像
?/* Bltfast()就可以了。它的原形是:
?HRESULT BltFast(
?DWORD dwX,
?DWORD dwY,//图像将被传送到目标页面何处。
?LPDIRECTDRAWSURFACE lpDDSrcSurface,//LPDIRECTDRAWSURFACE lpDDSrcSurface,//
?LPRECT lpSrcRect,//一个 RECT (Rectangle,即矩形)结构的地址,指明源页面上将被传送的区域。
???????????????????? //如果该参数是 NULL, 整个源页面将被使用。
?DWORD dwTrans??? //指定传送类型。有如下几种:
????????????????? //DDBLTFAST_NOCOLORKEY
????? //指定进行一次普通的复制,不带透明成分。
????? //DDBLTFAST_SRCCOLORKEY?
????? //指定进行一次带透明色的图像传送,使用源页面的透明色。
????? //DDBLTFAST_WAIT?
????? //如果图像传送器正忙,不断重试直到图像传送器准备好并传送好时才返回。
????? //一般都使用这个参数。
?);
?*/
?lpDDSBuffer->BltFast(0,0,lpSlides[cur_image],&rect,DDBLTFAST_WAIT);
?/*
?? 注意到了没有?在这个例子中,我们将有3个页面,
?? 就是主页面,用来换页的后台缓存页面以及用来存放图片的离屏页面
?? 创建完主页面和后台缓存页面,双缓存就很容易实现了,
?? 主要的差别就是图像要传送到后台缓存页面中进行而不是在主页面,
?? 当一桢完成后,主页面调用Flip命令即可。
????? Flip命令引起主页面与后台缓存页面的交换,但是这个动作不是马上进行,
?? 而是等到下次刷新周期的空白期才发生:)

?? Flip函数原型如下:
?? HRESULT Flip(
?? LPDIRECTDRAWSURFACE lpDDSurface,
???????? //换页链中另一个页面的 IDirectDrawSurface7接口的地址,
???????? //代表换页操作的目标页面。这个页面必须是换页链中的一员。
???????? //该参数缺省值是 NULL, 在这种情况下,
???????? //DirectDraw 从换页链中按照前后隶属关系依次换页。

?? DWORD dwFlags//换页的标志选项,常用DDFLIP_WAIT,同BltFast中的DDBLTFAST_WAIT差不多。
?? );
????? 一般我们这样即可换页:
?? lpDDSPrimary->Flip(NULL,DDFLIP_WAIT);
?*/
?lpDDSPrimary->Flip(NULL,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]);
}

chijingde 2005-03-25
  • 打赏
  • 举报
回复
画屏是指……


还有你为啥每次都加载位图阿,那样还要离屏页面干啥

太浪费了

在初始化的时候加载到离屏页面就行了

nasi00 2005-03-24
  • 打赏
  • 举报
回复
也可以尝试用DX Graphics嘛,毕竟现在的DX已经没有DDraw了,尝试一下ID3DXSprite吧,很方便的。
NeoXiong 2005-03-22
  • 打赏
  • 举报
回复
有两种比较基本的方法:
1.用GDI导入bmp图片再在ddraw中粘贴即可
2.自己写个bmp导入方法,直接在ddraw中显示,在 windows游戏编程大师 一书中有,不过书上的有点问题。这种方法需详细知道bmp文件格式。

你用的DDLoadBitmap函数里面应该封装的是第一种方法,如果有问题的话去看看里面的HDC的得到与释放是否正确。HDC xdc;
lpdds->GetDC(&xdc);
HDC tempHdc = CreateCompatibleDC(xdc);
SelectObject(tempHdc, HBmp);
BitBlt(xdc, 0, 0, width, height, tempHdc, 0, 0, SRCCOPY);
lpdds->ReleaseDC(xdc);
就像用gdi一样方便。你也可把代码贴出,让大家看看好知道问题在哪。
yyhzpk 2005-03-22
  • 打赏
  • 举报
回复
up
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了傻瓜式一键设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 8.1 Update、Windows 10,同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V3.3版分为标准版、增强版以及在线修复版。其中的标准版以及增强版都包含完整的DirectX组件。除此之外,增强版中还额外包含了c++ Redistributable Package,因此增强版不但能解决DirectX组件的问题,而且还能解决c++组件异常产生的问题。增强版适合无法自行解决c++相关问题的用户使用。在线修复版的功能与标准版相同,只是其所需的文件将通过Internet下载,因此大大减小了程序的体积。本程序的各个版本之间,主程序完全相同,只是配套使用的数据包不同。因此,当您使用标准版数据包时,程序将进行标准修复;当您使用增强版的数据包时,程序将进行增强修复;当数据包不全或没有数据包(即只有DirectX Repair.exe程序)时,程序将进行在线修复。在线修复、离线修复可自由灵活组合,充分满足不同用户的需要。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有自动更新c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常时(非丢失时)会提示用户使用增强版进行修复。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了4项高级功能。点击其中的“注册系统文件夹中所有dll文件”按钮可以自动注册系统文件夹下的所有dll文件。该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。点击第二个按钮可以为dll文件的右键菜单添加“注册”和“卸载”项,方便对单独的dll文件进行注册。请注意,并不是所有的dll文件都可以通过这种方式注册。点击“DirectX版本”选项卡可以自行修改系统中DirectX的版本信息。点击“DirectX加速”选项卡可以控制系统中DirectX加速的开启与关闭。 新版程序集成了用户反馈程序,可以在用户允许的前提下发送检测修复结果。用户也可以在出现问题时通过反馈程序和软件作者进行交流,共同查找问题。反馈是完全自愿和匿名(如果不填E-mail地址)的。 本程序的通用版基于Microsoft .NET Framework 2.0开发,对于Windows 2000、Windows XP、Windows 2003的用户需要首先安装.NET Framework 2.0或更高版本方可运行本程序。有关下载和安装的详细信息请参阅“致Windows XP用户.txt”文件。对于Windows Vista、Windows 7及后续用户,可以直接运行本程序。 同时鉴于Windows 8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中默认未包含.NET Framework 2.0,因此新版的程序文件夹内将包含一个DirectX_Repair_win8的特别版程序,该程序功能与通用版相同,基于.NET Framework 4.0开发,可以在Windows8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中直接运行(其他系统如果安装了.NET Framework 4.0也可以运行这个特别版的程序)。 本程序的官方博客地址为:http://blog.csdn.net/vbcom/article/details/6962388 所有的更新以及技术支持都可以到该博客上找到。
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了傻瓜式一键设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows Blue(Windows 8.1),同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V3.0版分为标准版、增强版以及在线修复版。其中的标准版以及增强版都包含完整的DirectX组件,增强版中还额外包含了c++ Redistributable Package,因此增强版适合无法自行解决c++相关问题的用户使用;在线修复版的功能与标准版相同,只是其所需的文件将通过Internet下载,因此大大减小了程序的体积。本程序的各个版本之间,主程序完全相同,只是配套使用的数据包不同。因此,当您使用标准版数据包时,程序将进行标准修复;当您使用增强版的数据包时,程序将进行增强修复;当数据包不全或没有数据包(即只有DirectX Repair.exe程序)时,程序将进行在线修复。在线修复、离线修复可自由灵活组合,充分满足不同用户的需要。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有自动更新c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。V3.0版本使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。此功能仅限于增强版。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了3项高级功能。点击其中的“注册系统文件夹中所有dll文件”按钮可以自动注册系统文件夹下的所有dll文件。该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。点击第二个按钮可以为dll文件的右键菜单添加“注册”和“卸载”项,方便对单独的dll文件进行注册。请注意,并不是所有的dll文件都可以通过这种方式注册。 新版程序集成了用户反馈程序,可以在用户允许的前提下发送检测修复结果。用户也可以在出现问题时通过反馈程序和软件作者进行交流,共同查找问题。反馈是完全自愿和匿名(如果不填E-mail地址)的。 本程序的通用版基于Microsoft .NET Framework 2.0开发,对于Windows 2000、Windows XP、Windows 2003的用户需要首先安装.NET Framework 2.0或更高版本方可运行本程序。有关下载和安装的详细信息请参阅“致Windows XP用户.txt”文件。对于Windows Vista、Windows 7用户,可以直接运行本程序。 同时鉴于Windows 8(Windows Blue、Windows 8.1)系统中默认未包含.NET Framework 2.0,因此新版的程序文件夹内将包含一个DirectX_Repair_win8的特别版程序,该程序功能与通用版相同,基于.NET Framework 4.0开发,可以在Windows8(Windows Blue、Windows 8.1)系统中直接运行(其他系统如果安装了.NET Framework 4.0也可以运行这个特别版的程序)。 本程序的官方博客地址为:http://blog.csdn.net/vbcom/article/details/6962388所有的更新以及技术支持都可以到该博客上找到。
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了傻瓜式一键设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows Blue(Windows 8.1),同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V3.2版分为标准版、增强版以及在线修复版。其中的标准版以及增强版都包含完整的DirectX组件。另外,增强版中还额外包含了c++ Redistributable Package,因此增强版不但能解决DirectX组件的问题,而且还能解决c++组件异常产生的问题。增强版适合无法自行解决c++相关问题的用户使用。在线修复版的功能与标准版相同,只是其所需的文件将通过Internet下载,因此大大减小了程序的体积。本程序的各个版本之间,主程序完全相同,只是配套使用的数据包不同。因此,当您使用标准版数据包时,程序将进行标准修复;当您使用增强版的数据包时,程序将进行增强修复;当数据包不全或没有数据包(即只有DirectX Repair.exe程序)时,程序将进行在线修复。在线修复、离线修复可自由灵活组合,充分满足不同用户的需要。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有自动更新c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。V3.2版本使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。此功能仅限于增强版。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了4项高级功能。点击其中的“注册系统文件夹中所有dll文件”按钮可以自动注册系统文件夹下的所有dll文件。该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。点击第二个按钮可以为dll文件的右键菜单添加“注册”和“卸载”项,方便对单独的dll文件进行注册。请注意,并不是所有的dll文件都可以通过这种方式注册。点击“DirectX版本”选项卡可以自行修改系统中DirectX的版本信息。点击“DirectX加速”选项卡可以控制系统中DirectX加速的开启与关闭。 新版程序集成了用户反馈程序,可以在用户允许的前提下发送检测修复结果。用户也可以在出现问题时通过反馈程序和软件作者进行交流,共同查找问题。反馈是完全自愿和匿名(如果不填E-mail地址)的。 本程序的通用版基于Microsoft .NET Framework 2.0开发,对于Windows 2000、Windows XP、Windows 2003的用户需要首先安装.NET Framework 2.0或更高版本方可运行本程序。有关下载和安装的详细信息请参阅“致Windows XP用户.txt”文件。对于Windows Vista、Windows 7用户,可以直接运行本程序。 同时鉴于Windows 8(Windows Blue、Windows 8.1)系统中默认未包含.NET Framework 2.0,因此新版的程序文件夹内将包含一个DirectX_Repair_win8的特别版程序,该程序功能与通用版相同,基于.NET Framework 4.0开发,可以在Windows8(Windows Blue、Windows 8.1)系统中直接运行(其他系统如果安装了.NET Framework 4.0也可以运行这个特别版的程序)。 本程序的官方博客地址为:http://blog.csdn.net/vbcom/article/details/6962388所有的更新以及技术支持都可以到该博客上找到。
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了傻瓜式一键设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 8.1 Update、Windows 10,同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V3.3版分为标准版、增强版以及在线修复版。其中的标准版以及增强版都包含完整的DirectX组件。除此之外,增强版中还额外包含了c++ Redistributable Package,因此增强版不但能解决DirectX组件的问题,而且还能解决c++组件异常产生的问题。增强版适合无法自行解决c++相关问题的用户使用。在线修复版的功能与标准版相同,只是其所需的文件将通过Internet下载,因此大大减小了程序的体积。本程序的各个版本之间,主程序完全相同,只是配套使用的数据包不同。因此,当您使用标准版数据包时,程序将进行标准修复;当您使用增强版的数据包时,程序将进行增强修复;当数据包不全或没有数据包(即只有DirectX Repair.exe程序)时,程序将进行在线修复。在线修复、离线修复可自由灵活组合,充分满足不同用户的需要。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有自动更新c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常时(非丢失时)会提示用户使用增强版进行修复。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了4项高级功能。点击其中的“注册系统文件夹中所有dll文件”按钮可以自动注册系统文件夹下的所有dll文件。该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。点击第二个按钮可以为dll文件的右键菜单添加“注册”和“卸载”项,方便对单独的dll文件进行注册。请注意,并不是所有的dll文件都可以通过这种方式注册。点击“DirectX版本”选项卡可以自行修改系统中DirectX的版本信息。点击“DirectX加速”选项卡可以控制系统中DirectX加速的开启与关闭。 新版程序集成了用户反馈程序,可以在用户允许的前提下发送检测修复结果。用户也可以在出现问题时通过反馈程序和软件作者进行交流,共同查找问题。反馈是完全自愿和匿名(如果不填E-mail地址)的。 本程序的通用版基于Microsoft .NET Framework 2.0开发,对于Windows 2000、Windows XP、Windows 2003的用户需要首先安装.NET Framework 2.0或更高版本方可运行本程序。有关下载和安装的详细信息请参阅“致Windows XP用户.txt”文件。对于Windows Vista、Windows 7及后续用户,可以直接运行本程序。 同时鉴于Windows 8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中默认未包含.NET Framework 2.0,因此新版的程序文件夹内将包含一个DirectX_Repair_win8的特别版程序,该程序功能与通用版相同,基于.NET Framework 4.0开发,可以在Windows8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中直接运行(其他系统如果安装了.NET Framework 4.0也可以运行这个特别版的程序)。 本程序的官方博客地址为:http://blog.csdn.net/vbcom/article/details/6962388 所有的更新以及技术支持都可以到该博客上找到。

8,325

社区成员

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

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