以前看到三原色的图案,一直很好奇是如何画出来。后来终于搞清楚了,其实很简单,实际上就是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. rabbitmq 简单梳理
  2. linux 网卡问题 Device eth0 does not seem to be present,delaying initialization.
  3. springMVC:通配符的匹配很全面, 但无法找到元素 &#39;mvc:annotation-driven&#39; 的声明
  4. Oracle中的索引详解
  5. License Manager 10.3启动失败解决方法
  6. JSONP的学习(收集整理)
  7. MyBatis的分页操作(MySQL)
  8. EMV规范 ---ISO7816 T=0协议的时间特性
  9. RDD 重新分区,排序 repartitionAndSortWithinPartitions
  10. BZOJ 1489: [HNOI2009]双递增序( dp )
  11. Flume搭建
  12. vue-router 组件实例被复用问题
  13. IP包设计
  14. 【HDU5950】Recursive sequence(矩阵快速幂)
  15. Ruby on Rails,一对多关联(One-to-Many)
  16. SolrJ的入门
  17. java web指定主页
  18. Python Flask 构建微电影视频网站
  19. MySQL死锁检测和回滚
  20. Redis——总结

热门文章

  1. Linux分区和挂载硬盘
  2. kubernetes 内网节点部署笔记(一)
  3. Spring注解学习
  4. get_list_or_404(klass, *args, **kwargs)和get_object_or_404(klass, *args, **kwargs)区别
  5. html 学习资料列表
  6. 标准C++中的string类的用法总结
  7. IRC常用命令
  8. MVVM模式下弹出窗体
  9. qt环境下Mapx组建的编程---------regoin
  10. TCP/IP之蓟辽督师