目录
1.对话框创建
(1)在资源视图->创建对话框文件,可以修改ID、双击创建对话框类Setup;
(2)在主菜单->新建项目子菜单->右击创建view事件 “CLwj1View::OnFileSetup()”。
2.给予用户选择
(1)提示框static text 和文本编辑框 Edit text;
给控件添加变量,UINT型、m_nLineWidth; 在对话框类生成该成员、并生成函数void Setup::DoDataExchange(CDataExchange* pDX)//变量和控件数据交换。
然后在view类新建成员变量int m_nLineWidth, 对话框输入的值传递到 view界面的值。
只有conf.DoModal()才能显示对话框。 IDOK模式对话框,必须交互选择确认才执行。
void CLwj1View::OnFileSetup()
{
Setup conf;
conf.m_nLineWidth = m_nLineWidth;
if (IDOK == conf.DoModal()) {
m_nLineWidth = conf.m_nLineWidth;
m_nLineStyle = conf.m_nLineStyle;
m_color = conf.m_color;
}
// TODO: 在此添加命令处理程序代码
}
(2)滑动空间slide control.也是添加变量,要及时更新实例大小添加方法:
void Setup::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: 在此添加消息处理程序代码和/或调用默认值 Invalidate(); CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar); }
(3)按钮选择控件:范围控件group box,拖动三个Radio button,并设置group为true,添加控件关联的变量:m_nLineStyle;
(4)颜色:添加button(颜色,双击添加事件),Invalidate让窗口内容无效。
void Setup::OnBnClickedButton1()
{
CColorDialog colDlg; //颜色对话框对象
colDlg.m_cc.Flags = CC_RGBINIT; //m_cc记住上次选的颜色
if (IDOK == colDlg.DoModal()) {
m_color = colDlg.m_cc.rgbResult;
Invalidate(); //更改颜色后重新画
}
// TODO: 在此添加控件通知处理程序代码
}
(5)示例生成:
注意添加updateDate()才能一直同步刷新;
获得对话框控件方法:GetDlgItem(ID) ->GetWindowRect(&rect)在生成矩形
Window坐标转化客户端坐标:ScreenToItem(&rect)
void Setup::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CDialogEx::OnPaint() //回一条线 UpdateData(); //同步成员变量和控件 CPen pen(m_nLineStyle, m_nLineWidth, m_color); CPen *pOldPen = dc.SelectObject(&pen); //获得控件的坐标信息 CRect rect; //创建矩形 GetDlgItem(IDC_SAMPLE)->GetWindowRect(&rect); ScreenToClient(&rect); dc.MoveTo(rect.left + 20, rect.top + rect.Height() / 2); //花在中间 dc.LineTo(rect.right - 20, rect.top + rect.Height() / 2); dc.SelectObject(pOldPen); }
(6)项目结果
3.重绘图像:解决缩放屏幕画的内容没有了
(1)元文件重绘;
(2)兼容设备重绘:①创建设备成员变量:CDC m_dcCompatible';
②写到兼容设备:
void Lwj1::ButtonDown() {
//在第一次点击时初始化
if(!m_dcCompatible.m_hDC) { //只初始化一次
CRect rect;
GetClientRect(&rect); //获得客户区屏幕大小
m_dcCompatible.CreateCompatibleDC(&dc); //开始创建是一个像素*一个像素大小
CBitmap bitmap; //创建兼容bitmap
bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
m_dcCompatible.SelectObject(&bitmap);//兼容上下文替换原有dc
m_dcCompatible.FillSolidRect(&rect,RGC(255m255,255));//白色替换默认黑色背景
}
}
//所有的dc可以替换为m_dcCompatible了
③将兼容设备内容映射到物理设备(屏幕):
在CPP的OnDraw函数里面,
//把兼容设备拷贝到屏幕上显示
CRect rect;
GetClientRect(&rect);
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcCompatible, 0, 0, SRCCOPY);
(3)自定义重绘:保留在CArray<Graph*> m_pGraphs; //存储所有绘图信息(view.h里面)
每次绘图在draw函数里面再绘制出来
①创建图形类:class Graph :
public CObject{
public:
UINT m_nDrawType; //绘画类型
UINT m_nLineStyle; //
UINT m_nLineWidth; //宽度
COLORREF m_color;
CArray<CPoint> m_Points; //添加数组模板
}
②注意局部变量可能出错,用堆保存,记得释放;
③CArray模板数组对象,可以是任何类型。缩放图形保存了。
4.文件读写
(1)
void CLwj1View::OnFileWrite() { CStrin g hello=_T("Hellp world!"); //打开文件对话框,写读为true CFileDialog fileDlg(FALSE); if(IDOK == fileDlg.DoModal()) { //获取文件名 CString path = fileDlg.GetPathName(); //打开文件,写模式+创建 CFile file(path, CFile::modeWrite | CFile::modeCreate); //写入 int len = hello.GetLength() * sizeof(TCHAR); file.Write(hello, len); //关闭 file.Close(); } }
(2)读文件
void CLwj1View::OnFileRead() { // TODO: 在此添加命令处理程序代码 CFileDialog fileDlg(TRUE);//读是true if (IDOK == fileDlg.DoModal()) { CString path = fileDlg.GetPathName(); //获取文件路径 CFile file(path, CFile::modeRead); //打开文件 TCHAR* pBuf; //准备缓冲区 int cnt = file.GetLength(); int chars = cnt / sizeof(TCHAR); //转换unocode码 pBuf = new TCHAR[chars + 1]; file.Read(pBuf, cnt); pBuf[cnt] = 0; //最后一个字符填充为0 MessageBox(pBuf); file.Close(); delete[] pBuf; } }
5.序列化CArchive
(1) 把对象数据通过二进制格式存储,防止程序关闭数据丢失;
(2)条件:是CObject派生类、有无参构造函数、在类里申明 DECLARE_SERIAL(Graph); //宏说明类、在类cpp 文件引用:IMPLEMENT_SERIAL(Graph, CObject, 1); //版本号
使用:(1)对类Graph在类向导创建虚函数Serilize,存入数据
void Graph::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
ar << m_nDrawType << m_nLineStyle << m_nLineWidth << m_color;
}
else
{ // loading code,读出来
ar>> m_nDrawType >> m_nLineStyle >> m_nLineWidth >> m_color;
}
m_Points.Serialize(ar); //CArray数组模板以及实现序列化
}
(2)在doc.cpp再对数据显示:
//先添加LwjView.h头文件
void CLwj1Doc::Serialize(CArchive& ar)
{
//doc类取数据
POSITION pos = GetFirstViewPosition(); //获得第一个类视图
CLwj1View* pView = (CLwj1View*)GetNextView(pos); //由View.h创建对象
int cnt = pView->m_pGraphs.GetSize(); //取出大小
if (ar.IsStoring())
{
//存储长度
ar << cnt;
for (int i = 0; i < cnt; i++) {
ar << pView->m_pGraphs.GetAt(i);
}
// TODO: 在此添加存储代码
}
else
{
ar >> cnt; //读取长度
for (int i = 0; i < cnt; i++) {
Graph* ph; //一次读数据,加入到数组
ar >> ph;
pView->m_pGraphs.Add(ph);
}
// TODO: 在此添加加载代码
}
}
//CObArray 替换CArray doc文件直接pView->m_pGraphs.Serilize(ar);