MFC对话框背景---图片背景---背景色
MFC 颜色对话框 字体对话框 WM_CTLCOLOR消息总结
MFC 颜色对话框字体对话框WM_CTLCOLOR消息总结1.颜色对话框CHOOSECOLOR 结构体来设置获取颜色对话框的相关信息成员变量m_ccm_cc.rgbResult 在IDOK之后保存的是选择的颜色RGB值COLORREF choose_color;CColorDialog dlg; //创建颜色对话框dlg.m_cc.Flags|=CC_RGBINIT ;//以用户选择的颜色进行初始化颜色打开对话框dlg.m_cc.Flags|=CC_FULLOPEN; //全部打开包括用户自定义dlg.m_cc.rgbResult=choose_color; //使用我们上次选择的颜色进行初始化if(IDOK==dlg.DoModal()) //创建模态对话框{choose_color=dlg.m_cc.rgbResult; //保存颜色选择颜色选择会反映到CHOOSECOLOR结构体中的regResult变量中}2. 字体对话框CFontDialogCHOOSEFONT 结构体保存字体设置LOGFONT 结构体间接创建字体DeleteObject 删除与windows GDI 相关的所有存储这是资源CGDIObject是GDI类判断类是否与某种资源相关联我们可以判断句柄CFont m_font; //定义CFont对象CString FontName; //字体名字CFontDialog dlg; //定义CFontDialog对象if(IDOK==dlg.DoModal()) //创建模态对话框{if(m_font.m_hObject) //判断句柄是否存在m_font.DeleteObject(); //相关资源m_font.CreateFontIndirect(dlg.m_cf.lpLogFont); //通过CHOOSEFON结构体的LOGFON 成员创建字体FontName=dlg.m_cf.lpLogFont->lfFaceName; //字体名字Invalidate(); //引起窗体无效重画进入OnDraw函数4. GetWindowRect 是获取到屏幕矩形区域的我们获取控件矩形要用GetClientRect 来获得SCreenToClient() 屏幕坐标转换到客户坐标ClientToSCreen() 客户坐标转换成屏幕坐标5.WM_CTLCOLOR 消息响应我们可以通过这个消息函数来设置控件的背景颜色函数必须返回一个画刷这个函数被调用多次每次对应一个控件afx_msg HBRUSH OnCtlColor(CDC* pDC, //控件设备描述CWnd* pWnd, //指向控件的指针UINT nCtlColor ); //控件的类型CWnd::GetDlgCtrlID() //CWnd类的成员函数通过对象来获取一个控件的ID 包括对话框ID 子窗口顶层窗口返回值无效CDC::SetBkMode(TRANSPARENT)设置背景模式。
MFC-显示对话框背景
一、创建MFC首先创建一个MFC对话框应用程序(Dialog-based Application)如下:在VS2005和2008里,我们可以用一个 Solution 来组合几个 Project (每个Project 基本上只包含一个 Program),当我们要构建一个多Program的应用时(例如一个客户端程序加一个服务器应用程序),利用 Solution 可以将这些Projects 组合起来、并且共享文件和函数库。
通常需要为Solution创建一个主路径,其中包含了所有Projects的路径。
不过在这篇文章里,我们只构建一个简单的Project,所以在创建MFC的New Project对话框里,不用勾选“Create directory for solution”这个选项。
点击OK -- Next进入下一步,在这里我们创建一个Dialog-based Application,大部分选项按默认设置就行,不过最下面的“Use Unicode libraries”最好去掉。
如果勾选了这个选项,程序代码就会使用16bit的Unicode字符集来编码,但是很多函数虽然使用 char* (ASCII stings) 类型字符,而将字符串从Unicode 转换到 ASCII 是非常麻烦的。
使用 Unicode 在编译时可能会遇到下列错误:cannot convert parameter 1 from 'CString' to 'const char *'cannot convert from 'const char [11]' to 'LPCWSTR'这意味着在Unicode和Multi-byte字符串的转换中出现了问题。
在上一篇学习笔记中,就提到“成员函数LoadBMP其输入参数类型应为const char*”,那应该只是一个治标的方法,这里的去掉“Use Unicode libraries”选项,才是治本之道。
Visual C++调整对话框背景颜色代码
【例Ex_BkColor 】调整对话框背景颜色① 用MFC AppWizard(exe)创建一个默认的对话框应用程序Ex_BkColor 。
② 将对话框的标题设为“调整对话框背景颜色”。
删除“TODO: 在这里设置对话控制。
”静态文本控件和[取消]按钮,将[确定]按钮标题改为“退出”。
③ 打开对话框网格,调整对话框大小为,参看图11.38的控件布局,添加如表11.19所示的一些控件。
表11.19 对话框添加的控件 添加的控件 ID 标识符标 题 其他属性 水平滚动条IDC_SCROLLB—— 默认 滑动条(绿色) IDC_SLIDER_G—— 默认 滑动条(蓝色) IDC_SLIDER_B —— 默认④ 打开ClassWizard 的Member Variables 页面,选中所需的控件ID 标识符,双击鼠标。
依次添加下列控件变量,如表11.20所示。
表11.20 控件变量 控件ID 标识符变量类别 变量类型变量名 范围和大小 IDC_SCROLLBAR_REDControlCScrollBar m_scrollRe d —— IDC_SLIDER_GREEN ControlCSliderCtrl m_sliderGr een ——IDC_SLIDER_GREENValue int m_nGreen IDC_SLIDER_BLUE Control CSliderCtrlm_sliderBlue——IDC_SLIDER_BLUEValue int m_nBlue ——⑤为CEx_BkColorDlg类添加两个成员变量,一个是int型m_nRedValue,用来指定RGB中的红色分量,另一个是画刷CBrush 类对象m_Brush,用来设置对话框背景所需要的画刷。
在OnInitDialog中添加下列初始化代码:BOOL CEx_BkColorDlg::OnInitDialog(){CDialog::OnInitDialog();…// TODO: Add extra initialization herem_scrollRed.SetScrollRange(0, 255);m_sliderBlue.SetRange(0, 255);m_sliderGreen.SetRange(0, 255);m_nBlue = m_nGreen = m_nRedValue = 192;UpdateData( FALSE );m_scrollRed.SetScrollPos(m_nRedValue);return TRUE; // return TRUE unless you set the focus to a control}⑥用MFC ClassWizard为CEx_BkColorDlg类添加WM_HSCROLL消息映射,并添加下列代码:void CEx_BkColorDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){int nID = pScrollBar->GetDlgCtrlID();// 获取对话框中控件ID值if (nID == IDC_SCROLLBAR_RED) { // 若是滚动条产生的水平滚动消息switch(nSBCode){case SB_LINELEFT: m_nRedValue--;// 单击滚动条左边箭头break;case SB_LINERIGHT: m_nRedValue++;// 单击滚动条右边箭头break;case SB_PAGELEFT: m_nRedValue -= 10;break;case SB_PAGERIGHT: m_nRedValue += 10;break;case SB_THUMBTRACK: m_nRedValue = nPos;break;}if (m_nRedValue<0) m_nRedValue = 0;if (m_nRedValue>255) m_nRedValue = 255;m_scrollRed.SetScrollPos(m_nRedValue);}Invalidate(); // 使对话框无效,强迫系统重绘对话框CDialog::OnHScroll(nSBCode, nPos, pScrollBar);}⑦用MFC ClassWizard为CEx_BkColorDlg类添加WM_CTLCOLOR消息映射,并添加下列代码:HBRUSH CEx_BkColorDlg::OnCtlColor(CDC* pDC,CWnd* pWnd, UINT nCtlColor){UpdateData(TRUE);COLORREF color = RGB(m_nRedValue, m_nGreen, m_nBlue);m_Brush.Detach(); // 使画刷和对象分离m_Brush.CreateSolidBrush(color); // 创建颜色画刷pDC->SetBkColor( color ); // 设置背景颜色return (HBRUSH)m_Brush; // 返回画刷句柄,以便系统使此画刷绘制对话框}代码中,COLORREF是用来表示RGB颜色的一个32位的数据类型,它是Visual C++中一种专门用来定义颜色的数据类型。
MFC中改变对话框背景的几个消息函数OnEraseBkgnd、 OnPaint、 OnCtlColor的调用顺序
MFC中改变对话框背景的几个消息函数OnEraseBkgnd、OnPaint、OnCtlColor的调用顺序设置对话框背景颜色及背景图片可在OnCtlColor(),OnEraseBkgnd(),OnPaint()里设置,对话框初始化完毕,显示时调用OnSize()->OnEraseBkgnd(),->OnPaint()->OnCtlColor(), 若想改变对话框大小,比如全屏显示ShowWindow(SW_SHOWMAXIMIZED);UpdateWindow();其中ShowWindow会调用OnSize()->OnEraseBkgnd(),UpdateWindow();调用OnPaint()->OnCtlColor(),若对话框中没有设置消息响应OnEraseBkgnd(),,则系统默认消息响应OnEraseBkgnd()会调用OnCtlColor()设置对话框背景(即替代OnEraseBkgnd())对话框的背景设置可在OnCtlColor()中进行,因为OnCtlColor()一般会被多次调用,所以要想设置的CFont,CBrush等应在OnInitDialog中初始化,若要在OnCtlColor()中设置,在设置前先调用Detach就可以了,如下示例HBRUSH CDb3Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){if(pWnd->GetDlgCtrlID()==IDC_STATIC5){m_font.CreatePointFont(300,"宋体");pDC->SelectObject(&m_font);m_font.Detach();pDC->SetBkMode(TRANSPARENT);return (HBRUSH)::GetStockObject(NULL_BRUSH);}}但是如果在OnCtlColor()在设置背景图片,则图片不会随对话框大小按比例缩放所以可调用StretchBlt()函数设置,如下示例:void CDb3Dlg::OnPaint(){CClientDC cdc(this); CDC comdc;comdc.CreateCompatibleDC(&cdc);CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP2);comdc.SelectObject(&bitmap);CRect rect;GetClientRect(rect);BITMAP bit;bitmap.GetBitmap(&bit);cdc.StretchBlt(0,0,rect.Width(),rect.Height(),&comdc,0,0,bit.bmWidth,bit.bmHeight,SRCCOPY);}//全屏显示对话框背景图片(限bmp格式)用了两年的VC,其实对OnPaint的工作原理一直都是一知半解。
MFC中添加背景图片
方法一:1、声明成员变量CBrush m_brush;2、在InitDialog中添加代码:3、重载对话框的OnCtlColor,改最后的返回值:方法二:把下面这段代码加进OnPaint()里就行了方法三:使用StretchBlt()函数,具有图像自适应窗体功能dc.Rectangle(0,0,200,200); // 这些参数可以调整图片添加位置和大小dc.SelectObject(pOldBrush);问题有的程序员希望在自己的应用程序中以有趣味的位图来代替对话框中令人讨厌的灰色背景,希望位图在对话框中看起来象墙纸而且并不影响对话框中的控制或静态文本的显示。
许多程序员找不到一个改变窗口背景的简单方法,是否有方法利用Windows API 函数来改变对话框的背景为某个位图呢?方法改变对话框的背景为某个位图并不困难,关键是需要清楚对话框和窗口是如何设置背景颜色的,以及程序员应该如何修改对话框和窗口改变显示的行为。
当Windows 准备改变对话框背景的颜色时,通常发送两个消息给对话框。
第一个消息是WM_ERASEBKGND,此消息指示对话框绘制对话框的背景颜色,以“抹去”屏幕上对话框显示区域的任何显示。
第二个消息是WM_CTLCOLOR,发送此消息给对话框或窗口来表示Windows 需要知道对话框中控制的颜色。
在本节中,将重置对消息WM_ERASEBKGND 的处理,以便将位图绘制在窗口的背景上。
另外,将重置对消息WM_CTLCOLOR 的处理,以避免对话框中的控制“剪补”位图。
最后的结果是对话框的背景位图绘制在对话框背景上,控制在背景位图的“上面”。
步骤按照下列步骤实现一个例子程序。
运行此例子程序,选择菜单Dialog 和菜单项Bitmap Background,将弹出一个对话框,显示背景位图和几个控制。
实现例子程序的具体步骤如下:1.在Visual C++中,利用AppWizard 创建新的项目文件,并命名此项目文件为Ld145。
MFC无标题栏对话框美化
1.无标题栏和边框的对话框Border 属性改为NoneTitle bar属性改为False2.对话框添加OnInitDialog函数OnInitDialog 在vs2010中实现为虚函数,所以在“项目”-> “类向导”-> “虚函数”->找到对应虚函数添加即可,就这么简单。
3.移动无标题栏的对话框拖动无标题窗口时,欺骗WINDOW在鼠标点下是像WINDOW发送一个鼠标选中WINDOW标题栏的消息!添加鼠标左键消息。
void CMyPlayerDlg::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call default//使窗口可以拖动PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM (point.x, point.y));CDialog::OnLButtonDown(nFlags, point);}在OnLButtonDown的鼠标响应消息添加红色部分代码!WM_NCLBUTTONDOWN 鼠标选中非客户区域(标题栏)HTCAPTION 鼠标选中了标题栏MAKELPARAM (point.x, point.y)) 返回一个LPARAM的值PostMessage函数功能:该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。
消息队列里的消息通过调用GetMessage和PeekMessage取得。
原型与参数如下:函数原型:BOOL PostMessage(UINT Msg,WPARAM wParam,LPARAM lParam);参数说明:Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
IParam:指定附加的消息特定的信息。
我整理的MFC界面美化
我整理的MFC界面美化一,对话框背景为一幅位图1.插入位图打开VC6.0MFC程序,右击“Dialog”,打开“引入”,选择图片就可以引入一个位图了。
2.打开“ClassView”,再打开“CAbouttDlg()”函数,找到void CTuxingDlg::OnPaint()函数,粘贴上CPaintDC dc(this);CRect rect;GetClientRect(&rect);CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAP1);//IDB_BITMAP1是你自己的图对应的IDBITMAP bitmap;bmpBackground.GetBitmap(&bitmap);CBitmap*pbmpOld=dcMem.SelectObject(&bmpBackground);dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);二.在对话框上显示一幅位图法一:把图片引入工程,其句柄名为IDB_BITMAP2;然后放一个静态控件或者图片控件到对话框上,将其句柄名设为IDC_SHOWBMP; 具体代码为在需要使用的地方(如按钮函数或OnInitDialog()或OnPaint()里等等)加入如下代码:CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP);HBITMAPhBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESO URCE(IDB_BITMAP2));p->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);p->SetBitmap(hBitmap);详解:CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP); //获得指向IDC_SHOWBMP的指针,并将其强制转换为CStatic*类型,并赋值给pHBITMAPhBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESO URCE(IDB_BITMAP2));//从工程资源处获得IDB_BITMAP2的位图句柄,并将其赋值给hBitmap变量p->Modifystyle(0xF,SS_BITMAP|SS_CENTERIMAGE);//设置该静态控件(p指向的静态控件),使其用于显示位图,并且是在控件中央显示//(若无此步无法显示,因为没有说明静态对话框要显示的类型是什么)p->SetBitmap(hBitmap);//将需要显示的位图设置为bBitmap,即资源IDB_BITMAP1的句柄法二:通过位图所在路径显示位图(此方法无需事先将位图文件添加为该工程的资源) 在对话框上放一个静态控件(一定是静态控件,若图片控件则无法显示) 将其重命名为IDC_BMP(不重命名的话无法添加变量),然后再为该控件添加一个变量,命名为m_image.在需要使用的地方(如按钮函数或OnInitDialog()或OnPaint()里等等)加入如下代码: this->m_image.ModifyStyle(0,SS_BITMAP |SS_CENTERIMAGE);HBITMAP hBmp = (HBITMAP)::LoadImage(0, "path\\1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);this->m_image.SetBitmap(hBmp);详解:this->m_image.ModifyStyle(0,SS_BITMAP|SS_CENTERIMAGE);//和上面的作用一样,将该静态控件设置为是用来显示位图的,只不过这里是通过该静态对话框的变量来进行/ /modifystyle操作的HBITMAP hBmp = (HBITMAP)::LoadImage(0, "path\\1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //从bmp文件所在的路径直接读取该bmp图象的句柄,并将其转换为HBITMAP类型//注:其中的"path\\1.bmp"是相对路径,即在和可执行文件的同一目录下有一个名为path的文件夹,里面有一个名为1.bmp的位图文件.this->m_image.SetBitmap(hBmp); //通过变量m_image来设置该静态框所显示的位图文件.三.列表控件的背景在BOOL CTuxingDlg::OnInitDialog()函数中添加以下代码m_List.SetBkColor(RGB(444, 233, 255)); //三个参数可以任意改变,下同m_List.SetTextBkColor(RGB(444, 233, 255));四.设置列表控件属性带有表格线在BOOL CTuxingDlg::OnInitDialog()函数中添加以下代码DWORD NewStyle = m_List.GetExtendedStyle();NewStyle |= LVS_EX_GRIDLINES; m_List.SetExtendedStyle(NewStyle);五.改变全部界面的背景颜色点击“Globals”,再打开“theApp”,在Bool CPersonalFinancialManagementSystemApp::InitInstance()函数中添加SetDialogBkColor(RGB(444, 233, 255), RGB(0, 0, 0));。
vc6.0中更改对话框背景色和字体颜色
vc6.0中更改对话框背景⾊和字体颜⾊⽅法⼀:设置所有窗⼝的颜⾊MFC程序修改对话框的背景和⽂字颜⾊最简单的⽅法就是调⽤SetDialogBkColor函数,SetDialogBkColor是CWinApp类的成员函数,以下是该函数的原型:void CWinApp::SetDialogBkColor(COLORREF clrCtlBk, COLORREF clrCtlText);请注意,SetDialogBkColor函数并不是对Windows的某个API的封装,他是MFC框架的⼀部分,所以不使⽤MFC的程序也就不能享受这种⽅便。
这个函数的使⽤很简单,在程序的CWinApp派⽣类的InitInstance函数中,添加⼀⾏代码就⾏了,写在domodal()的上⼀句:SetDialogBkColor(RGB(188,197,230),RGB(13,125,188));注:前⼀个为背景⾊,后⼀个为字体颜⾊。
⽅法⼆:设置当前窗⼝改变对话框的背景颜⾊的原理很简单,就是响应WM_ERASEBKGND消息,⽤⾃定义的颜⾊填充对话框的客户区背景,代替对话框窗⼝默认的背景填充动作。
改变控件和字体的颜⾊同理,是响应WM_CTLCOLOR这⼀消息。
具体操作,⽅法如下:⾸先://消息映射BEGIN_MESSAGE_MAP(CHelloDlg, CDialog)//{{AFX_MSG_MAP(CHelloDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_CTLCOLOR() //字体颜⾊ON_WM_ERASEBKGND() //背景⾊ON_WM_QUERYDRAGICON()//}}AFX_MSG_MAPEND_MESSAGE_MAP()其次:定义两个函数afx_msg BOOL OnEraseBkgnd(CDC* pDC);afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);第三:重载OnEraseBkgnd和OnCtlColor其中预先定义:protected:CBrush m_brBkgnd;//设置对话框背景⾊⽅法⼀:可以实现(但有点问题)BOOL CHelloDlg::OnEraseBkgnd(CDC* pDC){CRect rect;GetClientRect(&rect);m_brBkgnd.CreateSolidBrush(RGB(183,213,213)); //背景⾊pDC->FillRect(&rect,&m_brBkgnd);return TRUE;}⽅法⼆:可⾏BOOL CClientDlg::OnEraseBkgnd(CDC* pDC){CBrush back(RGB(220,215,254));CBrush* pold=pDC->SelectObject(&back);CRect rect;pDC->GetClipBox (&rect);pDC->PatBlt (rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY);pDC->SelectObject(pold);return TRUE;}⽅法三:也可⾏BOOL CHelloDlg::OnEraseBkgnd(CDC* pDC){CBrush MyBrush;MyBrush.CreateSolidBrush(RGB(0,255,0));CBrush *pOldBrush=pDC->SelectObject(&MyBrush);CRect Rect;GetClientRect(&Rect);pDC->Rectangle(&Rect);pDC->SelectObject(pOldBrush);return TRUE;}//设置对话框中控件的字体颜⾊HBRUSH CHelloDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if(pWnd->GetDlgCtrlID() == IDC_EDIT_MULLINE) //多⾏edit控件{pDC->SetTextColor(RGB(13,125,188)); //设置字体颜⾊return hbr;}else{pDC->SetBkMode(TRANSPARENT);pDC->SetTextColor(RGB(255,125,188));return (HBRUSH)m_brBkgnd; //因为CBrush类实现了HBRUSH类型转换操作符 }}。
创建有个性的对话框之MFC篇
创建有个性的对话框之MFC篇想使自己的软件与众不同就要给软件加点“色”,一个颜色搭配协调的窗口要比windows千篇一律的灰底黑字更能吸引别人的眼球。
设想如果html浏览器显示的网页都是白底黑字,还会有那么多的mm喜欢上网吗?可能互联网的人气将下想使自己的软件与众不同就要给软件加点“色”,一个颜色搭配协调的窗口要比wind ows千篇一律的灰底黑字更能吸引别人的眼球。
设想如果html浏览器显示的网页都是白底黑字,还会有那么多的mm喜欢上网吗?可能互联网的人气将下降一半。
做个出色的界面对于老手来说可能不在话下,但是对于新手来说还是无从下手,使用BCGControlBar和Xtrem e Toolkit是个很好的选择,不过对于一个小程序使用这么大的库未免有头重脚轻的感觉。
其实不使用这些庞然大物一样可以做个很“色”的界面,本文就结合CSDN论坛上经常被问起的问题,介绍几个给对话框上色的方法。
本文的方法都是针对MFC程序的,其他方法请参看“创建有个性的对话框之ATL/WTL篇”。
第一步:改变对话框的背景颜色如何改变对话框的背景颜色这个问题常常出现在论坛上,可见大家对Windows默认的灰色对话框是多么不满。
MFC程序修改对话框的背景和文字颜色最简单的方法就是调用Set DialogBkColor函数,SetDialogBkColor是CWinApp类的成员函数,以下是该函数的原型:void CWinApp::SetDialogBkColor(COLORREF clrCtlBk, COLORREF clrCtlText);请注意,SetDialogBkColor函数并不是对Windows的某个API的封装,他是MFC框架的一部分,所以不使用MFC的程序也就不能享受这种方便。
这个函数的使用很简单,在程序的CWinApp派生类的InitInstance函数中添加一行代码就行了:SetDialogBkColor(RGB(188,197,230),RGB(13,125,188));图.1 就是运行效果:图.1 SetDialogBkColor效果图使用SetDialogBkColor也有局限的地方,那就是所有的控件文字颜色都一样,不能针对不同的控件设置不同的文字颜色,还有就是不能设置Edit控件的颜色。
MFC菜单栏下拉菜单图片设置
VC MFC菜单栏(CMenu)控件 (2011-07-02 12:49)分类:C++菜单栏在对话框窗口里显示菜单栏像工具栏一样,菜单栏在按件面板里没有对应的选项,但有一个菜单控件类CMenu,所以如果想要在对话框里显示菜单栏,就得像工具栏那样,到ResourceView选项卡里新建一个菜单栏资源,步骤跟新建工具栏资源一样,只是资源类型是:Menu,菜单资源设计如下图:如果想改菜单项文本内容的话,方法是右击要更改的菜单项,选择属性,接着会弹出这样一个对话框:上面那个ID项就是该菜单项对应的ID号了,添加菜单项单击消息处理函数时会用到,而标明项里的内容就是菜单项要显示的文本了。
这里还得注意一下“弹出”这个选项,勾上这个选项表明对应的菜单项还有下级菜单,如:上面“转到”这个菜单项具有弹出属性,有下级菜单设计好了菜单资源,接着我们就来在对话框显示菜单栏吧,方法是进入对话框编辑区,右击对话框界面,选择属性,然后在菜单项里选择菜单资源ID号,回车,编译,运行,效果如下图:当然还有第二种在对话框显示菜单的方法:调用SetMenu函数把菜单跟对话框关联起来,函数第一个参数是窗口句柄,第二个参数是菜单句柄。
在OnInitDialog函数里添加如下语句:CMenu menu;//定义一个菜单类变量menu.LoadMenu(IDR_MENU1);//装载IDR_MENU1菜单资源SetMenu(&menu);//和当前窗口关联起来menu.Detach();//分离如果要处理菜单项单击消息的话,方法跟处理工具栏项单击消息一样,进入类向导,找到对应的菜单项ID,为它添加COMMAND消息处理函数。
设置菜单左边显示位图和背景位图CMenu类里要了解的函数SetMenuItemBitmaps//设置菜单项左边的位图函数定义:BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );nPostion指明具体要设置的菜单项,可以是菜单项索引,菜单项ID,具体由nFlags参数指明,为MF_BYPOSITION,则以菜单项索引指明,为MF_BYCOMMAND则第一个参数nPosition是菜单项ID号。
mfc中插入背景图片
1、添加背景图片到“Bitmap”资源里。
方法为“插入——资源”,如果还没有Bitmap,则新建一个Bitmap,否则选择资源类型为“Bitmap”后“引入”想要插入的背景图片,我加入的背景图片如图1,加入过程如图2。
图1图2说明:引入的图片可以插入256色、16位色或更高色的图片,若是其他格式图片可用PS打开再另存为BMP、24位windows格式就可以了。
提示说该资源使用了大于256色的调色板,在VC里无法编辑等等,点确定就可以了,没有影响的。
2、定位到void CXXXDlg::OnPaint(),在if()...else()中的else()下添加如下代码:else{//CDialog::OnPaint();//要禁止这个调用CPaintDC dc(this);CRect rect;GetClientRect(&rect);CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAP); //IDB_BITMAP是你自己的图对应的ID ,由于我刚刚加入的位图资源//被我命名成了IDB_Bg,因而我这句就是bmpBackground.LoadBitmap(IDB_Bg);BITMAP bitmap;bmpBackground.GetBitmap(&bitmap);CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);}3、编译运行结果如图3。
图34、通过属性设置把边框隐藏起来并更改对话框的大小结果更好一点,如图4。
VS2008环境下基于MFC读取显示图像、更改背景图像
一、创建MFC首先创建一个MFC对话框应用程序(Dialog-based Application)如下:在VS2005和2008里,我们可以用一个 Solution 来组合几个 Project (每个 Project 基本上只包含一个 Program),当我们要构建一个多Program的应用时(例如一个客户端程序加一个服务器应用程序),利用 Solution 可以将这些Projects 组合起来、并且共享文件和函数库。
通常需要为Solution创建一个主路径,其中包含了所有Projects的路径。
不过在这篇文章里,我们只构建一个简单的Project,所以在创建MFC的New Project对话框里,不用勾选“Create directory for solution”这个选项。
点击OK -- Next进入下一步,在这里我们创建一个Dialog-based Application,大部分选项按默认设置就行,不过最下面的“Use Unicode libraries”最好去掉。
如果勾选了这个选项,程序代码就会使用16bit的Unicode字符集来编码,但是很多函数虽然使用 char* (ASCII stings) 类型字符,而将字符串从 Unicode 转换到 ASCII 是非常麻烦的。
使用Unicode 在编译时可能会遇到下列错误:cannot convert parameter 1 from 'CString' to 'const char *'cannot convert from 'const char [11]' to 'LPCWSTR'这意味着在Unicode 和Multi-byte字符串的转换中出现了问题。
在上一篇学习笔记中,就提到“成员函数LoadBMP其输入参数类型应为const char*”,那应该只是一个治标的方法,这里的去掉“Use Unicode libraries”选项,才是治本之道。
VS2010_MFC编程入门之十九(对话框:颜色对话框)-软件开发-鸡啄米
以下是实例创建的步骤:
1.创建一个基于对话框的MFC工程,名字为“Example19”。
2.在自动生成的主对话框IDD_EXAMPLE19_DIALOG的模板中,删除“TODO: Place dialog contr ols here.”静态文本框,添加一个按钮,ID设为IDC_COLOR_BUTTON,Caption设为“颜色选择”,用 于显示颜色对话框来选择颜色。再添加四个静态文本框,ID分别为IDC_COLOR_STATIC、IDC_R_S TATIC、IDC_G_STATIC、IDC_B_STATIC,Caption分别设为“Color:”、“R:”、“G:”、“B:”,然 后每个静态文本框后添加一个编辑框,四个编辑框的ID分别为IDC_COLOR_EDIT、IDC_R_EDIT、ID C_G_EDIT、IDC_B_EDIT,分别用来显示颜色对话框中选择的颜色值和所选颜色值的红色分量、绿 色分量、蓝色分量。
2013职称计算机考试题库下载浪潮服务器冠军品质智能高效123456789订阅鸡啄米站内搜索分类标签编程入门124vc72mfc62c61vs201060android38苹果37平板电脑31智能手机31谷歌28iphone18ipad17windows17设计模式15三星12腾讯11程序员11微软10facebook8新浪8galaxy7首页it互联网数码生活软件开发职场人生娱乐休闲安卓开发留言簿鸡啄米下面给大家做一个颜色对话框的小例子
VS2010/MFC编程入 门之四十一(文档、 视图和框架:分割窗 口)
除非特别注明,鸡啄米文章均为原创 转载请标明本文地址:/software/177.html
无觅关联推荐[?] 2012-5-17 21:26:10
作者:鸡啄米 分类:软件开发 浏览:30455
MFCButton控件的背景颜色
MFCButton控件的背景颜色MFC Button控件的背景颜色一个继承于CButton的按钮控件类,实现Button背景色与文字的共存与改变,可以自行设计背景色。
头文件:CMyButton.h 如下:#pragma once#include "afxwin.h"class CMyButton : public CButton{//DECLARE_DYNAMIC(CMyButton)public:CMyButton();virtual ~CMyButton();//设置Button Down的背景颜色void SetDownColor(COLORREF color);//设置Button Up的背景颜色void SetUpColor(COLORREF color);BOOL Attach(const UINT nID, CWnd* pParent);protected://必需重载的函数virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);public://三种颜色分别为文字,Button Down的背景颜色,Button Up 的背景颜色COLORREF m_TextColor, m_DownColor, m_UpColor;};源文件:CMyButton.cpp#include "StdAfx.h"#include "CMyButton.h"CMyButton::CMyButton(void){m_DownColor = m_UpColor = RGB(0,0,0);}CMyButton::~CMyButton(void){}//CMyButton是CButton派生类,具有CButton的全部成员函数,//但在创建时需要使用BS_OWNERDRAW风格。
//如果按钮不是动态生成,使用Attach函数使CMyButton代替原来按钮的窗口过程。
对话框设置背景图片
对话框设置背景图片CRect rect;GetClientRect(&rect);CDC *pDC=GetDC(); //这句值得记忆,如何获取当前DCCDC memdc;memdc.CreateCompatibleDC(pDC);CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP3);memdc.SelectObject(bitmap);pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);对于一般的空间及本功能对话框设置背景图片的中心思想大致是:获取本当前对话框坐标及句柄,然后创建图片对象,并加载控件,然后客户对话框选中图片对象并进行转换(最后一句)。
这些都是在OnPaint()下进行的。
Invalidate():立即重绘客户对话框(即立即刷新对话框),调用OnPaint()相关的消息映射。
路径显示图片MFC界面加载图片大致有两个方法:通过BITMAP控件直接加载和通过路径动态加载图片。
通过BITMAP 加载图片很简单没有技术含量。
在Resource页面下,添加Resource,然后导入图片(注意是BMP格式的,其他格式暂时没有研究),重命名等设置一下;接下来在对话框中添加picture control 控件,在type中选择bitmap,然后在image 中选择导入的加入的那个BITMAP就可以了。
通过路径加载图片相对复杂一点。
picture control保持默认就可以。
CPaintDC dc(this);HBITMAP bmpHandle;bmpHandle = (HBITMAP)LoadImage(NULL,_T(图片路径),IMAGE_BITMAP,0,0,LOADFROMFILE);//路径要使用双\CBitmap bmpPicture;CDC mdcPicture;CBitmap *bmpFromHandle = bmpPicture.FromHandle(bmpHandle);CRect rctPicture;GetDlgItem(picture控件)->GetWindowRect(&rctPicture);//上面那一句很重要,GetDlgItem,获取相关控件//关联相关控件,比如按钮控件m_btn.SubclassDlgItemmdcPicture.CreateCompatibleDC(&dc);CBitmap *bmpPrevious = mdcPicture.SelectObject(bmpFromHandle);ScreenToClient(&rctPicture);dc.BitBlt(rctPicture.left,rctPicture.top,rctPicture.Width();rctPicture.Heigth(),&mdcPicture,0,0,SRCCOPY);dc.SelectObject(bmpPrevious);控件背景设置加载ON_WM_CTLCOLOR消息映射,在相关的响应OmCltcolor响应函数中,添加以下代码可以修改相关控件的背景颜色等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对话框的背景
1、添加位图背景
首先在资源视图中添加bmp图片:选择项目名右击---添加—添加资源---Bitmap---导入---选择res文件中的位图(如果res文件中无位图请提前添加),此时可以知道位图ID为IDB_BITMAP1
(1)picture控件添加背景
在对话框中添加picture控件,并修改其属性,选中picture控件在属性表中修改Type为Bitmap,Image为IDB_BITMAP1。
此时图片就显示在对话框中
(2)在CPP文件中初始化显示位图
添加位图后,在源文件XXXDlg.cpp的void C XXX Dlg::OnPaint()函数中添加初始化代码如下:
void CbeijingDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP1);
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpPri=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SR
CCOPY);
}
}
2、设置纯色背景
点击对话框添加成员变量CBrush m_brush,然后在源文件XXXDlg.cpp初始化位置添加如下代码:
// TODO: 在此添加额外的初始化代码?
m_brush.CreateSolidBrush(RGB(0,0,255)); /////添加的代码,用于创建蓝色画刷
return TRUE; // 除非将焦点设置到控件,否则返回TRUE
然后找到WM_CTLCOLOR消息,添加对应的函数OnCtlColor()
添加如下代码:
HBRUSH CbeijingsehewenziDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改DC 的任何特
return m_brush;
// TODO: 如果默认的不是所需画笔,则返回另个画笔
// return hbr;
}
这样运行后对话框背景色就变为蓝色。