`
txf2004
  • 浏览: 6866548 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics