鱼C论坛

 找回密码
 立即注册
查看: 1113|回复: 0

DirectDraw问题

[复制链接]
发表于 2015-3-15 19:40:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

#define WIN32_LEAN_AND_MEAN

#define INITGUID

#include <windows.h>
#include <windowsx.h>
#include <mmsystem.h>
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <io.h>
#include <fcntl.h>
#include <ddraw.h>

#define WIN_NAME "fan"

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000)?1:0)

typedef unsigned short USHORT;
typedef unsigned short WORD;
typedef unsigned char  UCHAR;
typedef unsigned char  BYTE;

LPDIRECTDRAW7 lpdd = NULL;
LPDIRECTDRAWPALETTE lpddpal = NULL;
LPDIRECTDRAWSURFACE7 lpddsprimary = NULL;

DDSURFACEDESC2 ddsd;

HWND main_windows_handle = NULL;

LRESULT CALLBACK WindowProc(HWND hwnd,
                                                        UINT msg,
                                                        WPARAM wparam,
                                                        LPARAM lparam)
{
        PAINTSTRUCT ps;
        HDC hdc;

        switch (msg)
        {
        case WM_CREATE:
                {
                        return 0;
                }break;

        case WM_PAINT:
                {
                        hdc = BeginPaint(hwnd,&ps);
                        EndPaint(hwnd,&ps);

                        return 0;
                }break;
        case WM_DESTROY:
                {
                        PostQuitMessage(0);

                        return 0;
                }break;

        default:break;
        }

        return( DefWindowProc(hwnd,msg,wparam,lparam) );
}

int Game_Main(void *parms = NULL , int num_parms = 0)
{
        if( KEYDOWN(VK_ESCAPE) )
                SendMessage(main_windows_handle , WM_CLOSE , 0 , 0);

        memset(&ddsd , 0 , sizeof(ddsd));
        ddsd.dwSize = sizeof(ddsd);

        if(FAILED(lpddsprimary->Lock(NULL, &ddsd,
                                                                DDLOCK_SURFACEMEMORYPTR |
                                                                DDLOCK_WAIT,NULL)))
        {
                return 0;
        }

        int mempitch = (int)ddsd.lPitch;
        UCHAR *video_buffer = (UCHAR *)ddsd.lpSurface;

        for(int index = 0;index < 100 ; index++)
        {
                UCHAR color = rand()%256;
                int x = rand()%640;
                int y = rand()%480;

                video_buffer[x+y*mempitch] = color;
        }

        if(FAILED(lpddsprimary->Unlock(NULL)))
                return 0;

        Sleep(30);
        return 1;
}

int Game_Init(void *parms = NULL , int num_parms = 0)
{

        if(FAILED(DirectDrawCreateEx(NULL,(void **)&lpdd, IID_IDirectDraw7, NULL)))
                {
                        return 0;
                }

        if(FAILED(lpdd->SetCooperativeLevel(main_windows_handle , DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX
                                                        | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT)))
                {
                        return 0;
                }

        if (FAILED(lpdd->SetDisplayMode(800, 600, 16,0,0)))
                {
                        return 0;
                }

        ddsd.dwSize = sizeof(ddsd);
        ddsd.dwFlags = DDSD_CAPS;
        ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

        if(FAILED(lpdd->CreateSurface(&ddsd , &lpddsprimary , NULL)))
                {
                        return 0;
                }


        PALETTEENTRY palette[256];

        srand(time(NULL));
        for(int color = 1; color < 255 ; color++)
        {
                palette[color].peBlue = rand()%256;
                palette[color].peRed = rand()%256;
                palette[color].peGreen = rand()%256;
                palette[color].peFlags = PC_NOCOLLAPSE;
        }

        palette[0].peBlue = 0;
        palette[0].peRed = 0;
        palette[0].peGreen = 0;
        palette[0].peFlags = PC_NOCOLLAPSE;

        palette[255].peBlue = 255;
        palette[255].peRed = 255;
        palette[255].peGreen = 255;
        palette[255].peFlags = PC_NOCOLLAPSE;

        if(FAILED(lpdd->CreatePalette(DDPCAPS_8BIT |
                                                                DDPCAPS_ALLOW256 |
                                                                DDPCAPS_INITIALIZE,
                                                                palette,
                                                                &lpddpal,
                                                                NULL
                                                                )))
        {
                return 0;
        }

        if (FAILED(lpddsprimary->SetPalette(lpddpal)))
    {
                return(0);
    }

        return 1;
}

int Game_ShutDown(void *parms = NULL , int num_parms = 0)
{
        if(lpdd)
        {
                lpdd->Release();
                lpdd = NULL;
        }

        if(lpddsprimary)
        {
                lpddsprimary->Release();
                lpddsprimary = NULL;
        }

        if(lpddpal)
        {
                lpddpal->Release();
                lpddpal = NULL;
        }

        return 1;
}

int WINAPI WinMain(HINSTANCE hinstance,
                                   HINSTANCE hprevinstance,
                                   LPSTR lpcmdline,
                                   int necmshow)
{
        WNDCLASSEX winclass;
        HWND hwnd;
        MSG msg;

        winclass.cbSize = sizeof(WNDCLASSEX);
        winclass.style = CS_DBLCLKS | CS_OWNDC |
                                        CS_HREDRAW | CS_VREDRAW;
        winclass.lpfnWndProc = WindowProc;
        winclass.cbClsExtra = 0;
        winclass.cbWndExtra = 0;
        winclass.hInstance = hinstance;
        winclass.hIcon = LoadIcon( NULL ,IDI_APPLICATION);
        winclass.hCursor = LoadCursor(NULL ,IDC_ARROW);
        winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        winclass.lpszMenuName = NULL;
        winclass.lpszClassName = WIN_NAME;
        winclass.hIconSm = LoadIcon( NULL ,IDI_APPLICATION);

        if(!RegisterClassEx(&winclass))
        {
                return 0;
        }

        if(!(hwnd = CreateWindowEx(NULL,
                                WIN_NAME,"cheng",
                                WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                                0,0,
                                640,480,
                                NULL,
                                NULL,
                                hinstance,
                                NULL)))
        {
                return 0;
        }

        main_windows_handle = hwnd;

        Game_Init();

        while(TRUE)
        {
                if(PeekMessage(&msg , NULL , 0 , 0 , PM_REMOVE))
                {
                        if(msg.message == WM_QUIT)
                        break;

                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }

                Game_Main();
        }

        Game_ShutDown();

        return (msg.wParam);
}


代码没有bug,但就是运行不出来,没有全屏,也没有随机像素点显示,求大神指教:loveliness:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 20:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表