MFC设置窗体背景图片(画刷)

合集下载

MFC中设置SDI的背景图片

MFC中设置SDI的背景图片

MFC中设置SDI的背景图片第一篇:MFC中设置SDI的背景图片MFC中设置SDI的背景图片VC开发简单的单文档程序时,客户区一般是一片空白,可以显示一张图片,重载OnEraseBkgnd()函数即可。

代码如下:BOOL CSAMSView::OnEraseBkgnd(CDC* pDC)2 {3// TODO: Add your message handler code here and/or call default4//创建位图5CBitmap bitmap;6bitmap.LoadBitmap(IDB_BITMAP_MAIN_BACKGRAND);7//得到位图的信息8BITMAP bmp;9bitmap.GetBitmap(&bmp);10//创建兼容DC11CDC dcCompatible;12dcCompatible.CreateCompatibleDC(pDC);13//将位图选到兼容DC中14dcCompatible.SelectObject(&bitmap);15//得到客户区的大小16CRect rect;17GetClientRect(&rect);18//将兼容DC中的位图贴到当前DC中。

19pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatib le,200,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);21//return CView::OnEraseBkgnd(pDC);22return TRUE;23 }1VC中为SDI添加背景图片总结方案一,使用画刷改变视图单调的背景我们为CT estView类添加一个变量CBrush m_brushBackground;这个画刷就是用于画背景的。

我们在CTestView的构造函数中加入如下代码://方案一.(1),直接用资源id[cpp] view plaincopyprint?1 CBitmap bmp;2 bmp.LoadBitmap(IDB_SPLASH);///加载位图3m_brushBackground.CreatePatternBrush(&bmp);///创建位图画刷//方案一.(2),读图片文件[cpp] view plaincopyprint?4 HBITMAPhBmp=(HBITMAP)LoadImage(AfxGetInstanceHandle(),“.resbackgro und.bmp”,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);5CBitmap bmp;//backgroundbitmappicture6 bmp.Attach(hBmp);7m_brushBackground.CreatePatternBrush(&bmp);///创建位图画刷接着我们需要在OnDraw函数中画出来,代码如下:[cpp] view plaincopyprint?8 CRect rect;9 GetClientRect(rect);///取得客户区域10pDC->FillRect(rect,&m_brushBackground);///用背景画刷填充区域为了避免背景的闪烁,使显示更加完美,我们添加WM_ERASEBKGND消息的处理函数,并取消调用父类的处理函数,代码如下:[cpp] view plaincopyprint?11 BOOL CTestView::OnEraseBkgnd(CDC* pDC)12 {13return TRUE;14 }/////////////////////////////////////////////////////////////////// 方案二-五,处理OnEraseBkgnd[cpp] view plaincopyprint?15 BOOL CMPEG4DecoderView::OnEraseBkgnd(CDC* pDC)16 {17//dan,2007-6-9,修改为背景图片可随窗口客户区大小伸缩18 // TODO: Add your message handler code here and/or call default19 //dan,2007-6-920 //方案二读文件,图形可伸缩21 /*22 HBITMAPhBmp=(HBITMAP)LoadImage(AfxGetInstanceHandle(),“.resbackgro und.bmp”,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);23HDChMemDC=CreateCompatibleDC(pDC->m_hDC);24 CBitmapbmp;25 bmp.Attach(hBmp);26 BITMAPbm;27 bmp.GetBitmap(&bm);28 SelectObject(hMemDC,hBmp);29 CRectrc;30 GetClientRect(rc);31StretchBlt(pDC->m_hDC,0,0,rc.Width(),rc.Height(),hMemDC,0,0,b m.bmWidth,bm.bmHeight,SRCCOPY);32 bmp.DeleteObject();33 */34/*方案三,直接使用资源id,图形可伸缩,修改为背景图片可随窗口客户区大小伸缩,图片偏大,失真35 CBitmap bmp;36HDChMemDC=CreateCompatibleDC(pDC->m_hDC);37 bmp.LoadBitmap(IDB_SPLASH);38 BITMAPbm;39 bmp.GetBitmap(&bm);40 SelectObject(hMemDC,HBITMAP(bmp));41 CRectrc;42 GetClientRect(rc);43StretchBlt(pDC->m_hDC,0,0,rc.Width(),rc.Height(),hMemDC,0,0,b m.bmWidth,bm.bmHeight,SRCCOPY);44 bmp.DeleteObject();45 */46 /*方案四,直接使用资源id,图形不可伸缩47CBitmapbackBmp;//backgroundbitmappicture48 backBmp.LoadBitmap(IDB_SPLASH);CDCmemDC;50 memDC.CreateCompatibleDC(pDC);51CBitmap*oldBmp=memDC.SelectObject(&backBmp);52 if(!oldBmp)returnfalse;53 CRectcr;54 GetClientRect(&cr);55 BITMAPbmpinfo;56GetObject(backBmp.m_hObject,sizeof(BITMAP),&bmpinfo);57 intwDelta=bmpinfo.bmWidth;inthDelta=bmpinfo.bmHeight;58 for(intw=0;w59for(inth=0;h60pDC->BitBlt(w,h,wDelta,hDelta,&memDC,0,0,SRCCOPY);61 memDC.SelectObject(oldBmp);62 memDC.DeleteDC();63 */6465 //方案五,读文件,图形不可伸缩66 /*67 HBITMAPhBmp=(H BITMAP)LoadImage(AfxGetInstanceHandle(),“.resbackgro und.bmp”,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);68 CBitmapbackBmp;//backgroundbitmappicture6970 backBmp.Attach(hBmp);7172 CDCmemDC;73 memDC.CreateCompatibleDC(pDC);74CBitmap*oldBmp=memDC.SelectObject(&backBmp);75 if(!oldBmp)returnfalse;76 CRectcr;77 GetClientRect(&cr);78 BITMAPbmpinfo;79GetObject(backBmp.m_hObject,sizeof(BITMAP),&bmpinfo);80 intwDelta=bmpinfo.bmWidth;inthDelta=bmpinfo.bmHeight;81 for(intw=0;w82for(inth=0;h83pDC->BitBlt(w,h,wDelta,hDelta,&memDC,0,0,SRCCOPY);84 memDC.SelectObject(oldBmp);85 memDC.DeleteDC();86 */4987//方案一,直接返回,使用画刷改变视图单调的背景88return true;8990 }几种色调的数字表示:m_nColorRef[0] = RGB(51, 204, 102);m_nColorRef[2] = RGB(233, 121, 118);m_nColorRef[3] = RGB(0, 143, 224);m_nColorRef[4] = RGB(153, 153, 204);m_nColorRef[5] = RGB(204, 204, 204);m_nColorRef[6] = RGB(232, 123,20);m_nColorRef[7] = RGB(235,88, 235);m_nColorRef[8] = RGB(220,39,75);// 绿 // 砖红// 蓝 // 青 // 灰// 橙// 粉// 红第二篇:邀请函背景图片设置“邀请函封面”的制作实训说明制作邀请函,邀请函的用途非常广泛,生日聚会、结婚典礼、节日庆典等都需要使用。

MFC对话框背景---图片背景---背景色

MFC对话框背景---图片背景---背景色

对话框的背景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,SRCCOPY);}}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;}这样运行后对话框背景色就变为蓝色。

MFC学习设置对话框的背景颜色及设置透明

MFC学习设置对话框的背景颜色及设置透明

MFC学习——设置对话框的背景颜色及设置透明(2012-03-20 20:57:28)现说设置背景颜色。

我用了很多方法都不行,查了很多资料,现在说一下解决方案吧。

在XXXXXXDlg.头文件的protected:中加入CBrush m_brush;在XXXXXXDlg.cpp文件中的OnInitDialog()初始化函数中加入画刷m_brush.CreateSolidBrush(RGB(255,255,255));RGB中的颜色自己定义。

然后在类向导中添加WM_CTLCOLOR消息函数。

在里面只写一句话:return m_brush;背景颜色就改了。

现在说怎么设计透明了,那就更简单了。

在OnInitDialog()初始化函数中添加两行代码:SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|WS_EX_LAYERED);SetLayeredWindowAttributes(0,200,LWA_ALPHA);第二行中的200为透明度,0为全透明,255为不透明。

MFC改变标题栏的颜色分类: MFC2009-02-06 17:15 2641人阅读评论(0) 收藏举报mfc1、创建一个普通的对话框;2、重写 WM_NCPAINT的实现函数;3、在实现函数中绘制标题栏,如果需要实现系统按钮,利用DrawFrameControl实现;4、如果有系统按钮,重写(WM_NCLBUTTONDOWN, WM_NCHITTEST,WM_NCLBUTTONUP)的实现函数;带源码的例子请参考:/cpp/w-d/dislog/titlebar/article.php/c1987/VC 标准对话框的标题栏,是有windows 系统控制颜色的(你可以通过修改桌面属性中的配色方案调整,看到实际效果),也就是说,在通常情况下,这个是不受程序控制的。

MFC中改变对话框背景的几个消息函数OnEraseBkgnd、 OnPaint、 OnCtlColor的调用顺序

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 对话框 背景图片 以及消除 字体重影 字体重叠

MFC 对话框 背景图片 以及消除 字体重影 字体重叠

很多人都想改变对话框的背景图,其实很简单,只需要一个函数就可以了,不过还是有问题的,下面讲述。

