在OnDraw()中调用GetClientRect()为一个RECT结构赋值,结果得到的RECT为空
本来的目的是想在弹出的对话框中画图,发现刷新后没有图形后在OnDraw()中加入了重绘图形的代码,但是发现在刷新的时候还是没有图形,个人认为可能是因为从GetClientRect得到的RECT结构为空(RECT用来装载对话框的客户区,即其所在区域),但不知应该如何修改。请大虾们看看应该如何修改,或者如果原因不在于RECT为空,应该如何修改
代码如下:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CImage &img=pDoc->m_image ;
CRect r;
r.left =0;r.top =0;
r.right =img.Width();
r.bottom =img.Height();
img.DrawToHDC(pDC->GetSafeHdc (),r);
extern color;
if(color!=0)
{
//if(viewdialog!=NULL)
CRect picrect;
this->GetClientRect(&picrect);
PAINTSTRUCT pts;
CDC * cdc=BeginPaint(&pts);
HDC hdc=cdc->GetSafeHdc ();
HBRUSH hbrush;
HPEN hpen;
hpen=(HPEN)GetStockObject(BLACK_PEN);
hbrush=(HBRUSH)GetStockObject(BLACK_BRUSH);
SelectObject(hdc,hpen);
SelectObject(hdc,hbrush);
Rectangle(hdc,picrect.left ,picrect.top ,picrect.right,picrect.bottom);
..............(以下代码省略)
注:color是用来判断对话框是否存在的标志,从目前的调试看来它是有效的,即没有显示图形不是color的原因
请大虾指教,多谢!
本来的目的是想在弹出的对话框中画图,发现刷新后没有图形后在OnDraw()中加入了重绘图形的代码,但是发现在刷新的时候还是没有图形,个人认为可能是因为从GetClientRect得到的RECT结构为空(RECT用来装载对话框的客户区,即其所在区域),但不知应该如何修改。请大虾们看看应该如何修改,或者如果原因不在于RECT为空,应该如何修改
代码如下:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CImage &img=pDoc->m_image ;
CRect r;
r.left =0;r.top =0;
r.right =img.Width();
r.bottom =img.Height();
img.DrawToHDC(pDC->GetSafeHdc (),r);
extern color;
if(color!=0)
{
//if(viewdialog!=NULL)
CRect picrect;
this->GetClientRect(&picrect);
PAINTSTRUCT pts;
CDC * cdc=BeginPaint(&pts);
HDC hdc=cdc->GetSafeHdc ();
HBRUSH hbrush;
HPEN hpen;
hpen=(HPEN)GetStockObject(BLACK_PEN);
hbrush=(HBRUSH)GetStockObject(BLACK_BRUSH);
SelectObject(hdc,hpen);
SelectObject(hdc,hbrush);
Rectangle(hdc,picrect.left ,picrect.top ,picrect.right,picrect.bottom);
..............(以下代码省略)
注:color是用来判断对话框是否存在的标志,从目前的调试看来它是有效的,即没有显示图形不是color的原因
请大虾指教,多谢!
解决方案 »
- CTabCtrl的使用问题
- 如何用echo 执行一注册表.然后删除注册文件?
- 请教 功能较多的软件,界面,以及内部逻辑组织方式?
- 散分:datagrid不好用,改用ListCtrl!
- 为什么我的TerminateProcess无法结束进程?
- 帮忙up也送分:大家如何在程序代码里执行命令窗口里的命令呢?
- 关于OICQ穿透防火墙原理的讨论。请大家进来看看。
- 请问如何获得Edit中的字符串?
- 为什么在debug中明明某个double类型变量a的值是123.4,而表达式a==123.4及a>=123.4都返回false?
- 怎样用ATL编带Picture属性的COM
- 我自定义了一个子窗口,为什么不执行DrawItem啊,该如何处理啊
- 关于list box数据显示的问题
==你这想法都有问题。在对话框中画图,你在视图类的OnDraw中加图形绘制程序干啥呢?
你调用BeginPaint完后,要调用EndPaint(&ps);
且不能在调用系统默认产生的CView::OnPaint();
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CImage &img=pDoc->m_image ;
CRect r;
r.left =0;r.top =0;
r.right =img.Width();
r.bottom =img.Height();
img.DrawToHDC(pDC->GetSafeHdc (),r);
extern color;
if(color!=0)
{
//if(viewdialog!=NULL)
CRect picrect;
viewdialog->GetWindowRect(&picrect);
HWND hwnd=viewdialog->m_hWnd;
HDC hdc = ::GetDC(hwnd);
HBRUSH hbrush;
HPEN hpen;
hpen=(HPEN)GetStockObject(BLACK_PEN);
hbrush=(HBRUSH)GetStockObject(BLACK_BRUSH);
SelectObject(hdc,hpen);
SelectObject(hdc,hbrush);
//ScreenToClient(&picrect);
Rectangle(hdc,picrect.left,picrect.top,picrect.right,picrect.bottom);
DeleteObject(hpen);
DeleteObject(hbrush);
::ReleaseDC(m_hWnd, hdc);
if(0)
{
IplImage * image= img.GetImage();
CRect picrect;
viewdialog->GetWindowRect(&picrect);
//this->GetClientRect(&picrect);
PAINTSTRUCT pts;
CDC * cdc=BeginPaint(&pts);
HDC hdc=cdc->GetSafeHdc ();
HBRUSH hbrush;
HPEN hpen;
HPEN hpe;
HBRUSH hbr;
hpen=(HPEN)GetStockObject(BLACK_PEN);
hbrush=(HBRUSH)GetStockObject(BLACK_BRUSH);
hpe=(HPEN)GetStockObject(WHITE_PEN);
hbr=(HBRUSH)GetStockObject(WHITE_BRUSH); 添加ScreenToClient(&picrect);
则在指定的位置显示矩形,但是完全被对话框挡住
猜想是因为m_hWnd的原因,但是
将m_hWnd改为HWND hwnd=viewdialog->m_hWnd;
HDC hdc = ::GetDC(hwnd);
则根本不显示矩形
继续等高手