鱼C论坛

 找回密码
 立即注册
查看: 2143|回复: 0

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

[复制链接]
发表于 2017-8-3 11:42:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
  我按照小甲鱼老师视频讲解的方法,用之前学的知识和百度得到的一些参数,写了一个粗略版的颜色拾取器。之所以说是粗略版,因为还存在不少问题。比如如果屏幕分辨率比较高时,像素密度较大,获取的坐标有误差,由于本人知识有限,没有成功解决。还有一些小问题。。。废话不多说,代码贴上。如果哪位朋友有好的解决方法,求评论,谢谢了。
/* -------------------------------------------------------------------
                    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,         //y  nHeight
                              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[128];
        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处理其他消息
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 13:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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