游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2306|回复: 0

请高手帮帮忙啊。。。。

[复制链接]

4

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2003-8-30 14:17:00 | 显示全部楼层 |阅读模式
各位好!!
我刚学directx,想显示一幅图,可是遇到了几个问题想请各位高手帮忙。
1。我为什么不能定义lpdirectdraw7的对象,一定义就说参数不对或是不能转换。我只好都改成lpdirectdraw
了。是不是得用QueryInterface函数才行?书上都没有用啊。
2。我的图显示出来比原来的图像大,屏幕放不下。也不是从屏幕0,0位置开始的。
3。还有rect结构在程式中要怎么初始化才好呢??
4。谢谢各位看看我这还有什么错误什么的请指点一下,费心了。


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

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
LPDIRECTDRAW lpDD7;
LPDIRECTDRAWSURFACE lpPrimary;
LPDIRECTDRAWSURFACE lpOffscreenplain;
LPDIRECTDRAWSURFACE lpBackbuffer;
DDSURFACEDESC desc;
DDSCAPS caps;
HBITMAP h_bitmap;
RECT rect;

BOOL InitDraw(HWND hWnd);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
        static TCHAR szAppName[] = TEXT ("HelloWin") ;
        HWND        hwnd ;
        MSG        msg ;
        WNDCLASS        wndclass ;
        rect.bottom=600;
        rect.left=0;
        rect.right=800;
        rect.top=0;

        wndclass.style                  = CS_HREDRAW | CS_VREDRAW ;
        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 (WHITE_BRUSH) ;
          wndclass.lpszMenuName        = NULL ;
        wndclass.lpszClassName        = szAppName ;

        if (!RegisterClass (&wndclass))
     {
                MessageBox (        NULL, TEXT ("This program requires Windows NT!"),
                                          szAppName, MB_ICONERROR) ;
                return 0 ;
     }
        hwnd = CreateWindow( szAppName,        // window class name
                        TEXT ("The Hello Program"),        // window caption
                        WS_OVERLAPPEDWINDOW,        // window style
                        CW_USEDEFAULT,        // initial x position
                        CW_USEDEFAULT,        // initial y position
                        CW_USEDEFAULT,        // initial x size
                        CW_USEDEFAULT,        // initial y size
                        NULL,                        // parent window handle
                    NULL,                // window menu handle
                    hInstance,            // program instance handle
                    NULL) ;             // creation parameters
     
        ShowWindow (hwnd, iCmdShow) ;
        UpdateWindow (hwnd) ;

        InitDraw( hwnd );
     
        while (GetMessage (&msg, NULL, 0, 0))
     {
                TranslateMessage (&msg) ;
                  DispatchMessage (&msg) ;
     }
        return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        HDC                        hdc ;
        PAINTSTRUCT ps ;
        RECT                rect ;
     
        switch (message)
     {
        case WM_CREATE:
        //PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
                return 0 ;

        case         WM_PAINT:
                hdc = BeginPaint (hwnd, &ps) ;
         
                GetClientRect (hwnd, &rect) ;
         
                DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
                        DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
                          EndPaint (hwnd, &ps) ;
                        return 0 ;
         
        case        WM_DESTROY:
                PostQuitMessage (0) ;
                return 0 ;
     }
   return DefWindowProc (hwnd, message, wParam, lParam) ;
}


BOOL InitDraw(HWND hWd)
{
        HRESULT h_judge;
        HDC hdc;
        HDC hdc1;
        HWND hWnd = hWd;

        if( (h_judge=DirectDrawCreate( NULL, &lpDD7, NULL))!=DD_OK )
                return FALSE;

        if( (h_judge=lpDD7->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE |
                                DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT))!=DD_OK )
                return FALSE;

    if( (h_judge=lpDD7->SetDisplayMode(800, 600, 16))!=DD_OK )
                return FALSE;

    ZeroMemory( &desc, sizeof(desc) );
        desc.dwSize=sizeof(desc);
        desc.dwFlags=DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
        desc.dwBackBufferCount=1;
        desc.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX |
                                DDSCAPS_FLIP;

        if( (h_judge=lpDD7->CreateSurface(&desc, &lpPrimary, NULL))!=DD_OK )
                return FALSE;
        caps.dwCaps=DDSCAPS_BACKBUFFER;

        if( (h_judge=lpPrimary->GetAttachedSurface(&caps, &lpBackbuffer))!=DD_OK )
                return FALSE;

        ZeroMemory( &desc, sizeof(desc) );
        desc.dwSize=sizeof(desc);
        desc.dwFlags=DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
        desc.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
        desc.dwWidth=800;
        desc.dwHeight=600;

        if( (h_judge=lpDD7->CreateSurface(&desc, &lpOffscreenplain, NULL))!=DD_OK )
                return FALSE;


        hdc1=CreateCompatibleDC( NULL );
        lpOffscreenplain->GetDC( &hdc );
       
        h_bitmap=(HBITMAP)LoadImage( NULL, "i:\\baby.bmp", IMAGE_BITMAP, 800,
                                600, LR_LOADFROMFILE );
        SelectObject( hdc1, h_bitmap );
        BitBlt( hdc, 0, 0, 800, 600, hdc1, 0, 0, SRCCOPY );
        lpOffscreenplain->ReleaseDC( hdc );

        lpBackbuffer->BltFast( 0, 0, lpOffscreenplain, &rect, DDBLTFAST_WAIT );
        lpPrimary->Flip( NULL, DDFLIP_WAIT );

        return 0;
}
[em7] [em7] [em7] [em7] [em10]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-11-22 09:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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