MFC背景图片修改

合集下载

改变CListCtrl、CHeaderCtrl高度、字体、颜色和背景

改变CListCtrl、CHeaderCtrl高度、字体、颜色和背景

改变CListCtrl、CHeaderCtrl⾼度、字体、颜⾊和背景改变 CListCtrl、CHeaderCtrl ⾼度、字体、颜⾊和背景作者:摘要 ⽤CListCtrl来显⽰数据⽐较⽅便,有时候我们需要标注某⼀列或某⼀个单元格的背景和字体颜⾊,或者需要改变⼀下⾏⾼和字体⼤⼩,CListCtrl要改变这些并不是很⽅便。

本⽂将介绍如何派⽣⼀个类来改变CListCtrl及其表头的⾼度、字体⼤⼩、列背景颜⾊、单元格背景颜⾊、列字体颜⾊、单元格字体颜⾊。

关键字: ⾃绘 ⼦类化 颜⾊ CListCtrl CHeaderCtrl⼀、 实现过程1.表头修改 新建⼀个MFC类CHeaderCtrlCl,其基类为CHeaderCtrl,响应OnPaint消息实现⾃绘,实现代码请看源代码(由于代码较占篇幅,所以就不贴上来了,抱歉),在头⽂件中定义函数LRESULT OnLayout( WPARAM wParam, LPARAM lParam ),之后⼿动添加消息响应ON_MESSAGE(HDM_LAYOUT, OnLayout),在消息响应中改变⾼度,实现代码如下:LRESULT CHeaderCtrlCl::OnLayout( WPARAM wParam, LPARAM lParam ){LRESULT lResult = CHeaderCtrl::DefWindowProc(HDM_LAYOUT, 0, lParam);HD_LAYOUT &hdl = *( HD_LAYOUT * ) lParam;RECT *prc = hdl.prc;WINDOWPOS *pwpos = hdl.pwpos;int nHeight = (int)(pwpos->cy * m_Height); //改变⾼度,m_Height为倍数pwpos->cy = nHeight;prc->top = nHeight;return lResult;}2. 表的修改 新建⼀个MFC类CListCtrlCl,其基类为CListCtrl,定义⼀个CHeaderCtrlCl的成员变量m_Header,重载PreSubclassWindow(),在函数中修改控件类型为⾃绘模式,然后⼦类化表头,代码如下:void CListCtrlCl::PreSubclassWindow(){// TODO: 在此添加专⽤代码和/或调⽤基类ModifyStyle(0,LVS_OWNERDRAWFIXED);CListCtrl::PreSubclassWindow();CHeaderCtrl *pHeader = GetHeaderCtrl();m_Header.SubclassWindow(pHeader->GetSafeHwnd());}添加成员变量,保存⼀些基本信息。

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中改变对话框背景的几个消息函数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界面美化

SDI和MDI程序中对非客户区(标题栏、左右下边界)的美化基本思路是重载CMainFrame类的DefWindowProc()函数,并判断消息为:WM_NCPAINT,WM_NCACTIV ATE,WM_NOTIFY的时候,调用自己的绘制窗口标题栏的函数。

用GetSystemMetrics(SM_CSFRAME)和GetSystemMetrics(SM_CYFRAME)可以取得标题栏的左上角的坐标。

最大化,最小化的按钮自己画,如果不是在标准的位置,一定要记录下他们的位置,并且在WM_NCLBUTTONDOWN消息处理函数中判断是否是点击了按钮,以做出相应的处理。

系统图标也可以自己重新画。

主要任务有贴图(包括标题栏、左边界、右边界、下边界、系统图标、最大化、最小化、关闭按钮)、处理消息(屏蔽系统自带按钮、双击状态栏改变大小、鼠标停放在三个自绘按钮上时改变按钮图标、单击自绘按钮时作出相应反应)。

一、响应的消息及重载的函数响应的消息及重载的函数都在CMainFrame类中。

响应DefWindowProc函数,在其中判断消息是不是WM_NCPAINT、WM_MOVE、WM_NCACTIV ATE、WM_NOTIFY,若是则重画标题栏、左框架、右框架、下框架、最大化、最小化、关闭按钮(放在一个函数里)。

响应消息WM_NCHITTEST,使鼠标位于自绘按钮时返回相应hittest值,同时屏蔽自带按钮的鼠标事件。

简言之,当鼠标位于自绘按钮时,让系统误以为鼠标位于相应按钮,而当鼠标位于系统自带按钮时,让系统误以为鼠标只是位于标题栏。

自绘图标与之类似,不再赘述。

响应消息WM_NCMOUSEMOVE,判断光标是不是位于自绘最大化、最小化、关闭按钮区域,如是则重画相应的按钮。

响应消息WM_NCLBUTTONDOWN,判断单击左键时鼠标是否位于自绘制的最大化、最小化、关闭按钮或图标区域,如是则执行相应的按钮操作。

响应消息WM_NCLBUTTONDBCLK,使双击标题栏时窗口能最大化或还原。

MFC使用Skin++美化皮肤

MFC使用Skin++美化皮肤

MFC使⽤Skin++美化⽪肤查了好⼏天关于MFC应⽤程序换肤的资料,经过各种莫名其妙的问题的困扰,现分享⼀下⾃⼰的体会。

希望可以避免⼀些弯路。

另外会在附上⼀些资源。

环境:Windows 7 + VS2012 + SkinSharp(注:Skin++、USkin、SkinMagic ⽤法相同)1. 新建⼀个⼯程(⼯程名:Demo)(⽐如⼀个基于对话框的MFC程序)如图所⽰,注意不要勾选Use Unicode libraries ,否则可能会出现以下错误:见图2. 添加相关⽂件(.h .lib .dll 以及⽪肤⽂件)下⾯就以SkinSharp、Skin++、USkin、SkinMagic中的⼀种(SkinSharp)进⾏⽰范,其他三种的操作基本是⼤同⼩异。

如图将SkinH.h和SkinH.lib⽂件导⼊⼯程⽂件的⽬录中,如下图所⽰:请注意VC++6.0和VS2012下⼯程⽬录的不同之处,应该是Demo->Demo⽂件夹下(Demo是⼯程名),然后加⼊⼯程的Header Files下:3. 添加必要的代码3.1 在stdafx.h中添加#include "SkinH.h"#pragma comment(lib, "SkinH.lib")如图:在BOOL CDemoApp::InitInstance() 函数下写SkinH_Attach();这句语句是加载默认的⽪肤⽂件:skinh.she3.3 试着编译⼯程,产⽣Debug⽂件(或者Release⽂件)将以下⽂件放⼊Debug⽬录(⼯程根⽬录下的Debug⽂件夹)中如图:3.4 再次编译⼯程即可看到换肤的效果:(添加的是只是skinh.she⽪肤⽂件)3.5 实现更“⾃由”的换肤将SkinH_Attach(); 改为下句SkinH_AttachEx("../Debug/Skins/Green.she", NULL);运⾏效果如下:3.6 如果出现缺少SkinH.dll,就将该⽂件再放到C:\Windows\System32和C:\Windows\SysWOW64⽂件夹下,然后重新编译运⾏就可以了。

位图按钮-更换皮肤

位图按钮-更换皮肤

位图按钮——给按钮换肤用MFC基本控件添加的按钮,总是显得比较枯燥。

为了让平实的按钮表现出更加丰富的效果,我们可以使用CBitmapButton类给按钮添加位图,让按钮换上穿上新装,显示出它华丽的一面。

下面就简单介绍一下实现的步骤。

1.新建MFC应用程序工程,应用程序类型选择基于对话框。

2.我们现在转到资源面板,双击对话框,打开对话框编辑器,给对话框添加一个按钮控件,设置资源ID(假定设置的ID为IDBMBUTTON),在风格页中勾上Owner draw。

3.现在添加准备好的位图资源,设置资源ID。

每个按钮最多可以包含四张图片,分别代表正常、按下、获得焦点和禁用四种状态,其中第一张图片是必须的。

在这里假定它们的ID为BUTTONU,BUTTOND,BUTTONF,BUTTONX,最后一个字母用来代表四种不同的状态。

4.接下来就可以在CXXXDlg类中添加CBitmapButton类型变量了,这里假定名称为m_button。

5.在有了CBitmapButton类型对象后,接下来就在CXXXDlg类的构造函数中为它载入位图,使用的代码如下:if(!m_button.LoadBitmaps(BUTTONU, BUTTOND, BUTTONF, BUTTONX)){TRACE0("Failed to load bitmaps for button\n");AfxThrowResourceException();}6.最后一部就是让CBitmapButton类对象的窗口过程替换掉默认按钮控件的窗口过程(也就是WINDOWS意义上的派生子类),听起来很复杂,其实也蛮简单,只需要在CXXXDlg类的OnInitDialog()函数中添加如下的语句就可以完成:VERIFY(m_button.SubclassDlgItem(IDBMBUTTON, this));m_button.SizeToContent();好了,到这里所有的工作就完成了,编译运行一下看看效果如何。

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中更改背景图片

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

mfc背景图片设置

mfc背景图片设置

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();返回值指定对话框是否对它的一个控件设置输入焦点。

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中设置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); // 红。

