对于如何在SDK以及单文档界面的用户区上画图,介绍得都比较多,其实最关键的就是要获得DC,然后就可以调用GDI函数来在与DC关联的环境上画图了。
现在要想在对话框上画图,最关键的问题就是先用何种控件,以及如何获得该与控件相关的DC。
我比喜欢用Picture控件,其实静态文本框控件也可以,但总觉得前都要专业一点。在Picture的Properties里面的General选项卡里面的Rectangle组合框里面选择Rectangle然后Color选择White,这样是不是就有一点单文档界面的味道了。把它的ID改为IDC_STATIC_PICTURE,为什么要改呢?下面再说。
那么如何在上面画图呢?
我们添加一个按钮,并在它的响应函数里面添加上
CClientDC dc(GetDlgItem(IDC_STATIC_PICTURE)); // 获得控件的CWnd,之所以要把ID改为IDC_STATIC_PICTURE就是为了与其它静态控件区别出来
dc.MoveTo(0,0);
dc.LineTo(30,30);
这些处理方式与单文档的处理方式基本上是一样的。然后编译运行就OK了
在画图过程中也可能会遇到一些问题:
1.控件上绘好图之后,鼠标移上去停留两秒之后,会出现一条白线, 这是由于你开了金山词霸或有道词典等桌面工具的缘故。
2.被其它窗口挡住并移开之后,变成空白, 原因很简单窗口要重绘,但是到哪重绘呢?到对话框的WM_PAINT消息所对应的OnPaint函数里面去。
以上来自网友的参考:
在wince平台上,本人使用picture控件绘图没有实现,好像是不支持。
在静态文本控件上的绘图,代码如下:(将如下代码放到按钮的单击事件中,添加一个静态文本控件ID 值是IDC-SS)
PAINTSTRUCT ps;
RECT rect;
HDC hdc;
CClientDC dc(GetDlgItem(IDC_SS)); // 获得控件的CWnd
HWND hWnd=this->GetSafeHwnd();
HBRUSH hBr,hOldBr;
this->GetClientRect(&rect);
//GetClientRect(hWnd,&rect);
//BeginPaint(&ps);
hdc = *BeginPaint(&ps);
if(tag==true)
{hBr=(HBRUSH)GetStockObject(WHITE_BRUSH);
tag=false;
}
else
{
hBr=(HBRUSH)GetStockObject(DKGRAY_BRUSH);
tag=true;
}
hOldBr=(HBRUSH)SelectObject(dc,hBr);
Ellipse(dc,10,10,80,80);
SelectObject(dc,hOldBr);
EndPaint(&ps);
本人运行通过。
有不对的地方请指点,谢谢!