绘图模式--SetROP2
2015-10-03 23:41
405 查看
设备内容中定义的绘图方式也影响显示器上所画线的外观。设想画这样一条直线,它的色彩由画笔色彩和画线区域原来的色彩共同决定。设想用同一种画笔在白色表面上画出黑线而在黑色表面上画出白线,而且不用知道表面是什么色彩。这样的功能对您有用吗?通过绘图方式的设定,这些都可以实作。
当Windows使用画笔来画线时,它实际上执行画笔图素与目标位置处原来图素之间的某种位布尔运算。图素间的位布尔运算叫做「位映像运算」,简称为「ROP」。由于画一条直线只涉及两种图素(画笔和目标),因此这种布尔运算又称为「二元位映像运算」,简记为「ROP2」。Windows定义了16种ROP2代码,表示Windows组合画笔图素和目标图素的方式。在内定设备内容中,绘图方式定义为R2_COPYPEN,这意味着Windows只是将画笔图素复制到目标图素,这也是我们通常所熟知的。此外,还有15种ROP2码。在此处就不列出其余的15中ROP2码了,在《Windows程序设计》一书中有详解。
现在通过程序进行详解解释:
[cpp] view
plaincopyprint?
View Code
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("FillRect");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName,
TEXT("FillRect"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
HBRUSH hBrush;
RECT rectBrush;
HPEN hPen;
static int cxClient, cyClient;
switch(iMsg)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
SetROP2(hdc, R2_MASKPEN);
// Rectangle
hPen = CreatePen(PS_SOLID, 2, RGB(0, 255, 0));
SelectObject(hdc, hPen);
Rectangle(hdc, cxClient / 2 - 50, cyClient / 2 - 50, cxClient / 2 + 50, cyClient / 2 + 50);
// Ellipse
Ellipse(hdc, cxClient / 2 - 100, cyClient / 2 - 50, cxClient / 2 + 100, cyClient / 2 + 50);
// FillRect
hBrush = CreateSolidBrush(RGB(255, 0, 0));
SetRect(&rectBrush, cxClient / 2 - 25, cyClient / 2 - 25, cxClient / 2 + 25, cyClient / 2 + 25);
FillRect(hdc, &rectBrush, hBrush);
EndPaint(hwnd, &ps);
DeleteObject(hPen);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
在代码中,有SetROP2(hdc, R2_MASKPEN);这样一句,当去掉这句话时运行程序,结果如下:
此时程序的运行结果中,矩形的边框被椭圆遮挡住,但这并不是我们想要的结果,所以,设置绘图模式,便可以解决这个问题。调用SetROP2(hdc, R2_MASKPEN);便可以完成绘图模式的设置,可以调用GetROP2获取当前设备内容使用的绘图模式。当加上SetROP2(hdc, R2_MASKPEN);之后的运行效果如下:
好了,全文讲解完毕!!!希望大家对我的博客提出至诚的建议~~~
当Windows使用画笔来画线时,它实际上执行画笔图素与目标位置处原来图素之间的某种位布尔运算。图素间的位布尔运算叫做「位映像运算」,简称为「ROP」。由于画一条直线只涉及两种图素(画笔和目标),因此这种布尔运算又称为「二元位映像运算」,简记为「ROP2」。Windows定义了16种ROP2代码,表示Windows组合画笔图素和目标图素的方式。在内定设备内容中,绘图方式定义为R2_COPYPEN,这意味着Windows只是将画笔图素复制到目标图素,这也是我们通常所熟知的。此外,还有15种ROP2码。在此处就不列出其余的15中ROP2码了,在《Windows程序设计》一书中有详解。
现在通过程序进行详解解释:
[cpp] view
plaincopyprint?
View Code
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("FillRect");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName,
TEXT("FillRect"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
HBRUSH hBrush;
RECT rectBrush;
HPEN hPen;
static int cxClient, cyClient;
switch(iMsg)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
SetROP2(hdc, R2_MASKPEN);
// Rectangle
hPen = CreatePen(PS_SOLID, 2, RGB(0, 255, 0));
SelectObject(hdc, hPen);
Rectangle(hdc, cxClient / 2 - 50, cyClient / 2 - 50, cxClient / 2 + 50, cyClient / 2 + 50);
// Ellipse
Ellipse(hdc, cxClient / 2 - 100, cyClient / 2 - 50, cxClient / 2 + 100, cyClient / 2 + 50);
// FillRect
hBrush = CreateSolidBrush(RGB(255, 0, 0));
SetRect(&rectBrush, cxClient / 2 - 25, cyClient / 2 - 25, cxClient / 2 + 25, cyClient / 2 + 25);
FillRect(hdc, &rectBrush, hBrush);
EndPaint(hwnd, &ps);
DeleteObject(hPen);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
在代码中,有SetROP2(hdc, R2_MASKPEN);这样一句,当去掉这句话时运行程序,结果如下:
此时程序的运行结果中,矩形的边框被椭圆遮挡住,但这并不是我们想要的结果,所以,设置绘图模式,便可以解决这个问题。调用SetROP2(hdc, R2_MASKPEN);便可以完成绘图模式的设置,可以调用GetROP2获取当前设备内容使用的绘图模式。当加上SetROP2(hdc, R2_MASKPEN);之后的运行效果如下:
好了,全文讲解完毕!!!希望大家对我的博客提出至诚的建议~~~
相关文章推荐
- [20150925]Linux之文件系统与SHELL
- [20150513]Linux远程登陆管理以及Vim的学习
- 更改Linux的主机的名称
- OpenGL光源、材质和光照模型
- 局域网ip地址用手机访问Apache服务器的默认网页
- 快速排序——PowerShell版
- bfs 拓扑排序 bnu Usoperanto
- Windows Azure Virtual Machine (25) 使用SSH登录Azure Linux虚拟机
- XAMPP 的安装配置(Linux 版)
- OP趋势系统
- 自动化运维工具puppet(二)
- linux中文件属性和权限修改命令chgrp|chown|chmod介绍
- Hadoop学习笔记(六)启动Shell分析
- 找出第二个文本抄袭第一个文本的所有位置和长度 后缀数组 UVA 10526 - Intellectual Property
- 网站用户存在状态的session用法及例子
- Linux对rm的误操作预防
- centos 正则,grep,egrep,流式编辑器 sed,awk -F 多个分隔符 通配符 特殊符号. * + ? 总结 问加星 cat -n nl 输出文件内容并加上行号 alias放~/.bash_profile 2015-4-10 第十三节课
- CentOS 6.7下PXE+Kickstart无人值守安装操作系统
- 关于AVAudioPlayer
- Apache容器扩展类和常用方法