CreateSolidBrush()用法

CreateSolidBrush

  函数功能:该函数创建一个具有指定颜色的逻辑刷子。   函数原理:HBRUSH CreateSolidBrush(COLORREF crColor);   参数:   crColor:指定刷子的颜色。   返回值:如果该函数执行成功,那么返回值标识一个逻辑实心刷子;如果函数失败,那么返回值为NULL。   Windows NT:若想获得更多错误信息,请调用GetLastError函数。   备注:实心刷子实际上就是指系统用来绘制要填充图形的内部区域的位图。   在应用程序调用CreateSolidBrush创建刷子以后,可以通过调用SelectObject函数把该刷子选入设备环境。   ICM:在创建刷子时没有颜色操作。 然而,当把该刷子选入ICM许可的设备环境中时,将进行颜色管理。   Windows CE:Windows CE不支持抖动刷子。

/*
*  画刷笔设置 CreateSolidBrush()
*/ 

#include <windows.h>
#include <string>
using namespace std;

#define size 50

// 窗口函数的函数原形
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 char szClassName[] = "MainWClass"; 
 WNDCLASSEX wndclass;
 
 // 用描述主窗口的参数填充WNDCLASSEX结构
 wndclass.cbSize = sizeof(wndclass); // 结构的大小
 wndclass.style = CS_HREDRAW|CS_VREDRAW; // 指定如果大小改变就重画
 wndclass.lpfnWndProc = MainWndProc; // 窗口函数指针,当窗口收到消息时,windows调用此函数
 wndclass.cbClsExtra = 0;  // 没有额外的类内存
 wndclass.cbWndExtra = 0;  // 没有额外的窗口内存
 
 wndclass.hInstance = hInstance;  // 实例句柄
 wndclass.hIcon = LoadIcon(
  NULL,
  IDI_APPLICATION); // 使用预定义图标
 wndclass.hCursor = LoadCursor(
  NULL,
  IDC_ARROW);  // 使用预定义的光标
 
 //设置背景画刷
 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 使用白色背景画刷
 
 
 wndclass.lpszMenuName = NULL;  // 不指定菜单
 wndclass.lpszClassName = szClassName ; // 窗口类的名称 
 wndclass.hIconSm = NULL;  // 没有类的小图标
 
 // 注册这个窗口类
 RegisterClassEx(&wndclass);
 
 // 创建主窗口
 HWND hwnd = ::CreateWindowEx(
  0,   // dwExStyle,扩展样式 
  szClassName,  // lpClassName,类名   
  "My first Window!", // lpWindowName,标题  
  WS_OVERLAPPEDWINDOW, // dwStyle,窗口风格 
  CW_USEDEFAULT,  // X,初始 X 坐标  
  CW_USEDEFAULT,  // Y,初始 Y 坐标  
  CW_USEDEFAULT,  // nWidth,宽度   
  CW_USEDEFAULT,  // nHeight,高度   
  NULL,   // hWndParent,父窗口句柄   
  NULL,   // hMenu,菜单句柄  
  hInstance,  // hlnstance,程序实例句柄  
  NULL) ;   // lpParam,用户数据   
 
 if(hwnd == NULL)
 {
  MessageBox(NULL, "创建窗口出错!", "error", MB_OK);
  return -1;
 }
 
 // 显示窗口,刷新窗口客户区
 ShowWindow(hwnd, nCmdShow);
 UpdateWindow(hwnd);
 
 // 从消息堆中取出消息
 MSG msg; 
 
 //循环结束条件, GetMessage 从消息队列中获取到 WM_QUIT 消息,返回 0 。
 //所以结束程序,需要向消息队列中发送 WM_QUIT 消息。
 while(GetMessage(&msg, NULL, 0, 0))
 {
  // 转化键盘消息
  TranslateMessage(&msg);
  // 将消息发送到相应的窗口函数
  DispatchMessage(&msg);
 }
 
 // 当GetMessage返回0时程序结束
 return msg.wParam;
}


LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 switch (message)
 {
   
 case WM_PAINT: // 窗口客户区需要重画
  {
   HDC hdc;
   PAINTSTRUCT ps;
   
   // 使无效的客户区变的有效,并取得设备环境句柄
   hdc = ::BeginPaint (hwnd, &ps) ;

   //创建填充用画刷,用后删除 deleteObject()
   HBRUSH hbrush=CreateSolidBrush(RGB(100,120,200));
   //将新画刷 hbrush 选入设备,返回以前的老画刷holdbrush,系统默认值
   HBRUSH holdbrush=(HBRUSH)SelectObject(hdc,hbrush);

   //画矩形,用hbrush填充
   Rectangle(
    hdc,
    50,50,
    100,100);

   //将老画刷 holdbrush 选入设备
   SelectObject(hdc,holdbrush);
   
   //删除创建的画刷句柄
   DeleteObject(hbrush);

   //画矩形,用holdbrush填充
   Rectangle(
    hdc,
    200,50,
    250,100);


    
  
   EndPaint(hwnd, &ps);
   return 0;
  } 
  //当关闭窗口时,windows 向消息队列发送 WM_DESTROY 消息。
 case WM_DESTROY: // 正在销毁窗口
  
  // 向消息队列投递一个WM_QUIT消息,促使GetMessage函数返回0,结束消息循环
  PostQuitMessage(0) ;
  return 0 ;
 }
 
 // 将我们不处理的消息交给系统做默认处理
 return DefWindowProc(hwnd, message, wParam, lParam);
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过以下步骤来修改代码,使得前面的圆不会因为后面的圆而消失: 1. 在CMyView类的头文件中声明一个std::vector<CPoint>类型的变量points,用于存储圆心的坐标。 2. 在OnLButtonDown函数中,将圆心的坐标存储到points向量中,并在绘制圆形时使用该坐标。 3. 在rise函数中,遍历points向量中的所有元素,分别更新每个圆形的位置。 4. 在OnTimer函数中,调用rise函数,然后重绘窗口。 下面是修改后的代码: MyView.h文件: ``` #pragma once #include <vector> class CMyView : public CView { protected: DECLARE_DYNCREATE(CMyView) CPoint center; COLORREF color; int r; CBrush br; CDC* pDC; std::vector<CPoint> points; // 新增的变量 public: CMyView(); virtual ~CMyView(); void rise(); protected: afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnTimer(UINT nIDEvent); DECLARE_MESSAGE_MAP() }; ``` MyView.cpp文件: ``` void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { center = point; color = RGB(rand() % 256, rand() % 256, rand() % 256); r = rand() % 20 + 5; br.CreateSolidBrush(color); pDC = GetDC(); pDC->SelectObject(&br); pDC->Ellipse(center.x - r, center.y - r, center.x + r, center.y + r); br.DeleteObject(); points.push_back(center); // 将圆心坐标存储到points向量中 CView::OnLButtonDown(nFlags, point); } void CMyView::rise() { for (auto& pt : points) // 遍历points向量中的所有元素 { pt.y -= 5; // 更新每个圆形的位置 br.CreateSolidBrush(color); pDC = GetDC(); pDC->SelectObject(&br); pDC->Ellipse(pt.x - r, pt.y - r, pt.x + r, pt.y + r); br.DeleteObject(); } } void CMyView::OnTimer(UINT nIDEvent) { rise(); // 调用rise函数 RedrawWindow(); // 重绘窗口 CView::OnTimer(nIDEvent); } ``` 这样,前面的圆形就会继续向上运动,而不会因为后面的圆形而消失。请注意,由于我们使用了std::vector来存储圆心坐标,因此需要在头文件中引入<vector>头文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值