zoukankan      html  css  js  c++  java
  • 画刷

    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 ;
  • 相关阅读:
    Cannot load php5apache2_4.dll into server
    PHP合并数组
    为什么 echo 3 . print(2) . print(4) . 5 . 'c'的结果是45c2131
    PHP数据类型
    PHP变量
    SSH Key
    VMware Tools安装教程
    nginx: [emerg] getpwnam("nginx") failed
    JS 生成随机数
    JS 操作 cookie
  • 原文地址:https://www.cnblogs.com/tinaluo/p/5390169.html
Copyright © 2011-2022 走看看