MFC中更改背景图片

合集下载

MFC设置字体及颜色(转载)

MFC设置字体及颜色(转载)

函数原型:BOOL CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename );参数说明:nHeight :字体高度. 三中情况 1、>0:字体的高度值(设备坐标);2、=0:字体采用缺省值. 3、<0:此值的绝对值为高度.nWidth :字体宽度.nEscapement :文本行的倾斜度.nOrientation :字符基线的倾斜度.nWeight :字体的粗细.如下:.FW_DONTCARE.FW_THIN.FW_EXTRALIGHT.....bItalic :字体是否为斜体bUnderline :字体是否带下划线cStrikeOut :字体是否带删除线nCharSet :字体的字符集.ANSI_CHARSET.DEFAULT_CHARSET.SYMBOL_CHARSET.....nOutPrecision :字符的输出精度nClipPrecision :字符裁剪的精度nQuality :字符的输出质量nPitchAndFamily :字符间距和字体族(低位说明间距,高位说明字符族)lpszFacename :字体名称[程序实现]假设你已有了名为My的对话框工程.并有一个ID=IDC_EDIT1的Edit控件. class CMyDlg : public CDialog{public:CFont *m_Font;//最好用指针,我用对象调用好像不起作用,不清楚原因!m_Font = new CFont;//结束时记得要delete m_Font;........};BOOL CTMyDlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization here//CFont m_Font;m_Font->CreateFont(-11,0,0,0,100,FALSE,FALSE,0,ANSI_CHARSET,O UT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,"Arial ");CEdit *m_Edit=(CEdit *)GetDlgItem(IDC_EDIT1);m_Edit->SetFont(m_Font,FALSE);return TRUE; // return TRUE unless you set the focus to a control}改变Edit字体颜色!OnCtlColor是一个响应界面上文字字体、文本框背景颜色的消息事件,可以在这里面改变字体颜色、文本框背景颜色。

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

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

MFC中改变对话框背景的几个消息函数的调用顺序、VC设置对话框背景颜色及背景图片可在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.bmWi dth,bit.bmHeight,SRCCOPY);}//全屏显示对话框背景图片(限bmp格式)用了两年的VC,其实对OnPaint的工作原理一直都是一知半解。

MFC背景图片修改

MFC背景图片修改

MFC添加背景图片方法此文系转载,忘了博客地址了VC++中如何给对话框加背景图片(2010-03-22 16:57:59)方法一:1、声明成员变量CBrush m_brush;2、在InitDialog中添加代码:CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP1是图片资源IDm_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);。

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

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

只需要响应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背景音乐与图片的实现

MFC播放声音文件一.播放声音文件的简单方法在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。

利用这些函数可以方便地播放声音。

最简单的播放声音方法就是直接调用VC++中提供的声音播放函数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中参数lpszSound是需要播放声音的.WAV文件的路径和文件名,hmod在这里为NULL,fuSound是播放声音的标志,详细说明请参考VC++中的帮助。

例如播放C:\sound\music.wav可以用sndPlaySound ( "c:\\sound\\music.wav ",SND_ASYNC);或PlaySound( "c:\\sound\\music.wav ",NULL, SND_ASYNC|SND_NODEFAULT );如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。

二.将声音文件加入到程序中在VC++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。

同时VC++也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE 文件,实现无.WAV文件的声音播放。

要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。

假设生成的声音文件资源标识符为IDR_WAVE1。

在播放时只需要调用下面的语句:PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(), SND_ASYNC|SND_ RESOURCE|SND_NODEFAULT|SND_LOOP);其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄,SND_RESOURCE是必须的标志。

位图按钮-更换皮肤

位图按钮-更换皮肤

位图按钮——给按钮换肤用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界面设计

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 修改各种控件的背景颜色、字颜色和字体

MFC 修改各种控件的背景颜色、字颜色和字体今天主要总结一下有关MFC 中静态编辑框(StaticEdit)、编辑框(Edit)和按钮(Button)的背景颜色、字颜色和字体。

我的程序运行结果如下:由上图我们知道修改的地方有:1、把StaticEdit的背景颜色变成黄色,字体颜色变成蓝色;2、Edit的背景颜色变成黄色,字体变成红色,字体为华文楷体3、Button的背景颜色为绿色,字体为红色。

1、对StaticEdit控件修改在0106ChangeColorDlg.h中添加一个变量CBrush m_brush,用来保存控件的背景颜色;对0106ChangeColorDlg添加一个响应WM_CTLCOLOR消息,在OnCtlColor函数中添加如下代码:else if(pWnd->GetDlgCtrlID()==IDC_STA)//如果是静态编辑框{pDC->SetTextColor(RGB(0,0,255));//修改字体的颜色pDC->SetBkMode(TRANSPARENT);//把字体的背景变成透明的return m_brush;//返回背景色}2、对Edit控件修改在OnCtlColor函数中添加如下代码:if(pWnd->GetDlgCtrlID()==IDC_EDIT1)//如果是编辑框{pDC->SetTextColor(RGB(255,0,0));//设置编辑框字体的颜色pDC->SetBkColor(RGB(255,255,0));//设置字体背景颜色CFont font;font.CreatePointFont(100,"华文楷体");pDC->SelectObject(&font);//设置字体return m_brush;}3、对Button控件修改对Button按钮修改需要通过重写DrawItem方法,所以写一个类CSXBtn,继承于CButton类。

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));。

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

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 here
m_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); //图片ID
BITMAP bmp;
bitmap.GetBitmap(&bmp);
//创建内存DC
CDC 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);。

相关文档
最新文档