📄 chap09.html
字号:
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">返回</FONT><FONT SIZE=1>CRect</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>对象和另一矩形的并</FONT></TD>
</TR>
</TABLE>
</CENTER></P>
<FONT FACE="Arial"><P>9.1.2 </FONT><FONT FACE="黑体" LANG="ZH-CN">显示设备上下文</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">对于在视类的</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>成员函数中使用设备上下文进行输出的这种情况,我们已经以前面讲述文档和视时给出了一些示例,因此这里就不再重复叙述,读者可以参考前面所讲述的内容。下面我们来看一下如何自己构造设备上下文,并通过该设备上下文来进行绘制。</P>
<P ALIGN="JUSTIFY">在示例程序</FONT><FONT SIZE=3>MulticlrdCaption</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,我们通过</FONT><FONT SIZE=3>CWindowDC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象获得包括客户区和非客户区的显示设备上下文,然后将窗口的标题绘制为五彩的。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>#include <afxwin.h></P>
<P>#include <afxext.h></P>
<P>// 派生自己的应用程序类</P>
<P>class CMyApp : public CWinApp</P>
<P>{</P>
<P>public:</P>
<P>	virtual BOOL InitInstance();</P>
<P>};</P>
<P>// 应用程序主窗口类</P>
<P>class CMyWnd : public CFrameWnd</P>
<P>{</P>
<P>protected:</P>
<P>	void PaintTitleBar(BOOL bActive);</P>
<P>	// 声明主窗口的消息处理函数</P>
<P>	afx_msg void OnNcPaint();</P>
<P>	afx_msg BOOL OnNcActivate(BOOL bActive);</P>
<P>	DECLARE_MESSAGE_MAP();</P>
<P>};</P>
<P>// 初始化应用程序的实例</P>
<P>BOOL CMyApp::InitInstance()</P>
<P>{</P>
<P>	// 创建应用程序主窗口</P>
<P>	CMyWnd *pWnd=new CMyWnd;</P>
<P>	pWnd->Create(NULL, "具有五彩标题条的窗口");</P>
<P>	// 显示应用程序主窗口,并更新客户区</P>
<P>	pWnd->ShowWindow(SW_SHOW);</P>
<P>	pWnd->UpdateWindow();</P>
<P>	m_pMainWnd=pWnd;</P>
<P>	return TRUE;</P>
<P>}</P>
<P>// 声明应用程序对象</P>
<P>CMyApp MyApp;</P>
<P>// 应用程序主窗口的消息映射</P>
<P>BEGIN_MESSAGE_MAP(CMyWnd, CWnd)</P>
<P>	ON_WM_NCPAINT()</P>
<P>	ON_WM_NCACTIVATE()</P>
<P>END_MESSAGE_MAP()</P>
<P>// 绘制窗口的标题条,参数 bActive 代表窗口的当前激活状态</P>
<P>void CMyWnd::PaintTitleBar(BOOL bActive)</P>
<P>{</P>
<P>	// 创建代表整个窗口的显示设备上下文对象</P>
<P>	CWindowDC dc(this);</P>
<P>	CRect rc;</P>
<P>	// 获得窗口矩形及其宽度</P>
<P>	GetWindowRect(rc);</P>
<P>	UINT nWidth=rc.Width();</P>
<P>	// 获得窗口边框的度量</P>
<P>	UINT nXFrame=GetSystemMetrics(SM_CXSIZEFRAME);</P>
<P>	UINT nYFrame=GetSystemMetrics(SM_CYSIZEFRAME);</P>
<P>	// 获得窗口标题条的高度</P>
<P>	UINT nYCaption=GetSystemMetrics(SM_CYCAPTION);</P>
<P>	COLORREF cr;</P>
<P>	if (bActive)</P>
<P>	{</P>
<P>		// 获得当窗口处于激活状态时其标题条的颜色</P>
<P>		cr=GetSysColor(COLOR_ACTIVECAPTION);</P>
<P>		// 按从红到绿,再到蓝的渐变规律绘制标题条</P>
<P>		for (UINT j=nYFrame; j<=nYFrame+nYCaption; j++)</P>
<P>		{</P>
<P>			for (UINT i=nXFrame; i<=nWidth/2; i++)</P>
<P>			{</P>
<P>				UINT nLen=nWidth/2-nXFrame+1;</P>
<P>				if (dc.GetPixel(i, j)==cr)</P>
<P>				{</P>
<P>					dc.SetPixelV(i, j, </P>
<P>					 RGB(255-255*(i-nXFrame)/nLen, 255*(i-nXFrame)/nLen, 0));</P>
<P>				}</P>
<P>			}</P>
<P>			for (i=nWidth/2+1; i<=nWidth-nXFrame; i++)</P>
<P>			{</P>
<P>				UINT nLen=nWidth/2-nXFrame-1+1;</P>
<P>				if (dc.GetPixel(i, j)==cr)</P>
<P>				{</P>
<P>					dc.SetPixelV(i, j, </P>
<P>					 RGB(0, 255-255*(i-nWidth/2-1)/nLen, 255*(i-nWidth/2-1)/nLen));</P>
<P>				}</P>
<P>			}</P>
<P>		}</P>
<P>	}</P>
<P>	else</P>
<P>	{</P>
<P>		// 获得窗口处于非激活状态时的标题条颜色</P>
<P>		cr=GetSysColor(COLOR_INACTIVECAPTION);</P>
<P>		// 按从黑到灰,再到黑的渐变规律绘制标题条</P>
<P>		for (UINT j=nYFrame; j<=nYFrame+nYCaption-1; j++)</P>
<P>		{</P>
<P>			for (UINT i=nXFrame; i<=nWidth/2; i++)</P>
<P>			{</P>
<P>				UINT nLen=nWidth/2-nXFrame;</P>
<P>				if (dc.GetPixel(i, j)==cr)</P>
<P>				{</P>
<P>					dc.SetPixelV(i, j, RGB(192*(i-nXFrame)/nLen, </P>
<P>					 192*(i-nXFrame)/nLen, 192*(i-nXFrame)/nLen));</P>
<P>				}</P>
<P>			}</P>
<P>			for (i=nWidth/2+1; i<=nWidth-nXFrame; i++)</P>
<P>			{</P>
<P>				UINT nLen=nWidth/2-nXFrame-1;</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -