对话框美化教程.doc_第1页
对话框美化教程.doc_第2页
对话框美化教程.doc_第3页
对话框美化教程.doc_第4页
对话框美化教程.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.设置对话框背景图片 插入资源中-插入-Bitmap-引入 要设置成背景的图片(本例引入两个ID分别为IDB_BITMAP1,IDB_BITMAP2)拉入图像 设置成位图-然后选择 属性(M)中选择位图的ID2.设置对话框背景颜色 在.cpp中 BOOL CMyApp:InitInstance() AfxEnableControlContainer(); / Standard initialization / If you are not using these features and wish to reduce the size / of your final executable, you should remove from the following / the specific initialization routines you do not need.#ifdef _AFXDLL Enable3dControls(); / Call this when using MFC in a shared DLL#else Enable3dControlsStatic(); / Call this when linking to MFC statically#endif CMyDlg dlg; m_pMainWnd = &dlg; SetDialogBkColor(RGB(255,255,255),RGB(0,0,0);/这里设置对话框背景颜色为白色,文本/颜色为黑色 int nResponse = dlg.DoModal(); if (nResponse = IDOK) / TODO: Place code here to handle when the dialog is / dismissed with OK else if (nResponse = IDCANCEL) / TODO: Place code here to handle when the dialog is / dismissed with Cancel / Since the dialog has been closed, return FALSE so that we exit the / application, rather than start the applications message pump. return FALSE;3.设置按钮位图 插入Bitmap (ID分别为IDB_BITMAP3,IDB_BITMAP4) 在对话框头文件中定义CBitmap;protected: CBitmap bitmap1,bitmap2;然后在对话框Dlg.cpp文件中的OnIniDialog()中加入以下代码 bitmap1.LoadBitmap(IDB_BITMAP3); CButton *m_pButton1, *m_pButton2; m_pButton1=(CButton*)GetDlgItem(IDOK); m_pButton1-SetBitmap(HBITMAP(bitmap1); bitmap2.LoadBitmap(IDB_BITMAP4); m_pButton2=(CButton*)GetDlgItem(IDC_HAHA); m_pButton2-SetBitmap(HBITMAP(bitmap2); / TODO: Add extra initialization here然后编译运行 看下效果顶在VC中让对话框显示背景图点评:用图片控件,好像图片最多色彩数不超过256色,也就是8位,但是用代码在里面写的方法就可以解决这个问题了.让一个对话框显示背景通常有两种做法:使用图片控件、在WM_PAINT消息中画图。 用图片控件非常简单,但功能功能不强大,不能对图片拉申等。 在WM_PAINT中画图,相对复杂,但可以做很多特殊处理(如对图片拉申、图片取反等等)。 那么下面就对两种方法略述。 1、用图片控件 在对话框中加入Picture控件,属性页中GeneralType设为Bitmap, Image中选中相关联的图片资源号。 这样就编译运行,你就会发现它己经可以了。 耶,不对,图片复盖了其它控件!怎么办? 哈哈,这是由于你的Picture控件是后面放上去的。这样它会显示在最上层,所以有些控件看不到了。有两种方法可以解决: (1)、选中所有控件Ctrl+A, 然后取消对图片控件的选择,将其它控件剪切Ctrl+X,再粘帖 Ctrl+C, 编译运行或Ctrl+T看看,是不是可以了? (2)、在.rc文件中找到此对话框的定义,此处以例子中的一对话框为例。 IDD_DLG_USE_STATIC DIALOGEX 0, 0, 266, 201 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_APPWINDOW CAPTION DlgUseStatic FONT 9, 宋体 BEGIN CONTROL 129,IDC_STATIC,Static,SS_BITMAP,0,0,266,201 PUSHBUTTON 取消,IDCANCEL,210,23,50,14 DEFPUSHBUTTON 确定,IDOK,210,7,50,14 LTEXT 这是个通过图片控件来实现Dialog背景的,IDC_STATIC,13,106,156,8 PUSHBUTTON 方法二,IDC_BUTTON1,215,104,50,14 END 在BEGIN至END中便是各个控件的定义和先后顺序,你可以随意调整它们的顺序,这样最先的,它将会显示在最底层(即可能被其它控件覆盖)。 2、在WM_PAINT中画图 这是显示图片最常用的方法,各类窗体、控件要加上背景都基本上是在OnPaint中将图片画上。具体做法如下: /从资源中载入图片 CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); /得到图片信息 BITMAP bmpInfo; bmp.GetBitmap(&bmpInfo); /在内存中创建一个位图兼容设备 CDC dcMemory; dcMemory.CreateCompatibleDC(&dc); /将图片选入兼容设备 CBitmap *pOldBmp=dcMemory.SelectObject(&bmp); /将兼容设备的内容copy到屏幕设备中,实现真正的Paint dc.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY); /将设备还原 dcMemory.SelectObject(pOldBmp); 这样图片便显示在主对话框上。 特殊处理: 是不是经常有人提到某些加快图形显示、减少闪烁?处理什么WM_ERASEBKGND消息? 确实是这样,应为每个窗体重画时,它先会发WM_ERASEBKGND消息,让窗体用设置好的刷子将窗体需要重画的区域刷一次,然后才会发送 WM_PAINT消息,将需要的再画上去。这样就可以保证不会有残留的图形。但这样就会在短暂的时间内出现灰色背景,如果执行比较慢,就会让人感觉到。因此如果你确定不需要清除原有的背景,那么你就可以在OnEraseBkgnd中直接返回TRUE,或者直接在这里面绘图。 但一定要注意,不擦除背景时弄不好会带来上些麻烦事,源码中有此演示(由于一开始设置为不擦除背景,所以窗体创建时,没有画图的部分将显示为原来屏幕上的图象)。 同时源码中演示了对图片的拉申,实质上通过CDC我们可以对图象进行众多的处理,请参见有观资料或MSDN。我们使用过很多的软件, 给我们留下印象很深的是那些界面漂亮且迷人的软件, 国外的软件象QuickTime,国产的象金山词霸等,它们的软件界面设计风格都有独特之处。本人跟据自已的经验和大家探讨一下软件的漂亮界面实现的原理并提供DEMO程序。本人经验不多,经常从VCKBASE.COM吸取知识,共同学习,如有不足之处,请指正!也欢迎和我联系。下面就开始吧! 一、漂亮界面实现的原理 用图象元素自绘窗口标题样栏,边框,系统按钮(最大化、最小化、关闭按钮)还有按窗口中的控件。图象当然是美工画的,但要你教美工怎么去画,是不是不能理解? ,呆会我会告诉你你如何去教美工画.请先仔细看下图。 明白了吧,被红线包括的部分都是要画的图象。画得好不好会直接影响你的软件界面。 二、原理说玩了,来说一下实现的基本知识 1、VC软件绘图技术: CBitmap* pBitmap = new CBitmap; BITMAP BmpInfo; CBitmap* pOldBitmap; CDC* pDisplayMemDC=new CDC; pDisplayMemDC-CreateCompatibleDC(pDC); pBitmap-LoadBitmap(IDB_TITLE_LEFT); pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap); pBitmap-GetBitmap(&BmpInfo); / x,y为绘图位置 ,必要时此语句要有For(.;.;.)控制 pDC-BitBlt(x,y, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC-SelectObject(pOldBitmap); pBitmap-DeleteObject(); ReleaseDC(pDisplayMemDC);/记得执行以下的语句 delete pDisplayMemDC; delete pBitmap; 2、坐标的概念:点、窗口坐标和屏幕坐标及转换,很重要!如不清楚请先复习相关知识。 下图是我写在一个界面,就是基于上述原理实现的: 下面介绍软件如何实现的: 、重载对话框的消息函数:void OnNcLButtonDown(UINT nHitTest, CPoint point);/单击标题栏时是响应void OnNcMouseMove(UINT nHitTest, CPoint point);/Mous 在标题移动时响应LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 、添加关键成员函数为:BOOL DrawTitleBar(CDC *pDC) 、添加完消息涵数后,在.cpp中实现它们的代码:void CTitleBarDlg:OnNcMouseMove(UINT nHitTest, CPoint point) CDC* pDC = GetWindowDC(); CDC* pDisplayMemDC=new CDC; pDisplayMemDC-CreateCompatibleDC(pDC); CBitmap* pBitmap = new CBitmap; CBitmap* pOldBitmap; CRect rtWnd, rtButton; if (pDC) CString StrTemp = ; GetWindowRect(&rtWnd); /mouse坐标转化为本窗口坐标 重要 point.x = point.x - rtWnd.left; point.y = point.y - rtWnd.top; /判断mouse是否移到系统按钮上 if (m_rtButtExit.PtInRect(point) pBitmap-LoadBitmap(IDB_EXIT_FOCUS); StrTemp = _T(关闭); else if(m_rtButtMin.PtInRect(point) pBitmap-LoadBitmap(IDB_MIN_FOCUS); StrTemp = _T(最小化窗口); else if(m_rtButtMax.PtInRect(point) pBitmap-LoadBitmap(IDB_MAX_FOCUS); if(IsZoomed() StrTemp = _T(还原窗口); else StrTemp = _T(最化大窗口); else pBitmap-LoadBitmap(IDB_NORMAL); rtButton = m_rtButtMin; BITMAP BmpInfo; pBitmap-GetBitmap(&BmpInfo); pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap); pDC-BitBlt(rtButton.left-6, rtButton.top-2, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC-SelectObject(pOldBitmap); pBitmap-DeleteObject(); CRect ShowTipRec; ShowTipRec = m_rtButtMin; if(!StrTemp.IsEmpty() / ScreenToClient(&ShowTipRec); / m_ToolTip.AddToolTip(IDD_TITLEBAR_DIALOG,&ShowTipRec,StrTemp); / m_ToolTip.SetDelayTime(200); ReleaseDC(pDisplayMemDC); ReleaseDC(pDC); delete pDisplayMemDC; delete pBitmap; CDialog:OnNcMouseMove(nHitTest, point);/此为关键函数void CTitleBarDlg:rawTitleBar(CDC *pDC) if (m_hWnd) CBrush Brush(RGB(0,100,255); CBrush* pOldBrush = pDC-SelectObject(&Brush); CRect rtWnd, rtTitle, rtButtons; GetWindowRect(&rtWnd); /取得标题栏的位置 rtTitle.left = GetSystemMetrics(SM_CXFRAME); rtTitle.top = GetSystemMetrics(SM_CYFRAME); rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME); rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE); /计算最小化按钮的位置,位图大小为15X15 rtButtons.left = rtTitle.right-60; rtButtons.top= rtTitle.top+2; rtButtons.right = rtTitle.right-42; rtButtons.bottom = rtTitle.top+20; m_rtButtMin = rtButtons; /计算最大化按钮的位置,位图大小为15X15 m_rtButtMax.left = m_rtButtMin.left + 18; m_rtButtMax.top = m_rtButtMin.top; m_rtButtMax.right = m_rtButtMin.right + 16; m_rtButtMax.bottom = m_rtButtMin.bottom; m_rtButtExit.left = m_rtButtMax.left + 18; m_rtButtExit.top = m_rtButtMax.top; m_rtButtExit.right = m_rtButtMax.right + 16; m_rtButtExit.bottom = m_rtButtMax.bottom; /准备 CBitmap* pBitmap = new CBitmap; BITMAP BmpInfo; CBitmap* pOldBitmap; CDC* pDisplayMemDC=new CDC; pDisplayMemDC-CreateCompatibleDC(pDC); /重画Caption POINT DrawPonit; DrawPonit.x = rtTitle.left-4; DrawPonit.y = rtTitle.top-4; pBitmap-LoadBitmap(IDB_TITLE_LEFT); pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap); pBitmap-GetBitmap(&BmpInfo); pDC-BitBlt(rtTitle.left-4, rtTitle.top-4, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY); DrawPonit.x = DrawPonit.x + BmpInfo.bmWidth; pDisplayMemDC-SelectObject(pOldBitmap); pBitmap-DeleteObject(); pBitmap-LoadBitmap(IDB_TOP); pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap); pBitmap-GetBitmap(&BmpInfo); while(DrawPonit.xBitBlt(DrawPonit.x, DrawPonit.y, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY); DrawPonit.x = DrawPonit.x + BmpInfo.bmWidth; pDisplayMemDC-SelectObject(pOldBitmap); pBitmap-DeleteObject(); pBitmap-LoadBitmap(IDB_TITLE_RIGHT); pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap); pBitmap-GetBitmap(&BmpInfo); pDC-BitBlt(DrawPonit.x, DrawPonit.y, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC-SelectObject(pOldBitmap); pBitmap-DeleteObject(); /重画最小化button rtButtons = m_rtButtMin; pBitmap-LoadBitmap(IDB_NORMAL); pBitmap-GetBitmap(&BmpInfo); pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap); pDC-BitBlt(rtButtons.left-6, rtButtons.top-2, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC-SelectObject(pOldBitmap); pBitmap-DeleteObject(); int nOldMode = pDC-SetBkMode(TRANSPARENT); COLORREF clOldText=pDC-GetTextColor(); CFont titleFont; titleFont.CreateFont( 12, / nHeight 8, / nWidth 0, / nEscapement文本行逆时针旋转角度 0, / nOrientation字体角度 FW_BOLD, / nWeight字体粗细程度 FALSE, / bItalic FALSE, / bUnderline 0, / cStrikeOut 删除线 ANSI_CHARSET, / nCharSet OUT_DEFAULT_PRECIS, / nOutPrecision CLIP_DEFAULT_PRECIS, / nClipPrecision DEFAULT_QUALITY, / nQuality DEFAULT_PITCH | FF_SWISS, / nPitchAndFamily _T(隶书);/ lpszFac pDC-SelectStockObject(SYSTEM_FIXED_FONT); CFont *OldFont; OldFont = pDC-SelectObject(&titleFont); CString m_StrTitle; GetWindowText(m_StrTitle); pDC-SetTextColor(RGB(80,255,25); if(m_ShowTitle) pDC-TextOut(65,10,m_StrTitle); else m_StrTitle = m_StrTitle.Left(6); m_StrTitle += .; pDC-TextOut(30,10,m_StrTitle); pDC-SetBkMode(nOldMode); pDC-SetTextColor(clOldText); pDC-SelectObject(OldFont); /pDC-TextOut(60,60,m_StrTitle); /重画左边框 pBitmap-LoadBitmap(IDB_LEFTDOWN); pBitmap-GetBitmap(&BmpInfo); pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap); int i ; for (i= 20;iBitBlt(0, rtButtons.top+i, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC-SelectObject(pOldBitmap); pBitmap-DeleteObject(); /重画右边框 pBitmap-LoadBitmap(IDB_RIGHTDOWN); pBitmap-GetBitmap(&BmpInfo); pOldBitmap=(CBitmap*)pDisplayMemDC-SelectObject(pBitmap); GetClientRect(&rtWnd); for (i= 25;iBitBlt(rtWnd.right, i, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC-SelectObject(pOldBitmap); pBitmap-DeleteObject(); /重画底边框 pBitmap-LoadBit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论