浙江财经大学
信工学院ACM集训队

Win32 Api 学习记录

本文由 Ocrosoft 于 2018-05-10 22:43:18 发表

摘要:计时器的最后一个应用,每100ms获取鼠标指向的像素颜色并显示在窗口上

1.1.差不多就是PS的吸管效果

1.2.源码

#include <windows.h>

#define LPARAMX ((int)(short)LOWORD(lParam))
#define LPARAMY ((int)(short)HIWORD(lParam))
#define ID_TIMER 1

void FindWindowSize(int * , int * );
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("WhatClr");
    HWND hwnd;
    int cxWindow, cyWindow;
    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("Program requires Windows NT!"), szAppName, MB_ICONERROR);
        return 0;
    }

    FindWindowSize(&cxWindow, &cyWindow);

    hwnd = CreateWindow(szAppName, TEXT("WhatClr"),
                        // 标题,边框 关闭按钮
                        WS_OVERLAPPED | WS_SYSMENU,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        cxWindow, cyWindow,
                        NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

void FindWindowSize(int * pcxWindow, int * pcyWindow)
{
    HDC hdcScreen;
    TEXTMETRIC tm;

    hdcScreen = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL); // 获取窗口的参数,而没有CreateDC的开销
    GetTextMetrics(hdcScreen, &tm);
    DeleteDC(hdcScreen);

    * pcxWindow = 2 * GetSystemMetrics(SM_CXBORDER) + 12 * tm.tmAveCharWidth;
    * pcyWindow = GetSystemMetrics(SM_CYBORDER) + GetSystemMetrics(SM_CYCAPTION + 2 * tm.tmHeight);
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static COLORREF cr, crLast;
    static HDC hdcScreen;
    HDC hdc;
    HBRUSH hBrush; // 相应颜色的刷子
    PAINTSTRUCT ps;
    POINT pt;
    RECT rc;
    TCHAR szBuffer[16];

    switch (message)
    {
    case WM_CREATE:
        hdcScreen = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);
        SetTimer(hwnd, ID_TIMER, 100, NULL);
        return 0;

    case WM_TIMER:
        GetCursorPos(&pt);
        cr = GetPixel(hdcScreen, pt.x, pt.y); // 获得鼠标指向的像素点颜色

        //SetPixel(hdcScreen, pt.x, pt.y, 0);

        if (cr != crLast)
        {
            crLast = cr;
            InvalidateRect(hwnd, NULL, FALSE);
        }
        return 0;

    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);

        GetClientRect(hwnd, &rc);

        hBrush = CreateSolidBrush(cr); // 创建相应颜色的刷子
        FillRect(hdc, &rc, hBrush); // 填充客户区
        DeleteObject(hBrush); // 删除刷子

        wsprintf(szBuffer, "  %02X %02X %02X  ", GetRValue(cr), GetGValue(cr), GetBValue(cr)); // 十六进制RGB代码
        DrawText(hdc, szBuffer, -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER); // 单行、水平垂直居中

        EndPaint(hwnd, &ps);
        return 0;

    case WM_DESTROY:
        DeleteDC(hdcScreen);
        KillTimer(hwnd, ID_TIMER);
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

欢迎转载,请保留出处与链接。Ocrosoft » Win32 Api 学习记录

点赞 (0)or拍砖 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址