只需要响应WM_ERASEBKGND消息,然后重载OnEraseBkgnd(CDC*pDC)这个函数就可以,首先我们要添加消息响应,由于该消息不能用MFC ClassWizard添加,因为ClassWizard 没有该消息添加的选项,我们需要手动添加,只需要在消息响应MAP添加一下ON_WM_ERASEBKGND(),如下所示:BEGIN_MESSAGE_MAP(CSerialTestDlg, CDialog)//{{AFX_MSG_MAP(CSerialTestDlg)ON_WM_ERASEBKGND()//添加重绘背景消息响应//}}AFX_MSG_MAPEND_MESSAGE_MAP()我们然后进行消息响应,添加消息响应函数,然后在对话框类的声明文件添加该函数的声明virtual BOOL OnEraseBkgnd(CDC*pDC);在实现文件中进行该函数的书写,如:BOOL CSerialTestDlg::OnEraseBkgnd(CDC*pDC){CBitmap m_bitmap;m_bitmap.LoadBitmap(IDB_DLGBK);//加载背景图片,选择你对应的图片IDCDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);dcCompatible.SelectObject(&m_bitmap);CRect rect;GetWindowRect(&rect);ScreenToClient(&rect);//选择客户区域BITMAP bmp;m_bitmap.GetBitmap(&bmp);pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmW idth,bmp.bmHeight,SRCCOPY);//绘制BMP背景图m_bitmap.DeleteObject();return TRUE;}但是这样做一般就可以,细心的人会发现字体有重叠,比如说静态文本框和EDIT控件,如果选择只读模式,作为输出,这时EDIT的背景是BMP背景图片,但是字体重叠,如下图,我这样就行消除。

MFC中添加背景图片

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界面美化

我整理的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));。

MFC 小技巧(更换皮肤,背景,标题栏,透明)

MFC 小技巧(更换皮肤,背景,标题栏,透明)

1.背景透明在MainFrame.Cpp中找到int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函数添加代码SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^0x80000);// 添加库HINSTANCE hInst = LoadLibrary("User32.DLL");if(hInst){typedef BOOL (WINAPI *ShowLayer)(HWND,COLORREF,BYTE,DWORD);ShowLayer fun = NULL;// 读取函数指针fun = (ShowLayer)GetProcAddress(hInst, "SetLayeredWindowAttributes");if (fun)fun(this->GetSafeHwnd(), 0, 230, 2);FreeLibrary(hInst);}HBITMAP startpic;CStaticstartPics;startpic=(HBITMAP) ::LoadImage(NULL,"snakeNet.bmp",IMAGE_BITMAP,110,50,LR_LOADFROMF ILE|LR_DEFAULTSIZE);startPics.Create(NULL,WS_CHILD|WS_VISIBLE|SS_BITMAP|SS_CENTERIMAGE,CRect(200,457,20 0+110,457+50),this,NULL);startPics.SetBitmap(startpic);GetSafeHwnd(), 0, 230, 2);里面的参数230是改变透明度对话框的函数好像不一样2.更换背景图片首先先找一张图片将其格式转换成.Bmp格式然后在VC中ctrl+R 新建一个bitmap资源然后在资源栏中右击选择引入然后选择你的那张BMP格式图片出现这个不用理然后在View类中添加CBrush类型的m_brushBackground变量然后在View的构造函数中添加代码CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2); ///加载位图m_brushBackground.CreatePatternBrush(&bmp); ///创建位图画刷其中IDB_BITMAP2是你图片的ID号然后在OnDraw(CDC* pDC)函数中添加代码CRectrect;GetClientRect(rect);///取得客户区域pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域然后调试就发现背景好看多了3.标题栏标题栏图标找一个IOC格式的图片直接把名字改成工程文件夹中rs文件夹中的ico格式图片的名字直接替换就行了标题栏名字在App。

MFC框架窗口界面设计(共58张PPT)

MFC框架窗口界面设计(共58张PPT)

pStatus->SetPaneText(1,str);
二个窗格的文本
// wParam的低字节表示菜单、控件、加速键的命令ID
(3) 图形编辑器工作窗口的控制条上,单击“New Device Image”,单击[定制]。
// 更新第
FWS_ADDTOTITLE
1框架窗口
(6)在第四步对话框中,单击[高级], 如图,分别用于文档模板字串资源 内容和窗口风格的修改。
▪ 文档窗口一般都有相应的可见边框,它的客户区(除了窗口标题栏、边框外的区 域)是由相应的视图来构成的,因此可以说视图是文档窗口内的子窗口。文档窗 口时刻跟踪当前处于活动状态的视图的变化,并将用户或系统产生的消息传递给 当前活动视图。
1框架窗口
MFC AppWizard为每个窗口设置了相应的大小和位置。
ClassWizard信息文件
(9) 为CM.adinsFpr(aDmeev类el添o加peWrSMt_uSdEiToCUPRroSjOeRc的t)消息映射函数,项增目加代文码件:
(2) 在CMai.npFrlagme类添加WM_CONTEXTMENU消息映射,函数编代码译。信息文件
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
➢ 除了上述风格外,框架窗口还有以下三个自己的风格。它们都可以在PreCreateWindow重载 函数的CREATESTRUCT结构中指定。
➢ FWS_ADDTOTITLE 该风格指定相关的信息如文档名添加到框架窗口标题的后面。
➢ FWS_PREFIXTITLE 该风格使得框架窗口标题中的文档名显示在应用程序名之前。
// 显示窗口
m_pMainWnd->UpdateWindow();

MFC 小技巧(更换皮肤,背景,标题栏,透明)

MFC 小技巧(更换皮肤,背景,标题栏,透明)

1.背景透明在MainFrame.Cpp中找到int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函数添加代码SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^0x80000);// 添加库HINSTANCE hInst = LoadLibrary("User32.DLL");if(hInst){typedef BOOL (WINAPI *ShowLayer)(HWND,COLORREF,BYTE,DWORD);ShowLayer fun = NULL;// 读取函数指针fun = (ShowLayer)GetProcAddress(hInst, "SetLayeredWindowAttributes");if (fun)fun(this->GetSafeHwnd(), 0, 230, 2);FreeLibrary(hInst);}HBITMAP startpic;CStaticstartPics;startpic=(HBITMAP) ::LoadImage(NULL,"snakeNet.bmp",IMAGE_BITMAP,110,50,LR_LOADFROMF ILE|LR_DEFAULTSIZE);startPics.Create(NULL,WS_CHILD|WS_VISIBLE|SS_BITMAP|SS_CENTERIMAGE,CRect(200,457,20 0+110,457+50),this,NULL);startPics.SetBitmap(startpic);GetSafeHwnd(), 0, 230, 2);里面的参数230是改变透明度对话框的函数好像不一样2.更换背景图片首先先找一张图片将其格式转换成.Bmp格式然后在VC中ctrl+R 新建一个bitmap资源然后在资源栏中右击选择引入然后选择你的那张BMP格式图片出现这个不用理然后在View类中添加CBrush类型的m_brushBackground变量然后在View的构造函数中添加代码CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2); ///加载位图m_brushBackground.CreatePatternBrush(&bmp); ///创建位图画刷其中IDB_BITMAP2是你图片的ID号然后在OnDraw(CDC* pDC)函数中添加代码CRectrect;GetClientRect(rect);///取得客户区域pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域然后调试就发现背景好看多了3.标题栏标题栏图标找一个IOC格式的图片直接把名字改成工程文件夹中rs文件夹中的ico格式图片的名字直接替换就行了标题栏名字在App。

MFC界面设计

MFC界面设计

MFC界面设计前两天boss让写写界面,看程序看的头晕脑转,就在网上瞎搜搜,写些关于MFC的界面设计。

包括:窗体背景图、窗体大小、按钮背景图、控件透明、编辑框重影、exe图标、托盘程序。

下面逐一代码解析:窗体背景图:背景图,要在OnPaint() 函数中进行修改。

窗体不再使用默认,在else中添加代码[cpp] view plaincopyprint?//改变窗体大小MoveWindow(0,0,500,400,TRUE);//设置背景CPaintDC dc(this);CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP2);//在资源里添加的位图名CBrush brush;brush.CreatePatternBrush(&amp;bitmap);CBrush* pOldBrush = dc.SelectObject(&amp;brush); dc.Rectangle(0,0,600,400); //宽、长;dc.SelectObject(pOldBrush);//CDialog::OnPaint();按钮背景图:[cpp] view plaincopyprint?CBitmapButton m_BitmapButton;//声明按钮位图对象实现代码:[cpp] view plaincopyprint?//按钮添加图片m_BitmapButton.LoadBitmaps(IDB_BITMAP1);//位图名称m_BitmapButton.SubclassDlgItem(IDC_BConn,this);//按钮ID,句柄m_BitmapButton.SizeToContent();//把按钮设置成位图大小控件透明:重载OnCtlColor函数。

有的控件需要修改OwnerDraw属性为True。

[cpp] view plaincopyprint?afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);//透明添加消息函数:[cpp] view plaincopyprint?BEGIN_MESSAGE_MAP(CClientDlg, CDialog)//......ON_WM_CTLCOLOR()//透明//}}AFX_MSG_MAP//......END_MESSAGE_MAP() 实现:[cpp] view plaincopyprint?//重载——透明HBRUSH CClientDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hBrush = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// &lt;SPAN style="WHITE-SPACE: pre"&gt;&lt;/SPAN&gt;CTLCOLOR_BTN Button control//按钮// CTLCOLOR_DLG Dialog box//对话框// CTLCOLOR_EDIT Edit control//编辑框// CTLCOLOR_LISTBOX List-box control//列表框// CTLCOLOR_MSGBOX Message box//消息框// CTLCOLOR_SCROLLBAR Scroll-bar control// CTLCOLOR_STATIC Static control//——这些控件都能设置透明if(nCtlColor == CTLCOLOR_EDIT){pDC-&gt;SetBkMode(TRANSPARENT); //设置透明pDC-&gt;SetTextColor(RGB(255, 0, 255)); // 设置文本颜色return(HBRUSH)::GetStockObject(NULL_BRUSH);}return hBrush;编辑框重影:添加消息框的事件处理函数OnEnChange,[cpp] view plaincopyprint?//方法1CRect rtlbl;GetDlgItem(IDC_EPort)-&gt;GetWindowRect(&amp;rtlbl); ScreenToClient(&amp;rtlbl); //转到客户端界面InvalidateRect(&amp;rtlbl);//刷新对话框背景////方法二GetDlgItem(IDC_EPort)-&gt;GetParent()-&gt;RedrawWindow();//会闪动exe图标:如果资源里的图标有多个,exe会自动选择较小的作为自己的图标。

MFC中更改背景图片

MFC中更改背景图片

1.如果你建的是对话框应用程序,可以有以下方法改变对话框的背景色重载OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。

