目录:

  • 创建滚动条
  • 滚动条函数(新老版本)
  • 取得设备内容句柄hdc
  • 设置 hdc 中的属性
  • 画点画线
  • 画填充图形
  • 使用自定义的 画笔 和 画刷
  • 矩形、区域和剪裁
  • 关于GDI映像模式
  • 其他常用的方便计算的函数

创建滚动条:在CreateWindow函数中window style 参数设置WS_VSCROLL | WS_HSCROLL

产生的消息:WM_VSCROLL / WM_HSCROLL

滚动条函数(老的API——滑块大小固定)

SetScrollRange (hwnd, iBar, iMin, iMax, bRedraw) ;

SetScrollPos (hwnd, iBar, iPos, bRedraw) ;

GetScrollRange 和 GetScrollPos

新的函数win32滚动条函数

SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;

GetScrollInfo (hwnd, SB_HORZ, &si) ;

第三个参数是一种结构体:

typedef struct tagSCROLLINFO {

UINT cbSize ;// set to sizeof (SCROLLINFO)

UINT fMask ; // values to set or get

int nMin ; // minimum range value

int nMax ; // maximum range value

UINT nPage ; // page size

int nPos ; // current position

int nTrackPos ;// current tracking position

} SCROLLINFO, * PSCROLLINFO ;

【注意】 使用是是si时必须先初始化 si.cbSize = sizeof (si) ;

然后 fMask 必须制定操作类型:SIF_RANGE | SIF_PAGE|SIF_POS|SIF_TRACKPOS|SIF_DISABLENOSCROLL|

    SIF_ALL ( =SIF_RANGE|SIF_POS|SIF_PAGE|SIF_TRACKPOS)

滚动窗口时重画策略有二:

一、在滚动消息MS_VERT或MS_HORZ里调用InvalidateRect 函数,使其产生WM_PAINT 消息,并在重画消息中重画所有

二、在每次处理MS_VERT时,当LOWORD(wParam)里的通知 SB_THUMBTRACK等改变 position值,并在最后SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;后,不调用InvalidateRect 函数,而是调用非GDI函数 ScrollWindow(HWND hWnd,int XAmount,int YAmount,CONST RECT *IpRect, CONST RECT *lpClipRect); ; 来挪动windows内容.最后两个参数设定为NULL,这指出了要卷动整个显示区域. (两个RECT,第一个为Client Area ,第二个为Clipping Rectangle),该函数会将新卷出的内容所在矩形设置为无效矩形,一边在其之后自身发出PAINT消息时减少重画的部分。

(第二种比较用户友好,不会有太明显的闪刷)

 取得设备内容句柄:

1、在MS_PAINT中,

hdc = BeginPaint (hwnd, &ps) ;

   //其它行程序

EndPaint (hwnd, &ps) ;

2、在其他非 MS_PAINT中,

hdc = GetDC (hwnd) ;

  //其它行程序

ReleaseDC (hwnd, hdc) ;

3、或使用下面函数取得包括标题菜单在内的区域进行操作,使用时相应的处理消息 WM_NCPAINT

hdc = GetWindowDC (hwnd) ;

  //其它行程序

ReleaseDC (hwnd, hdc) ;

设置 设备内容句柄hdc 中的属性

设备内容属性

默认值

修改该值的函数

取得该值的函数

Mapping Mode

MM_TEXT

SetMapMode

GetMapMode

Window Origin

(0, 0)

SetWindowOrgEx

OffsetWindowOrgEx

GetWindowOrgEx

Viewport Origin

(0, 0)

SetViewportOrgEx

OffsetViewportOrgEx

GetViewportOrgEx

Window Extents

(1, 1)

SetWindowExtEx

SetMapMode

ScaleWindowExtEx

GetWindowExtEx

Viewport Extents

(1, 1)

SetViewportExtEx

SetMapMode

ScaleViewportExtEx

GetViewportExtEx

Pen

BLACK_PEN

SelectObject

SelectObject

Brush

WHITE_BRUSH

SelectObject

SelectObject

Font

SYSTEM_FONT

SelectObject

SelectObject

Bitmap

None

SelectObject

SelectObject

Current Position

