设备上下文实用程序






4.59/5 (22投票s)
2001年1月25日

198002

4906
一个封装了一些有用的、与 GUI 相关的静态函数的类
引言
我的数百个应用程序 <grin> 或多或少都使用了 GUI 函数。我非常喜欢编写任何能产生视觉效果的东西。这一定是因为我们在技术性的同时,也可以发挥创造力。在我看来,MFC 非常棒,因为它提供了一个框架,让你不必再为“底层”架构编写代码,从而可以自由地编写所需的代码来高效地扩展已有的功能。
在整理这些代码时,我学到了一些东西。注意“整理”这个词!虽然有些东西确实是我写的,但很多都是改编的(有时改编比自己写还难!)。我推荐大家访问 http://www.cwinapp.com。这是一个很棒的网站,只有一个问题……去看看就知道了!我非常感谢创建那个网站的各位。
类结构
我已尽我所能使这些 GUI 函数尽可能简单易用。我希望能通过一次调用就完成我需要的任务。但这并非总是可行或高效。例如,有时像整个屏幕截图这样的大图像,应该先保存起来重复使用,以牺牲一些准确性为代价,而不是每次发生变化都重新获取图像。
我毫不怀疑很多人会质疑我的方法/技术/熟练程度等等。虽然我们天生是具有挑战性和竞争性的生物,但请记住:
我写这个首先是为了自己,而且正如任何有用的发现之后应该做的那样,我想分享它。其中还有很多缺失的地方,我打赌我们可以制作一个非常酷的 GUI 函数库。如果你发现了一个 bug,或者有关于另一个很酷的 GUI 函数的想法/代码,请告诉我!
函数及其参数
有几个函数没有文档,因为它们要么非常不言自明,要么是为类中更复杂的 DC 实用工具提供的非常简单的辅助函数。
大多数函数都有以下两个共同的参数,我不会重复说明它们的用法,除非我忘了已经告诉过你们,或者我真的需要这样做。;)
void CDCUtils::SomeFunction( CDC* pDC, CRect area, ..Other params.. )
指向 CDC 类的指针是进行绘图的上下文。在我的示例应用程序中,我一直提供一个“内存 DC”,其中无处不在的 CMemDC
是最好的(由 Kieth Rule 编写)。
void CDCUtils::SomeFunction( CDC* pDC, CRect area, ..Other params.. )
提供的 CRect
是您希望执行工作的目标区域。
该类目前的状况
class CDCUtils
{
public:
// Helper Functions and variables:
static CBitmap m_bmpDesktop;
static double DegreeToRadian( ... );
static CDC* GetDCFromBmp( ... );
static CDC* GetDCFromBmp( ... );
static CDC* CreateBitmappedDC( ... );
// "Worker Functions"
static void GetDesktopImage( ... );
static void PaintRect( ... );
static void DrawText( ... );
static void PaintHatch( ... );
static void Draw3DRect( ... );
static void LinearGradient( ... );
static void RadialGradient( ... );
static void DrawElectricity( ... );
static void MakeGlass( ... );
static void PaintBitmap( ... );
static void PaintDesktop( ... );
static void DrawLine( ... );
static void DrawSineWave( ... );
static void TileBitmap( ... );
static void BlitBitmap( ... );
// Other
CDCUtils();
virtual ~CDCUtils();
};
PaintHatch()
static void CDCUtils::PaintHatch(CDC* pDC, CRect area,
COLORREF crFG, COLORREF crBG)
COLORREF crFG
网格(或影线)的颜色。
COLORREF crBG
背景颜色。
TileBitmap()
static void TileBitmap( CDC *pDC, CRect rect, UINT uResourceID );
UINT uResourceID
您 VC 项目中的 BMP 资源,其中包含要平铺的位图。
DrawText()
static void DrawText(
CDC* pDC,
CPoint Location,
CString strText,
CString strFontName,
int nFontWidth,
int nFontHeight,
COLORREF crFontColour,
long FontWeight=FW_BOLD);
CString strText
将要显示的文本。
CString strFontName
您想使用的字体名称。例如“Arial
”。(我希望这不会太难……)
int nFontWidth
我不想浪费时间打超过四个词来描述这个函数对于其传播功能的任何沉着运用可能有效地产生什么。
int nFontHeight
同上。
COLORREF crFontColour
我通常使用 RGB()
函数提供 RGB 信息。
long FontWeight
指定 FW_BOLD
、FW_NORMAL
等。
Draw3DRect()
static void Draw3DRect( CDC* pDC,
CRect& area,
bool bDeflate=false,
COLORREF crFill=-1,
COLORREF crHilite=-1,
COLORREF crLoLite=-1);
bool bDeflate
对我来说,这是一个简单但有用的参数,提供 true 将导致 Crect
参数被 CSize(1,1)
缩小。这在您调用的下一个函数使用相同的目标矩形区域,但需要缩小以防止擦除先前绘制的边框时非常有用。
COLORREF crFill
用于对指定矩形进行纯色填充的 RGB 值。默认值表示不需要填充。
COLORREF crHilite
用于矩形“高光”部分的 RGB 值。默认使用 ::GetSysColor(COLOR_BTNHILIGHT)
。
COLORREF crLoLite
用于矩形“Lowlight
”(暗部)的 RGB 值。默认使用 ::GetSysColor(COLOR_BTNSHADOW)
。
LinearGradient()
static void LinearGradient( CDC *pDC,
CRect &rect,
COLORREF clrFrom,
COLORREF clrTo,
BOOL bHorizontal = TRUE);
COLORREF crFrom
用于“起始”颜色的 RGB 值。
COLORREF crTo
用于“结束”颜色的 RGB 值。
BOOL bHorizontal
默认为 TRUE。指定您希望水平还是垂直展开渐变(示例使用 TRUE)。
DrawElectricity()
static void DrawElectricity( CDC *pDC, CRect rect );
我从 CodeProject 最近的一篇文章中“借鉴”了这个功能:CCreditsCtrl - 一个高级的“关于”对话框 - 作者 Marc Richarme。他为这个功能的简陋道歉,但我不会,我觉得它很酷。演示的可执行文件更好地展示了这一点,因为时间会使结果随机化,让它更……有闪电的感觉 ;)
RadialGradient()
static void RadialGradient( CDC *pDC,
CRect &rect,
COLORREF clrFrom,
COLORREF clrTo );
COLORREF crFrom
用于“起始”颜色的 RGB 值。
COLORREF crTo
用于“结束”颜色的 RGB 值。
DrawSineWave()
static void DrawSineWave( CDC *pDC,
CRect rect,
double dwCycles,
COLORREF crPen = 0x000 );
double dwCycles
决定在提供的 rect
中绘制多少个完整的周期。
COLORREF crPen
用于绘制波形的 RGB 值。默认为黑色。
PaintDesktop()
static void PaintDesktop( CDC *pDC,
CWnd* pWnd,
CRect SourceRect,
CRect DestRect);
CWND* pWnd
调用窗口将提供进行绘制的 CWnd
指针(通常在 OnDraw()
函数中是'this
')。
CRect SourceRect
指定您想“绘制”桌面图像的哪个部分。
CRect DestRect
指定您想在提供的 CDC* 上的哪个位置绘制桌面图像。
BlitBitmap()
static void BlitBitmap( CDC *pDC,
CRect rect,
UINT uResourceID,
COLORREF crMask=RGB(0,0,0),
double dDegreesRotation=0 );
UINT uResourceID
位于您应用程序中的位图的资源 ID。
COLORREF crMask
用于确定什么应该被设置为透明的 RGB 值。
double dDegreesRotation
允许旋转位图。超过 360 的值将被“环绕”处理。
PaintBitmap()
static void PaintBitmap( CDC *pDC,
CWnd* pWnd,
CRect rect,
UINT uBmpID,
bool bStretchToFit = true,
bool bOverlay = false );
CWND* pWnd
调用窗口将提供进行绘制的 CWnd
指针(通常在 OnDraw()
函数中是'this
')。
UINT uBmpID
位于您应用程序中的位图的资源 ID。
bool bStretchToFit
决定参数所暗示的功能(无意冒犯;)。
bool bOverlay
告诉函数在执行位图传输操作时使用 SRCAND
而不是 SRCCPY
。
MakeGlass()
static void MakeGlass( CDC *pDC,
CWnd* pWnd,
CRect rect,
UINT uBmpID );
此函数收集了 CDCUtils
类中另外两个 static
函数共有的参数,并根据需要将它们传递给这些类。该效果通过首先绘制先前制作的桌面快照的相关部分,然后使用 SRCAND
标志“覆盖”一个位图来实现。
- 首先调用 PaintDesktop(),
- 最后调用 PaintBitmap(),并使用创建所需效果所需的参数。
GetDesktopImage()
static void GetDesktopImage( CBitmap* pBitmap = NULL );
CBitmap* pBitmap
指向一个将包含桌面图像的 CBitmap
的指针。如果未指定,函数假定您正在为以后使用拍摄快照,并将图像存储到其成员变量 m_bmpDesktop
中。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。