明月一弯浅笑 发表于 2017-8-3 11:42:46

一个粗略版的颜色拾取器

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

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

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

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
      static TCHAR szAppName[] = TEXT("MyWindows");//定义一个窗口类名字
      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.lpszMenuName = NULL;//指定窗口菜单
      wndclass.lpszClassName = szAppName;//指定窗口类名

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

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

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

      return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
      HDC hdc;      
                HDC hdc2;//DC:Device Context 设备环境
      PAINTSTRUCT ps;
      RECT rect;
                static POINT apt;
                static int R,G,B;
                static COLORREF color;
                TCHAR buffer;
      switch (message)
      {
                case WM_CREATE:
                                SetTimer(hwnd,1,100,NULL);//100ms定时器
                          return 0;
      case WM_PAINT:                                                            //绘制窗口
                       
                                hdc2=GetDC(NULL);        //获取屏幕DC

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

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

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

      case WM_DESTROY:                                                             //窗口关闭
                PostQuitMessage(0);
                return 0;
                case WM_TIMER:
                                InvalidateRect(hwnd,NULL,TRUE);//100ms刷新一次窗口
                               
                          return 0;
      }
                if((message==WM_NCLBUTTONDOWN)&&(wParam==HTMAXBUTTON))return 0;//最大化失效

      return DefWindowProc(hwnd, message, wParam, lParam);//windows处理其他消息
}
页: [1]
查看完整版本: 一个粗略版的颜色拾取器