具体步骤如下:①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量:class CExampleDlgDlg : public CDialog{...protected:CBrush m_brush;...};---- ②在OnInitDialog()函数中添加如下代码:BOOL CExampleDlgDlg::OnInitDialog(){...// TODO: Add extra initialization herem_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一绿色刷子...}---- 步骤③利用ClassWizard重载OnCtlColor(…)(即WM_CTLCOLOR消息):HBRUSH CExampleDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);//在这加一条是否为对话框的判断语句if(nCtlColor ==CTLCOLOR_DLG)return m_brush; //返加绿色刷子return hbr;}2.如果建立的是单文档程序CDC* pDC = GetDC();CRect rect;GetClientRect(&rect);//加载背景位图CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1); //图片IDBITMAP bmp;bitmap.GetBitmap(&bmp);//创建内存DCCDC dc;dc.CreateCompatibleDC(pDC);//选择位图CBitmap* pOldBitmap=dc.SelectObject(&bitmap);//绘制位图pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &dc,0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);。

MFC菜单栏下拉菜单图片设置

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号。

VS2008环境下基于MFC读取显示图像、更改背景图像

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”选项,才是治本之道。

MFC编程中修改窗口的方法

MFC编程中修改窗口的方法

一对窗口外观的修改窗口的外观或者风格可以有类风格(CS_)和窗口风格(WS_),改变外观就是改变这两个风格。

窗口风格是由一个CREATESTRUCT结构体作为API函数CreateWindow()参数确定的。

类风格是由一个WNDCLASS结构体在注册窗口类之后确定的。

而改变可以在窗口对象创建之前和之后改变。

A 窗口创建之前改变在PreCreateWindow(CREATESTRUCT &cs)中修改,该函数是CWnd类的成员函数。

窗口风格:对于窗口风格只要修改cs的成员就可以实现。

类风格:但是对于由窗口类指定的那些诸如图标光标等类风格就不能由cs修改了,因为他们是由WNDCLASS结构在注册的时候指定的,所以只能修改更底层的窗口类,并重新注册。

方法如下:方法一在PreCreateWindow函数中,定义一个WNDCLASS变量并注册,然后把cs.lpszclss成员赋为该已注册类的窗口类名。

例如:PreCreateWindow(CREATESTRUCT &cs){...WNDCLASS wndcls;wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;wndcls.hbrBackgroud=(HBRUSH)GetStockObject(BLACK_BRUSH);wndcls.hCursor=LoadCursor(NULL,IDC_HELP);wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);wndcls.hInstance=AfxGetInstanceHandle();wndcls.lpfnWndProc=::DefWindowProc;wndcls.lpszClassName="ncls" //!!指定新类的名字,在后面cs.lpszclss就用该名字!!wndcls.lpszMenuName="";wndcls.style=CS_HREDRAW | CS_VREDRAW;RegisterClass(&wndcls);cs.lpszClass="ncls";...return TRUE;}对于单文档应用程序要修改背景和光标,应该在CView类的PreCreateWindow 中去修改。

MFC应用程序编写实例—完整版(原创)

MFC应用程序编写实例—完整版(原创)

MFC应⽤程序编写实例—完整版(原创)前段时间,将近花了⼀周⾄两周上班和上班后的闲余时间,做了⼀个⽤于调试和测试⼯作项⽬的应⽤软件,下⾯将实现软件的重要步骤及主要功能讲解⼀遍,⽅便⽇后查阅。

程序开始后,提⽰登录框,输⼊⽤户名,密码后,登录进去主窗体,效果图如下:下⾯将主要实现的功能函数要点进⾏描述,具体实现如下:⼀、设置主窗体⼤⼩1、进⼊⼯程窗体初始化函数,OnInitDialog()中,在CDialog::OnInitDialog() 下⾯添加函数语句如下:SetWindowPos(NULL,0,0,600,400,SWP_NOMOVE); ////设置主窗体⼤⼩,长为600,⾼为400⼆、为主窗体添加背景图⽚:1、⾸先,在⼯程头⽂件中,声明画刷变量如:CBrush m_brBk;2、在⼯程OnInitDialog()中,添加如下代码:CBitmap bmp1;bmp1.LoadBitmap(IDB_BITMAP1);m_brBk.CreatePatternBrush(&bmp1);3、添加消息函数OnCtlColor,代码如下所⽰:HBRUSH CDebugDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// if (pWnd == this)//// {//// return m_brBk;//// }return(HBRUSH) m_brBk;}三、调⽤模态对话框和⾮模态对话框(以菜单⼊⼝为例)如菜单所属的主窗体类名为CDebugDlg,调⽤对话框的类名为CPing实现调⽤⾮模态对话框⽅法:选择调⽤菜单⼊⼝后,点击添加消息处理函数,在函数体内添中如下代码:CPing *dlg = new CPing();dlg->Create(IDD_DIALOG_PING); //创建⼀个⾮模态对话框dlg->ShowWindow(SW_SHOW); //显⽰⾮模态对话框 实现调⽤模态对话框⽅法:Cping dlg;dlg.DoModal();四、调⽤外部应⽤程序⽅法:1、调⽤外部应⽤程序可采⽤WinExec函数例如,调⽤⼀个Tcpview.exe外部程序,可在消息处理函数中添加如下代码:WinExec(".\\dll\\TCPview\\Tcpview.exe",SW_SHOW); // 其中.代表当前路径,此时需要⽤到\\来区分路径。

MFC中设置SDI的背景图片

MFC中设置SDI的背景图片

MFC中设置SDI的背景图片VC开发简单的单文档程序时,客户区一般是一片空白,可以显示一张图片,重载OnEraseBkgnd()函数即可。

代码如下:1BOOL CSAMSView::OnEraseBkgnd(CDC* pDC)2{3// TODO: Add your message handler code here and/or call default4//创建位图5CBitmap bitmap;6bitmap.LoadBitmap(IDB_BITMAP_MAIN_BACKGRAND);7//得到位图的信息8BITMAP bmp;9bitmap.GetBitmap(&bmp);10//创建兼容DC11CDC dcCompatible;12dcCompatible.CreateCompatibleDC(pDC);13//将位图选到兼容DC中14dcCompatible.SelectObject(&bitmap);15//得到客户区的大小16CRect rect;17GetClientRect(&rect);18//将兼容DC中的位图贴到当前DC中。

19pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,200,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);21//return CView::OnEraseBkgnd(pDC);22return TRUE;23}VC中为SDI添加背景图片总结方案一,使用画刷改变视图单调的背景1 我们为CTestView类添加一个变量CBrush m_brushBackground;这个画刷就是用于画背景的。

2 我们在CTestView的构造函数中加入如下代码://方案一.(1),直接用资源id[cpp]view plaincopyprint?1CBitmap bmp;2bmp.LoadBitmap(IDB_SPLASH); ///加载位图3m_brushBackground.CreatePatternBrush(&bmp); ///创建位图画刷//方案一.(2),读图片文件[cpp]view plaincopyprint?4HBITMAP hBmp =(HBITMAP)LoadImage(AfxGetInstanceHandle(),".\\res\\background.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);5CBitmap bmp; // background bitmap picture6bmp.Attach(hBmp);7m_brushBackground.CreatePatternBrush(&bmp); ///创建位图画刷3 接着我们需要在OnDraw函数中画出来,代码如下:[cpp]view plaincopyprint?8CRect rect;9GetClientRect(rect);///取得客户区域10pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域4 为了避免背景的闪烁,使显示更加完美,我们添加WM_ERASEBKGND消息的处理函数,并取消调用父类的处理函数,代码如下:[cpp]view plaincopyprint?11BOOL CTestView::OnEraseBkgnd(CDC* pDC)12{13return TRUE;14}///////////////////////////////////////////////////////////////////方案二-五,处理OnEraseBkgnd[cpp]view plaincopyprint?15BOOL CMPEG4DecoderView::OnEraseBkgnd(CDC* pDC)16{17//dan,2007-6-9,修改为背景图片可随窗口客户区大小伸缩18// TODO: Add your message handler code here and/or call default19//dan,2007-6-920//方案二读文件,图形可伸缩21/*22HBITMAP hBmp =(HBITMAP)LoadImage(AfxGetInstanceHandle(),".\\res\\background.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);23HDC hMemDC = CreateCompatibleDC(pDC->m_hDC);24CBitmap bmp;25bmp.Attach(hBmp);26BITMAP bm;27bmp.GetBitmap(&bm);28SelectObject(hMemDC,hBmp);29CRect rc;30GetClientRect(rc);31StretchBlt(pDC->m_hDC,0,0,rc.Width(),rc.Height(),hMemDC,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);32bmp.DeleteObject();33*/34/*方案三,直接使用资源id,图形可伸缩,修改为背景图片可随窗口客户区大小伸缩,图片偏大,失真35CBitmap bmp;36HDC hMemDC=CreateCompatibleDC(pDC->m_hDC);37bmp.LoadBitmap(IDB_SPLASH);38BITMAP bm;39bmp.GetBitmap(&bm);40SelectObject(hMemDC,HBITMAP(bmp));41CRect rc;42GetClientRect(rc);43StretchBlt(pDC->m_hDC,0,0,rc.Width(),rc.Height(),hMemDC,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);44bmp.DeleteObject();45*/46/*方案四,直接使用资源id,图形不可伸缩47CBitmap backBmp;// background bitmap picture48backBmp.LoadBitmap(IDB_SPLASH);49CDC memDC;50memDC.CreateCompatibleDC(pDC);51CBitmap* oldBmp=memDC.SelectObject(&backBmp);52if(!oldBmp)return false;53CRect cr;54GetClientRect(&cr);55BITMAP bmpinfo;56GetObject(backBmp.m_hObject,sizeof(BITMAP),&bmpinfo); 57int wDelta=bmpinfo.bmWidth; inthDelta=bmpinfo.bmHeight;58for(int w=0;w<cr.Width();w+=wDelta)59 for(int h=0;h<cr.Height();h+=hDelta)60 pDC->BitBlt(w,h,wDelta,hDelta,&memDC,0,0,SRCCOPY); 61memDC.SelectObject(oldBmp);62memDC.DeleteDC();63*/6465//方案五,读文件,图形不可伸缩66/*67HBITMAP hBmp =(HBITMAP)LoadImage(AfxGetInstanceHandle(),".\\res\\backgroun d.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);68CBitmap backBmp; // background bitmap picture6970backBmp.Attach(hBmp);7172CDC memDC;73memDC.CreateCompatibleDC(pDC);74CBitmap* oldBmp=memDC.SelectObject(&backBmp);75if(!oldBmp)return false;76CRect cr;77GetClientRect(&cr);78BITMAP bmpinfo;79GetObject(backBmp.m_hObject,sizeof(BITMAP),&bmpinfo); 80int wDelta=bmpinfo.bmWidth; inthDelta=bmpinfo.bmHeight;81for(int w=0;w<cr.Width();w+=wDelta)82 for(int h=0;h<cr.Height();h+=hDelta)83 pDC->BitBlt(w,h,wDelta,hDelta,&memDC,0,0,SRCCOPY); 84memDC.SelectObject(oldBmp);85memDC.DeleteDC();86*/87//方案一,直接返回,使用画刷改变视图单调的背景88return true;8990}几种色调的数字表示:m_nColorRef[0] = RGB(51, 204, 102); // 绿m_nColorRef[2] = RGB(233, 121, 118); // 砖红m_nColorRef[3] = RGB(0, 143, 224); // 蓝m_nColorRef[4] = RGB(153, 153, 204); // 青m_nColorRef[5] = RGB(204, 204, 204); // 灰m_nColorRef[6] = RGB(232, 123, 20); // 橙m_nColorRef[7] = RGB(235, 88, 235); // 粉m_nColorRef[8] = RGB(220, 39, 75); // 红。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MFC设置窗体背景图片(画刷)先载入一张图片,ID为IDB_BITMAP2TestDlg.h中:CBrush m_brBk;//在public中定义TestDlg.cpp中:在初始化函数OnInitDialog()中加入:BOOL CTestDlg::OnInitDialog(){CDialog::OnInitDialog();CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2);m_brBk.CreatePatternBrush(&bmp);bmp.DeleteObject();return TRUE; // return TRUE unless you set the focus to a control}再打开类向导,找到WM_CTLCOLOR消息,重载得对应函数OnCtlColor(),添加如下:HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if (pWnd == this){return m_brBk;}return hbr;}按照上面的方法一路COPY下来运行,OK!并且由于图片是做为背景显示的,所以再添的按钮都能很好的显示出来,非常方便。

总结一下其中出现的变量和函数。

CBrush:类CBrush封装了Windows图形设备接口(GDI)中的画刷,画刷也就是采取什么方案填充图形的背景的工具。

OnInitDialog ( ):用于对对话框类的变量的初始化(注意:是在产生对话框之前就初始化),是WM_INITDIALOG消息产生的消息处理函数,覆盖该函数可改变对话框初始设置。

用法:virtual BOOL OnInitDialog();返回值指定对话框是否对它的一个控件设置输入焦点。

如果OnInitDialog返回非零值,Windows 将输入焦点设在对话框的第一个控件上,只有在对话框明确将输入焦点设在某控件上,应用返回0。

CBitmap:类CBitmap封装了Windows图形设备接口(GDI)中的位图,并且提供操纵位图的成员函数。

LoadBitmap ( ):CBitmap类的一个成员函数,从应用的可执行文件中加载一个命名的位图资源来初始化位图对象。

用法:BOOL LoadBitmap( LPCTSTR lpszRecourceName );BOOL LoadBitmap( UINT nIDResource );返回值调用成功时返回非零值,否则为0。

参数lpszResourceName指向一个包含了位图资源名字的字符串(该字符串以null结尾)。

NIDResource指定位图资源中资源的ID号。

本函数从应用的可执行文件中加载由lpszResourceName指定名字或者由nIDResource指定的ID号标志的位图资源。

加载的位图被附在Cbitmap对象上。

如果由lpszResourceName指定名字的对象不存在,或者没有足够的内存加载位图,函数将返回0。

可以调用函数CgdiObject::DeleteObject删除由LoadBitmap加载的位图,否则Cbitmap的析构函数将删除该位图对象。

CreatePatternBrush ( ):CBrush类的一个成员函数,用位图指定的模式初始化画刷。

用法:BOOL CreatePatternBrush( CBitmap* pBitmap );返回值调用成功时返回非零值,否则为0。

参数pBitmap指定一个位图。

本函数用位图指定的模式初始化画刷。

此画刷随后就可用于任何支持光栅操作的设备上下文。

由bBitmap指定的位图一般用以下的函数初始化:CBitmap:: CreateBitmap、CBitmap::CreateBitmapIndirect、CBitmap::LoadBitmap或Cbitmap::CreateCompatibleBitmap。

DeleteObject ( ):CgdiObject类的一个成员函数,从内存中删除附加给CGdiObject的Windows GDI对象,释放与此对象相关的系统存储空间。

GdiObject类为各种Windows图形设备接口(GDI)对象,如位图、区域、画刷、画笔、调色板、字体等提供了一些基本类。

我们不会直接构造一个CGdiObject对象,而是使用某一个派生类如CPen或CBrush创建。

用法:BOOL DeleteObject( );如果GDI对象被成功删除,则返回非零值,否则为0。

通过释放附加的GDI对象占有的系统存储来删除它们。

与CGdiObject对象有关的存储不受此调用的影响。

如果CGdiObject对象正被选入设备上下文中,则应用不可对此对象调用DeleteObject。

当一个模式画刷被删除时,与之相关联的位图不被删除。

位图必须被独立删除。

HBRUSH:数据类型,用于定义画刷句柄。

在Windows环境中,句柄是用来标识项目的,这些项目包括:module, task,instance, file ,block of memory, menu, control, font, resource, icon, cursor, string, GDI object等,包括bitmap, brush, metafile, palette, pen, region以及设备描述表device context。

实际上,句柄是一个标识符,用来表示对象或者项目,是一个32位的正整数。

应用程序几乎总是通过调用一个Windows函数来获得一个句柄,之后其他的Windows 函数就可以使用这个句柄, 以引用相应的对象。

WM_CTLCOLOR消息:WM_CTLCOLOR是一个由控制(Control)发送给它父窗口的通知消息(Notification message)。

利用向导映射该消息产生函数:HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);参数pDC是TestDlg的设备上下文,pWnd是TestDlg中发送该消息的control指针,nCtlColor是Control的类型编码。

