《Windows程序设计》之WHATCLR

void FindWindowSize(int *pcxWindow,int *pcyWindow)
{
	HDC hdcScreen;
	TEXTMETRIC tm;
	//获取整个屏幕的设备描述表的属性信息,("DISPLAY")不能改为其它的
	hdcScreen=CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
	//获取hdcScreen中当前字体信息
	GetTextMetrics(hdcScreen,&tm);
	//删除hdcScreen(这个删除的是CreateIC创建的)
	DeleteDC(hdcScreen);
	//x方向上不可变边框的大小*2+12*字体的平均宽度
	*pcxWindow=2*GetSystemMetrics(SM_CXBORDER)+12*tm.tmAveCharWidth;
	//y方向上不可变边框的大小*2+字体高度*2
	*pcyWindow=2*GetSystemMetrics(SM_CYBORDER)+GetSystemMetrics(SM_CYCAPTION)+2*tm.tmHeight;
	//得到的pcxWindow,pcyWindow是用来设置创建窗口大小的
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	static COLORREF cr,crLast;
	static HDC hdcScreen;
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rc;
	POINT pt;
	TCHAR szBuffer[30];
	switch(message)
	{
	case WM_CREATE:
		//获取整个屏幕的设备描述表("DISPLAY")不能改为其它的
		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);
		wsprintf(szBuffer,TEXT("  %02d %02d %02d   "),GetRValue(cr),GetGValue(cr),GetBValue(cr));
		DrawText(hdc,szBuffer,-1,&rc,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
		EndPaint(hwnd,&ps);
		return 0;
	case WM_DESTROY:
		//这个删除的是CreateDC创建的
		DeleteDC(hdcScreen);
		KillTimer(hwnd,ID_TIMER);
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd,message,wParam,lParam);
}

可以学到的东西都在注释中做好说明。

你可能感兴趣的:(Windows编程学习)