以前看到三原色的图案,一直很好奇是如何画出来。后来终于搞清楚了,其实很简单,实际上就是RGB三个分量的"位与"运算。

下面给出Win32绘制三原色图案的例子,特此记录在此:

 #include <windows.h>

 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
{
static TCHAR szAppName[]=TEXT("RGB_SRCPAINT");
HWND hWnd;
MSG msg;
WNDCLASS wc= {sizeof(WNDCLASS)};
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=;
wc.cbWndExtra=;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=szAppName;
if(!RegisterClass(&wc)) {
MessageBox(NULL,TEXT("error"),szAppName,MB_ICONERROR|MB_OK);
return ;
}
hWnd=CreateWindow(szAppName,TEXT("RGB"),WS_OVERLAPPEDWINDOW,
,,,,NULL,NULL,hInstance,NULL); //
ShowWindow(hWnd,iCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,,)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//
void Circle(HDC dc,int ox,int oy,int r)
{
Ellipse(dc,ox-r,oy-r,ox+r,oy+r);
}
//
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//
HDC hdc,hMemDC;
HBITMAP hBitmap;
HBRUSH hbrush;
RECT rc= {,,,};
PAINTSTRUCT ps;
int ox=,oy=,r=;
//
switch (message) {
case WM_PAINT :
hdc=BeginPaint(hWnd,&ps);
//MemDC
hMemDC = CreateCompatibleDC(hdc);
hBitmap = CreateCompatibleBitmap(hdc,,);
SelectObject(hMemDC,hBitmap);
//ClearScreen with Black
hbrush = CreateSolidBrush(RGB(, , ));
SelectObject(hMemDC,hbrush);
FillRect(hdc,&rc,hbrush);
//RED
hbrush = CreateSolidBrush(RGB(, , ));
SelectObject(hMemDC,hbrush);
//Ellipse(hMemDC,0+200,0+200+30,100+200,100+200+30);
Circle(hMemDC,ox,oy+0.8*r,r);
BitBlt(hdc,,,,,hMemDC,,,SRCPAINT);
//GREEN
hbrush = CreateSolidBrush(RGB(, , ));
SelectObject(hMemDC,hbrush);
//Ellipse(hMemDC,0+200-26,0+200-15,100+200-26,100+200-15);
Circle(hMemDC,ox-0.866*0.8*r,oy-0.5*0.8*r,r);
BitBlt(hdc,,,,,hMemDC,,,SRCPAINT);
//BLUE
hbrush = CreateSolidBrush(RGB(, , ));
SelectObject(hMemDC,hbrush);
//Ellipse(hMemDC,0+200+26,0+200-15,100+200+26,100+200-15);
Circle(hMemDC,ox+0.866*0.8*r,oy-0.5*0.8*r,r);
BitBlt(hdc,,,,,hMemDC,,,SRCPAINT);
//
DeleteObject(hBitmap);
DeleteDC( hMemDC );
EndPaint (hWnd, &ps) ; break;
case WM_DESTROY :
PostQuitMessage();
break ;
}
return DefWindowProc (hWnd, message, wParam, lParam) ;
}

最新文章

  1. SVN导出/导入、SVN备份/还原 【小白版】
  2. 从Prototype学习JavaScript面向对象编程
  3. centos 一键安装jdk
  4. js生成 1-100 不重复随机数
  5. 返回canceled 代码 的原因
  6. socket 基础学习
  7. Apache Mina 2.x 框架+源码分析
  8. opencar二次开发常用代码
  9. Java基础知识强化67:基本类型包装类之Integer直接赋值的面试题
  10. access 数据更新password列为空出问题?
  11. LeetCode 289. Game of Life (生命游戏)
  12. ML—高斯判别分析
  13. [笔记]Linux命令行大全
  14. CentOS 6下编译安装MySQL 5.6
  15. [LeetCode] Encode and Decode TinyURL 编码和解码精简URL地址
  16. sublime使用package control安装插件
  17. 导航栏中各按钮在点击当前按钮变色其他按钮恢复为原有色的实现方法(vue、jq、原生js)
  18. mac电脑上不能用移动硬盘的原因和方法
  19. IDEA编译时出现 Information:java: javacTask: 源发行版 1.8 需要目标发行版 1.8
  20. Vagrant 管理部署 VirtualBox (推荐使用)

热门文章

  1. iPhone如何设置自定义铃声?无需连接电脑,轻松几步就搞定!
  2. memcache 协议 &amp;&amp; Golang实现
  3. Python基础——模块与包
  4. zoj 4056
  5. HDU 3667 费用流 拆边 Transportation
  6. CodeForces 568B DP Symmetric and Transitive
  7. dubbo与zk注册中心如何对接,如何做到服务自动发现
  8. 【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸
  9. Selenium WebDriver-通过ActionChains实现页面元素拖拽
  10. Leetcode1---&gt;数组中两数之和等于给定数