WM_CTLCOLOR是系统在绘制控件的时候自动发送的,如果需要自定义,就截取这个消息并重载它的响应函数,用classWizard添加WM_CTLCOLOR 消息然后编辑其OnCtlColor函数。

这样Windows向应用程序发送消息WM_CTLCOLOR,应用程序处理WM_CTLCOLOR消息并返回一个用来绘画窗体背景的刷子句柄//放在OnPaint()里{//设置背景图片CRect rect;GetClientRect(&rect);CDC *pDC=GetDC();CDC memdc;memdc.CreateCompatibleDC(pDC);CBitmap bitmap;//从资源中载入位图bitmap.LoadBitmap(IDB_BITMAP1);memdc.SelectObject(bitmap);pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);}对于VC++文档、视结构中的视图,从用户的角度来看,只是可以改变大小、位置的普通窗口,同其他基于Windows应用程序的窗口是一样的;从程序员的角度来看,视图并不是普通的窗口,而是从MFC库中CView类派生的类对象。

像任何VC++对象一样,视图对象的行为由类的成员函数(数据成员)决定,包括派生类中应用程序定义的函数和从基类继承来的函数。

提出问题视图的背景一般来说是白色的,在缺省情况下,它和系统定义的颜色COLOR_WINDOW 是一致的。