(0, 0)

MoveToEx

LineTo

PolylineTo

PolyBezierTo

GetCurrentPositionEx

Background Mode

OPAQUE

SetBkMode

GetBkMode

Background Color

White

SetBkColor

GetBkColor

Text Color

Black

SetTextColor

GetTextColor

Drawing Mode

R2_COPYPEN

SetROP2

GetROP2

Stretching Mode

BLACKONWHITE

SetStretchBltMode

GetStretchBltMode

Polygon Fill Mode

ALTERNATE

SetPolyFillMode

GetPolyFillMode

Intercharacter Spacing

0

SetTextCharacterExtra

GetTextCharacterExtra

Brush Origin

(0, 0)

SetBrushOrgEx

GetBrushOrgEx

Clipping Region

None

SelectObject

SelectClipRgn

IntersectClipRgn

OffsetClipRgn

ExcludeClipRect

SelectClipPath

GetClipBox

画点画线

画点的相关函数有如下,不过比较少用

SetPixel (hdc, x, y, crColor) ;
crColor = GetPixel (hdc, x, y) ;

画线函数:

//画直线
MoveToEx (hdc, xBeg, yBeg, NULL) ; //不画点,指定[当前位置];最后一个参数POINT设置时取回上一次的[当前位置]
LineTo (hdc, xEnd, yEnd) ; //获取当前位置的另一种方法
GetCurrentPositionEx (hdc, &pt) ; //画连续的线段可用Polyline函数,Polyline函数是在设备驱动程序层次上实作的,速度相对快些
Polyline (hdc, apt, ) ; // apt 是点结构体数组,5 是点的个数 //画连续线有另一个版本,以下两行相当于上面的Polyline
MoveToEx (hdc, apt[].x, apt[].y, NULL) ;
PolylineTo (hdc, apt + , ) ; //画弧线可用下面函数,其用法参考接下来的【画填充图形】
Arc(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ; //画 贝塞尔曲线:两种
PolyBezier (hdc, apt, iCount) ;
PolyBezierTo (hdc, apt, iCount) ;

画填充图形

//画填充 矩形
Rectangle (hdc, xLeft, yTop, xRight, yBottom) ; //画填充 圆角矩形
RoundRect (hdc, xLeft, yTop, xRight, yBottom,
xCornerEllipse, yCornerEllipse) ; // 圆角所在圆的尺寸,一般x=y //画填充 椭圆
Ellipse (hdc, xLeft, yTop, xRight, yBottom) ; //画填充 饼和弓
Pie(hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;
Chord (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ; //画填充 多边形
Polygon (hdc, apt, iCount) ; //apt为点的数组,iCount 为点的个数
PolyPolygon (hdc, apt, aiCounts, iPolyCount) ;// aiCounts 为数组,每个值表示多边形的顶点数, iPolyCount 为多边形的个数,apt包括所有构成的点 //于填入内部的方式,则取决于多边形填入方式,您可以用SetPolyFillMode函数来设定:
SetPolyFillMode (hdc, iMode) ; // iMode : ALTERNATE 或 WINDING (区别略)

其中,Arc Pie Chord 三个函数xStart, yStart, xEnd, yEnd 是假想的点,用于与原点连接形成假想的线:

使用自定义的 画笔 和 画刷

画笔的定义以及使用

/** 使用现有的画笔*******************************/
HPEN hPen ;
hPen = GetStockObject (WHITE_PEN) ; //系统还定义了另外两种 WHITE_PEN和NULL_PEN
SelectObject (hdc, hPen) ; //现在必须将画笔选进设备内容 //也可以不定义,直接用
SelectObject (hdc, GetStockObject (WHITE_PEN)) ; //使用时传回的事 上一个画笔的句柄,可用于删除(避免生成太多对象)
hPen = SelectObject (hdc, GetStockobject (WHITE_PEN)) ;
//使用或删除
SelectObject (hdc, hPen) ;
DeleteObject(hdc, hPen) ; /** 创建画笔*************************************/
hPen = CreatePen (iPenStyle, iWidth, crColor) ; //或
LOGPEN logpen ;
hPen = CreatePenIndirect (&logpen) ;
iPenStyle:

参数crColor以及其他这里出现的 颜色参数,都是用COLORREF值(只是一个32位的无正负号长整数)来表示一种色彩。COLORREF结构如下:

颜色的定义和使用如下:

#define RGB(r,g,b) ((COLORREF)(((BYTE)(r) | \
((WORD)((BYTE)(g)) << )) | \
(((DWORD)(BYTE)(b)) << )))
//故可以直接使用以下来设置参数
RGB(,,);

