此程序的目的是用DDraw为一个按钮贴图:BOOL CDirectDraw3Dlg::OnInitDialog()
{
CDialog::OnInitDialog();// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization here
m_button1.CreateBitmapSurface(IDB_BITMAP1);return TRUE; // return TRUE unless you set the focus to a control
}下面是重载一个按钮类:void CDrawButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct/*lpDrawItemStruct*/)
{// TODO: Add your code to draw the specified item
//CDC dc ;
//dc.Attach(lpDrawItemStruct->hDC);
CRect rect;
GetClientRect(&rect);StretchBlt(
m_hdc,  
0,  
0,  
rect.Width(),  
rect.Height(),  
m_hdcImage,  
0,  
0,  
m_bitmap.bmWidth,  
m_bitmap.bmHeight,  
SRCCOPY
);  
}这是在对话框初始化时的接口函数void CDrawButton::CreateBitmapSurface(UINT CtlID)
{
HBITMAP hBitmap;
CBitmap bmp;bmp.LoadBitmap(CtlID);hBitmap=(HBITMAP)bmp;bmp.GetBitmap(&m_bitmap);DDSURFACEDESC ddsd;ZeroMemory(&ddsd, sizeof(ddsd));ddsd.dwSize = sizeof(ddsd);ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;ddsd.dwWidth = m_bitmap.bmWidth;ddsd.dwHeight = m_bitmap.bmHeight;m_lpdd->CreateSurface(&ddsd, &m_lpSource, NULL);if (m_lpSource == NULL || hBitmap == NULL)return;m_lpSource->Restore();m_hdcImage = CreateCompatibleDC(NULL);SelectObject(m_hdcImage, hBitmap);GetObject(hBitmap, sizeof(m_bitmap), &m_bitmap);m_lpSource->GetDC(&m_hdc);
}
问题是:每次调试时,走到m_lpdd->CreateSurface(&ddsd, &m_lpSource, NULL);时一切正常,可是F10过后,程序没有报错结束,但是程序好像是忽略了这行代码之后的代码,直接运行完成了(如同直接F5一般)。不知道是什么原因,谁能帮忙看下啊,谢谢大家了先!

解决方案 »

  1.   

    难道是我之前忘记创建Ddraw对象了吗?但是我只要在前面加上DirectDrawCreate(),程序运行时就会报错,实在是不知道为什么啊!
      

  2.   

    我用的是WINCE系统,估计是SDK的问题。可是我换成VC6.0之后这几个问题虽然没了,可以新问题又出来了HBITMAP hBitmap;
    CBitmap bmp;
    HRESULT  hRet=DirectDrawCreate(NULL, &m_lpdd, NULL);
    if (hRet != DD_OK)
    return; bmp.LoadBitmap(CtlID); hBitmap=(HBITMAP)bmp; bmp.GetBitmap(&m_bitmap); DDSURFACEDESC ddsd; ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwWidth = m_bitmap.bmWidth; ddsd.dwHeight = m_bitmap.bmHeight; hRet = m_lpdd->CreateSurface(&ddsd, &m_lpSource, NULL);
        if (hRet != DD_OK)
            return ;

    if (m_lpSource == NULL || hBitmap == NULL)
    {
    return;
    }

    m_lpSource->Restore();

    m_hdcImage = CreateCompatibleDC(NULL);

    SelectObject(m_hdcImage, hBitmap); GetObject(hBitmap, sizeof(m_bitmap), &m_bitmap); m_lpSource->GetDC(&m_hdc);
    其中
    BITMAP m_bitmap;
    LPDIRECTDRAW m_lpdd;
    LPDIRECTDRAWSURFACE m_lpSource;
    HDC m_hdc;
    HDC m_hdcImage;
    均为成员变量。但是每次到hRet = m_lpdd->CreateSurface(&ddsd, &m_lpSource, NULL);m_lpSource都没有创建成功,不知道具体是为什么,谁能帮忙看看啊!先谢谢大家了!
      

  3.   

    关于利用DDRAW给按钮贴图,我先说下自己的想法:(初学者,可能有不少错误,希望大家帮忙指正和指导)
    总的来说就是想给一个按钮建立一个页面(DIRECTDRAWSURFACE),在这个页面上显示按钮的位图(暂时不考虑按钮获得焦点和按钮按下时的情况),这样的话是不是只用创建一个主页面就行了,然后将位图通过BITBLT加载到页面上。但是:怎么样才能创建一个大小和位置合适的页面盖在按钮上面呢(Ret = m_lpdd->SetCooperativeLevel( this->m_hWnd,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );是不是这个操作就是制定了我创建的页面将会是基于当前按钮的呢),再者其中的DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN 应该如何选取,全屏和独占究竟何意?再创建工程当中,遇到了一些问题:
    我是在VC6.0上创建的工程,没有自己去下载directdraw的SDK(我搜索发现VC98/INCLUDE里面已经存在ddraw.h和ddraw.lib了,所以就没有人为的安装SDk)。
    下了几个实例,可是都是基于不同的平台的,SDK版本各不相同,众说纷纭,很是无奈。1。dxguid.lib 到底需要不需要,我没有添加dxguid.lib,只添加ddraw.lib,可是程序成功通过编译了,并且运行成功,但是其中很多操作失败。(看到有些文章说要加dxguid.lib)2。是否需要查询接口QueryInterface();
       是否需要设置协作等级SetCooperativeLevel();我设置协作等级,失败,返回值-2147024809。
       是否需要设置显示模式SetDisplayMode();这里的参数难道是1024,800吗?还是别的什么含义?3。是否可以直接创建一个主页面(即不需要离屏页面,和后台页面),页面的尺寸如何取定呢?
    我用hRet = m_lpdd->CreateSurface(&ddsd, &m_lpSource, NULL);失败,返回值-2005532460。