此程序的目的是用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一般)。不知道是什么原因,谁能帮忙看下啊,谢谢大家了先!
{
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一般)。不知道是什么原因,谁能帮忙看下啊,谢谢大家了先!
解决方案 »
- 如何设置xml文件的版本号
- 关于socket的WSAAsyncSelect问题:accept出错
- 鼠标原理问题
- CListBox右键弹出菜单问题
- 两个对话框的问题。
- windows下的dll可以返回string对象吗?很简单的一个源码出错,高手看看,在线等
- 关于窗口的编译问题
- 在CMainFrame类之外的类里灰掉菜单
- 谁有关于树型控件的使用的例子????
- 初学者提问:有关邮件协议的问题。谢谢!
- 装了卡巴斯基,VC不能编译,在link的时候卡住,添加link.exe为信任程序后,卡吧提示我编译出来的EXE有潜在风险,郁闷至死,求解决方案
- 谁给推荐几篇图像处理领域或虚拟现实领域里比较经典的文献,论文!
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都没有创建成功,不知道具体是为什么,谁能帮忙看看啊!先谢谢大家了!
总的来说就是想给一个按钮建立一个页面(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。