逻辑画笔 LOGPEN 和 逻辑画刷 LOGBRUSH 定义

//  <WINGDI.h> 中定义的 LOGPEN
typedef struct tagLOGPEN
{
UINT lopnStyle; //同为上面 iPenStyle 的7种,其中PS_INSIDEFRAME 和 PS_SOLID 都是画实线,区别是前者不管线多粗都在逻辑矩形内
POINT lopnWidth; //当Width>1 时,不连续线的画笔样式将不起作用
COLORREF lopnColor;
} LOGPEN, *PLOGPEN, NEAR *NPLOGPEN, FAR *LPLOGPEN; //<WINGDI.h> 中定义的 LOGBRUSH
typedef struct tagLOGBRUSH
{
UINT lbStyle;
COLORREF lbColor;
LONG lbHatch;
} LOGBRUSH, *PLOGBRUSH, NEAR *NPLOGBRUSH, FAR *LPLOGBRUSH;

LOGBRUSH 中 lbStyle 以及对另外两个参数的影响

lbStyle (UINT)

lbColor (COLORREF)

lbHatch (LONG)

BS_SOLID

画刷的色彩

忽略

BS_HOLLOW

忽略

忽略

BS_HATCHED

影线的色彩

影线画刷风格

BS_PATTERN

忽略

位图的句柄

BS_DIBPATTERNPT

忽略

指向DIB的指标

要了解其中成员 lbHatch,还得介绍一下创建画刷的方式和 具体参数:

//使用以上LOGBRUSH 的函数是
hBrush = CreateBrushIndirect (&logbrush) ; //它可以看做是以下几个函数的集合函数
hBrush = CreateSolidBrush (crColor) ;
hBrush = CreateHatchBrush (iHatchStyle, crColor) ; //影线填充,具体如下 //使用画刷同样需要选进设备内容,如同画笔选进的方式
SelectObject (hdc, hBrush) ;
DeleteObject (hBrush) ;

iHatchStyle 如图:

[注意] 在画虚线和画影线模式的画刷时,空隙会默认使用 CreateWindow 时指定的 画刷,一般为白色画刷,要改变空隙的填充方式,可用

//指定空隙颜色
SetBkColor (hdc, crColor) ; //可用GetBkColor 取当前颜色 //指定填充模式
SetBkMode (hdc, bkMode) ; //GetBkMode来取得目前背景模式 //bkMode:
OPAQUE //内定模式,Windows使用背景色来填入空隙,内定的背景色为白色
TRANSPARENT //Windows将忽略背景色,并且不填入空隙

设备内容中定义的绘图方式也影响显示器上所画线的外观。绘图色彩由画笔色彩和画线区域原来的色彩共同决定。

设置不同的绘图方式:

SetROP2 (hdc, iDrawMode) ;
iDrawMode = GetROP2 (hdc) ;
//具体的 iDrawMode值如下表

矩形、区域和剪裁

矩形函数:

//三种矩形绘制函数
FillRect (hdc, &rect, hBrush) ;
FrameRect (hdc, &rect, hBrush) ;
//FrameRect允许使用者画一个不一定为纯色的矩形框。该边界框为一个逻辑单位元宽。如果逻辑单位大于设备单位,则边界框将会为2个图素宽或者更宽。
InvertRect (hdc, &rect) ;
//取反色绘制
//快速设置RECT的函数
SetRect (&rect, xLeft, yTop, xRight, yBottom) ; //可用的改变矩形属性的函数
OffsetRect (&rect, x, y) ;              //将矩形沿x轴和y轴移动几个单元:
InflateRect (&rect, x, y) ;             //增减矩形的尺寸:
SetRectEmpty (&rect) ;                //矩形各字段设定为0:
CopyRect (&DestRect, &SrcRect) ;          //将矩形复制给另一个矩形:(相当于 DestRect = SrcRect)
IntersectRect (&DestRect, &SrcRect1, &SrcRect2) ;//取得两个矩形的交集:
UnionRect (&DestRect, &SrcRect1, &SrcRect2) ;   //取得两个矩形的联集:
bEmpty = IsRectEmpty (&rect) ;           //确定矩形是否为空:
bInRect = PtInRect (&rect, point) ;        //确定点是否在矩形内:

