剪贴板的简单应用

配合鼠标,剪贴板,学习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);
}


你可能感兴趣的:(windows,null,application,callback,文本编辑,winapi)