windows程序设计 第五章笔记 GDI(1)

我们在对 windows 设备进行绘图操作的时候要用到 GDI 函数 并且要获取 设备的 DC 也就是设备的代号

如果是响应WM_PAINT 消息 那么 我们利用

BeginPaint

.......code

EndPaint

获取设备上下文代号

如果处理的不是 WM_PAINT 消息 那么 就利用

GetDC

.....code

ReleaseDC //释放DC

如果我们要获取整个视窗的DC那么用 GetWindowDC

如果要获取 Client Area的DC那么用GetClientDC 来获取 但是最后都要掉哟过ReleaseDC来释放设备上下文

在MSDN我们可以看到 我们在 GetDC后 一定要调用 ReleaseDC 而一定不能调用 DeleteDC

DeleteDC是 在 CreateDC后调用的 。。。。。

hdcMem = CreateCompatibleDC (hdc) ; //兼容DC

其他行程式

DeleteDC (hdcMem) ;

hdcMeta = CreateMetaFile (pszFilename) ;

其他行程式

hmf = CloseMetaFile (hdcMeta)

int GetDeviceCaps( HDC hdc, // handle to DC int nIndex // index of capability); 获得设备的信息

SetPixel 绘制一个点

GetPixel 可以返回指定设备指定坐标上的点的颜色

BOOL Polyline( //这个函数的功能是可以将多个点连续的画起来

HDC hdc, // handle to device context

CONST POINT *lppt, // array of endpoints //POINT 结构体数组

int cPoints // number of points in array); //POINT 结构体数组的个数

Rectangle、矩形

Ellipse、 绘制椭圆

RoundRect 绘制一个边角圆滑的椭圆

BOOL RoundRect(

HDC hdc, // handle to DC

int nLeftRect, // x-coord of upper-left corner of rectangle

int nTopRect, // y-coord of upper-left corner of rectangle

int nRightRect, // x-coord of lower-right corner of rectangle

int nBottomRect, // y-coord of lower-right corner of rectangle

int nWidth, // width of ellipse //值越大 边角就越明显

int nHeight // height of ellipse); //值越大 边角就越明显

Chord 绘制一个弦

Pie 饼图函数绘 制一个扇形楔,由一个椭圆形和两个子午线轮胎的交集范围内。通过使用当前画笔的馅饼概述,并通过使用当前画笔填充。

Arc 绘制一个椭圆弧

PolyBezier 贝塞尔曲线

PolyBezierTo 也是画贝塞尔曲线

在绘制线的时候对画笔的 设置

HPEN pen ;

pen=GetStockObject (WHITE_PEN) ;

SelectObject(hdc,pen) ;// 这样就 为我们的设备上下文设置了白色的画笔 选择的时候必须用 GetStockObject获取画笔

受限与 windows的几种画笔 我们可以通过函数创建自己的画笔

CreatePen 或者 CreatePenIndirect 使用完了之后 我们需要DelectObject删除 逻辑画笔 这是一种GDI物件

其他的物件有 其他五种是画刷、点阵图、区域、字体和调色盘。除了调色盘之外,这些物件都是通过SelectObject选进装置内容的。

hPen =CreatePen(PS_DASH,1,RGB(122,233,55));
SelectObject (hdc,hPen) ; //这个例子创建了一个浅绿色的画笔

DeleteObject(hPen) ; //删除创建的GDI物件 也就是逻辑画笔

ClentToScreen 是客户坐标到屏幕的转换

ScreenToClient是屏幕到客户的转换

GetWindowRect是相对于 屏幕的左上角的(0,0)

创建逻辑画笔的第二种方法

LOGPEN logpen ;

hPen = CreatePenIndirect (&logpen) ;

DeleteObject(logpen); //可以在响应WM_DESTROY的时候 删除画笔

int GetObject(
  HGDIOBJ hgdiobj,  // handle to graphics object
  int cbBuffer,     // size of buffer for object information
  LPVOID lpvObject  // buffer for object information
);

这个函数的用法是 如果 我们有位图或者 画笔 或者。。的句柄那么我们能获得对应的 GDI对象的信息

如果需要目前选进装置内容的画笔代号,可以呼叫: 也就是我们要获取当前设备的画笔句柄 也可以获取其他句柄 具体看MSDN函数的介绍

hPen = GetCurrentObject (hdc, OBJ_PEN) ;

在画虚线的时候我们也可以 用 SetBkColor填充 虚线的空白地方

SetBkMode(TRANSPARENT) ;会设置 背景模式为透明的 。。 GetBkMode 可以获取现在的背景模式 也就是返回 SetBkMode设置的背景参数

GetObject喝 GetCurrentObject的区别 GetObject是通过句柄获取 设备的属性 GetCurrentObject是获取当前设备的句柄 通过参数 。。

函式图形
Rectangle直角矩形
Ellipse椭圆
RoundRect圆角矩形
Chord椭圆周上的弧,两端以弦连接
Pie椭圆上的圆形图
Polygon多边形 MSDN
PolyPolygon多个多边形 N个
SetPolyFillMode (hdc, iMode) ;  设置多边形填充模式   
如果我们要对背景进行填充那么就要创建画刷了   画刷 句柄HBRUSH 可以用到  CreateSolidBrush (crColor) ;   函数 和 
 CreateHatchBrush (iHatchStyle, crColor) ;       带斜线的画刷  
hBrush = CreateBrushIndirect (&logbrush) ;  间接的创建画刷  
如果要取得画刷的 信息一样可以调用 GetObject来实现 

我们还可以选择坐标的映射方式

SetMapMode (hdc, iMapMode ) //那么 我们可以设置 x y坐标的初始起点

同样 有Set就对应有GetMapMode

还有一些常用的函数

GetTextExtend 获取一段文本的信息

GetTextMetrics 获取系统文本度量

GetSystemMetrics 获取系统的度量

GetDeviceCaps 获取设备信息

GetCursorPos 获取鼠标位置

SetCursor set鼠标位置

MoveWindow 移动窗体

GetWindowRect 获取窗体的举行 相当于 Desktop

GetClientRect 获取客户区域的举行相对于window

ScreenToClient ClientToScreen 客户 屏幕坐标的转换

DptoLP

  函数功能:该函数将设备坐标转变为逻辑坐标,转变依赖于设备的图形模式,窗口和坐标的起点及范围的设置,和转换的内容。

SetRect设置 举行的值

PeekMessage和GetMessage有类似的功能但是不同的是 PeekMessage可以对消息进行处理 例如从消息队列中国删除消息

建立剪裁区域 HRGN 也是GDI物件 之一也可以调用DeleteObject删除

创建剪裁区域的2中方法

hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom) ;

或者

hRgn = CreateRectRgnIndirect (&rect) ;

您也可以建立椭圆剪裁区域:

hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom) ;

或者

hRgn = CreateEllipticRgnIndirect (&rect) ;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值