建立和绘制裁剪区域:

HRGN hRgn;

//创建矩形裁剪区域
hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom) ;
//或
hRgn = CreateRectRgnIndirect (&rect) ; //创建椭圆裁剪区域
hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom) ;
//或
hRgn = CreateEllipticRgnIndirect (&rect) ; //穿件圆角矩形同理
CreateRoundRectRgn //类似 Plygon函数
hRgn = CreatePolygonRgn (&point, iCount, iPolyFillMode) ;
//point参数是一个POINT型态的结构数组,iCount是点的数目,iPolyFillMode是ALTERNATE或者WINDING /********** 组合裁剪区域函数 ****************/
iRgnType = CombineRgn (hDestRgn, hSrcRgn1, hSrcRgn2, iCombine) ; //这一函数将两个剪裁区域(hSrcRgn1和hSrcRgn2)组合起来并用句柄hDestRgn指向组合成的剪裁区域。这三个剪裁区域句柄都必须是有效的,
//但是hDestRgn原来所指向的剪裁区域被破坏掉了(当您使用这个函数时,您可能要让hDestRgn在初始时指向一个小的矩形剪裁区域)。

CombineRgn 的最后一个参数  iCombine  如下:

iCombine值                     新剪裁区域
___________________________________________
RGN_AND 两个剪裁区域的公共部分
RGN_OR 两个剪裁区域的全部
RGN_XOR 两个剪裁区域的全部除去公共部分
RGN_DIFF hSrcRgn1不在hSrcRgn2中的部分
RGN_COPY hSrcRgn1的全部(忽略hSrcRgn2)

CombineRgn 的返回值  iRgnType 包括如下情况:

NULLREGION,           表示得到一个空剪裁区域;
SIMPLEREGION, 表示得到一个简单的矩形、椭圆或者多边形;
COMPLEXREGION, 表示多个矩形、椭圆或多边形的组合;
ERROR, 表示出错了。

那么如何在程序使用区域,并起到什么效果呢?

区域和画笔画刷一样,是可以选进设备内容的对象,使用的方式与 其类似:

//选进设备内容
SelectObject (hdc, hRgn) ;
//或
SelectClipRgn (hdc, hRgn) ;
//类似的,删除
DeleteObject (hRgn) ; //另外,设定具体画刷属性,类似于矩形的函数,区域也有如下函数
FillRgn (hdc, hRgn, hBrush) ;
FrameRgn (hdc, hRgn, hBrush, xFrame, yFrame) ; //xFrame和yFrame参数是画在区域周围的边框的宽度和高度
InvertRgn (hdc, hRgn) ; PaintRgn (hdc, hRgn) ; // 用设备内容中目前画刷填入所指定的区域

当接收到 WM_PAINT 无效区域除了是矩形,还可以是区域,相关函数:

//类似矩形的InvalidateRect (hwnd, NULL, TRUE) ;
InvalidateRgn (hwnd, hRgn, bErase) ;
ValidateRgn (hwnd, hRgn) ;

关于GDI映像模式

设置映像模式:

SetMapMode (hdc, iMapMode) ;
iMapMode = GetMapMode (hdc) ;

iMapMode 如下表:

两个相关函数:

SetViewportOrgEx (hdc, cxClient / , cyClient / , NULL) ;
SetWindowOrgEx (hdc, -cxClient / , -cyClient / , NULL) ; //此两句效果如下:

   ==》


其他常用的方便计算的函数

//获得显示区域的矩形
GetClientRect (hwnd, &rect) ;

