目录:

  • 创建滚动条
  • 滚动条函数(新老版本)
  • 取得设备内容句柄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. MySQL存储过程的基本函数(三)

    (1).字符串类 首先定义一个字符串变量:set @str="lxl"; CHARSET(str) //返回字串字符集 select charset(@str);+-------- ...

  2. WMI概述

    关于wmi的定义可以在网上和msdn中查询,我在这里想说说自己对wmi的理解.Wmi是Windows Management Instrumentation(windows管理方法)的缩写.在wmi中微 ...

  3. LINUX 内核代码 errno 错误代码提示 /include/asm/errno.h

    首先在自己的程序中#include<errno.h> 添加打印errno的语句 printf("errno is: %d\n",errno); 根据errno的值查错. ...

  4. DownloadProvider调试

    由于身边的同事离职,最近又接手了一个模块,DownloadProvider, 也就是安卓中自带的下载管理.此模块的代码量比较少,但是最近阅读代码却发现还是由不少知识点的.之前同事在此模块做了一个关于D ...

  5. 【转载】逃离adapter的地狱-针对多个View type的组合实现方案

    英文原文:JOE'S GREAT ADAPTER HELL ESCAPE 转载地址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015 ...

  6. hello,boke

    我一名学习软件工程金融服务工程的学生,简单来说就是学习计算机类的,对于自己的介绍,从平时生活中来说吧,我一直处于一种很中规中矩的生活状态里,平时玩玩手机.追追剧.和室友一起去图书馆自习,考前拼命复习两 ...

  7. JavaScript--数组--关联(hash)数组

    关联(hash)数组的原理: hash算法: 接收一个字符串,计算出一个尽量不重复的序号 不同的字符串,计算出的序号尽量不同 相同的字符串,计算出的序号一定是相同 存入数据时: 将自定义下标名称交给h ...

  8. NetBeans无法使用编码GBK安全地打开该文件 解决方法

    正常安装的NetBeans在打开UTF-8编码的文件时,会提示“NetBeans无法使用编码GBK安全地打开该文件”,点击“是”强制打开后,中文会变成乱码. 上述问题可以通过如下方式解决: 用文本编辑 ...

  9. JavaScript奇技淫巧44招

    JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...

  10. C# Word

    C# 操作word文档 1.c#操作word 在指定书签插入文字或者图片  1using Word = Microsoft.Office.Interop.Word; 2 3object Nothing ...