笔者在开发项目时想在MDI程序中添加彩色位图以美化界面,也实验了几种方法,但都有一些小问题,经多方查找资料,终于圆满的实现了这种功能,现把我的实现方法介绍给大家。
首先要清楚对于一个MDI应用程序的主框架窗口来说包含一个特殊的子窗口称为MDICLIENT窗口,应用程序的主框架类中有一个成员变量m_hWndMDIClient指的就是MDICLIENT窗口。MDICLIENT窗口负责管理主框架窗口的客户区,对MDI客户窗口编程有一定的难度。原因是MDIFrameWnd的客户区完全被MDICLIENT窗口覆盖掉了。这样,MDI主窗口类MDIFrameWnd的背景色和光标都不起作用。同时,微软并不支持将MDICLIENT窗口作为子类,MDICLIENT窗口只能使用标准的背景色和光标。所以,对MDI客户窗口编程不能象对普通窗口那样简单地重载WM_PAINT的消息处理函数。我们可以在主框架窗口截获关于MDICLIENT窗口的重画消息,然后加入自己设计的代码。我用PreTranslateMessage(MSG*pMsg)截获MDI客户窗口WM_PAINT消息,在这个函数中向主框架窗口发送WM_PAINT消息,在该消息的处理函数中实现彩色位图的显示。我的具体实现如下:1、向程序添加256色彩色位图资源,命名为IDB_BITMAP1;2、用ClassWizard向主框架类添加函数CMainFrame::PreTranslateMessage(MSG*pMsg);3、用ClassWizard向主框架类添加函数CMainFrame::OnPaint();现给出两个函数的实现: 财管家,园,fs119.net
BOOLCMainFrame::PreTranslateMessage(MSG*pMsg)
{
//TODO:Addyourspecializedcodehereand/orcallthebaseclass
if(pMsg->hwnd==m_hWndMDIClient&&pMsg->message==WM_PAINT)
PostMessage(WM_PAINT);
returnCMDIFrameWnd::PreTranslateMessage(pMsg);
}
voidCMainFrame::OnPaint()
{
CDCdc,memdc;
dc.m_hDC=::GetDC(this->m_hWndMDIClient);
CRectrect;
CBitmapbitmap;
BITMAPszbitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
bitmap.GetObject(sizeof(BITMAP),&szbitmap);
CSizesize(szbitmap.bmWidth,szbitmap.bmHeight);
memdc.CreateCompatibleDC(&dc);
CBitmap*oldbitmap=memdc.SelectObject(&bitmap);
GetClientRect(&rect);
StretchBlt(dc.m_hDC,0,0,rect.Width(),rect.Height(),
memdc.m_hDC,0,0,size.cx,size.cy,SRCCOPY);
memdc.SelectObject(oldbitmap);
memdc.DeleteDC();
dc.DeleteDC();
CMDIFrameWnd::OnPaint();
}
按上述步骤就可以实现在MDI程序中显示彩色位图了,我举的例子用的是256色位图,你也可以实现真彩色位图的显示,具体方法我就不多说了,有兴趣的朋友可以试一试。
首先要清楚对于一个MDI应用程序的主框架窗口来说包含一个特殊的子窗口称为MDICLIENT窗口,应用程序的主框架类中有一个成员变量m_hWndMDIClient指的就是MDICLIENT窗口。MDICLIENT窗口负责管理主框架窗口的客户区,对MDI客户窗口编程有一定的难度。原因是MDIFrameWnd的客户区完全被MDICLIENT窗口覆盖掉了。这样,MDI主窗口类MDIFrameWnd的背景色和光标都不起作用。同时,微软并不支持将MDICLIENT窗口作为子类,MDICLIENT窗口只能使用标准的背景色和光标。所以,对MDI客户窗口编程不能象对普通窗口那样简单地重载WM_PAINT的消息处理函数。我们可以在主框架窗口截获关于MDICLIENT窗口的重画消息,然后加入自己设计的代码。我用PreTranslateMessage(MSG*pMsg)截获MDI客户窗口WM_PAINT消息,在这个函数中向主框架窗口发送WM_PAINT消息,在该消息的处理函数中实现彩色位图的显示。我的具体实现如下:1、向程序添加256色彩色位图资源,命名为IDB_BITMAP1;2、用ClassWizard向主框架类添加函数CMainFrame::PreTranslateMessage(MSG*pMsg);3、用ClassWizard向主框架类添加函数CMainFrame::OnPaint();现给出两个函数的实现: 财管家,园,fs119.net
{
//TODO:Addyourspecializedcodehereand/orcallthebaseclass
if(pMsg->hwnd==m_hWndMDIClient&&pMsg->message==WM_PAINT)
PostMessage(WM_PAINT);
returnCMDIFrameWnd::PreTranslateMessage(pMsg);
}
voidCMainFrame::OnPaint()
{
CDCdc,memdc;
dc.m_hDC=::GetDC(this->m_hWndMDIClient);
CRectrect;
CBitmapbitmap;
BITMAPszbitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
bitmap.GetObject(sizeof(BITMAP),&szbitmap);
CSizesize(szbitmap.bmWidth,szbitmap.bmHeight);
memdc.CreateCompatibleDC(&dc);
CBitmap*oldbitmap=memdc.SelectObject(&bitmap);
GetClientRect(&rect);
StretchBlt(dc.m_hDC,0,0,rect.Width(),rect.Height(),
memdc.m_hDC,0,0,size.cx,size.cy,SRCCOPY);
memdc.SelectObject(oldbitmap);
memdc.DeleteDC();
财软联 盟 fs119.net
dc.DeleteDC();
CMDIFrameWnd::OnPaint();
}
按上述步骤就可以实现在MDI程序中显示彩色位图了,我举的例子用的是256色位图,你也可以实现真彩色位图的显示,具体方法我就不多说了,有兴趣的朋友可以试一试。
财.管家园.fs119.net
相关文章
VCGDI编程的字体和文本绘制 用VisualC.NET进行GDI编程 VC.NET实现应用程序XP风格 用VisualC.NET实现XML解析 VC.NET中使用Windows.Forms VC.NET2003代码优化方法 VisualC.NET中的字符串转换方法 在managedC应用中使用ADO.NET VISUALC6.0在MDI主框架窗口中添 VisualC2005中混合代码的初始化 体验VisualC.NET2005中的STL 用VC.NET制作启动屏幕的新方法 VisualStudio2005中C的变化 VC.NET中定义和使用MFCDLL VC.NET的Direct3D极速入门宝典 VC.NET开发环境整合技巧 VisualC.NETDirectShow编程 基于VC.NET的GDI编程之CImage 基于VC.NET的GDI图像处理 利用VisualC实现AVI文件的图像截 VisualC.NETGDI编程基础 VisualC.NET编程讲座之八 VisualC.NET编程讲座之七 VisualC.NET编程讲座之六
Google.cn搜索关键字:
窗口 添加 框架 MDICLIENT MDI 实现 函数 WM_PAINT 客户
Google.cn搜索相关文章:
谷歌中搜索全球网 VISUALC6.0在MDI主框架窗口中添加位图
百度中搜索 VISUALC6.0在MDI主框架窗口中添加位图
谷歌中搜索www.fs119.net VISUALC6.0在MDI主框架窗口中添加位图
上一篇:VisualC2005中混合代码的初始化
Google.cn搜索相关文章:
谷歌中搜索全球网 VISUALC6.0在MDI主框架窗口中添加位图
百度中搜索 VISUALC6.0在MDI主框架窗口中添加位图
谷歌中搜索www.fs119.net VISUALC6.0在MDI主框架窗口中添加位图
下一篇:在managedC应用中使用ADO.NET
精品课程推荐
热点专题
最新主题
推荐大折扣培训课程