Win32知识之窗口绘制.窗口第一讲
Win32知识之窗口本质
一丶摘要
在学习Win32的时候. 很多操作都是窗口进行操作的.那么今天就说一下窗口的本质是什么.
窗口的本质是不断绘制.是windows通过消息机制进行绘制的.
我们知道.内存分为高低2G 低2G是给应用程序使用的. 高2G是给操作系统使用的.而我们画图形的操作都是操作系统通过底层的 win32k.sys这个驱动来提供的.
进程跟线程管理是通过notokerner.exe这个程序来管理的.但是三环不能使用.所以提供接口给三环. 分别是kerner32.dll 跟user32.dll gdi.dll
那么他们之间的区别是什么.
1.kerner32.dll 管理进程线程跟内存的一个dll
2.user32.dll 窗口管理.图形界面管理.
3.gdi.dll 自己绘制的的管理.
而我们要认识一下窗口的创建.那么需要了解几个基础的只是.
1.设备对象.
2.DC设备上下文.
3.图形对象.
1.设备对象是什么.
简而言之设备对象的意思就是你要画图形要往哪里画. 每一个窗口都有一个窗口句柄.而且是存放在全局窗口句柄表中的. 我们可以获取一下.使用Spy++获取.
2.DC设备上下文.
DC设备上下文其实就是这个窗口有一块内存是绘制用的. 我们想要往这个窗口绘制.需要先绘制到这个内存中才可以.这块内存就称为DC上下文.
3.图形对象.
图形对象就是指画笔 画刷 位图. 等等这些对象.因为我们要往内存中画的时候.可以画默认的.但是一般我们想改变一下形式.所以创建图形对象跟DC相关联.那么我们绘制就可以使用图形对象了.
二丶绘制窗口步骤
绘制窗口免不了使用API.但是使用之前.需要知道我们要操作的步骤.
1.获取窗口句柄.也就是设备对象.
2.获取窗口中的DC上下文.可以理解为获取指定窗口的绘图的那块内存.
3.创建图形对象. 要想绘制.那么首先就需要你自定义的一个绘制的东西才可以.
4.关联图形对象跟DC. 只要关联了.那么绘制的时候自动就使用你的图形对象了.
5.进行你的绘图操作. 这里就是你写的绘图代码了.
6.释放资源. 不管是窗口句柄也好. DC也好.图形对象也好.都是内核对象.所以我们需要进行释放.
具体API:
1.获取指定窗口句柄. FindWindowA/FindWindowW
HWND FindWindowA(
LPCSTR lpClassName, 窗口类名.字符串. 可以用Spy++获取
LPCSTR lpWindowName 窗口名称
);
返回窗口句柄.
2.获取DC设备上下文. GetDc()
HDC GetDC(
HWND hWnd 传入设备对象.也就是窗口句柄
);
3.创建图形对象.
PS: 创建图形对象.图形对象有很多. 有画笔. 画刷. 等等.
HPEN CreatePen(
int iStyle, 创建笔的风格, 意思就是你的画笔是实心的 还是虚线 还是其他.
int cWidth, 笔的宽度.如果实心的.笔的宽度则自定义设置.如果其他.不能超过1
COLORREF color RGB的颜色. 你的画笔是什么颜色的.是一串16进制可以在线取色
);
返回图形对象
还有常用的.创建矩形区域.
HRGN CreateRectRgn(
int x1,
int y1, 坐标
int x2,
int y2
);
具体使用可以查询MSDN: https://docs.microsoft.com/zh-cn/windows/desktop/gdi/windows-gdi 代码使用例子
如果你安装了MSDN 2001版本.搜索SelectObject可以看到. 图形对象有很多.并且告诉你相应的API

