【问题标题】:My code isn't enough to show a triangle我的代码不足以显示三角形
【发布时间】:2016-06-05 14:35:22
【问题描述】:

为父窗口注册类后,winmain函数中的代码如下:

RECT disrect;
HWND stat = CreateWindow("BUTTON","abcdef",
    WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,10,150,500,100,dis,0,0,0); 
HDC hdc=GetDC (stat);
FillRect(hdc,&disrect,CreateSolidBrush(RGB(3,5,54)));   
SetTextColor(hdc,RGB(25,250,250));
POINT p[3];   
p[1].x=280;
p[1].y=280;
p[2].x=280;
p[2].y=290;
p[3].x=285;
p[3].y=285;
Polygon(hdc,p,3);
TextOut(hdc,10,10,"hhhhh",5);

但是当我运行它时,只在父窗口中显示一个白色矩形,矩形既没有被黑色画笔填充,也没有任何文本。

你们能告诉我哪里错了吗?

【问题讨论】:

标签: windows winapi


【解决方案1】:

除非你想显示动画,否则你不应该尝试直接用这种方式写入窗口,因为许多事件可能会导致窗口重绘自身,从而擦除你刚刚写入的内容。

正确的方法是放在 WM_PAINT 处理程序中。

【讨论】:

  • 谢谢,它现在显示文本。但不是三角形。可以建议我应该怎么做来画一个三角形?
  • 您忘记将CreateSolidBrush()创建的画笔选择到DC中。见SelectObject()
【解决方案2】:

一些问题,除了没有使用WM_PAINT

首先,仅调用CreateSolidBrush() 不足以将该画笔标记为供您的绘图操作使用的画笔。您必须先将画笔选择为 DC (device context),然后才能使用它。这是通过SelectObject() function 完成的。一般用法看起来像

HBRUSH prevBrush;

prevBrush = SelectObject(hdc, newBrush);
// drawing functions
SelectObject(hdc, prevBrush);

是的,完成后恢复之前的刷子很重要,即使在新的 DC 上也是如此;必须恢复初始状态。初始状态使用不绘制任何内容的画笔;这就是为什么您的Polygon() 不画任何东西的原因。 SelectObject() 用于您用来绘制的所有各种东西(钢笔、字体等),而不仅仅是画笔。

其次,在 C 数组中,索引从 0 开始并转到 size - 1,而不是从 1 开始并转到 size。所以不要说pt[1]pt[2]pt[3],而是说pt[0]pt[1]pt[2]。你的编译器应该已经警告你了。

第三,as the documentation for CreateSolidBrush() 会说,一旦你用完刷子,你必须用DeleteObject() 摧毁它。您必须重新选择上一个画笔后执行此操作。您还必须使用在FillRect() 调用中使用的画笔执行此操作。

【讨论】:

  • 错字:应该是DeleteObject而不是DestroyObject
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多