我整理的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);HBITMAP hBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP2));p->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);p->SetBitmap(hBitmap);详解:CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP); //获得指向IDC_SHOWBMP的指针,并将其强制转换为CStatic*类型,并赋值给pHBITMAP hBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(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));。

对话框设置背景图片

对话框设置背景图片

对话框设置背景图片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响应函数中,添加以下代码可以修改相关控件的背景颜色等。

MFC单文档应用程序 修改style 光标 图标 背景 等综合

MFC单文档应用程序 修改style 光标 图标 背景 等综合

MFC单文档应用程序修改style 光标图标背景等综合首先我们修改窗体有2种方法一是在窗体创建之前二是在窗体创建之后修改下面就介绍各种修改方法参考MSDN window style window styles用到的函数GetWindowLong SetWindowLong GetClassLong SetClassLong 在窗体创建之后修改窗体的属性图标光标等等AfxRegisterWndClass函数返回一个已经注册的窗口类的名字以便我们给CREATESTRUCT结构体赋值RegisterClass注册窗口类::DefWindowProc 缺省窗口过程一定要加全局符号因为CWnd类也有同名函数否则VC会编译报错AfxGetInstanceHandle获得应用程序句柄LoadIcon(NULL,IDI_ERROR); //要使用系统图标参数一实例的句柄必须设置为NULL 如果引用了图标资源那么不能为NULL 应该是AfxGetApp()->m_hInstance;LoadCursor(NULL,IDC_HELP);1.窗体创建之前修改这种修改是通用的我们可以再从CWnd派生的类中覆盖这个虚函数SDI程序主界面由框架窗体和视图构成这个函数在窗体创建之前BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) //在窗体生成之前传递给MFC底层代码CreateWindowEx在这里的改变会影响到底层代码{ //这个CREATESTRUCT的结构体的参数和创建窗口所需要的WNDCLASSEX参数完全一样只是顺序不同if( !CFrameWnd::PreCreateWindow(cs) ) //window style 参考return FALSE;cs.cx=500; //修改大小cs.cy=500;cs.style&=~FWS_ADDTOTITLE; //MFC默认这个属性把window caption设置为文档标题所以我们要去掉这个属性用&= 取反cs.lpszName=""; //因为引用关系所作的修改都会影响到MFC创建窗体的底层代码//如何修改窗体的图标光标背景呢这些事创建窗口的时候MFC指定的我们不能也不应该修改MFC底层代码但是我们可以注册自己的窗口类/* WNDCLASS wndcls;wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;wndcls.hbrBackground=(HBRUSH)::GetStockObject(BLACK_BRUSH);wndcls.hCursor=::LoadCursor(NULL,IDC_ARROW);wndcls.hIcon=::LoadIcon(NULL,IDI_ERROR);wndcls.hInstance=::AfxGetInstanceHandle();wndcls.lpfnWndProc=::DefWindowProc;// 缺省窗口过程因为CWnd类也有一样的函数所以我们应该加上全局限定符wndcls.lpszClassName="";wndcls.lpszMenuName=NULL;//对于一个MDI程序来说菜单的创建不是在注册窗口类的时候所以NULLwndcls.style=CS_HREDRAW|CS_VREDRAW; //窗口类型水平重画和垂直重绘RegisterClass(&wndcls);//窗口类一经注册全局便可以使用类名字cs.lpszClass=""; //吧底层代码的窗口类换成我们注册的*///上面的修改太过繁琐我们要修改窗口的光标图标背景其实很简单AfxRegisterWndClass()函数返回一个注册的窗口类名//cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,0,LoadI con(NULL,IDI_ERROR));修改成我们注册的窗口类}2.窗体创建之后修改窗体的属性图标光标背景等等具体看MSDN window styles class styles 有相关的设置参数在框架类或者视图类的WM_CREATE消息的响应事件中//SDI的主窗体就是框架就好像基于对话框的程序一样主窗体是对话框//我们再窗体创建之后通过SetWindowLong 改变窗口属性GetWindowLong 获得现有窗口的信息//::SetWindowLong(this->m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW );//修改的属性值参考window styles::SetWindowLong(this->m_hWnd,GWL_STYLE,::GetWindowLong(this->m_hWnd,G WL_STYLE)&~WS_MAXIMIZEBOX);//在视图中用这个函数设置视图的背景在框架类设置背景光标无意义应该砸view类设置光标和背景::SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)::GetStockObject(G RAY_BRUSH));。

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

