2015-12-21 56 views
1

下面的代码是在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); 

但是当我运行它,只显示一个白色矩形到父窗口中,矩形既没有黑色笔刷,也没有任何文字。

你能告诉我我错在哪?

+2

您似乎无法理解Windows桌面应用程序的运行方式。有关快速介绍,请参阅[演练:创建Windows桌面应用程序(C++)](https://msdn.microsoft.com/zh-cn/library/bb384843.aspx)。这不是真正的学习材料的替代品。考虑获取Jeffrey Richter的[编程Windows®,第五版(开发人员参考)](http://www.amazon.com/dp/157231995X)的副本。 – IInspectable

+0

你也有资源泄漏和'p [3] .x'无效 –

+0

@BarmakShemirani这不是资源泄漏;这是无效的索引导致缓冲区溢出。有一个资源泄漏,刷没有被破坏。 – andlabs

回答

1

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

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

+0

谢谢,它现在显示的文字。但不是三角形。可以建议我应该如何绘制三角形? –

+0

您忘了选择由'CreateSolidBrush()'创建的笔刷到DC中。参见['SelectObject()'](https://msdn.microsoft.com/en-us/library/windows/desktop/dd162957%28v=vs.85%29.aspx)。 – andlabs

1

有几个问题,除了没有使用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()调用中使用的画笔执行此操作。

+0

错字:应该是'DeleteObject'而不是'DestroyObject' –

+0

@BarmakShemirani修复,谢谢。 – andlabs

相关问题