当Windows收到 WM_NCCALCSIZE 消息时会指定客户区大小,我们可以在这个时候设置客户区的大小。
参数lParam是一个NCCALCSIZE_PARAMS结构,保存包含三个矩形的数组。第一个矩形保存窗口的客户区。
你只要改写这个矩形的值就可以修改客户区的大小了。
修改了客户区的大小后,还要响应WM_NCPAINT消息,来绘制整个非客户区。
响应WM_NCCALCSIZE和WM_NCPAINT消息后都必须调用默认窗口处理函数,以便实现缺省处理。
下面是一个(SDK)例子:(出于方便我只列出了窗口处理过程)
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc,100,100,TEXT("缩小客户区的例子"),lstrlen(TEXT("缩小客户区的例子")));
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
if(message == WM_NCCALCSIZE)
{
//缩小客户区的范围
InflateRect(&((NCCALCSIZE_PARAMS* )lParam)->rgrc[0],-WIDTH,-WIDTH);
}
if(message == WM_NCPAINT)
{
RECT rc;
GetClientRect(hWnd,&rc); RECT rcWnd;//窗口坐标GetWindowRect(hWnd,&rcWnd);
ScreenToClient(hWnd,(LPPOINT)&rcWnd.left);// 将窗口坐标转换为客户坐标
ScreenToClient(hWnd,(LPPOINT)&rcWnd.right);rc.left -= rcWnd.left; //计算得到窗口内新的客户区域坐标
rc.top -= rcWnd.top;
rc.right += rc.left;
rc.bottom += rc.top;HDC hdc = GetWindowDC(hWnd);
//现在rc是一个新的窗口内的客户区坐标
ExcludeClipRect(hdc,rc.left,rc.top,rc.right,rc.bottom); //不刷新客户区域
InflateRect(&rc,WIDTH,WIDTH); // 将客户区域坐标扩大WIDTH
//在客户区域的外围画一个红色边框
HBRUSH hBr = CreateSolidBrush(RGB(255,0,0));
FillRect(hdc,&rc, hBr);
ReleaseDC(hWnd,hdc);
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
WIDTH是一个宏定义的大于0的整数,你可以自己定义它的值。