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);
}
可以学到的东西都在注释中做好说明。