We must accept finite disappointment, but we must never lose infinite hope

VC—主框架窗口绘制背景

上一篇 / 下一篇  2008-07-02 17:56:59

LUPA开源社区 r3o Mu:yF ^4r/]

VC—主框架窗口绘制背景  转自skyremember的专栏

Xv$s6}+g%{-A3R)I|p0

7Mf R `4`^v0使用VC进行项目开发,特别是简单的MIS系统开发中,通常在用户没有进行操作之前显示的是主框架的窗口(用户点击操作菜单项再弹出处理窗口)。因此给主框 架窗口提供一个背景图片就显得很有必要(例如一用户满意的LOGO等)。但是对于主框架的背景的绘制不能简单地用ClassWizard重载 OnEraseBkgnd(CDC* pDC)函数的方法实现。LUPA开源社区7u(L]oAWmYt/R

(S6[gL s-t ]0多文档窗口应用程序中的主框架窗口的背景区是一个MDIClient类的窗口,因此改变背 景与这个MDIClient类的窗口有关。MDIClient类的窗口的句柄是m_hWndMDIClient(在CMDIFrameWnd中),可以通 过以下步骤实现:

2P&|D4gqp0

^R8klr9W/bI0Step 1:在资源中添加一个Bitmap资源,资源标志符为IDB_BKGOUND;LUPA开源社区f-H7]7\6BP#I
Step 2:添加一个MDIClient类:Insert——>New Class,选择MFC Class,基类选择"generic CWnd",类名为CClientWnd;
O'u FEx{Y0Step 3:为CClientWnd添加OnEraseBkgnd(CDC* pDC)(WM_ERASEBKGND),OnSize(UINT nType, int cx, int cy)(WM_SIZE)函数的重载(Class Wizard),并添加虚函数WNDPROC* CClientWnd::GetSuperWndProcAddr():LUPA开源社区y*hHF;O4\%}

LUPA开源社区~Y,[S9l]

BOOL CClientWnd::OnEraseBkgnd(CDC* pDC)

ivI$O'])g}-P0

`3ZB9w`8d"s9pU v0{LUPA开源社区*N-uT.Ppp-Q"SZ,o
// TODO: Add your message handler code here and/or call default
z9NC#}h~8{ g/y0CRect rectbk; // 客户区的大小 LUPA开源社区];N2m,JYV2v4]
CDC dcMen; //内存设备描述表
5l ?Rd:odFJ0CBitmap bmbk; // 位图对象 LUPA开源社区kc[SE4nn
bmbk.LoadBitmap(IDB_BKGOUND); // 从资源加载位图 bitmap
(e5@1F!CA:G \0// 得到位图bitmap的大小 LUPA开源社区g.xN*w ~A
BITMAP stBitmap; LUPA开源社区 l @cYd|_/KF
bmbk.GetObject(sizeof(BITMAP),&stBitmap);
"{9\K"I6B]0CSize bmsize(stBitmap.bmWidth,stBitmap.bmHeight); LUPA开源社区p#N,i e4I
dcMen.CreateCompatibleDC(pDC); LUPA开源社区 EB tc3?"L
// 选入新的位图对象并保存旧的位图对象
&A5EX"z0{Pu0CBitmap *pold=dcMen.SelectObject(&bmbk);
;L!v-XCv+Z$}0GetClientRect(&rectbk);
;XiIP_'E9[$DB)F0// 从内存向屏幕复制位图对象
yhu9HWJx#}Whn0pDC->StretchBlt(rectbk.left,rectbk.top,rectbk.Width(),rectbk.Height(),&dcMen,0,0,bmsize.cx,bmsize.cy,SRCCOPY); LUPA开源社区U1HR-c z }1O wQ4fJ
dcMen.SelectObject(pold); LUPA开源社区7wD3N6TVA"fW
// 恢复旧的位图对象 LUPA开源社区m2a.B-~d&?.J
dcMen.DeleteDC(); LUPA开源社区.D2jKq\
// 释放内存设备描述表
:OI$Y.Rp:B0//return CWnd::OnEraseBkgnd(pDC);
#i3v&v*K\ I&m Y1I%K0return TRUE;LUPA开源社区8SA%NOln"U
}

:fB*dt pz0 LUPA开源社区Zc7IIW(R3G;g'f!@*?;A

void CClientWnd::OnSize(UINT nType, int cx, int cy)
\Jv;Q(ZO0{
{}(?'yT;S(u{0CWnd::OnSize(nType, cx, cy);
!?;Vo!D_W:i!U0// TODO: Add your message handler code hereLUPA开源社区}l-Y)l-B
Invalidate(); //大小改变后重画LUPA开源社区&c3Q^D.~T
}

e@8i:D0Q'W:VqDXG0

}Q`/^']I3I:O0ClientWnd.h中添加:LUPA开源社区+@U YT4D/_
virtual WNDPROC* GetSuperWndProcAddr();LUPA开源社区i;c1T^sLE jH
ClientWnd.cpp中添加:
&Z(Y1mf8Jb$Bj0WNDPROC* CClientWnd::GetSuperWndProcAddr()LUPA开源社区q#je&XXvP+U:^,ta
{
t&`N{t,bT0static WNDPROC NEAR pfnSuper = NULL; LUPA开源社区X.Bt6^ On,t
return &pfnSuper; // 返回函数指针LUPA开源社区f}/u5s\'u8B6GT#C D
}

+e4n \_q mH0 LUPA开源社区jC@l ]k+Z

LUPA开源社区%\(Tc,U @yVY|
Step 4:为主框架添加背景:
Q_`r-V]0在MainFrm.h中添加:CClientWnd m_wndClient; (添加#include"ClientWnd.h"头文件)LUPA开源社区ky1N@0XD

LUPA开源社区Hs R!Qy2r2Gm']fK*~

在CMainFrame类的OnCreate()事项中添加:

4@T"Yi.{z f0 LUPA开源社区]-o ~5[#nm~

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)LUPA开源社区Y$VYN$`f
{
0^x1tX TMV!Hw0if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
&d+U;n(T5GC@*Y0return -1;LUPA开源社区_d `^|v n0Z ]W8B
if(!m_wndClient.SubclassWindow(m_hWndMDIClient))//该句为加入
3j3?%PldjS0{
c$U)ibP o y"`0TRACE("Fail to subclass MDI client window\n");LUPA开源社区6\1]/^ ? j
return -1;LUPA开源社区 t4V.xR0H-xP0I
}LUPA开源社区lwR.ng4Vn![-dl/bp
//////省略LUPA开源社区I+z$u A.kNjf6J

@-Q2eu3\0

\G-NpEi%j0原文件

.Hqz%t O0uh0 LUPA开源社区~h7jt rt

http://download1.csdn.net/down3/20070517/17195402945.rarLUPA开源社区 f:P@7N6`W


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2008-10-14  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 2315
  • 日志数: 54
  • 图片数: 1
  • 建立时间: 2008-02-28
  • 更新时间: 2008-10-10

RSS订阅

Open Toolbar