windows 编程—— 使用函数笔记的更多相关文章

  1. windows 编程—— 常用函数 与 操作

    目录: MessageBox() 和 PlaySound() 获得窗口 或屏幕大小 获得字体大小 输出文字 屏蔽和显示控制台窗口 1. MessageBox() 和 PlaySound() Messa ...

  2. windows 编程 之 问题解决笔记

    问题目录: 1.如何隐藏和显示窗口 2.InvalidateRect在连续使用鼠标或光标时暂时不起作用 3.在VC项目里自己添加头文件和cpp文件在编译阶段报错 4.在static 控件里添加子控件或 ...

  3. Windows编程MessageBox函数

    API: int MessageBox(HWND hWnd, LPCTSTRlpText, LPCTSTRlpCaption, UINTuType); MSDN描述: This function cr ...

  4. 《Windows核心编程》读书笔记 上

    [C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...

  5. Direct3D 10学习笔记(四)——Windows编程

    本篇将简单整理基本的Windows应用程序的实现,并作为创建Direct3D 10应用程序的铺垫.具体内容参照< Introduction to 3D Game Programming with ...

  6. 2.C++标准库函数:getline函数 定界流输入截取函数 -windows编程

    引言:今天工作遇到了一个需要按行读取txt文件数据的需求,查询了一下getline()函数,发现这竟然是一个C++的标准库函数,而且设计的很好,特地做一下记录.getline本质是一个定界流输入截取函 ...

  7. windows 编程—— 宽字符集 与 Unicode

    目录: 从ASCII码 到 Unicode Windows 编程中的 "字符” 定义 (如何在windows下进行通用编码) 常用的通用函数,定义 (本文为学习<Programming ...

  8. python核心编程第二版笔记

    python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d   提供调试输出1.2 –O   生成优化的字节码(生成 ...

  9. MoreWindows 微软认证专家博客目录(白话算法,C++ STL,windows编程)

    为了方便大家查找和学习,现将本人博客中所有博客文章列出目录. (http://blog.csdn.net/morewindows) 一.      白话经典算法 目前有17篇,分为七大排序和经典面试题 ...

随机推荐

  1. (转)JavaWeb学习总结(十三)——使用Session防止表单重复提交

    如何防止表单重复提交 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复 ...

  2. XML参数转换为Object,并转换为List或DataTable

    demo效果:

  3. (转)ThinkPHP使用心得分享-分页类Page的用法

    转之--http://www.jb51.net/article/50138.htm ThinkPHP中的Page类在ThinkPHP/Extend/Library/ORG/Util/Page.clas ...

  4. Linux特殊权限

    ************************     ACL权限       ****************************************** acl权限的出现是为了弥补用户权 ...

  5. sql - 复制表

    1,复制表结构和内容 1)这个表: select * into new_table_name from old_table_name ref:SQL复制数据表及表结构

  6. cas sso原理(转)

    采用CAS原理构建单点登录 企业的信息化过程是一个循序渐进的过程,在企业各个业务网站逐步建设的过程中,根据各种业务信息水平的需要构建了相应的应用系统,由于这些应用系统一般是 在不同的时期开发完成的,各 ...

  7. python challenge 16

    前情回顾:上一篇 第16关地址 打开16关,又是一张奇奇怪怪很多点点的图片,应该又是与PIL库有关的. 页面的标题是:let me get this straight.这是英语中的一句俚语,意思是让我 ...

  8. javascript-Cookie的应用

    在我平时开发网页的过程中,可能涉及到浏览器本地的存储,现在主流的浏览器存储方式有:cookie,直接读取xml,userData,H5 的LocalStorage等,Cookie存储数据有限,但对于数 ...

  9. oracle行转列和列转行

    目录[-] 一.行转列 1.1.初始测试数据 1.2. 如果需要实现如下的查询效果图: 1.3.延伸 二.列转行 1.1.初始测试数据 1.2. 如果需要实现如下的查询效果图: 一.行转列 1.1.初 ...

  10. 面向对象设计模式之Facade外观模式(结构型)

    动机:有些系统组件的客户和组件中各种复杂的子系统有了过多的的耦合,随着外部客户程序  和个子系统的演化,这种过多的耦合面临很多变化的挑战:如何简化外部客户程序和系统的交互接口?  如何将外部客户程序的 ...