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) ;

 

 

 

转载于:https://www.cnblogs.com/mosatsu/archive/2011/10/20/2466865.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值