{ CTESTDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
17
if ( pDoc->filename!="" )
{ HBITMAP hbitmap;
hbitmap=(HBITMAP)LoadImage(NULL,pDoc->filename,
IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
CDC m;
CRect rect;
m.CreateCompatibleDC(pDC);
GetClientRect(rect);
m.SelectObject(hbitmap);
pDC->BitBlt(20,20,rect.Width()-20,rect.Height()-20,&m,0,0,SRCCOPY);
}
}
说明:加载磁盘上的一个.bmp 文件应使用LoadImage() 。其函数原型为:
HANDLE LoadImage(HINSTANCE hinst , LPCTSTR lpszName , UINT uType , int cxDesired , int cyDesired , UINT fuLoad );
其中:hinst 可以用NULL ,lpszName 是图象在磁盘上的文件名,uType 表示图象的类型,fuLoad 的值为LR_LOADFROMFILE 表示从文件中导入位图。
颜色对话框
颜色对话框属于CColorDialog 类。其一般使用形式为:
CColorDialog dlg; // 说明dlg 为CColorDialog 类的对象
dlg.DoModal(); // 打开颜色对话框
COLORREF c= dlg. GetColor(); // 获取用户选择的颜色并赋给 c 说明:
①GetColor() 是CColorDialog 的成员函数,其返回值是用户选择的颜色。
②若用户选择了“取消”,没有选择颜色,则GetColor() 的返回值是对话框的默认值。
【例2.10】编写一个如图所示的应用程序。若用户单击左键,则弹出颜色对话框,用户选择一种颜色后就以鼠标单击处为圆心画一个圆,圆的半径随机产生。
(1)在文档类中添加三个公有的数据成员:
CRect r[100]; // 存放圆的数据
COLORREF c[100]; // 存放对应数组r 的圆的颜色
int n; // 目前圆的数量
(2)在文档类的OnNewDocument() 函数中对数据成员n 进行初始化。
18
n=0;
(3)通过“建立类向导”为视图类添加WM_LBUTTONDOWN 消息处理函数,代码: void CMy0601aView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMy0601aDoc *pDoc=GetDocument();
CColorDialog dlg;
dlg.DoModal();
pDoc->c[pDoc ->n]=dlg.GetColor();
int r=rand()%50+10;
CRect rect(point.x-r,point.y-r,point.x+r,point.y+r);
pDoc->r[pDoc->n]=rect;
pDoc->n++;
Invalidate();
CView::OnLButtonDown(nFlags, point);
}
(4)在OnDraw() 函数中,用数组 c 的颜色绘出所有的圆
void CMy0601aView::OnDraw(CDC* pDC)
{ CMy0601aDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBrush newbrush,*oldbrush;
for(int i=0;i
{ newbrush.CreateSolidBrush(pDoc->c[i]);
oldbrush=pDC->SelectObject(&newbrush);
pDC->Ellipse(pDoc->r[i]);
pDC->SelectObject(oldbrush);
newbrush.DeleteObject(); // 删除画刷
}
}
字体对话框
字体对话框属于CFontDialog 类。其一般使用形式为:
CFontDialog dlg; // 说明dlg 为CFontDialog 类的对象
dlg.DoModal(); // 打开字体对话框
LOGFONT font; // 说明font 为LOGFONT 类型结构变量
dlg.GetCurrentFont (& font ); // 把用户选择的字体送入变量font 中
COLORREF c= dlg. GetColor(); // 把用户选择的颜色赋给变量 c
Cfont cf; // 说明cf 为Cfont 类的对象
cf.CreateFontIndirect(&font); // 用font 中的数据构造字体
pDC->SelectObject(&cf); // 选用新字体
pDC->SetTextColor(); // 选用新颜色
pDC->TextOut(10,10," 同舟共济自强不息!"); // 用新的字体和颜色输出文字
19
说明:
①LOGFONT 是Visual C++ 定义的结构类型,用于存放有关字体的参数。
②GetCurrentFont () 是字体对话框的成员函数,把字体数据送入font 中。
【例2.11】编写一个如图所示的应用程序。若用户单击左键,则弹出如图所示的字体对话框,然后用用户选择的字体后输出“同舟共济自强不息!”
(1)在文档类中添加两个公有的数据成员:
public:
LOGFONT font; // 存放有关字体的数据
COLORREF c; // 存放字体颜色
(2)通过“建立类向导”为视图类添加WM_LBUTTONDOWN 消息处理函数,代码: void CMy0601aView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMy0601aDoc *pDoc=GetDocument();
CFontDialog dlg;
dlg.DoModal();
dlg.GetCurrentFont(&pDoc->font);
pDoc->c=dlg.GetColor();
Invalidate();
CView::OnLButtonDown(nFlags, point);
}
(3)在OnDraw() 函数中,用选定的颜色和字体输出文字
void CMy0601aView::OnDraw(CDC* pDC)
{ CMy0601aDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CFont cf;
cf.CreateFontIndirect(&pDoc->font);
pDC->SelectObject(&cf);
pDC->SetTextColor(pDoc->c);
pDC->TextOut(10,10,"同舟共济自强不息!");
}
20
21 调用自定义对话框
对话框是 Windows 及其应用程序的重要组成元素。 Windows 应用程序不仅可以使用通用对话框,而且还可以调用如第七章中设计的用户自定义对话框。
在文档 / 视图结构应用程序中,设计、调用用户自定义对话框的过程可分为三个阶段:
(1)设计、测试对话框;
(2)创建对话框类;
(3)使用对话框;
下面通过一个实例说明。
【例2.12】 设计一个如图所示的应用程序。若用户单击左键,则弹出输入成绩对话框,选择 OK 后平均成绩和总分在窗口的客户区输出。
(1)设计对话框
①用 AppWizard 生成 SDI 应用程序框架;
②选择“插入 | 资源”命令;
③在弹出“插入资源”对话框中,选定“ Dialog ”,然后选择“新建”;
④ 在 ResourceView 中展开 Dialog ,可以看到新增了 ID 为 IDD_DIALOG1 的资源双击该 ID ,则在窗口中间显示对话框设计界面,在这里进行对话框设计。(保留原有ok 按钮)
⑤ 测试对话框
选择“编排 |TEST ”测试对话框。若符合要求,则对话框设计就完成了
(2)创建对话框类
①若双击对话框设计界面,或在对话框设计界面的快捷菜单中选择“建立类向导”, ②选择“ Create a new class ”,选择“ OK ”。
③在 “ New Class ”对话框中输入对话框类名: CInput 。
将 5 个编辑框都连接到 int 类型的变量。
(3)调用对话框类
首先在视图类的实现文件 TESTView.cpp 中添加对话框类头文件的包含命令: #include "Input.h"
(注意,不能加在最前面,至少第三行或以后)