MFC添加背景图片方法
此文系转载,忘了博客地址了
VC++中如何给对话框加背景图片(2010-03-22 16:57:59)
方法一:
1、声明成员变量CBrush m_brush;
2、在InitDialog中添加代码:
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1是图片资源ID
m_brush.CreatePatternBrush(&bmp);
3、重载对话框的OnCtlColor,改最后的返回值:
1 return (HBRUSH)m_brush; 方法二:
把下面这段代码加进OnPaint()里就行了
CPaintDC dc(this);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1); //这个IDB_BITMAP1要自己添加
CBrush brush;
brush.CreatePatternBrush(&bitmap);
CBrush* pOldBrush = dc.SelectObject(&brush);
dc.Rectangle(0,0,200,200); // 这些参数可以调整图片添加位置和大小
dc.SelectObject(pOldBrush);
方法三:使用StretchBlt()函数,具有图像自适应窗体功能
CPaintDC dc(this);
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1); //这个IDB_BITMAP1要自己添加 CBrush brush;
brush.CreatePatternBrush(&bitmap);
CBrush* pOldBrush = dc.SelectObject(&brush);
dc.Rectangle(0,0,200,200); // 这些参数可以调整图片添加位置和大小 dc.SelectObject(pOldBrush);。

相关文档
最新文档