void CMainFrame::DrawTitleBar(CDC *pDC)
{
CRect rectWnd;
CDC* pMemDC=new CDC;
CBitmap bitmapTemp, *pOldBitmap;
int nWidth, nHeight; GetWindowRect(&rectWnd);
nWidth = rectWnd.Width();
nHeight = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME)+1; //创建位图内存
bitmapTemp.CreateCompatibleBitmap(pDC, nWidth, nHeight);
pMemDC->CreateCompatibleDC(pDC);
pOldBitmap=pMemDC->SelectObject(&bitmapTemp); //绘制底色
pMemDC->FillSolidRect(0, 0, nWidth, nHeight, m_clrMain); // GDI+贴图片
ScreenToClient(rectWnd); //屏幕坐标转换客户区坐标
HDC tc=GetDC()->m_hDC;
Graphics graphics(tc); //创建需要的DC,取得DC句柄
Image image(_T("titlebar.png"),false); // 图片的路径
graphics.DrawImage(&image,rectWnd.left,rectWnd.top,rectWnd.Width(),rectWnd.Height()); //画按钮
m_tlbtnClose.DrawButton(pMemDC, 8);
m_tlbtnMin.DrawButton(pMemDC,56);
if(flag==0)
{
m_tlbtnRes.DrawButton(pMemDC,32);
}
else
{
m_tlbtnMax.DrawButton(pMemDC,32);
}
//绘制标题
DrawCaption(pMemDC);
pDC->BitBlt(0, 0, nWidth, nHeight, pMemDC, 0, 0, SRCCOPY);
pMemDC->SelectObject(pOldBitmap);
ReleaseDC(pMemDC);
delete pMemDC;
}
{
CRect rectWnd;
CDC* pMemDC=new CDC;
CBitmap bitmapTemp, *pOldBitmap;
int nWidth, nHeight; GetWindowRect(&rectWnd);
nWidth = rectWnd.Width();
nHeight = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME)+1; //创建位图内存
bitmapTemp.CreateCompatibleBitmap(pDC, nWidth, nHeight);
pMemDC->CreateCompatibleDC(pDC);
pOldBitmap=pMemDC->SelectObject(&bitmapTemp); //绘制底色
pMemDC->FillSolidRect(0, 0, nWidth, nHeight, m_clrMain); // GDI+贴图片
ScreenToClient(rectWnd); //屏幕坐标转换客户区坐标
HDC tc=GetDC()->m_hDC;
Graphics graphics(tc); //创建需要的DC,取得DC句柄
Image image(_T("titlebar.png"),false); // 图片的路径
graphics.DrawImage(&image,rectWnd.left,rectWnd.top,rectWnd.Width(),rectWnd.Height()); //画按钮
m_tlbtnClose.DrawButton(pMemDC, 8);
m_tlbtnMin.DrawButton(pMemDC,56);
if(flag==0)
{
m_tlbtnRes.DrawButton(pMemDC,32);
}
else
{
m_tlbtnMax.DrawButton(pMemDC,32);
}
//绘制标题
DrawCaption(pMemDC);
pDC->BitBlt(0, 0, nWidth, nHeight, pMemDC, 0, 0, SRCCOPY);
pMemDC->SelectObject(pOldBitmap);
ReleaseDC(pMemDC);
delete pMemDC;
}
解决方案 »
- 关于listctrl的问题求大神笼罩新人
- 从Excel表中读取数据怎么做?
- mfc中,参数传递中 HWND 与 CWnd* 哪个更好一些?
- 全局键盘钩子的回调函数中怎么把我参数(WPARAM w LPARAM l)即w 和l含的信息转换成键盘输入的字符信息。
- 用winpcap捕获ICMP包问题
- 华为从通知面试通过到通知报道要多长时间啊,等的花都谢了...
- 《VC++技术内幕》P74页下面 pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX),-pDC->GetDeviceCaps(LOGPIXELSY));第二个参数为什么
- 遍歷子窗口的問題,有兩個函數不明白其區別,請教!
- 有关ocx控件应用的问题?
- 为什么我的CFormView不响应键盘事件,难道真的我的VC安装有问题?
- 从COM接口的函数如何取得结构体和结构体数组?
- 请教怎样让多个Client获取网内特定Server地址?
因为delete pMemDC;会释放DC的另外CreateCompatibleDC对应的是DeleteDC
ScreenToClient(rectWnd); //屏幕坐标转换客户区坐标
HDC tc=GetDC()->m_hDC;
Graphics graphics(tc); //创建需要的DC,取得DC句柄
Image image(_T("titlebar.png"),false); // 图片的路径
graphics.DrawImage(&image,rectWnd.left,rectWnd.top,rectWnd.Width(),rectWnd.Height());
然后 就出现一个对话框提示 0x7c93300e8处未处理的异常:0xC0000005:读取位置0x00000010时发生访问冲突。
使用GDI+前要初始化,GdiplusStartup
GDI+初始化在头文件里面有,在里面加了以后还是上面的错误。
追踪到
Image::Image(
IN const WCHAR* filename,
IN BOOL useEmbeddedColorManagement
)
{
nativeImage = NULL;
if(useEmbeddedColorManagement)
{
lastResult = DllExports::GdipLoadImageFromFileICM(
filename,
&nativeImage
);
}
else
{
lastResult = DllExports::GdipLoadImageFromFile(
filename,
&nativeImage
);
}
}
是不是文件路径写错了?还是我的逻辑写错了?
用绝对路径试试
pMemDC->CreateCompatibleDC(pDC); //你用CMainFrame的CDC创建了一个兼容DC
...
m_tlbtnClose.DrawButton(pMemDC, 8);//然后你将这个DC用到按钮的绘制中。
...
Delete pMemDC ;//不知道你的DrawButton 是如何实现的。
//绘图的消息通常 是Post出去的。
//在不知道按钮是否完成绘制的情况下,你又删除了该DC我估计问题出在这里。
Graphics graphics(tc); //创建需要的DC,取得DC句柄 tc出问题了。怎么回事?gdi和gdi+不太了解,求高人指点!
WNDPROC btnProc = SetWindowLong (hWndBtnClose, GWL_WNDPROC, (LONG)MyCloseBtnProc);
SetWindowLong (hWndBtnClose, GWL_USERDATA, (LONG)btnProc);
//============================================
// MyCloseBtnProc 函数
LRESULT CALLBACK MyCloseBtnProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hDC = BeginPaint (hWnd, &ps); //在这里绘制安钮
绘制的代码
//============= EndPaint (hDC, &ps);
}
}
return CallWindowProc ( (WNDPROC)GetWindowLong (hWnd, GWL_USERDATA),
hWnd, msg, wParam, lParam);
}
HDC tc = GetDC ()->m_hDC; //这句取的是窗口客户区坐标。你应该取窗口坐标。
我这样做按钮显示没问题,你的那种方法我会学习的。现在项目经理催进度,按钮改没时间,我想应该不会影响贴图的吧?
应是HDC tc=pDC->m_hDC;
断点现在这一步出错了。是不是添加的路径不对?
Image::Image(
IN const WCHAR* filename,
IN BOOL useEmbeddedColorManagement
)
{
nativeImage = NULL;
if(useEmbeddedColorManagement)
{
lastResult = DllExports::GdipLoadImageFromFileICM(
filename,
&nativeImage
);
}
else
{
lastResult = DllExports::GdipLoadImageFromFile(
filename,
&nativeImage
);
}
}
构造函数没有执行,直接跳过去了。
{
CDC* pWinDC = GetWindowDC();
if (pWinDC)
DrawNCFrame(pWinDC);
ReleaseDC(pWinDC); // 你先把这行去掉,试下。可能是绘制前,句柄被提前释放了。
}
Image image(_T("E:\\title.png"),false); 断点到这后再往下执行就报错了,image的构造函数直接跳过去了。
跟踪到断点 Graphics graphics(tc)时,tc有效吗?
改为:HDC tc = pMemDC->m_hDC 试试