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

简介:     我们在对 windows 设备进行绘图操作的时候要用到  GDI  函数    并且要获取 设备的 DC 也就是设备的代号      如果是响应WM_PAINT 消息 那么 我们利用      BeginPaint       .

    我们在对 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) ;

 

 

 

目录
相关文章
|
9月前
|
缓存 网络协议 数据安全/隐私保护
[运维笔记] - (命令).Windows server常用网络相关命令总结
[运维笔记] - (命令).Windows server常用网络相关命令总结
489 0
|
4月前
|
监控 Ubuntu Linux
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
这篇文章介绍了如何在Ubuntu和Windows系统中通过设置相同的时区并使用ntp服务来解决时间同步问题。
120 4
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
|
7月前
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
181 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
7月前
|
存储 安全 数据安全/隐私保护
Windows 32 汇编笔记(一):基础知识
Windows 32 汇编笔记(一):基础知识
|
6月前
|
存储 编译器 Linux
Windows 32 汇编笔记(二):使用 MASM
Windows 32 汇编笔记(二):使用 MASM
|
9月前
|
算法 Linux Windows
FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass
在Windows环境下为FFmpeg集成字幕渲染库libass涉及多个步骤,包括安装freetype、libxml2、gperf、fontconfig、fribidi、harfbuzz和libass。每个库的安装都需要下载源码、配置、编译和安装,并更新PKG_CONFIG_PATH环境变量。最后,重新配置并编译FFmpeg以启用libass及相关依赖。完成上述步骤后,通过`ffmpeg -version`确认libass已成功集成。
224 1
FFmpeg开发笔记(十七)Windows环境给FFmpeg集成字幕库libass
|
8月前
|
编解码 Windows
FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid
XviD是开源MPEG-4视频编码器,与DivX相似但后者非开源。早期MP4常使用XviD或DivX编码,现已被H.264取代。在Windows上集成FFmpeg的XviD编解码库libxvid,需访问<https://labs.xvid.com/source/>下载源码,解压后在MSYS环境中配置、编译和安装。之后重新配置FFmpeg,启用libxvid并编译安装。详细步骤包括configure命令、make和make install。成功后,通过`ffmpeg -version`检查是否启用libxvid。更多音视频开发技术可参考《FFmpeg开发实战:从零基础到短视频上线》。
162 0
FFmpeg开发笔记(二十九)Windows环境给FFmpeg集成libxvid
|
9月前
|
编解码 Linux Windows
FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
在Windows环境下,为FFmpeg集成音频编解码库,包括libogg、libvorbis和opencore-amr,涉及下载源码、配置、编译和安装步骤。首先,安装libogg,通过配置、make和make install命令完成,并更新PKG_CONFIG_PATH。接着,安装libvorbis,同样配置、编译和安装,并修改pkgconfig文件。之后,安装opencore-amr。最后,重新配置并编译FFmpeg,启用ogg和amr支持,通过ffmpeg -version检查是否成功。整个过程需确保环境变量设置正确,并根据路径添加相应库。
202 1
FFmpeg开发笔记(十一)Windows环境给FFmpeg集成vorbis和amr
|
9月前
|
编解码 5G Linux
FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器
AVS3是中国首个8K及5G视频编码标准,相比AVS2和HEVC性能提升约30%。解码器libuavs3d支持8K/60P视频实时解码,兼容多种平台。《FFmpeg开发实战》书中介绍了在Windows环境下如何集成libuavs3d到FFmpeg。集成步骤包括下载源码、使用Visual Studio 2022编译、调整配置、安装库文件和头文件,以及重新配置和编译FFmpeg以启用libuavs3d。
144 0
FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器
|
9月前
|
Linux 编译器 C语言
FFmpeg开发笔记(二)搭建Windows系统的开发环境
在Windows上学习FFmpeg通常较困难,但通过安装预编译的FFmpeg开发包可以简化流程。首先需要安装MSYS2来模拟Linux环境。下载并执行MSYS2安装包,然后修改msys2_shell.cmd以继承Windows的Path变量。使用pacman安装必要的编译工具。接着,下载预编译的FFmpeg Windows包,解压并配置系统Path。最后,在MSYS2环境中运行`ffmpeg -version`确认安装成功。欲深入学习FFmpeg开发,推荐阅读《FFmpeg开发实战:从零基础到短视频上线》。
153 4
FFmpeg开发笔记(二)搭建Windows系统的开发环境