Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16496889
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:53:04

下载本文示例代码
  笔者在开发项目时想在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();现给出两个函数的实现: BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(pMsg->hwnd==m_hWndMDIClient && pMsg->message==WM_PAINT)  PostMessage(WM_PAINT);  return CMDIFrameWnd::PreTranslateMessage(pMsg); } void CMainFrame::OnPaint()  {   CDC dc, memdc;  dc.m_hDC=::GetDC(this->m_hWndMDIClient);  CRect rect;  CBitmap bitmap;  BITMAP szbitmap;  bitmap.LoadBitmap(IDB_BITMAP1);  bitmap.GetObject(sizeof(BITMAP),&szbitmap);  CSize size(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程序中添加彩色位图以美化界面,也实验了几种方法,但都有一些小问题,经多方查找资料,终于圆满的实现了这种功能,现把我的实现方法介绍给大家。  首先要清楚对于一个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();现给出两个函数的实现: BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(pMsg->hwnd==m_hWndMDIClient && pMsg->message==WM_PAINT)  PostMessage(WM_PAINT);  return CMDIFrameWnd::PreTranslateMessage(pMsg); } void CMainFrame::OnPaint()  {   CDC dc, memdc;  dc.m_hDC=::GetDC(this->m_hWndMDIClient);  CRect rect;  CBitmap bitmap;  BITMAP szbitmap;  bitmap.LoadBitmap(IDB_BITMAP1);  bitmap.GetObject(sizeof(BITMAP),&szbitmap);  CSize size(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色位图,你也可以实现真彩色位图的显示,具体方法我就不多说了,有兴趣的朋友可以试一试。 下载本文示例代码


VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图VISUAL C 6.0在MDI主框架窗口中添加位图
阅读(144) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~