在哪里定义PAINTSTRUCT以及为什么要定义HDC?

Cub*_*i73 2 c++ memory winapi hdc

我的问题很简单,也不是很重要.

  1. 我开始学习编写Win32应用程序.当我从其他人那里读取代码时,我经常会看到他们PAINTSTRUCT ps;在switch语句之前放入WndProc.他们为什么不把这个问题放进去WM_PAINT?他们为内存分配ps,然后不使用它?

  2. 我总是看到PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps);.但我检查了ps.hdc多次的值,ps.hdc并且hdc每次的值都相等.还有其他原因可以定义hdc可读性或编写更少的代码吗?

(对不起,如果我的英语不好而问题不属于这个社区的水平)

Ski*_*izz 5

回答第1点:Win32 API是为C设计的(它已经很老了)并且放在语句PAINTSTRUCT ps;内部case需要放入case内部大括号的内容,{}因为C不允许内联声明.C++也可能在case没有大括号的语句中声明变量的问题- 在不调用构造函数的情况下调用析构函数.你会很快发现这种switch() case...风格会变得难以维护,这个功能会变得非常庞大和笨拙,并且它不能像Intellisense那样很好地运行.通常,您会看到开发人员使用地图将功能与特定消息相关联: -

WindowProc (args)
{
  func_ptr = some_map.GetValue (message_type)
  if func_ptr not null
    call func_ptr
  else
    DefWindowProc (args)
}
Run Code Online (Sandbox Code Playgroud)

至于第2点,当出现错误时,它的值hdc将变得null更清晰,hdc而不是使用ps.hdc.此外,hdc更容易传递到其他功能而不是ps.但除此之外,文档没有说明为什么ps.hdc会有不同的结果BeginPaint.