QQ登录

只需一步,快速开始

搜索
查看: 154|回复: 0

[技术交流] 一个粗略版的颜色拾取器

[复制链接]
最佳答案
0 
累计签到:2 天
连续签到:2 天
发表于 2017-8-3 11:42:46 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
  我按照小甲鱼老师视频讲解的方法,用之前学的知识和百度得到的一些参数,写了一个粗略版的颜色拾取器。之所以说是粗略版,因为还存在不少问题。比如如果屏幕分辨率比较高时,像素密度较大,获取的坐标有误差,由于本人知识有限,没有成功解决。还有一些小问题。。。废话不多说,代码贴上。如果哪位朋友有好的解决方法,求评论,谢谢了。
  1. /* -------------------------------------------------------------------
  2.                     MyWindows.c -- 基本窗口模型  
  3.                                 《Windows 程序设计(SDK)》视频教程                    
  4. --------------------------------------------------------------------*/

  5. #include <windows.h>
  6. #include <strsafe.h>

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

  8. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  9. {
  10.         static TCHAR szAppName[] = TEXT("MyWindows");//定义一个窗口类名字
  11.         HWND hwnd;                                   //窗口句柄
  12.         MSG msg;                                     //消息结构
  13.         WNDCLASS wndclass;                           //窗口类结构     //声明

  14.         wndclass.style = CS_HREDRAW | CS_VREDRAW   ;    //指定窗口类型
  15.         wndclass.lpfnWndProc = WndProc;              //指定窗口过程
  16.         wndclass.cbClsExtra = 0;                     //预留的额外空间
  17.         wndclass.cbWndExtra = 0;                    
  18.         wndclass.hInstance = hInstance;              //应用程序的实例句柄
  19.         wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//为所有基于该窗口类设定一个图标
  20.         wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);  //为所有基于该窗口类设定一个鼠标指针
  21.         wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//指定窗口背景色
  22.         wndclass.lpszMenuName = NULL;//指定窗口菜单
  23.         wndclass.lpszClassName = szAppName;//指定窗口类名

  24.         if (!RegisterClass(&wndclass))//注册
  25.         {
  26.                 MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR);
  27.                 return 0;
  28.         }

  29.         hwnd = CreateWindow(szAppName, //窗口类名称lpClassName     
  30.                 TEXT("颜色拾取器"),     //窗口标题lpWindowName
  31.                 WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX,   //窗口风格dwStyle 使其不能改变大小
  32.                 CW_USEDEFAULT,         //初始x坐标           CW CreatWindow创建窗口选项
  33.                 CW_USEDEFAULT,         //y
  34.               //  CW_USEDEFAULT,         //初始x方向尺寸nWidth
  35.              //   CW_USEDEFAULT,         //y  nHeight
  36.                               250,
  37.                              100,//初始化窗口长宽
  38.                 NULL,                  //父窗口句柄hWndParent
  39.                 NULL,                  //窗口菜单句柄hMenu
  40.                 hInstance,             //程序实例句柄hInstance
  41.                 NULL);                 //创建参数lpParam
  42.         
  43.         ShowWindow(hwnd, iCmdShow);     //显示窗口
  44.         UpdateWindow(hwnd);             //更新窗口

  45.         while (GetMessage(&msg, NULL, 0, 0))
  46.         {
  47.                 TranslateMessage(&msg); //翻译消息
  48.                 DispatchMessage(&msg);  //分配消息  调用
  49.         }                               //消息循环

  50.         return msg.wParam;
  51. }

  52. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  53. {
  54.         HDC hdc;      
  55.                 HDC hdc2;//DC:Device Context 设备环境
  56.         PAINTSTRUCT ps;
  57.         RECT rect;
  58.                 static POINT apt;
  59.                 static int R,G,B;
  60.                 static COLORREF color;
  61.                 TCHAR buffer[128];
  62.         switch (message)
  63.         {
  64.                 case WM_CREATE:
  65.                                 SetTimer(hwnd,1,100,NULL);//100ms定时器
  66.                             return 0;
  67.         case WM_PAINT:                                                              //绘制窗口
  68.                          
  69.                                 hdc2=GetDC(NULL);        //获取屏幕DC

  70.                             GetCursorPos(&apt);        //获取屏幕坐标

  71.                                 color=GetPixel(hdc2,apt.x,apt.y);//拾取像素点
  72.                                 R=GetRValue(color);
  73.                                 G=GetGValue(color);
  74.                                 B=GetBValue(color);                                //获取RGB值
  75.                                 ReleaseDC(NULL,hdc2);                        //释放DC  

  76.                 hdc = BeginPaint(hwnd, &ps);                                                                                                  
  77.                                 SetClassLongPtr(hwnd,GCLP_HBRBACKGROUND,(LONG)(CreateSolidBrush(RGB(R,G,B))));//设置背景颜色
  78.                                 SetTextColor(hdc,RGB(0,0,0));                                                //设置字体颜色
  79.                                 if(R<167&&G<167&&B<167)SetTextColor(hdc,RGB(255,255,255));
  80.                 GetClientRect(hwnd, &rect);                                         //获得客户区的位置坐标信息
  81.                                 SetBkMode(hdc,TRANSPARENT);                                         //设置字体背景为透明
  82.                                 StringCchPrintf(buffer,128,TEXT("#%2X%2X%2X"),R,G,B);               
  83.                                
  84.                 DrawText(hdc, buffer, -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);                    //绘制文字 一行 居中 垂直居中 显示RGB值
  85.                 EndPaint(hwnd, &ps);
  86.                 return 0;

  87.         case WM_DESTROY:                                                             //窗口关闭
  88.                 PostQuitMessage(0);
  89.                 return 0;
  90.                 case WM_TIMER:
  91.                                 InvalidateRect(hwnd,NULL,TRUE);//100ms刷新一次窗口
  92.                                
  93.                             return 0;
  94.         }
  95.                 if((message==WM_NCLBUTTONDOWN)&&(wParam==HTMAXBUTTON))return 0;//最大化失效

  96.         return DefWindowProc(hwnd, message, wParam, lParam);//windows处理其他消息
  97. }
复制代码
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋手机版Archiver( 粤公网安备 44051102000370号 | 粤ICP备11014136号

© 2010-2017 FishC.com GMT+8, 2017-10-17 17:52 Powered by Discuz! X2.5 Theme by dreambred

快速回复 返回顶部 返回列表