阅读本文前,我们假设您已经: 1,知道如何创建一个单文档的App Wizard 2,知道C++ 类、函数重载等简单知识 3,知道如何给View类或者Doc文档添加成员变量 4,会用MFC的IDE调试工具最好,那么本文的程序您可以copy去调试 5,知道如何为某个框架类添加虚函数或消息处理函数 添加对话框,再用ClassWizard添加new class之后,出现找不到类的提示,可以删除.clw文件,重编译即可 一、绘制图形 CClientDC dc(this); CPen pen(PS_SOLID,1,RGB(255,0,0)); dc.SelceObject(&pen); //此处可以调用函数进行绘制了 dc.SetPixel(point,RGB(255,0,0)); dc.MoveTo();dc.LineTo();dc.Rectangle() 二、透明画刷 在绘图前添加 CBrush *pBrush=CBrush::FromHandle(GetStockObject(NULL_BRUSH)); dc.SelctObject(pBrush); 三、颜色对话框 数据m_cc CColorDialog dlg; dlg.m_cc.Flags|=CC_RGBINIT;//可以再|CC_FULLOPEN,但不能写成dlg.m_cc.Flags=CC_RGBINIT; dlg.m_cc.rgbResult=m_clr; if(IDOK==dlg.Domodal()) m_clr=dlg.m_cc.rgbResult; 四、字体对话框 数据成员m_cf CFont m_font; CString m_strFontName; CFontDialog dlg; if(IDOK==dlg.Domodal()) { m_font.CreateFontIndirect(dlg.m_cf.lpLogFont); -----1 m_strFontName=dlg.m_cf.lpLogFont->lfFaceName; Invalidate(); } 在OnDraw()中添加 CFont *pOldFont=pDC->SelectObject(&m_font); pDC->TextOut(0,0,m_strFontName); pDC->SelectObject(pOldFont); 运行,第二次选择字体时出错(二次初始化),将上面程序语句1修改为 if(m_font.m_hObject)m_font.DeleteObject(); m_font.CreateFontIndirect(dlg.m_cf.lpLogFont);
控件和成员变量关联时 控件值=>成员变量 UpdateData(); 成员变量可以直接赋值给控件并显示
五、对话框背景色 1,消息WM_CTLCOLOR 添加WM_CTLCOLOR消息处理函数 CBrush m_brush; m_brush.CreateSolidBrush(RGB(0,255,0)); 在CXXX::OnCtlColor()中返回m_brush即可; 2,对话框上如何精确获得控件? 在CXX::OnCtlColor()中添加 1)对按静态框、组合框等可以如下 if(pWnd->GetDlgCtrID()==IDC_STATIC1) { pDC->SetTextColor(RGB(255,0,0)); pDC->SetBkMode(TRANSPARENT);//设置文字的背景色 return m_brush; } 2)对文本框(单行编辑控件)如下 if(pWnd->GetDlgCtrID()==IDC_EDIT1) 3,改变静态框显示文字类型 CFont m_font; 4,OK按钮 1)在对话框类 =>Insert=>New Class添加以CButton为基类的类CTstBtn 4)将OK按钮关联CTstBtn的一个变量,并将按钮的owner_draw的选项选上。这一步就是把对话框上的控件和类关联 六、在窗口中显示位图 1,创建位图 CBitmap bm; 2,创建兼容DC CDC dcCompatible; 3,将位图选到兼容DC中 dcCompatible.SelectObject(&bm); 4,将兼容DC中的位图贴到当前DC中。 pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY); 七、窗口绘制 1,擦除背景 添加WM_ERASEBKGND消息对应的函数 在CXXXView::OnEraseBkgnd()中添加 CBitmap bm; bm.LoadBitmap(IDB_BITMAP1) 获取位图信息 //BITMAP bmp; //BitBlt函数进行1:1的拷贝函数,不能压缩或者拉伸位图 pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY); //pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); return TRUE; 并将return CView::OnEraseNkgnd(pDC);注释掉 在这里实现闪烁比较小 2,重新显示 将以上代码复制到OnDraw()函数中,也能正常显示,但是闪烁比较大 题目:创建CDialogBar并在其上放置控件,重复以上的功能,并在列表框中显示位图 |
欢迎以任何形式转载本文,只要对您有用 |
韦伯主页: http://mail.ustc.edu.cn/~bywang(提供此笔记系列相关源程序下载) 韦伯Blog: http://webbery.tianyablog.com |
参考书目和网站: |
(1)孙鑫VC++视频 |
(2)1-6章主要参考: hbyufan的BLog |
(3)11-20章主要参考: songpeng的Blog |