剪贴板的简单应用

配合鼠标,剪贴板,学习windows程序设计,主要掌握windows中的消息处理机制。

Demo解释:鼠标获取屏幕上任意一点颜色,然后,将颜色值传入剪贴板,然后去带有粘贴功能的文本编辑器,ctrl+v就能将取得的颜色值复制下来。程序没有任何实战意义,仅是为了实践。

#include <windows.h>



void FindWindowSize(int *, int *);

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



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow)

{

    TCHAR szAppName[] = TEXT("ColorPicker");

    MSG msg;

    WNDCLASS wndclass;

    HWND hwnd;

    int cxWindow, cyWindow;



    wndclass.cbClsExtra = 0;

    wndclass.cbWndExtra = 0;

    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

    wndclass.hInstance = hInstance;

    wndclass.lpfnWndProc = WndProc;

    wndclass.lpszClassName = szAppName;

    wndclass.lpszMenuName = NULL;

    wndclass.style = CS_HREDRAW | CS_VREDRAW;



    if (!RegisterClass(&wndclass))

    {

        MessageBox(NULL, TEXT("Run Error"), szAppName, MB_ICONERROR);

        return 0;

    }



    FindWindowSize(&cxWindow, &cyWindow);

    hwnd = CreateWindow(szAppName,

        szAppName,

        WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_BORDER,

        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 = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);

    GetTextMetrics(hdcScreen, &tm);

    DeleteDC(hdcScreen);



    *pcxWindow = 2 * GetSystemMetrics(SM_CXBORDER) + 12 * tm.tmAveCharWidth;

    *pcyWindow = 2 * 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;

    PAINTSTRUCT ps;

    POINT pt;

    RECT rc;

    TCHAR szBuffer[20];

    GLOBALHANDLE hGlobal;

    char *pGlobal;

    int i = 0;



    switch (message)

    {

    case WM_CREATE:

        hdcScreen = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); 

        SetTimer(hwnd, 1, 100, NULL);

        return 0;



    case WM_PAINT:

        hdc = BeginPaint(hwnd, &ps);

        GetClientRect(hwnd, &rc);

        wsprintf(szBuffer, TEXT("#%02X%02X%02X"), GetRValue(cr), GetGValue(cr), GetBValue(cr));

        DrawText(hdc, szBuffer, -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

        EndPaint(hwnd, &ps);



        // 将值传送至剪贴板

        hGlobal = GlobalAlloc(GHND | GMEM_SHARE, 20);

        if (NULL == hGlobal)

        {

            return 0;

        }

        pGlobal = (char*)GlobalLock(hGlobal);

        for (i = 0; i < 20; ++i)

        {

            *pGlobal++ = szBuffer[i];

        }

        GlobalUnlock(hGlobal);

        OpenClipboard(hwnd);

        EmptyClipboard();

        SetClipboardData(CF_TEXT, hGlobal);

        CloseClipboard();



        return 0;



    case WM_TIMER:

        GetCursorPos(&pt);

        cr = GetPixel(hdcScreen, pt.x, pt.y);

        if (cr != crLast)

        {

            crLast = cr;

            InvalidateRect(hwnd, NULL, FALSE);

        }

        return 0;



    case WM_DESTROY:

        DeleteDC(hdcScreen);

        KillTimer(hwnd, 1);

        PostQuitMessage(0);

        return 0;

    }



    return DefWindowProc(hwnd, message, wParam, lParam);

}

你可能感兴趣的:(应用)