设计者一般会希望自己的程序可以让用户轻松地改变窗口背景颜色,或是用漂亮的图片来充填背景。

澳门新濠天地官网 我们可以用Windows函数SetSysColors 来重新指定COLOR_WINDOW所对应的实际颜色,来达到改变视图背景颜色的目的。

但这样会同时改变其他应用程序的视图窗口背景,使得整个Windows系统的颜色设置产生混乱。

另外,我们可能会用以下方法来设置视图的背景颜色,即在CView的OnDraw函数中添写如下一段程序代码:void CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CRect rectClient;CBrush brushBkColor;GetClientRect(rectClient);brushBkColor.CreateSolidBrush(RGB(255,0,0));pDC->DPtoLP(rectClient);pDC->FillRect(rectClient,&brushBkColor);…}这样可以达到改变当前应用程序的视图背景的目的,但同时也产生了一些不良影响,使得程序运行效果不尽如人意。

分析问题我们知道,在VC++的文档、视结构中,CView的OnDraw函数用于实现绝大部分图形绘制的工作。

如果用户改变窗口尺寸,或者显示隐藏的区域,OnDraw函数都将被调用来重画窗口。

并且,当程序文档中的数据发生改变时,一般必须通过调用视图的Invalidate(或InvalidateRect)成员函数来通知Windows所发生的改变,对Invalidate的调用也会触发对OnDraw函数的调用。

正因为OnDraw函数被频繁调用,所以在其执行时,每次都刷新填充一次视图客户区域,便会使屏幕不稳定,产生闪烁现象。

笔者通过对VC++应用程序框架结构和Windows消息映射系统的仔细研究,找到另外一种改变视图背景的方法,其执行效果比上述两种方法都好。

其实在程序调用OnDraw函数之前,会触发一个Windows消息:WM_ERASEBKGND,以擦除视图刷新区域。

在缺省情况下,Windows系统使用视图窗口注册时窗口类中的成员hbrBackground所描述的画刷来擦除屏幕,这一般会将屏幕刷新成COLOR_WINDOW所对应的颜色。

因此,在OnDraw函数中设置背景颜色的执行过程是这样的:先将屏幕刷新成COLOR_WINDOW所对应的颜色,接着又在OnDraw函数中填充其他颜色,这正是产生屏幕闪烁的根本原因。

解决问题通过上述分析,我们应将视图背景颜色填充移到Windows消息:WM_ERASEBKGND所对应的消息映射函数中,而不是在OnDraw函数中。

相关文档
最新文档