问一个在子窗口画图的问题

时间:2008-06-20 13:46:30   来源:论坛整理  作者:  编辑:chinaitzhe
我希望在主窗口按一个按键后,出现一个在窗口A,然后选择其中一些东西后(比如矩形或圆),点OK退出A.同时,在子窗口B中画出相应的图(矩形或圆).现在就是不能实现画图,选择A中的选项后,如何让B画出图呢?
CMyPrjDlg *pw=(CMyPrjDlg*)GetParent();
if(pw)
{
CRect myRect,drawRect;
GetClientRect(myRect);
drawRect.top =myRect.top 5;
drawRect.left =myRect.left 5;
drawRect.bottom=drawRect.top 10;
drawRect.right =myRect.right -10;
}
以上是B中的代码,现在就简单实现退出A窗口后,在B中画个矩形,对不对呢?或者是主程序中应该如何调用呢?
不知道表达清楚没有,谢谢了
网友回复:发消息来响应你选择的去画
网友回复:如何发消息来响应呢?
网友回复:画矩形的代码不全吧?? 没有看到画的函数啊..只是设置了矩形的大小..
LZ先把画矩形的函数写对了. 在本地窗口上试试, 是否可以实现点一个按钮,就在本地的窗口画一个矩形

假如想在A中让B 画窗口, 可以这么做~~
当A中的选好所画图形后,给窗口B发个小时
如:
SendMessage函数, LZ可以去MSDN上看看这个函数如何使用, 消息的类型话, 可以自定义一个消息名称.
然后把 图画信息作为LPARM 或者WPARM传过去.

在函数B的消息循环中接受这个消息,去画就好了..

当然,假如你能在窗口A中 得到窗口B的对象实例..
那就在窗口A的关闭事件中直接调用B的画矩形的函数 不就好了...

不就可以实现LZ的要求了?
网友回复://自定义消息
#define WM_MYMSG WM_USER 1

//子窗口A退出的时候向窗口B发送消息,假设窗口B句柄为hwnd
SendMessage(hwnd,WM_MYMSG,0,0);

//子窗口B处理消息
//头文件里:
afx_msg long OnMyFuction(WPARAM wParam, LPARAM lParam); //申明

//cpp文件里:
BEGIN_MESSAGE_MAP
ON_MESSAGE(MYMSG, OnMyFuction)
END_MESSAGE_MAP()

void B::OnMyFuction(WPARAM wParam, LPARAM lParam)
{
// 实现画图
}
网友回复:下面是B中的画图程序,有什么错误?我是初学者,请多指教.谢谢啦
CRect myRect,drawRect;
GetClientRect(myRect);
drawRect.top =myRect.top 5;
drawRect.left =myRect.left 5;
drawRect.bottom=drawRect.top 10;
drawRect.right =myRect.right -10;
CPen mypen(PS_SOLID,1,RGB(0,0,0));
CDC *pDC=GetDlgItem(IDD_PAINTDLG)->GetDC();
GetDlgItem(IDD_PAINTDLG)->Invalidate();
GetDlgItem(IDD_PAINTDLG)->UpdateWindow();
GetDlgItem(IDD_PAINTDLG)->GetClientRect(&drawRect);
pDC->SelectObject(mypen);
pDC->Rectangle(drawRect);
网友回复:
引用 5 楼 cczzdd 的回复:
下面是B中的画图程序,有什么错误?我是初学者,请多指教.谢谢啦
CRect myRect,drawRect;
GetClientRect(myRect);
drawRect.top =myRect.top 5;
drawRect.left =myRect.left 5;
drawRect.bottom=drawRect.top 10;
drawRect.right =myRect.right -10;
CPen mypen(PS_SOLID,1,RGB(0,0,0));
CDC *pDC=GetDlgItem(IDD_PAINTDLG)->GetDC();
GetDlgItem(IDD_PAINTDLG)->Invalidate();
GetDlgItem(IDD_PAINTDLG)->Up…


函数是写在B窗体里的么? 那么就别用CDC *pDC=GetDlgItem(IDD_PAINTDLG)->GetDC();
来得到DC了.
直接this->GetDC()就可以了.
以及后面的
都直接this->调用.
另,不用调用Invalidate函数, 除非你是在onpaint里的画的,不然调用这个函数则不会显示你画的图形.
UpdateWindow也没必要调用
网友回复:我还是不明白啊,我是在B窗口中写的函数,是在onpaint中画的.用this 是什么意思,那对画笔和画刷的引用怎么办
网友回复:CMyPrjDlg *pw=(CMyPrjDlg*)GetParent();

CRect myRect,drawRect;
GetClientRect(myRect);
drawRect.top =myRect.top 5;
drawRect.left =myRect.left 5;
drawRect.bottom=drawRect.top 10;
drawRect.right =myRect.right -10;
CPen mypen(PS_SOLID,1,RGB(0,0,0));
CDC *pDC=this->GetDC();
this->Invalidate();
this->GetClientRect(&drawRect);
pDC->SelectObject(mypen);
pDC->Rectangle(drawRect);
改成上面程序后,运行,B窗口开始不停地闪动后,出现错误,终止.为什么?
网友回复:查了一下似乎是INVALIDATE的原因,可是去掉就没有图象,加上就不停地闪.如何处理?谢谢啦
网友回复:把代码全贴上来啊,至少你应该把带上类名啊,你这一段一段的谁知道你是在哪个类的啊!
网友回复:在A里面保存B的指针,就可以在B里面进行化图了,就和操作B画图一样了
网友回复:没有表达清楚,不好意思,重新说一遍.
主对话框:myprj 子对话框A,B.
其中,B是和主对话框同时出现的.
最初目的:点击一个按钮后,出现A,选择其中一些选项,比如说画个线啊,或者是矩形等等.然后在B中就相应的画出来了.
现在简化点,希望点击按钮出现A,选择其中选项(无论线还是矩形)点OK,就可在B中画个矩形出来.
书上讲的很复杂,看不懂.我想先一步一步来,不知道各位大虾看懂没有.上面的程序就是B中画矩形的程序.
A如何保存B的指针呢?
书中在点击按钮出现A的相应函数中调用了B的INVALIDATE,我模拟了一下,也不行.唉呀,郁闷死了

网友回复:因为你的A对话框点击完毕后会关闭,B窗口会重绘,即使你画了也会被刷没.
所以你在A中选择了画"线"或者画"矩形"后不应忙着用DC在B窗口中绘图
而是应该保存一个数据结构
最后在B窗口的OnPaint里面,根据数据结构来实现绘制.
假如是文档视图,数据应该保存在CDucument派生类里
假如是基于对话框,则保存在主窗口类中
关键字:一个,窗口,画图,问题,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面