缩小客户区(扩大非客户区)的方法

当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的整数,你可以自己定义它的值。

posted @ 2007-12-20 20:34  Max Woods  阅读(1227)  评论(0编辑  收藏  举报