GE宏指令将消息映射到消息处理函数中。
22、简述模态对话框与非模态对话框的区别?
答:
(1). 模式对话框就是不处理它就没法处理父窗口,而非模式对话框就是不用先处理此对话框也可以处理父窗口.
(2). 模式对话框一般是使用DoModal,而非模式对话框的创建则是使用Create。
(3). 模式对话框的销毁是使用EndDialog,而非模式对话框的销毁是使用DestroyWindow。
二、编写程序(编程题已经打包上传, 点击下载)
1、编写一个应用程序,使用CDC类的TextOut函数在屏幕坐标(100,100)的位置输出“Hello World”字符串?
答:在于OnDraw函数中写入如下代码:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(100,100,"Hello World");
}
答:已做
2、编写一个单文档应用程序,程序启动后在用户区显示一个矩形,当用鼠标左键单击用户区后,该矩形变成椭圆形,如果再单击则变成矩形,以此循环。
答:(1)在视图类声明定义成员变量
private:
CRect m_rectRec;
BOOL m_bKey;
(2)在视图类的构造函数中对成员变量进行初始化
CMyView::CMyView()
{
m_bKey=FALSE;
m_rectRec.left=100;
m_rectRec.top=100;
m_rectRec.bottom=400;
m_rectRec.right=400;
}
(3)在视图类鼠标左键按下消息中添加相应代码:
void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
if(m_bKey)
m_bKey=FALSE;
else
m_bKey=TRUE;
InvalidateRect(m_rectRec);
CView::OnLButtonDown(nFlags, point);
}
(4)在视图类的OnDraw函数中添加相应代码:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(m_bKey)
pDC->Ellipse(m_rectRec);
else
pDC->Rectangle(m_rectRec);
}
答:已做
3、编写一个单文档应用程序,程序启动后在用户区显示一个椭圆形,每单击鼠标左键一次则圆的颜色会变化一次。
答:(1)在视图类声明定义成员变量
private:
int m_clr1;
int m_clr2;
int m_clr3;
(2)在视图类的构造函数中对成员变量进行初始化
CCIRCLEView::CCIRCLEView()
{
m_clr1=255;
m_clr2=255;
m_clr3=255;
}
(3)在视图类鼠标左键按下消息中添加相应代码:
void CCIRCLEView::OnLButtonDown(UINT nFlags, CPoint point)
{
if(m_clr1>10)
{
m_clr1-=10;
m_clr2-=10;
m_clr3-=10;
}
else
{
m_clr1=255;
m_clr1=255;
m_clr1=255;
}
InvalidateRect(NULL);
CView::OnLButtonDown(nFlags, point);
}
(4)在视图类的OnDraw函数中添加相应代码:
void CCIRCLEView::OnDraw(CDC* pDC)
{
CCIRCLEDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
COLORREF clr=RGB(m_clr1,m_clr2,m_clr3);
CBrush newBrush(clr);
CBrush *oldBrush=pDC->SelectObject(&newBrush);
pDC->Ellipse(20,20,200,200);
pDC->SelectObject(oldBrush);
}
答:已做
4、简单的计算程序界面如下图所示,操作数1对应编辑框控件的ID为 IDC_EDIT1,对应值类型的成员变量m_op1(int);操作数2对应编辑框控件的ID为IDC_EDIT2,对应值类型的成员变量m_op2(int);计算结果对应的编辑框控件的ID 为IDC_EDIT3,对应值类型的成员变量m_result(int)。 假设输入的数为整数,加法按钮的功能是将两操作数相加,并将结果在对应的编辑框IDC_EDIT3显示出来。写出加法按钮对应的代码。
void CExDlg::OnButton1()
{
UpdateDate(TRUE); //此处是UpdateData(TRUE);
m_result = m_op1 + m_op2;
UpdateDate(FALSE);
}
void CExDlg::OnButton2()
{
UpdateDate(TRUE);
m_result = m_op1 - m_op2;
UpdateDate(FALSE);
}
答:已做
5、下面是一个基于对话框的应用程序,用来求解一元二次方程的根。当用户在A、B、C 三个编辑框中输入3个参数后,单击【计算】按钮,将显示出该方程的根。
各控件对应的成员变量见下表:
控件ID号 |
变量类型 |
变量名 |
IDC_A_EDIT |
int |
m_a |
IDC_B_EDIT |
int |
m_b |
IDC_C_EDIT |
int |
m_c |
IDC_X1_EDIT |
CString |
m_x1 |
IDC_X2_EDIT |
Cstring |
m_x2 |
试写出计算按钮的单击消息处理函数。
答:void CEx6_1Dlg::OnButton1()
{
UpdateData();
double disc;
disc=(double)(m_b*m_b-4*m_a*m_c);
if ( fabs(disc)<=1e-6 ) //如果disc等于0
{ m_x1.Format("x1=%6.2f ",-m_b/(2*m_a));
m_x2.Format("x2=%6.2f ",-m_b/(2*m_a));
}
else if ( disc>1e-6 ) //如果disc大于0
{ double x1,x2;
x1=(-m_b-sqrt(disc))/(2*m_a);
x2=(-m_b+sqrt(disc))/(2*m_a);
m_x1.Format("x1=%6.2f",x1);
m_x2.Format("x2=%6.2f",x2);
}
else //如果disc小于0
{
double realpart,imagpart;
realpart=-m_b/(2*m_a);
imagpart=sqrt(-disc)/(2*m_a);
m_x1.Format("x1=%6.2f+%6.2fi",realpart,imagpart);
m_x2.Format("x2=%6.2f-%6.2fi",realpart,imagpart);
}
Upd