Bitmap 位图. 后面是操作的API
Brush 画刷
字体
笔
矩形
4.关联DC跟图形对象.
HGDIOBJ SelectObject( HDC hdc, // handle to DC
HGDIOBJ hgdiobj // handle to object);
5.写你想要绘制的代码.
这里如果是画线. 则用 LineTo(Hdc,x,y) 这个API 给定一个DC.给个x y坐标.则可以绘制.
当然如果指定在哪里开始绘制则用MoveToEx指定起始位置.
BOOL MoveToEx(
HDC hdc,
int x,
int y,
LPPOINT lppt
);
6.释放资源.
释放资源很简单了. 如果是图形对象.同一使用DeleteObject(对象) 进行删除.
如果是DC. 如果是创建的Dc.则用DeleteDc(DC对象)来进行删除.
如果是获取的DC.则用ReleaseDc(Dc对象) 来进行删除.
题外话. windows程序中还有一个API.可以获取DC中默认的图形对象.
HGDIOBJ GetStockObject(
int i 对象的类型.你想从DC中获取什么对象类型.
);
图像类型如果是 DC_BRUSH 则是获取纯色刷.就不用自己创建色刷了.可以通过操作色刷的API进行操作.
COLORREF SetDCBrushColor(
HDC hdc,
COLORREF color RGB颜色
);
三丶绘制图形.
1.绘制直线的代码例子.
#include "stdafx.h"
#include <Windows.h> int main(int argc, char *argv[])
{ //1.获取窗口句柄
HWND hwnd = ::FindWindow(NULL, TEXT("计算器")); //2.获取DC.
HDC hdc = ::GetDC(hwnd); //3.创建图形对象.
HPEN hPen = CreatePen(PS_SOLID, , RGB(0xFF, , )); //设置为红色画笔 //4.关联图形对象跟DC
HPEN oldPen = (HPEN)::SelectObject(hdc, hPen); //返回旧的画笔 //5.绘制直线.
MoveToEx(hdc, , , NULL);
LineTo(hdc, , ); //6.释放资源.
::SelectObject(hdc, oldPen); //首先还原旧画笔
DeleteObject(hPen); //删除图形对象.
ReleaseDC(hwnd,hdc); //释放Dc system("pause");
return ;
}
运行之后图片.注意不要遮挡计算器.

2.绘制矩形.获取默认画刷.设置画刷区域颜色.
绘制代码
#include "stdafx.h"
#include <Windows.h> int main(int argc, char *argv[])
{ //1.获取窗口句柄
HWND hwnd = ::FindWindow(NULL, TEXT("计算器")); //2.获取DC.
HDC hdc = ::GetDC(hwnd); //3.创建图形对象.
HPEN hPen = CreatePen(PS_SOLID, , RGB(0xFF, , )); //设置为红色画笔
HBRUSH hBru = (HBRUSH)::GetStockObject(DC_BRUSH);
//4.关联图形对象跟DC
HPEN oldPen = (HPEN)::SelectObject(hdc, hPen); //返回旧的画笔
SetDCBrushColor(hdc, RGB(, 0xFF, )); //设置画刷颜色
HBRUSH oldBrush = (HBRUSH)::SelectObject(hdc, hBru);
//5.绘制句柄
Rectangle(hdc, , , , ); //6.释放资源.
::SelectObject(hdc, oldPen); //首先还原旧画笔
DeleteObject(hPen); //删除图形对象.
ReleaseDC(hwnd,hdc); //释放Dc system("pause");
return ;
}
其中新用到的API就是绘制矩形的API.
绘制完毕结果

Win32知识之窗口绘制.窗口第一讲的更多相关文章
- 你的第一个Windows程序——绘制窗口
MSDN原文(英文) 绘制窗口 你已经创建了你的窗口,现在你想在它里面显示东西.在WIndows术语里,这就是所谓的绘制窗口.混合隐喻,一个窗口是一个空白画布,等待你去填充它. 有时你的程序将启动绘制 ...
- 给Win32 GUI程序增加控制台窗口的方法
给Win32 GUI程序增加控制台窗口的方法 2008年10月11日 星期六 下午 04:43 在Win32的GUI程序中,没有控制台窗口,我们输出调试信息时有些不方便,以往我的做法是使用Messag ...
- 在C#中调用Win32函数EnumWindows枚举所有窗口。
原文 http://www.cnblogs.com/mfm11111/archive/2009/06/30/1514322.html 开发旺旺群发软件,难点及重要技术点分析(一) 一. ...
- 窗口绘制有关的消息整理 WM_PAINT, WM_NCPAINT, WM_ERASEBKGND
WM_PAINTWM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作. WM_NCPAINT当窗口客户区以外的部分(如窗口标题栏.菜单栏等)需要需要重 ...
- 逆向知识第一讲,IDA的熟悉使用,以及TEB,PEB结构
逆向知识第一讲,IDA的熟悉使用,以及TEB,PEB结构 一丶熟悉IDA,以及手工制作sig文件. IDA,静态分析工具,网上随便找一个即可下载. 首先,我们写一个可执行EXE,最简单的 使用IDA打 ...
- Unity3D编辑器扩展(三)——使用GUI绘制窗口
前两篇分别讲解了创建菜单https://www.cnblogs.com/xiaoyulong/p/10115053.html和创建窗口https://www.cnblogs.com/xiaoyulon ...
- 逆向知识第一讲,IDA的熟悉使用
逆向知识第一讲,IDA的熟悉使用 一丶熟悉IDA,以及手工制作sig文件. IDA,静态分析工具,网上随便找一个即可下载. 首先,我们写一个可执行EXE,最简单的 使用IDA打开. 1.提示使用什么格 ...
- Java 窗口 绘制图形 #2
写在前面: 高考结束咧,爽到啊,好耶 完善了Java 窗口 绘制图形 #1里面的程序 加入了缩放平移功能,给代码加了注释 1 package my_package; 2 3 import java.a ...
- MFC控件第一讲.DC编程
MFC控件第一讲.DC编程 一丶简介 什么是DC,DC有什么用. DC成为设备描述符表. DC的作用就是可以进行绘制. 比如我们的窗口都是绘制出来的. DC可以简单理解为.没一个窗口程序都有一块内存 ...
随机推荐
- (转载)python 命名.py 不能与模块相同,否则会报错
在学习python网页爬虫时,测试requests的post方法进行表单提交时,命名.py文件为requests.py 代码如下: import requests params={'firstname ...
- ubuntu 安装vue+element
1.安装npm sudo apt install npm 检测安装npm -v 因为npm安装软件慢,可设置淘宝镜像 npm config set registry https://registry. ...
- Cache高速缓冲存储器
Cache的命中率:命中Cache的次数比总访问次数 平均访问时间:t(Cache)X命中次数+t(未命中)X未命中次数 Cache与主存的映射方式: 直接映射 全相联映射 组相联映射 图片来源:ht ...
- 三级菜单,可以退出到上一级菜单和全部退出(low版本)
menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, 'youk ...
- 网络操作系统 第十章 DNS服务器管理与配置
1.什么是域名系统?描述域名解析的过程. 1)域名系统:Domain Name System缩写DNS,是因特网的一项核心服务 域名系统作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方 ...
- 端口转发 Port Forwarding (一)
0x00First 最近发现一些好用的端口转发工具和技巧,计划认真梳理一下 SSH.NC.LCX.EW.FRP 0x01 SSH隧道端口转发 目前利用SSH隧道(SSH tunneling)进行端口转 ...
- [转] KVM虚拟化技术生态环境介绍
KVM虚拟化技术生态环境介绍 http://xanpeng.github.io/wiki/virt/kvm-virtulization-echosystem-intro.html kvm和qemu/q ...
- python爬虫学习之查询IP地址对应的归属地
话不多说,直接上代码吧. import requests def getIpAddr(url): response = requests.get(url) response.encoding=resp ...
- FineCMS 5.0.10 多个 漏洞详细分析过程
0x01 前言 已经一个月没有写文章了,最近发生了很多事情,水文一篇.今天的这个CMS是FineCMS,版本是5.0.10版本的几个漏洞分析,从修补漏洞前和修补后的两方面去分析. 文中的evai是特意 ...
- Android开发之如何避免ANR(Keeping Your App Responsive)
一:什么是ANR 如果应用程序不能响应用户的输入了,那么就可以说应用ANR了. 如果需要运行一个耗时较长的操作的时候,不要把这个任务放在UI线程上运行,而是单独创建一个线程运行那些操作. 以下情况会出 ...