Windows 程序设计基础知识总结(二)(草稿)

本文详细介绍了Windows程序设计中的绘图基础知识,包括GDI(GraphicsDeviceInterface)、DC(DeviceContext)及其类型,MM(映射模式),以及关键函数如GetWindowDC、BeginPaint等。还涵盖了画笔、画刷、颜色管理及设备描述表的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Windows 程序设计基础知识总结(二)

绘图

术语名词解释

GDI Graphics Device Interface, 图形设备接口
DC Device Context, 设备描述表,类型分为:显示、打印、存储、消息类型。
MM Map Mode 映射模式
COLORREF 表示颜色,形式为 RGB(R, G, B)

常用函数
//-----------------------------------------------------------------
// 获取设备环境
//
HDC
WINAPI	// #define WINAPI      __stdcall
GetWindowDC(
    _In_opt_ HWND hWnd);

// 不由 WM_PAINT 消息驱动的绘图工作需调用 GetDC 函数获取设备环境。
HDC
WINAPI
GetDC(
    _In_opt_ HWND hWnd);
    
// GetDC() 的扩展,提供更灵活的操作。
HDC
WINAPI
GetDCEx(
    _In_opt_ HWND hWnd,
    _In_opt_ HRGN hrgnClip,
    _In_ DWORD flags);
    
// 释放由 GetDC() 和 GetDCEx() 获取的设备环境
int
WINAPI
ReleaseDC(
    _In_opt_ HWND hWnd,
    _In_ HDC hDC);


// 应用程序响应 WM_PAINT 消息进行图形刷新时,主要通过调用 BeginPaint() 函数获取设备环境
HDC
WINAPI
BeginPaint(
    _In_ HWND hWnd,
    _Out_ LPPAINTSTRUCT lpPaint);		// 标识无效区域的结构
    
// 由 BeginPaint() 函数获取的设备环境必须用 EndPaint 释放。
BOOL
WINAPI
EndPaint(
    _In_ HWND hWnd,
    _In_ CONST PAINTSTRUCT *lpPaint);

//-----------------------------------------------------------------
// 映射模式设置
//
int   WINAPI SetMapMode(_In_ HDC hdc, _In_ int iMode);
	// 设置设备环境的映射模式,参数见属性对照说明-Windows映射模式

int   WINAPI GetMapMode( _In_ HDC hdc);
	// 获取当前设备环境的映射模式。

BOOL  
WINAPI 
SetViewportExtEx( 				// 定义视口区域
	_In_ HDC hdc, 
	_In_ int x, 				// 以物理设备单位表示的新视口区域尺寸
	_In_ int y, 
	_Out_opt_ 	LPSIZE lpsz);	// lpSize 为保存函数调用前视口区域尺寸的 SIZE 结构地址,
								// 如果取 NULL,则表示忽略调用前的尺寸。
 
BOOL  
WINAPI 
SetViewportOrgEx(				// 设定视口原点,默认 (0, 0)
	_In_ HDC hdc, 
	_In_ int x, 				// x 和 y 为以物理单位表示的新视口原点坐标
	_In_ int y, 
	_Out_opt_ LPPOINT lppt);	// lpPoint 为保存函数调用前原点坐标的 POINT 结构的地址
								// 取 NULL,则忽略调用前的尺寸
 
BOOL  
WINAPI 
SetWindowExtEx( 				// 定义窗口区域
	_In_ HDC hdc, 
	_In_ int x, 				// 以逻辑单位表示的窗口尺寸
	_In_ int y, 
	_Out_opt_ LPSIZE lpsz);		// 如果取 NULL 则表示忽略调用前尺寸
 
BOOL  
WINAPI 
SetWindowOrgEx( 
	_In_ HDC hdc, 
	_In_ int x, 				// 以逻辑单位表示的窗口原点坐标
	_In_ int y, 
	_Out_opt_ LPPOINT lppt);	// 取 NULL,则忽略调用前的尺寸。

//-----------------------------------------------------------------
// 绘图
//
HGDIOBJ 						// 返回上一次使用的画刷或画笔
WINAPI 
SelectObject(					// 将目标选入设备环境
	_In_ HDC hdc, 
	_In_ HGDIOBJ h);
	
BOOL 
WINAPI 
DeleteObject( _In_ HGDIOBJ ho);
//-------------------------------------------------------------
// 画笔
HGDIOBJ // typedef void *HGDIOBJ;
WINAPI 
GetStockObject( _In_ int i);
	// hPen = (HPEN)GetStockObject(BLACK_PEN);
	// WHITE_PEN, BLACK_PEN, DC_PEN, NULL_PEN

HPEN    
WINAPI 
CreatePen( 
	_In_ int iStyle, 			// 画笔样式
	_In_ int cWidth, 			// 画笔宽度,取 0 表示一个像素宽度
	_In_ COLORREF color);		// 画笔颜色   typedef DWORD COLORREF;
//-------------------------------------------------------------
// 画刷
HGDIOBJ // typedef void *HGDIOBJ;
WINAPI 
GetStockObject( _In_ int i);	// 输入参数为画刷样式
	// hBrush = (HBRUSH)GetStockObject(BLACK_BRUSH);

HBRUSH  
WINAPI 
CreateSolidBrush( _In_ COLORREF color);	// 创建一个具有指定颜色的单色画刷

