~$ 存档

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  1. 刷子种类
  2. 常见问题
  3. 刷子的使用时机
刷子种类 逻辑画刷也是一种GDI对象,应用程序常使用逻辑画刷来填充Rectangle,Ellipse, Polygon等图形的内部区域。一般的画刷是一个8×8的位图,利用水平和垂直的重复来填充这些图形的内部区域
库存刷子 系统自带的几种类型,白、浅、灰、深、黑、空,6种刷子,获取方式:
hBrush=GetStockObject(DKGRAY_BRUSH);
纯色刷子 hBrush=CreateSolidBrush(RGB(33,66,55)); 
阴影刷子 hBrush=CreateHatchBrush(HS_CROSS,RGB(255,0,0)); //库存带阴影的刷子
位图刷子 hBrush=CreatePatternBrush(hBitmap); //可以用位图作为刷子
根据结构间接创建的刷子 HBRUSH CreateBrushIndirect( CONST LOGBRUSH *lplb );

根据结构创建刷子的说明:

 typedef struct tagLOGBRUSH { 
                      UINT lbStyle;         // 画刷的类型
                      COLORREF lbColor;    // 颜色
                      LONG lbHatch;        // 填充风格
} LOGBRUSH, *PLOGBRUSH; 

类型是可选的,有BS_SOLID,BS_HATCHED,BS_PATTERN和BS_HOLLOW四种类型。

 

题一:如何在创建窗口之后重新填充用户区窗口?

方法一:首先计算窗口大小,将结果放入一个矩形结构rect中,然后利用矩形填充函数FillRect填充。
根据前面的研究,得到窗口矩形大小有一种比较简便的方法,如果窗口大小改变,就会发送WM_SIZE消息,其中lParam的低字节存放宽,高字节存放高,分离就会得到窗口的大小。一旦得到窗口大小,就可以调用FillRect函数填充,问题解决!

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     HDC hdc;
     PAINTSTRUCT ps ;
     static RECT  rect ;//矩形变量存储用户区窗口的坐标,尤其是右下角的坐标
     static HBRUSH hBrush;//定义一个刷子对象
     switch (message)
     {      
     case WM_SIZE://窗口改变大小发送的消息
         rect.right=LOWORD(lParam);//
         rect.bottom=HIWORD(lParam);//
         return 0;

     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
          hBrush=CreateSolidBrush(RGB(0,0,0));//自定义刷子
          FillRect(hdc,&rect,hBrush);//刷子填充矩形
          EndPaint (hwnd, &ps) ;
          return 0 ;          
     case WM_DESTROY:
          DeleteObject(hBrush);//删除刷子
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam);
}
View Code

刷子使用的时机:
一般来说,在WM_CREATE消息时创建,在WM_PAINT消息时选入。原因:刷子的创建函数都不需要HDC,只有通过SelectObject选入设备中时才生效。(在初学阶段,代码繁杂,以致于不知道代码该放在哪个地方,有必要定下一套规则,简化记忆),看一下代码的样式:

    case WM_CREATE:
    hsolidBrush=CreateSolidBrush(RGB(34,56,99));//先创建
    return 0 ;

    case WM_PAINT:
    hdc = BeginPaint (hwnd, &ps) ;
    SelectObject(hdc,hsolidBrush);//再选入
    Rectangle(hdc,100,100,300,300);//填充矩形
    EndPaint (hwnd, &ps) ;

最后,在WM_DESTORY消息间删除创建的刷子句柄

          case WM_DESTROY:
          DeleteObject(hsolidBrush);
          PostQuitMessage (0) ;
          return 0 ;

 

posted on 2016-04-14 10:41  LuoTian  阅读(671)  评论(0编辑  收藏  举报