HBRUSH  
WINAPI 
CreateHatchBrush( 				// 创建一个具有指定阴影图案和颜色的画刷
	_In_ int iHatch, 			// 阴影模式标识
	_In_ COLORREF color);		// 画刷颜色


//-----------------------------------------------------------------
//
BOOL
WINAPI
GetUpdateRect(
    _In_ HWND hWnd,
    _Out_opt_ LPRECT lpRect,
    _In_ BOOL bErase);
相关数据结构
typedef struct tagRECT
{
    LONG    left;
    LONG    top;
    LONG    right;
    LONG    bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

typedef struct tagPAINTSTRUCT {
    HDC         hdc;				// 设备环境句柄
    BOOL        fErase;				// fErase 一般取真值,表示擦除无效矩形的背景
    RECT        rcPaint;			// 无效矩形标识
    BOOL        fRestore;			// 系统保留
    BOOL        fIncUpdate;			// 系统保留
    BYTE        rgbReserved[32];	// 系统保留
} PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;

typedef struct tagSIZE
{
    LONG        cx;
    LONG        cy;
} SIZE, *PSIZE, *LPSIZE;

typedef struct tagPOINT
{
    LONG  x;
    LONG  y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
属性对照说明
图形对象及其属性
图形对象相关属性
位图字节数、像素、颜色、缩放模式
字体字体名称、宽度、高度、磅数、所属字符集
画刷样式、颜色、起始点
画笔样式、宽度、颜色
调色板颜色、尺寸
区域位置、尺寸
设备描述表属性及相关函数
属性默认值相关函数
背景色WHITEGetBkColor(), SetBkColor()
背景模式OPAQUEGetBkMode(), SetBkMode()
位图NONECreateBitMap(), CreateBitMapIndirect(), CreateCompatibleBitmap(), SelectObject()
画刷WHITE_BRUSHCreateBrushIndirect(), CreateDIBPatternBrush(), CreateHatchBrush(), CreatePatternBrush(), CreateSolidBrush(), SelectObject()
画刷起始位置(0, 0)GetBrushOrg(), SetBrushOrg(), UnrealizeObject()
剪截域DISPLAY SURFACEExcludeClipRect(), IntersectClipRect(), OffsetClipRgn(), SelectClipPath(), SelectObject(), SelectClipRgn()
颜色调色板DEFAULT_PALETTECreatePalette(), RealizePalette(), SelectPalette()
绘图方式R2_COPYPENGetROP2(), SetROP2()
字体SYSTEM_FONTCreateFont(), CreateFontIndirect(), SelectObject()
字符间距0GetTextCharacterExtra(), SetTextCharacterExtra()
映射方式MM_TEXTGetMapMode(), SetMapMode()
画笔BLACKCreatePen(), CreatePenIndirect(), SelectObject()
多边形填充方式ALTERNATEGetPolyFillMode(), SetPolyFillMode()
缩放模式BLACKONWHITESetStretchBltMode(), GetStretchBltMode()
文本颜色BLACKGetTextColor(), SetTextColor()
视图范围(1, 1)GetViewportExtEx(), SetViewportExtEx(), ScaleViewportExtEx()
视图远点(0, 0)GetViewportOrgEx(), SetViewportOrgEx()
窗口范围(1, 1)GetWindowExtEx(), SetWindowExtEx(), ScaleWindowExtEx()
窗口原点(0, 0)GetWindowOrgEx(), OffsetWindowOrgEx(), SetWindowOrgEx()
Windows 映射模式
映射模式将一个逻辑单位映射为坐标系设定
MM_ANISOTROCPIC由 SetWindowExtEx() 或 SetViewportExtEx() 函数确定可选
MM_ISOTROPIC由 SetWindowExtEx() 或 SetViewportExtEx() 函数确定可选,但 X 轴和 Y 轴的单位比例为 1:1
MM_HIENGLISH0.001 英寸Y 向上,X 向右
MM_HIMETRIC0.01 毫米Y 向上,X 向右
MM_LOENGLISH0.01 英寸Y 向上,X 向右
MM_LOMETRIC0.1 毫米Y 向上,X 向右
MM_TEXT一个像素(默认)Y 向上,X 向右
MM_TWIPS1/1440 英寸Y 向上,X 向右
画笔样式
样式说明
PS_DASH虚线
PS_DASHDOT点划线
PS_DASHDOTDOT双点划线
PS_DOT点线
PS_INSIDEFRAME边框线
PS_NULL
PS_SOLID实线
画刷样式
样式说明
BLACK_BRUSH黑色画刷
DKGRAY_BRUSH深灰色画刷
GRAY_BRUSH灰色画刷
LTGRAY_BRUSH浅灰色画刷
WHITE_BRUSH白色画刷
HOLLOW_BRUSH虚画刷
NULL_BRUSH空画刷
DC_BRUSH纯色画刷,可以通过函数 SetDCBrushColor 设定
画刷的阴影模式
样式说明
HS_BDIAGONAL45 度从左上角到右下角的阴影线
HS_FDIAGONAL45 度从左下角到右上角的阴影线
HS_DIAGCROSS45 度叉线
HS_CROSS垂直相交的阴影线
HS_HORIZONTAL水平阴影线
HS_VERTICAL垂直阴影线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值