精华内容
下载资源
问答
  • CString pngFileName=L"D:\\图 样\\png图片\\linux.png"; CBitmap m_bmpDialog; CDC dcMemory; CDC* m_screenDC; m_screenDC=new CDC(); m_screenDC->Attach(::GetDC(NULL)); dcMemory.CreateC
    OnPaint() 中添加
    
    CString pngFileName=L"D:\\图    样\\png图片\\linux.png";
    	CBitmap m_bmpDialog;
    	CDC dcMemory;
    	CDC* m_screenDC;
    
    	m_screenDC=new CDC();
    	m_screenDC->Attach(::GetDC(NULL));
    	dcMemory.CreateCompatibleDC(m_screenDC);
    	ModifyStyleEx(0,0x80000);
    
    	HBITMAP hBitmap;
    	hBitmap=CreateCompatibleBitmap(this->GetDC()->m_hDC,300,300);
    
    	{
    		HDC hDC;
    		WORD wBitCount=32;
    		DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
    		BITMAP Bitmap; 
    		BITMAPINFOHEADER bi; 
    		LPBITMAPINFOHEADER lpbi; 
    		HANDLE hPal,hOldPal=NULL;
    		HBITMAP hDib;
    		GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
    		bi.biSize = sizeof(BITMAPINFOHEADER);
    		bi.biWidth = Bitmap.bmWidth;
    		bi.biHeight = Bitmap.bmHeight;
    		bi.biPlanes = 1;
    		bi.biBitCount = wBitCount;
    		bi.biCompression = BI_RGB;
    		bi.biSizeImage = 0;
    		bi.biXPelsPerMeter = 0;
    		bi.biYPelsPerMeter = 0;
    		bi.biClrImportant = 0;
    		bi.biClrUsed = 0;
    		dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
    		hPal = GetStockObject(DEFAULT_PALETTE);
    		if (hPal)
    		{
    			hDC = ::GetDC(NULL);
    			hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
    			RealizePalette(hDC);
    		}
    		hDib = CreateDIBSection(hDC,(BITMAPINFO*)&bi,DIB_RGB_COLORS, (LPVOID*)&lpbi, NULL, 0);
    		GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi+dwPaletteSize, (LPBITMAPINFO)&bi, DIB_RGB_COLORS);
    		if (hOldPal)
    		{
    			::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
    			RealizePalette(hDC);
    			::ReleaseDC(NULL, hDC);
    		}
    		CloseHandle(hPal);
    		CloseHandle(hOldPal);
    		DeleteObject(hBitmap);
    		hBitmap=hDib;
    	}
    	m_bmpDialog.DeleteObject();
    	m_bmpDialog.Attach(hBitmap);
    
    	CBitmap *pOldBitmap= dcMemory.SelectObject(&m_bmpDialog);
    	BITMAP bmpInfo;
    	m_bmpDialog.GetBitmap(&bmpInfo);
    	CRect rectDlg;
    	this->GetWindowRect(rectDlg);
    	CPoint ptWindowScreenPosition(rectDlg.TopLeft());
    	CSize szWindow(bmpInfo.bmWidth, bmpInfo.bmHeight);
    	BLENDFUNCTION blendPixelFunction= { AC_SRC_OVER, 0, 255, 0x01};
    	CPoint ptSrc(0,0);
    
    	//
    	//Image *m_bit=new Bitmap(pngFileName.AllocSysString());
    
    	Image *m_Png;
    	m_Png=Image::FromFile(pngFileName);
    	Graphics graphics(dcMemory.m_hDC);
    	graphics.DrawImage(m_Png,0,0);
    	//
    	graphics.ReleaseHDC(dcMemory.m_hDC);
    	
    	::UpdateLayeredWindow(this->m_hWnd,m_screenDC->m_hDC,
    		&ptWindowScreenPosition, 
    		&szWindow,
    		dcMemory,
    		&ptSrc, 0, 
    		&blendPixelFunction, 0x02);
    OnLButtonDown(UINT nFlags, CPoint point)
    {
    	PostMessage(WM_NCLBUTTONDOWN,   HTCAPTION,   MAKELPARAM(point.x,   point.y));
    	CDialog::OnLButtonDown(nFlags, point);
    }

    #include <gdiplus.h>
    using namespace Gdiplus;

    #pragma comment(lib,"gdiplus.lib")





    GdiplusStartupInput gdiplusStartupInput;
    GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

    展开全文
  • MFC对话框编程中怎么实现添加PNG格式的图片作为对话框的背景? 希望各位高人指点下,有代码更好哈!我在网上搜索了下,用那个GDI+使PNG格式图实现对话框背景,这个实在是太麻烦了,我想要用更加简单的方式实现。...
  • GDI+使用PNG格式图实现对话框背景及控件全透明技术实现思想  实习两个多礼拜,很快就适应了环境,不过临时调到软件组去做控件及界面了,用的开发平台是visual studio 2008,毕业以来一直做的都是嵌入式C语言,还...
     GDI+使用PNG格式图实现对话框背景及控件全透明技术实现思想
    

      实习两个多礼拜,很快就适应了环境,不过临时调到软件组去做控件及界面了,用的开发平台是visual studio 2008,毕业以来一直做的都是嵌入式C语言,还真是有些痛苦,不过还好以前对GDI有所接触,所以做GDI+也不是大问题,对于C++也只是大学学了些理论知识,没有什么实际开发经验,这次正好搞定C++,让自己的遗憾就此消除。在高人的指点下于是就硬着头皮去做了啦。


      人有些时候,是被逼的,明明不会却硬着头皮去做起来,而往往这段最最煎熬的日子却是最充实的,化蛹成蝶的痛苦莫过于此吧。


      言归正传吧,话说要实现对话框背景及其上面的控件全透明,但是查了好多网上、MSDN的资料后,得出一个结论,只能实现这几种情况:1、对话框背景透明而其上的控件不能透明;2、对话框背景不透明而其上的控件透明;3、如果硬要都透明,由于微软的好多控件内置图是不能替换的,所以会导致什么都看不见。


      那么我们要达到对话框及其上面的控件全透明怎么办呢?核心思路是:使背景和控件都全透,然后通过GDI+的提供的借口来捕获这些对话框背景及其上面控件的消息,来获得具体的一些位置信息从而用GDI+使用PNG图绘制出透明背景及控件。具体就是通过继承GDI+的类来保留控件的消息及由此而继承来的位置信息,我们就是要这些位置信息来使用PNG绘图。

         对于编辑框的实现,由微软自带的编辑框使用drawtext来绘制文字,而GDI+只能用drawstring来绘制,尽管使用相同字体,这两种函数会出来的字是不一样的,所以在实现编辑框的文字输出时,只能 以插入符为参考系,从系统得到插入符的位置,用画线的方式绘制出来,而文字使用获取窗口内容的函数获得后采用化整为零的方法是用drawstring一个个字去绘制出来。这样经过细致的调节后能够基本模拟原本的文字输出状况。

     

          以下是我用这种方法实现treectrl 的例子

      实现文件:

    /************************************************************
      FileName: TprTreeCtrl.cpp
      Author:LiuGuanfa
      Version:1.0
      Date:2011.4.2
      Description:实现treectrl的透明显示
      History:   
          <author>  <time>   <version >   <desc>
          LiuGuanfa    2011/04/03     1.0  build this moudle 
    ***********************************************************/

    #include "stdafx.h"
    #include "TprUiFun.h"
    #include "TprTreeCtrl.h"
    #include "../ItfResource/ItfResource1920/resource.h"


    IMPLEMENT_DYNAMIC(CTprTreeCtrl, CTreeCtrl)

    CTprTreeCtrl::CTprTreeCtrl()
    {
     m_pLogTprTreeCtrl = NULL;
     m_pTprTreeCtrlLogFont = NULL;
     m_pTprTreeCtrlTxtFont = NULL;
     m_pTprTreeCtrlSysFont = NULL;
    }

    CTprTreeCtrl::~CTprTreeCtrl()
    {
     if(m_pLogTprTreeCtrl != NULL)
     {
      delete m_pLogTprTreeCtrl;
      m_pLogTprTreeCtrl = NULL;
     }

     if(m_pTprTreeCtrlLogFont != NULL)
     {
      delete m_pTprTreeCtrlLogFont;
      m_pTprTreeCtrlLogFont = NULL;
     }

     if (m_pTprTreeCtrlSysFont != NULL)
     {
      delete m_pTprTreeCtrlSysFont;
      m_pTprTreeCtrlSysFont = NULL;
     }

     if (m_pTprTreeCtrlTxtFont != NULL)
     {
      delete m_pTprTreeCtrlTxtFont;
      m_pTprTreeCtrlTxtFont = NULL;
     }

    }


    BEGIN_MESSAGE_MAP(CTprTreeCtrl, CTreeCtrl)
     ON_WM_PAINT()
    END_MESSAGE_MAP()

    void CTprTreeCtrl::InitTprTreeCtrl(const LOGFONT *pLogFont, TPRTREECTRL *pLogTprTreeCtrl)
    {
     int i;

     if(m_pTprTreeCtrlLogFont==NULL)
     {
      m_pTprTreeCtrlLogFont = new LOGFONT;
     }
     m_pTprTreeCtrlLogFont->lfHeight = pLogFont->lfHeight;
     m_pTprTreeCtrlLogFont->lfWidth = pLogFont->lfWidth;
     m_pTprTreeCtrlLogFont->lfEscapement = pLogFont->lfEscapement;
     m_pTprTreeCtrlLogFont->lfOrientation = pLogFont->lfOrientation;
     m_pTprTreeCtrlLogFont->lfWeight = pLogFont->lfWeight;
     m_pTprTreeCtrlLogFont->lfItalic = pLogFont->lfItalic;
     m_pTprTreeCtrlLogFont->lfUnderline = pLogFont->lfUnderline;
     m_pTprTreeCtrlLogFont->lfStrikeOut = pLogFont->lfStrikeOut;
     m_pTprTreeCtrlLogFont->lfCharSet = pLogFont->lfCharSet;
     m_pTprTreeCtrlLogFont->lfOutPrecision = pLogFont->lfOutPrecision;
     m_pTprTreeCtrlLogFont->lfClipPrecision = pLogFont->lfClipPrecision;
     m_pTprTreeCtrlLogFont->lfQuality = pLogFont->lfQuality;
     m_pTprTreeCtrlLogFont->lfPitchAndFamily = pLogFont->lfPitchAndFamily;
     wcscpy(m_pTprTreeCtrlLogFont->lfFaceName,pLogFont->lfFaceName);

     if(m_pLogTprTreeCtrl==NULL)
     {
      m_pLogTprTreeCtrl = new TPRTREECTRL;
     }

     m_pLogTprTreeCtrl->pImageAddSub[0] = pLogTprTreeCtrl->pImageAddSub[0];
     m_pLogTprTreeCtrl->pImageAddSub[1] = pLogTprTreeCtrl->pImageAddSub[1];
     for (i=0; i<9; i++)
     {
      m_pLogTprTreeCtrl->pImageNineFormat[i] = pLogTprTreeCtrl->pImageNineFormat[i];
     }

     for (i=0; i<3;i++)
     {
      m_pLogTprTreeCtrl->pImageScrollBarH[i] = pLogTprTreeCtrl->pImageScrollBarH[i];
      m_pLogTprTreeCtrl->pImageScrollBarV[i] = pLogTprTreeCtrl->pImageScrollBarV[i];

     }
     m_pLogTprTreeCtrl->pImageThumbH[0] = pLogTprTreeCtrl->pImageThumbH[0];
     m_pLogTprTreeCtrl->pImageThumbV[0] = pLogTprTreeCtrl->pImageThumbV[0];
     /*
     for (i=0; i<2;i++)
     {
      m_pLogTreeCtrl->pImageScrollArrowH[i] = pLogTprTreeCtrl->pImageScrollArrowH[i];
      m_pLogTreeCtrl->pImageScrollArrowV[i] = pLogTprTreeCtrl->pImageScrollArrowV[i];
     }
     */

     //设置GDItree ctrl字体
     m_pTprTreeCtrlSysFont = new CFont;
     if (!(m_pTprTreeCtrlSysFont->CreateFontIndirect(m_pTprTreeCtrlLogFont)))
     {
      MessageBox(_T("创建字体失败!"), _T("提示"), MB_OK);
     }
     this->SetFont(m_pTprTreeCtrlSysFont,TRUE);

     //创建GDI+tree ctrl字体
     m_pTprTreeCtrlTxtFont = new TEXTFONT;
     if (m_pTprTreeCtrlTxtFont)
     {
      m_pTprTreeCtrlTxtFont->coColor = Color(245,0,0,0);
      m_pTprTreeCtrlTxtFont->pStringFormat = new StringFormat;
      m_pTprTreeCtrlTxtFont->pStringFormat->SetAlignment(StringAlignmentNear);
      m_pTprTreeCtrlTxtFont->pStringFormat->SetLineAlignment(StringAlignmentCenter);
      m_pTprTreeCtrlTxtFont->pStringFormat->SetTrimming(StringTrimmingEllipsisCharacter);

      m_pTprTreeCtrlLogFont->lfWidth = m_pTprTreeCtrlLogFont->lfWidth * 1;
      m_pTprTreeCtrlLogFont->lfHeight= m_pTprTreeCtrlLogFont->lfHeight * 1;
      m_pTprTreeCtrlTxtFont->pFont =new Font(this->GetDC()->m_hDC,m_pTprTreeCtrlLogFont);
     }
    }

    /*
    *绘制TprTreeCtrl接口
    */
    void CTprTreeCtrl::DrawTprTreeCtrl(CDC* pDC)
    {
     CDC *pDCDst=this->GetDC();
     CDC dcSrc;
     dcSrc.CreateCompatibleDC(pDCDst);
     CRect reWindowRect;
     this->GetWindowRect(&reWindowRect);
     CBitmap cBitmap;
     cBitmap.CreateCompatibleBitmap(pDCDst, reWindowRect.Width(), reWindowRect.Height());
     dcSrc.SelectObject(&cBitmap);

     Graphics *pGraphics = new Graphics(dcSrc.m_hDC);
     if(NULL!=pGraphics)
     {
      DrawFrame(pGraphics);
      DrawTree(pGraphics);
      DrawScrollBar(pGraphics);
     }

     CRect rePrRect;
     GetParent()->GetWindowRect(&rePrRect);
     CRect reWinRect;
     this->GetWindowRect(&reWinRect);
     CRect reDlgRect;
     reDlgRect.left = reWinRect.left - rePrRect.left;
     reDlgRect.top = reWinRect.top - rePrRect.top;
     pDC->BitBlt(reDlgRect.left, reDlgRect.top, reWinRect.Width(), reWinRect.Height(), &dcSrc, 0, 0, SRCCOPY);

     delete pGraphics;
     pGraphics = NULL;
     cBitmap.DeleteObject();
     dcSrc.DeleteDC();
     this->ReleaseDC(pDCDst);
    }

    /*
    *绘制背景
    */
    void CTprTreeCtrl::DrawFrame(Graphics *pGraphics)
    {
     RECT tClientRect;
     RECT tWndRect;
     int i;
     int iPosX;
     int iPosY;
     int iWidth;
     int iHight;
     int iCycTimes;

     //this->GetClientRect(&tClientRect);
     this->GetWindowRect(&tWndRect);
     tClientRect.left  = 0;
     tClientRect.top   = 0;
     tClientRect.right = tWndRect.right - tWndRect.left;
     tClientRect.bottom = tWndRect.bottom - tWndRect.top;


     //绘制九宫格第0块
     iPosX = tClientRect.left;
     iPosY = tClientRect.top;
     iWidth= m_pLogTprTreeCtrl->pImageNineFormat[0]->GetWidth();
     iHight= m_pLogTprTreeCtrl->pImageNineFormat[0]->GetHeight();
     CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[0], RectF(iPosX, iPosY, iWidth, iHight));

     //绘制九宫格第1块
     iPosX = tClientRect.left + m_pLogTprTreeCtrl->pImageNineFormat[0]->GetWidth();
     iPosY = tClientRect.top;
     iWidth= m_pLogTprTreeCtrl->pImageNineFormat[1]->GetWidth();
     iHight= m_pLogTprTreeCtrl->pImageNineFormat[0]->GetHeight();
     iCycTimes = (tClientRect.right - tClientRect.left - m_pLogTprTreeCtrl->pImageNineFormat[0]->GetWidth() - m_pLogTprTreeCtrl->pImageNineFormat[2]->GetWidth())/iWidth;
     for (i=0; i<iCycTimes; i++)
     {  
      CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[1], RectF(iPosX, iPosY, iWidth, iHight));
      iPosX += m_pLogTprTreeCtrl->pImageNineFormat[1]->GetWidth();  
     }
     iWidth = (tClientRect.right - tClientRect.left - m_pLogTprTreeCtrl->pImageNineFormat[0]->GetWidth() - m_pLogTprTreeCtrl->pImageNineFormat[2]->GetWidth()) - iCycTimes * iWidth;
     CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[1], RectF(iPosX, iPosY, iWidth, iHight));

     //绘制九宫格第2块 
     iPosX = tClientRect.right - m_pLogTprTreeCtrl->pImageNineFormat[2]->GetWidth();
     iPosY = tClientRect.top;
     iWidth= m_pLogTprTreeCtrl->pImageNineFormat[2]->GetWidth();
     iHight= m_pLogTprTreeCtrl->pImageNineFormat[2]->GetHeight();
     CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[2], RectF(iPosX, iPosY, iWidth, iHight));

     //绘制九宫格第3块
     iPosX = tClientRect.left;
     iPosY = tClientRect.top + m_pLogTprTreeCtrl->pImageNineFormat[0]->GetHeight();
     iWidth= m_pLogTprTreeCtrl->pImageNineFormat[0]->GetWidth();
     iHight= m_pLogTprTreeCtrl->pImageNineFormat[3]->GetHeight();
     iCycTimes = (tClientRect.bottom - tClientRect.top - m_pLogTprTreeCtrl->pImageNineFormat[0]->GetHeight() - m_pLogTprTreeCtrl->pImageNineFormat[6]->GetHeight())/iHight;
     for (i=0; i<iCycTimes;i++)
     {  
      CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[3], RectF(iPosX, iPosY, iWidth, iHight));
      iPosY += m_pLogTprTreeCtrl->pImageNineFormat[3]->GetHeight();
     }
     iHight = (tClientRect.bottom - tClientRect.top - m_pLogTprTreeCtrl->pImageNineFormat[0]->GetHeight() - m_pLogTprTreeCtrl->pImageNineFormat[6]->GetHeight()) - iCycTimes * iHight; 
     CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[3], RectF(iPosX, iPosY, iWidth, iHight));

     //绘制九宫格第4块
     iPosX = tClientRect.left + m_pLogTprTreeCtrl->pImageNineFormat[0]->GetWidth();
     iPosY = tClientRect.top + m_pLogTprTreeCtrl->pImageNineFormat[0]->GetHeight();
     iWidth= tClientRect.right - tClientRect.left - m_pLogTprTreeCtrl->pImageNineFormat[3]->GetWidth() - m_pLogTprTreeCtrl->pImageNineFormat[5]->GetWidth();
     iHight= tClientRect.bottom - tClientRect.top - m_pLogTprTreeCtrl->pImageNineFormat[1]->GetHeight() - m_pLogTprTreeCtrl->pImageNineFormat[7]->GetHeight();
     CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[4], RectF(iPosX, iPosY, iWidth, iHight));

     //绘制九宫格第5块
     iPosX = tClientRect.right - m_pLogTprTreeCtrl->pImageNineFormat[2]->GetWidth();
     iPosY = tClientRect.top + m_pLogTprTreeCtrl->pImageNineFormat[2]->GetHeight();
     iWidth= m_pLogTprTreeCtrl->pImageNineFormat[2]->GetWidth();
     iHight= m_pLogTprTreeCtrl->pImageNineFormat[5]->GetHeight();
     iCycTimes = (tClientRect.bottom - tClientRect.top - m_pLogTprTreeCtrl->pImageNineFormat[2]->GetHeight() - m_pLogTprTreeCtrl->pImageNineFormat[8]->GetHeight())/iHight;
     for (i=0; i<iCycTimes;i++)
     {  
      CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[5], RectF(iPosX, iPosY, iWidth, iHight));
      iPosY += m_pLogTprTreeCtrl->pImageNineFormat[5]->GetHeight();
     }
     iHight = (tClientRect.bottom - tClientRect.top - m_pLogTprTreeCtrl->pImageNineFormat[2]->GetHeight() - m_pLogTprTreeCtrl->pImageNineFormat[8]->GetHeight()) - iCycTimes * iHight; 
     CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[5], RectF(iPosX, iPosY, iWidth, iHight));


     //绘制九宫格第6块 
     iPosX = tClientRect.left;
     iPosY = tClientRect.bottom - tClientRect.top - m_pLogTprTreeCtrl->pImageNineFormat[6]->GetHeight();
     iWidth= m_pLogTprTreeCtrl->pImageNineFormat[6]->GetWidth();
     iHight= m_pLogTprTreeCtrl->pImageNineFormat[6]->GetHeight();
     CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[6], RectF(iPosX, iPosY, iWidth, iHight));

     //绘制九宫格第7块
     iPosX = tClientRect.left + m_pLogTprTreeCtrl->pImageNineFormat[6]->GetWidth();
     iPosY = tClientRect.bottom - tClientRect.top - m_pLogTprTreeCtrl->pImageNineFormat[6]->GetHeight();
     iWidth= m_pLogTprTreeCtrl->pImageNineFormat[7]->GetWidth();
     iHight= m_pLogTprTreeCtrl->pImageNineFormat[7]->GetHeight();
     iCycTimes = (tClientRect.right - tClientRect.left - m_pLogTprTreeCtrl->pImageNineFormat[6]->GetWidth() - m_pLogTprTreeCtrl->pImageNineFormat[8]->GetWidth())/iWidth;
     for (i=0; i<iCycTimes; i++)
     {  
      CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[7], RectF(iPosX, iPosY, iWidth, iHight));
      iPosX += m_pLogTprTreeCtrl->pImageNineFormat[7]->GetWidth();
     }
     iWidth = (tClientRect.right - tClientRect.left - m_pLogTprTreeCtrl->pImageNineFormat[6]->GetWidth() - m_pLogTprTreeCtrl->pImageNineFormat[8]->GetWidth()) - iCycTimes * iWidth;
     CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[7], RectF(iPosX, iPosY, iWidth, iHight));

     //绘制九宫格第8块
     iPosX = tClientRect.right - m_pLogTprTreeCtrl->pImageNineFormat[8]->GetWidth();
     iPosY = tClientRect.bottom - tClientRect.top - m_pLogTprTreeCtrl->pImageNineFormat[6]->GetHeight();
     iWidth= m_pLogTprTreeCtrl->pImageNineFormat[8]->GetWidth();
     iHight= m_pLogTprTreeCtrl->pImageNineFormat[8]->GetHeight();
     CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageNineFormat[8], RectF(iPosX, iPosY, iWidth, iHight));
    }

    /*
    *绘制树,根据节点的可见性来决定是否绘制
    */
    void CTprTreeCtrl::DrawTree(Graphics *pGraphics)
    {
     HTREEITEM hRoot;
     HTREEITEM hChild;
     HTREEITEM hSibling;
     HTREEITEM hHight;
     UINT nState;
     RECT tRect;
     CString cStr;//每项的文字
     SHORT sHight;//每项的高度
     BOOL buer;
     UINT uiIndent = 0;
     int iIndentTimes = 0;//缩进次数
     int iDashLength = 10;//横虚线长度为10个像素
     int iPosX;
     int iPosY; 
     int i;

     sHight = this->GetItemHeight(); 
     uiIndent = this->GetIndent();//获取缩进量
     pGraphics->SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);//优化字体,消除锯齿走样
     //绘制root
     hRoot=this->GetRootItem();
     this->GetItemRect(hRoot,&tRect,TRUE);
     cStr = this->GetItemText(hRoot);
     pGraphics->DrawString((CONST WCHAR*)(cStr), -1, m_pTprTreeCtrlTxtFont->pFont, RectF(tRect.left, tRect.top, tRect.right - tRect.left, tRect.bottom - tRect.top), m_pTprTreeCtrlTxtFont->pStringFormat, &SolidBrush(m_pTprTreeCtrlTxtFont->coColor));

     Pen *myPen = new Pen(Color(255, 0, 0, 0), 1);//下面有对应的删除
     myPen->SetDashStyle(DashStyleDash); 
     pGraphics->DrawLine(myPen, tRect.left - iDashLength, tRect.top + (sHight)/2, tRect.left, tRect.top + (sHight)/2);//绘制横虚线
     buer = ItemHasChildren(hRoot);//判断root是否有子树以是否需要绘制加减号
     if (buer)
     {
      iPosX = (tRect.left - iDashLength) - m_pLogTprTreeCtrl->pImageAddSub[0]->GetWidth()/2;
      iPosY = (tRect.top + (sHight)/2) - m_pLogTprTreeCtrl->pImageAddSub[0]->GetHeight()/2;
      nState = GetItemState(hRoot, TVIS_EXPANDED);//判断是否展开
      if (0 != (nState & TVIS_EXPANDED))//表示已经展开 
      {   
       CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageAddSub[1], RectF(iPosX, iPosY, m_pLogTprTreeCtrl->pImageAddSub[1]->GetWidth(),  m_pLogTprTreeCtrl->pImageAddSub[1]->GetHeight()));//绘制root的前减号
      }
      else//没展开
      {   
       CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageAddSub[0], RectF(iPosX, iPosY, m_pLogTprTreeCtrl->pImageAddSub[0]->GetWidth(),  m_pLogTprTreeCtrl->pImageAddSub[0]->GetHeight()));//绘制root的前加号
      } 
     }

     //绘制其他所有可见项
     while ((hSibling=this->GetNextVisibleItem(hRoot)) != NULL)
     {
      this->GetItemRect(hSibling,&tRect,TRUE);
      cStr = this->GetItemText(hSibling);
      sHight = this->GetItemHeight(); 
      pGraphics->DrawString((CONST WCHAR*)(cStr), -1, m_pTprTreeCtrlTxtFont->pFont, RectF(tRect.left, tRect.top, tRect.right - tRect.left, tRect.bottom - tRect.top), m_pTprTreeCtrlTxtFont->pStringFormat, &SolidBrush(m_pTprTreeCtrlTxtFont->coColor));
      pGraphics->DrawLine(myPen, tRect.left - iDashLength, tRect.top + (sHight)/2, tRect.left, tRect.top + (sHight)/2);//绘制横虚线
      
      iIndentTimes =(int) ((float)tRect.left/uiIndent)- 1;//注意此处一定把tRect.left转化为浮点!判断其共缩进了几次,然后用这个缩进次数来获取一个自变量从第一个竖线往后逐一绘制出被子树隔开的竖线
      for (i=0;i<iIndentTimes;i++ )
      {
       pGraphics->DrawLine(myPen, tRect.left - iDashLength - uiIndent * i, tRect.top + (sHight)/2, tRect.left - iDashLength - uiIndent * i, (tRect.top + (sHight)/2) - sHight);//绘制被子树隔开的竖虚线
      }
      pGraphics->DrawLine(myPen, tRect.left - iDashLength, tRect.top + (sHight)/2, tRect.left - iDashLength, (tRect.top + (sHight)/2) - sHight);//绘制紧密相连的竖虚线

      buer = ItemHasChildren(hSibling);//判断是否有子树以是否需要绘制加减号
      if (buer)
      {
       iPosX = (tRect.left - iDashLength) - m_pLogTprTreeCtrl->pImageAddSub[0]->GetWidth()/2;
       iPosY = (tRect.top + (sHight)/2) - m_pLogTprTreeCtrl->pImageAddSub[0]->GetHeight()/2;
       nState = GetItemState(hSibling, TVIS_EXPANDED);//判断是否展开
       if (0 != (nState & TVIS_EXPANDED))//表示已经展开
       {     
        CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageAddSub[1], RectF(iPosX, iPosY, m_pLogTprTreeCtrl->pImageAddSub[1]->GetWidth(),  m_pLogTprTreeCtrl->pImageAddSub[1]->GetHeight()));//绘制root的前减号
       }
       else//没展开
       {     
        CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageAddSub[0], RectF(iPosX, iPosY, m_pLogTprTreeCtrl->pImageAddSub[0]->GetWidth(),  m_pLogTprTreeCtrl->pImageAddSub[0]->GetHeight()));//绘制root的前加号
       }
      }
      hRoot = hSibling; 
     }
     delete myPen;

     //绘制选中项的高亮项,此处替换成图
     hHight = this->GetSelectedItem();
     if (hHight != NULL)
     {
      this->GetItemRect(hHight,&tRect,TRUE);
      SolidBrush sBrush(Color(125,0,0,255));
      Pen *myPen = new Pen(Color(255, 0, 0, 0), 1);
      myPen->SetDashStyle(DashStyleDash);
      pGraphics->DrawRectangle(myPen, tRect.left, tRect.top, tRect.right - tRect.left, tRect.bottom - tRect.top);
      pGraphics->FillRectangle(&sBrush,tRect.left, tRect.top, tRect.right - tRect.left, tRect.bottom - tRect.top);
      delete myPen;
     }
    }

    /*
    *绘制滚动条
    */
    void CTprTreeCtrl::DrawScrollBar(Graphics *pGraphics)
    {
     RECT tClientRect;
     RECT tWndRect;
     SCROLLBARINFO tScrollBarInfoV;
     SCROLLBARINFO tScrollBarInfoH;
     int iPosX = 0;
     int iPosY = 0;
     int iWidth= 0;
     int iHight= 0;
     int iCycTimes;
     int i;

     this->GetClientRect(&tClientRect);
     this->GetWindowRect(&tWndRect);

     tScrollBarInfoV.cbSize = sizeof(SCROLLBARINFO);

     if ((tWndRect.right - tWndRect.left) != tClientRect.right)
     {
      //绘制垂直滚动条拇指
      this->GetScrollBarInfo(OBJID_VSCROLL,&tScrollBarInfoV);//得到垂直滚动条的信息,包括“拇指”的坐标信息及滚动条自身的坐标信息等。
      iPosX = tScrollBarInfoV.rcScrollBar.left - tWndRect.left;//所有的X坐标都一样

      CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageThumbV[0], RectF(iPosX, tScrollBarInfoV.xyThumbTop, m_pLogTprTreeCtrl->pImageThumbV[0]->GetWidth(), tScrollBarInfoV.xyThumbBottom - tScrollBarInfoV.xyThumbTop));

      //绘制垂直滚动条衬底
      //三宫格第一块  
      //iWidth= tScrollBarInfoV.rcScrollBar.right - tScrollBarInfoV.rcScrollBar.left;
      iWidth= m_pLogTprTreeCtrl->pImageScrollBarV[0]->GetWidth();
      iHight= m_pLogTprTreeCtrl->pImageScrollBarV[0]->GetHeight();
      CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageScrollBarV[0], RectF(iPosX, iPosY, iWidth, iHight));

      //三宫格第二块
      iPosY = tScrollBarInfoV.rcScrollBar.top - tWndRect.top + m_pLogTprTreeCtrl->pImageScrollBarV[0]->GetHeight();
      //iWidth= tScrollBarInfoV.rcScrollBar.right - tScrollBarInfoV.rcScrollBar.left;
      iWidth = m_pLogTprTreeCtrl->pImageScrollBarV[1]->GetWidth();
      iHight= m_pLogTprTreeCtrl->pImageScrollBarV[1]->GetHeight();
      iCycTimes = (tScrollBarInfoV.rcScrollBar.bottom - tScrollBarInfoV.rcScrollBar.top - m_pLogTprTreeCtrl->pImageScrollBarV[0]->GetHeight() - m_pLogTprTreeCtrl->pImageScrollBarV[2]->GetHeight()) / m_pLogTprTreeCtrl->pImageScrollBarV[1]->GetHeight();
      for (i=0;i<iCycTimes;i++)
      {
       CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageScrollBarV[1], RectF(iPosX, iPosY, iWidth, iHight));
       iPosY += m_pLogTprTreeCtrl->pImageScrollBarV[1]->GetHeight();      
      }
      iHight = (tScrollBarInfoV.rcScrollBar.bottom - tScrollBarInfoV.rcScrollBar.top - m_pLogTprTreeCtrl->pImageScrollBarV[0]->GetHeight() - m_pLogTprTreeCtrl->pImageScrollBarV[2]->GetHeight()) - iCycTimes * m_pLogTprTreeCtrl->pImageScrollBarV[1]->GetHeight();
      CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageScrollBarV[1], RectF(iPosX, iPosY, iWidth, iHight));
      

      //三宫格第三块
      iPosY = tScrollBarInfoV.rcScrollBar.bottom - tWndRect.top - m_pLogTprTreeCtrl->pImageScrollBarV[2]->GetHeight();
      //iWidth= tScrollBarInfoV.rcScrollBar.right - tScrollBarInfoV.rcScrollBar.left;
      iWidth = m_pLogTprTreeCtrl->pImageScrollBarV[2]->GetWidth();
      iHight= m_pLogTprTreeCtrl->pImageScrollBarV[2]->GetHeight();
      CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageScrollBarV[2], RectF(iPosX, iPosY, iWidth, iHight));

      
      /*
      //绘制垂直滚动条上箭头
      iPosX = tScrollBarInfoV.rcScrollBar.left - tWndRect.left;
      iPosY = tScrollBarInfoV.rcScrollBar.top - tWndRect.top;
      iWidth= tScrollBarInfoV.rcScrollBar.right - tScrollBarInfoV.rcScrollBar.left;
      iHight= m_pLogTreeCtrl->pImageScrollArrowV[0]->GetHeight();
      CTprUiFun::DrawImage(pGraphics, m_pLogTreeCtrl->pImageScrollArrowV[0], RectF(iPosX, iPosY, iWidth, iHight));

      //绘制垂直滚动条下箭头
      iPosX = tScrollBarInfoV.rcScrollBar.left - tWndRect.left;
      iPosY = tScrollBarInfoV.rcScrollBar.bottom - m_pLogTreeCtrl->pImageScrollArrowV[1]->GetHeight();
      iWidth= tScrollBarInfoV.rcScrollBar.right - tScrollBarInfoV.rcScrollBar.left;
      iHight= m_pLogTreeCtrl->pImageScrollArrowV[1]->GetHeight();
      CTprUiFun::DrawImage(pGraphics, m_pLogTreeCtrl->pImageScrollArrowV[1], RectF(iPosX, iPosY, iWidth, iHight));
      */
     }

     tScrollBarInfoH.cbSize = sizeof(SCROLLBARINFO);
     if ((tWndRect.bottom - tWndRect.top) != tClientRect.bottom)
     {
      //绘制水平滚动条拇指
      this->GetScrollBarInfo(OBJID_HSCROLL,&tScrollBarInfoH);//得到水平滚动条的信息,包括“拇指”的坐标信息及滚动条自身的坐标信息等。
      iPosY = tScrollBarInfoH.rcScrollBar.top - tWndRect.top;
      //CTprUiFun::DrawImage(pGraphics, m_pLogTreeCtrl->pImageThumbH[0], RectF(tScrollBarInfoH.xyThumbTop, tScrollBarInfoH.rcScrollBar.top - tWndRect.top, tScrollBarInfoH.xyThumbBottom - tScrollBarInfoH.xyThumbTop,tScrollBarInfoH.dxyLineButton));
      CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageThumbH[0], RectF(tScrollBarInfoH.xyThumbTop, iPosY, tScrollBarInfoH.xyThumbBottom - tScrollBarInfoH.xyThumbTop,m_pLogTprTreeCtrl->pImageThumbH[0]->GetHeight()));

      //绘制水平滚动条衬底
      //三宫格第一块
      iPosX = tScrollBarInfoH.rcScrollBar.left - tWndRect.left;
      iWidth= m_pLogTprTreeCtrl->pImageScrollBarH[0]->GetWidth();
      //iHight= tScrollBarInfoH.rcScrollBar.bottom - tScrollBarInfoH.rcScrollBar.top;
      iHight= m_pLogTprTreeCtrl->pImageScrollBarH[0]->GetHeight();
      CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageScrollBarH[0], RectF(iPosX, iPosY, iWidth, iHight));

      
      //三宫格第二块
      iPosX = tScrollBarInfoH.rcScrollBar.left - tWndRect.left + m_pLogTprTreeCtrl->pImageScrollBarH[0]->GetWidth();
      iWidth= m_pLogTprTreeCtrl->pImageScrollBarH[1]->GetWidth();
      //iHight= tScrollBarInfoH.rcScrollBar.bottom - tScrollBarInfoH.rcScrollBar.top;
      iHight= m_pLogTprTreeCtrl->pImageScrollBarH[1]->GetHeight();
      iCycTimes = (tScrollBarInfoH.rcScrollBar.right - tScrollBarInfoH.rcScrollBar.left - m_pLogTprTreeCtrl->pImageScrollBarH[0]->GetWidth() - m_pLogTprTreeCtrl->pImageScrollBarH[2]->GetWidth()) / m_pLogTprTreeCtrl->pImageScrollBarH[1]->GetWidth();
      for (i=0; i<iCycTimes;i++)
      {
       CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageScrollBarH[1], RectF(iPosX, iPosY, iWidth, iHight));
       iPosX += m_pLogTprTreeCtrl->pImageScrollBarH[1]->GetWidth();
      }
      iWidth = (tScrollBarInfoH.rcScrollBar.right - tScrollBarInfoH.rcScrollBar.left - m_pLogTprTreeCtrl->pImageScrollBarH[0]->GetWidth() - m_pLogTprTreeCtrl->pImageScrollBarH[2]->GetWidth()) - iCycTimes * m_pLogTprTreeCtrl->pImageScrollBarH[1]->GetWidth();
      CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageScrollBarH[1], RectF(iPosX, iPosY, iWidth, iHight));
      
      
      //三宫格第三块
      
      iPosX = tScrollBarInfoH.rcScrollBar.right - tScrollBarInfoH.rcScrollBar.left - m_pLogTprTreeCtrl->pImageScrollBarH[2]->GetWidth();
      iWidth= m_pLogTprTreeCtrl->pImageScrollBarH[2]->GetWidth();
      //iHight= tScrollBarInfoH.rcScrollBar.bottom - tScrollBarInfoH.rcScrollBar.top;
      iHight= m_pLogTprTreeCtrl->pImageScrollBarH[2]->GetHeight();
      CTprUiFun::DrawImage(pGraphics, m_pLogTprTreeCtrl->pImageScrollBarH[2], RectF(iPosX, iPosY, iWidth, iHight));
      
      
      /*
      //绘制水平滚动条左箭头
      iPosX = tScrollBarInfoH.rcScrollBar.left - tWndRect.left;
      iPosY = tScrollBarInfoH.rcScrollBar.top - tWndRect.top;
      iWidth= m_pLogTreeCtrl->pImageScrollArrowH[0]->GetWidth();
      iHight= tScrollBarInfoH.rcScrollBar.bottom - tScrollBarInfoH.rcScrollBar.top;
      CTprUiFun::DrawImage(pGraphics, m_pLogTreeCtrl->pImageScrollArrowH[0], RectF(iPosX, iPosY, iWidth, iHight));

      //绘制水平滚动条右箭头
      iPosX =  tScrollBarInfoH.rcScrollBar.right - m_pLogTreeCtrl->pImageScrollArrowH[1]->GetWidth();
      iPosY = tScrollBarInfoH.rcScrollBar.top - tWndRect.top;
      iWidth= m_pLogTreeCtrl->pImageScrollArrowH[1]->GetWidth();
      iHight= tScrollBarInfoH.rcScrollBar.bottom - tScrollBarInfoH.rcScrollBar.top;
      CTprUiFun::DrawImage(pGraphics, m_pLogTreeCtrl->pImageScrollArrowH[1], RectF(iPosX, iPosY, iWidth, iHight));
      */
     }
    }

    /*
    *触发自绘
    */
    void CTprTreeCtrl::OnPaint()
    {
     ::SendMessage(GetParent()->m_hWnd, WM_PAINT, (WPARAM)0, (LPARAM)0);
    }

     

    http://hi.baidu.com/guanfaliu/blog/item/35516e60106e99ca8cb10d58.html

    展开全文
  • 在VC对话框程序主窗口中加载PNG格式的图片做背景 用上网提供代码不显示???? 代码如下: CImage img; img.Load( "XXXXXX.png"); if( !img.IsNull() ) { HBITMAP hBitmap = img.Detach(); } 请那位亲给个...
  • GDI+使用PNG格式图实现对话框背景及控件全透明技术实现思想  以下是我用这种方法实现Editbox 的例子:     实现文件 /************************************************************  Author:LiuGuanfa ...
     GDI+使用PNG格式图实现对话框背景及控件全透明技术实现思想
    

        以下是我用这种方法实现Editbox 的例子:

     

     

    实现文件

    /************************************************************

     Author:LiuGuanfa
      Version:1.1
      Date:2011.03.26
      Description:

      History:   
          <author>  <time>   <version >   <desc>
          LiuGuanfa    2011/03/20     1.0  build this moudle 
    ***********************************************************/

    #include "stdafx.h"
    #include "TprEditBoxCtrl.h"
    #include "TprUiFun.h"
    #include "../ItfResource/ItfResource1920/resource.h"

    #include <iostream>
    #include <cassert>


    IMPLEMENT_DYNAMIC(CTprEditBoxCtrl, CEdit)

    CTprEditBoxCtrl::CTprEditBoxCtrl()
    {
     m_pLogTprEditBoxCtrl = NULL;
     m_pTprEditBoxCtrlLogFont = NULL;
     m_m_pTprEditBoxCtrlSysFont = NULL;
     m_pTprEditBoxCtrlTxtFont = NULL;
     m_ContextOfEditBox = L"";
    }

    CTprEditBoxCtrl::~CTprEditBoxCtrl()
    {
     if(m_pTprEditBoxCtrlTxtFont!=NULL)
     {
      delete m_pTprEditBoxCtrlTxtFont;
      m_pTprEditBoxCtrlTxtFont = NULL;
     }

     if(m_pLogTprEditBoxCtrl!=NULL)
     {
      delete m_pLogTprEditBoxCtrl;
      m_pLogTprEditBoxCtrl = NULL;
     }

     if(m_pTprEditBoxCtrlLogFont!=NULL)
     {
      delete m_pTprEditBoxCtrlLogFont;
      m_pTprEditBoxCtrlLogFont = NULL;
     }

     if(m_m_pTprEditBoxCtrlSysFont!=NULL)
     {
      delete m_m_pTprEditBoxCtrlSysFont;
      m_m_pTprEditBoxCtrlSysFont = NULL;
     }
    }

    BEGIN_MESSAGE_MAP(CTprEditBoxCtrl, CEdit)
     ON_WM_LBUTTONUP()
     ON_WM_MOUSEMOVE()  
     ON_WM_LBUTTONDOWN()
     ON_WM_PAINT()
    END_MESSAGE_MAP()

    void CTprEditBoxCtrl::InitEditBox(const LOGFONT *pLogFont, const EDITBOX *pLogEditBox)
    {
     int i;

     if(m_pTprEditBoxCtrlLogFont==NULL)
     {
      m_pTprEditBoxCtrlLogFont = new LOGFONT;
     }
     m_pTprEditBoxCtrlLogFont->lfHeight = pLogFont->lfHeight;
     m_pTprEditBoxCtrlLogFont->lfWidth = pLogFont->lfWidth;
     m_pTprEditBoxCtrlLogFont->lfEscapement = pLogFont->lfEscapement;
     m_pTprEditBoxCtrlLogFont->lfOrientation = pLogFont->lfOrientation;
     m_pTprEditBoxCtrlLogFont->lfWeight = pLogFont->lfWeight;
     m_pTprEditBoxCtrlLogFont->lfItalic = pLogFont->lfItalic;
     m_pTprEditBoxCtrlLogFont->lfUnderline = pLogFont->lfUnderline;
     m_pTprEditBoxCtrlLogFont->lfStrikeOut = pLogFont->lfStrikeOut;
     m_pTprEditBoxCtrlLogFont->lfCharSet = pLogFont->lfCharSet;
     m_pTprEditBoxCtrlLogFont->lfOutPrecision = pLogFont->lfOutPrecision;
     m_pTprEditBoxCtrlLogFont->lfClipPrecision = pLogFont->lfClipPrecision;
     m_pTprEditBoxCtrlLogFont->lfQuality = pLogFont->lfQuality;
     m_pTprEditBoxCtrlLogFont->lfPitchAndFamily = pLogFont->lfPitchAndFamily;
     wcscpy(m_pTprEditBoxCtrlLogFont->lfFaceName,pLogFont->lfFaceName);

     if(m_pLogTprEditBoxCtrl==NULL)
     {
      m_pLogTprEditBoxCtrl = new EDITBOX;
     }
     m_pLogTprEditBoxCtrl->dwCtrl_id = pLogEditBox->dwCtrl_id;
     m_pLogTprEditBoxCtrl->dwStyle = pLogEditBox->dwStyle;
     m_pLogTprEditBoxCtrl->dwTextLimit = pLogEditBox->dwTextLimit;
     m_pLogTprEditBoxCtrl->fPercentage = pLogEditBox->fPercentage;
     m_pLogTprEditBoxCtrl->fTopGap = pLogEditBox->fTopGap;
     m_pLogTprEditBoxCtrl->fCharGap= pLogEditBox->fCharGap;
     m_pLogTprEditBoxCtrl->iLastCharNum = pLogEditBox->iLastCharNum;
     m_pLogTprEditBoxCtrl->fCaretHight = pLogEditBox->fCaretHight;
     m_pLogTprEditBoxCtrl->fCaretOffsetX = pLogEditBox->fCaretOffsetX;
     m_pLogTprEditBoxCtrl->fCaretOffsetY = pLogEditBox->fCaretOffsetY;
     m_pLogTprEditBoxCtrl->dwStatus = pLogEditBox->dwStatus;
     for(i=0;i<3;i++)
     {
      m_pLogTprEditBoxCtrl->pImgActive[i] = pLogEditBox->pImgActive[i];
      m_pLogTprEditBoxCtrl->pImgInactive[i] = pLogEditBox->pImgInactive[i];
      m_pLogTprEditBoxCtrl->pImgGray[i] = pLogEditBox->pImgGray[i];

      if (CTprUiFun::IsImageAvail(m_pLogTprEditBoxCtrl->pImgActive[i])
       &&CTprUiFun::IsImageAvail(m_pLogTprEditBoxCtrl->pImgInactive[i])
       &&CTprUiFun::IsImageAvail(m_pLogTprEditBoxCtrl->pImgGray[i]))
      {
      }
      else
      {
       MessageBox(_T("编辑框加载图片失败!"), _T("提示"), MB_OK);
      }
     }

     //设置GDI编辑框字体
     m_m_pTprEditBoxCtrlSysFont = new CFont;
     if (!(m_m_pTprEditBoxCtrlSysFont->CreateFontIndirect(m_pTprEditBoxCtrlLogFont)))
     {
      MessageBox(_T("创建字体失败!"), _T("提示"), MB_OK);
     }
     this->SetFont(m_m_pTprEditBoxCtrlSysFont,TRUE);
     this->SetLimitText(m_pLogTprEditBoxCtrl->dwTextLimit);  

     //创建GDI+编辑框字体
     m_pTprEditBoxCtrlTxtFont = new TEXTFONT;
     if (m_pTprEditBoxCtrlTxtFont)
     {
      m_pTprEditBoxCtrlTxtFont->coColor = Color(245,0,0,0);
      m_pTprEditBoxCtrlTxtFont->pStringFormat = new StringFormat;
      m_pTprEditBoxCtrlTxtFont->pStringFormat->SetAlignment(StringAlignmentNear);
      m_pTprEditBoxCtrlTxtFont->pStringFormat->SetLineAlignment(StringAlignmentCenter);
      m_pTprEditBoxCtrlTxtFont->pStringFormat->SetTrimming(StringTrimmingEllipsisCharacter);
      
      m_pTprEditBoxCtrlLogFont->lfWidth = m_pTprEditBoxCtrlLogFont->lfWidth * m_pLogTprEditBoxCtrl->fPercentage;
      m_pTprEditBoxCtrlLogFont->lfHeight= m_pTprEditBoxCtrlLogFont->lfHeight * m_pLogTprEditBoxCtrl->fPercentage;
      m_pTprEditBoxCtrlTxtFont->pFont =new Font(this->GetDC()->m_hDC,m_pTprEditBoxCtrlLogFont);
     } 

     //开启光标闪烁定时器,尚未实现
     //this->SetTimer(8,50,(CALLBACK*)ShowCaretProc);
    }

    void CTprEditBoxCtrl::SetEditBoxStatus(DWORD dwStatus)
    {
     if(m_pLogTprEditBoxCtrl==NULL)
     {
      m_pLogTprEditBoxCtrl = new EDITBOX;
     }
     m_pLogTprEditBoxCtrl->dwStatus = dwStatus;
    }

    void CTprEditBoxCtrl::OnLButtonUp(UINT nFlags, CPoint point)
    {
     CWnd::OnLButtonUp(nFlags, point);
     //增加使编辑区域还原的代码,以示当前处于不可输入状态
    }


    void CTprEditBoxCtrl::OnLButtonDown(UINT nFlags, CPoint point)
    {
     CWnd::OnLButtonDown(nFlags, point);
     //增加使编辑区域变亮的代码,以示当前处于可输入状态
    }

    void CTprEditBoxCtrl::DrawEditBoxCtrl(CDC* pDC)
    {
     TRACE(L"\nCTprEditBoxCtrl::DrawEditBoxCtrl"); 

     CDC *pDCDst=this->GetDC();
     CDC dcSrc;
     dcSrc.CreateCompatibleDC(pDCDst);
     CRect reWindowRect;
     this->GetWindowRect(&reWindowRect);
     CBitmap cBitmap;
     cBitmap.CreateCompatibleBitmap(pDCDst, reWindowRect.Width(), reWindowRect.Height());
     dcSrc.SelectObject(&cBitmap);

     Graphics *pGraphics = new Graphics(dcSrc.m_hDC);
     if(NULL!=pGraphics)
     {
      DrawFrame(pGraphics);  
      DrawEditText(pGraphics);
      switch(m_pLogTprEditBoxCtrl->dwStatus)
      {
       case STATUS_EDITBOX_ACTIVE:
        DrawCaret(pGraphics); 
        break;
       case STATUS_EDITBOX_INACTIVE:
        break;
       case STATUS_EDITBOX_GRAY:
        break;
       default:
        break;
      }   
     }

     CRect rePrRect;
     GetParent()->GetWindowRect(&rePrRect);
     CRect reWinRect;
     this->GetWindowRect(&reWinRect);
     CRect reDlgRect;
     reDlgRect.left = reWinRect.left - rePrRect.left;
     reDlgRect.top = reWinRect.top - rePrRect.top;
     pDC->BitBlt(reDlgRect.left, reDlgRect.top, reWinRect.Width(), reWinRect.Height(), &dcSrc, 0, 0, SRCCOPY);

     delete pGraphics;
     pGraphics = NULL;
     cBitmap.DeleteObject();
     dcSrc.DeleteDC();
     this->ReleaseDC(pDCDst);
    }

    /**
    @relief 绘制控件边框
    @return BOOL 返回是否成功
    @date [03/17/2011]
    */
    BOOL CTprEditBoxCtrl::DrawFrame(Graphics *pGraphics)
    {
     CRect reWin;
     CRect reRect;
     int nWidth;
     int nHight;
     GetClientRect(&reWin);
     Image *pImage=NULL;

     //三宫格绘制左边的图
     reRect.left = reWin.left;
     reRect.top  = reWin.top; 
     nHight = reWin.Height();
     switch(m_pLogTprEditBoxCtrl->dwStatus)
     {
      case STATUS_EDITBOX_ACTIVE:
       nWidth = m_pLogTprEditBoxCtrl->pImgActive[0]->GetWidth();
       pImage = m_pLogTprEditBoxCtrl->pImgActive[0];
       break;
      case STATUS_EDITBOX_INACTIVE:
       nWidth = m_pLogTprEditBoxCtrl->pImgInactive[0]->GetWidth();
       pImage = m_pLogTprEditBoxCtrl->pImgInactive[0];
       break;
      case STATUS_EDITBOX_GRAY:
       nWidth = m_pLogTprEditBoxCtrl->pImgGray[0]->GetWidth();
       pImage = m_pLogTprEditBoxCtrl->pImgGray[0];
       break;
      default:
       break;
     }
     CTprUiFun::DrawImage(pGraphics, pImage, RectF(reRect.left, reRect.top, nWidth, nHight));
     

     //三宫格绘制中间的图
     int nMidWidth;
     int nCycTimes;
     int i=0;
     reRect.top  = reWin.top; 
     nHight = reWin.Height();
     switch(m_pLogTprEditBoxCtrl->dwStatus)
     {
      case STATUS_EDITBOX_ACTIVE:
       nMidWidth = reWin.right - reWin.left - m_pLogTprEditBoxCtrl->pImgActive[0]->GetWidth() - m_pLogTprEditBoxCtrl->pImgActive[2]->GetWidth();
       nCycTimes = nMidWidth/(m_pLogTprEditBoxCtrl->pImgActive[1]->GetWidth());
       nWidth = m_pLogTprEditBoxCtrl->pImgActive[1]->GetWidth();
       pImage = m_pLogTprEditBoxCtrl->pImgActive[1];

       for(i=0;i<nCycTimes;i++)
       {
        reRect.left = reWin.left + m_pLogTprEditBoxCtrl->pImgActive[0]->GetWidth() + i*nWidth;
        CTprUiFun::DrawImage(pGraphics, pImage, RectF(reRect.left, reRect.top, nWidth, nHight));
       }
       reRect.left += nWidth;
       nWidth = nMidWidth - i*nWidth;
       CTprUiFun::DrawImage(pGraphics, pImage, RectF(reRect.left, reRect.top, nWidth, nHight));//剩下不够整块的进行缩小贴图

       break;
      case STATUS_EDITBOX_INACTIVE:
       nMidWidth = reWin.right - reWin.left - m_pLogTprEditBoxCtrl->pImgInactive[0]->GetWidth() - m_pLogTprEditBoxCtrl->pImgInactive[2]->GetWidth();
       nCycTimes = nMidWidth/(m_pLogTprEditBoxCtrl->pImgInactive[1]->GetWidth());
       nWidth = m_pLogTprEditBoxCtrl->pImgInactive[1]->GetWidth();
       pImage = m_pLogTprEditBoxCtrl->pImgInactive[1];

       for(i=0;i<nCycTimes;i++)
       {
        reRect.left = reWin.left + m_pLogTprEditBoxCtrl->pImgInactive[0]->GetWidth() + i*nWidth;
        CTprUiFun::DrawImage(pGraphics, pImage, RectF(reRect.left, reRect.top, nWidth, nHight));
       }
       reRect.left += nWidth;
       nWidth = nMidWidth - i*nWidth;
       CTprUiFun::DrawImage(pGraphics, pImage, RectF(reRect.left, reRect.top, nWidth, nHight));//剩下不够整块的进行缩小贴图

       break;
      case STATUS_EDITBOX_GRAY:
       nMidWidth = reWin.right - reWin.left - m_pLogTprEditBoxCtrl->pImgGray[0]->GetWidth() - m_pLogTprEditBoxCtrl->pImgGray[2]->GetWidth();
       nCycTimes = nMidWidth/(m_pLogTprEditBoxCtrl->pImgGray[1]->GetWidth());
       nWidth = m_pLogTprEditBoxCtrl->pImgGray[1]->GetWidth();
       pImage = m_pLogTprEditBoxCtrl->pImgGray[1];

       for(i=0;i<nCycTimes;i++)
       {
        reRect.left = reWin.left + m_pLogTprEditBoxCtrl->pImgGray[0]->GetWidth() + i*nWidth;
        CTprUiFun::DrawImage(pGraphics, pImage, RectF(reRect.left, reRect.top, nWidth, nHight));
       }
       reRect.left += nWidth;
       nWidth = nMidWidth - i*nWidth;
       CTprUiFun::DrawImage(pGraphics, pImage, RectF(reRect.left, reRect.top, nWidth, nHight));//剩下不够整块的进行缩小贴图

       break;
      default:
       break;
     }

     //三宫格绘制右边的图 
     reRect.top  = reWin.top; 
     nHight = reWin.Height();
     switch(m_pLogTprEditBoxCtrl->dwStatus)
     {
      case STATUS_EDITBOX_ACTIVE:
       reRect.left = reWin.right -  m_pLogTprEditBoxCtrl->pImgActive[2]->GetWidth();
       nWidth =  m_pLogTprEditBoxCtrl->pImgActive[2]->GetWidth();
       pImage = m_pLogTprEditBoxCtrl->pImgActive[2];
       break;
      case STATUS_EDITBOX_INACTIVE:
       reRect.left = reWin.right -  m_pLogTprEditBoxCtrl->pImgInactive[2]->GetWidth();
       nWidth =  m_pLogTprEditBoxCtrl->pImgInactive[2]->GetWidth();
       pImage = m_pLogTprEditBoxCtrl->pImgInactive[2];
       break;
      case STATUS_EDITBOX_GRAY:
       reRect.left = reWin.right -  m_pLogTprEditBoxCtrl->pImgGray[2]->GetWidth();
       nWidth =  m_pLogTprEditBoxCtrl->pImgGray[2]->GetWidth();
       pImage = m_pLogTprEditBoxCtrl->pImgGray[2];
       break;
      default:
       break;
     }
     CTprUiFun::DrawImage(pGraphics, pImage, RectF(reRect.left, reRect.top, nWidth, nHight));

     return TRUE;
    }

    /**
    @relief 绘制控件文字,以系统编辑框的光标坐标为参照系,用化整为零的方法是DrawString绘画出的每个字符坐标尽量接近系统编辑框所绘字符的坐标,以达到仿真系统编辑框的目的
    @return BOOL 返回是否成功
    @date [03/25/2011]
    */
    BOOL CTprEditBoxCtrl::DrawEditText(Graphics *pGraphics)
    {
     int i = 0;
     int iCharactersTotalNum=0;//字符总数 
     int iCharIndexFormPos=0;//字符所在字符串的索引
     CRect reWin;
     float fGap=0;//字符平均占位宽
     char* cStrDes;
     char* cStrSrc;
     wchar_t wChar[2]={0};
     CPoint cCaretPos;

     cCaretPos = GetCaretPos();//获取光标位置
     CWnd::GetClientRect(&reWin); 
     GetWindowText(m_ContextOfEditBox);

     iCharactersTotalNum = wcslen(m_ContextOfEditBox);
     if(iCharactersTotalNum==0)
     {
      return FALSE;
     }

     iCharIndexFormPos = this->CharFromPos(cCaretPos);//获取系统光标所在位置的字符索引
     if(iCharIndexFormPos!=0)
     {
      fGap = cCaretPos.x/iCharIndexFormPos;//化整为零,计算单个字符绘画位置以让其跟看不见那个编辑框写出的字符位置基本保持一致
      
     }
     else
     {
      fGap = m_pLogTprEditBoxCtrl->fCharGap;
     }

     if(m_pLogTprEditBoxCtrl->iLastCharNum != iCharactersTotalNum)
     {
      m_pLogTprEditBoxCtrl->iLastCharNum = iCharactersTotalNum;
     }
     else if(m_pLogTprEditBoxCtrl->iLastCharNum == iCharactersTotalNum && m_pLogTprEditBoxCtrl->fCharGap != fGap)
     {
      fGap = m_pLogTprEditBoxCtrl->fCharGap;
     }

     for(i=1;i<=iCharactersTotalNum;i++)
     {
      if(m_pLogTprEditBoxCtrl->dwStyle==STYLE_EDITBOX_DEFAULT)
      {
       CopyOneWideCharacter(wChar,m_ContextOfEditBox,i);
      }
      else
      {
       wcscpy(wChar,_T("*"));
      }
      pGraphics->SetTextRenderingHint(TextRenderingHintAntiAliasGridFit);//优化字体,消除锯齿走样
      pGraphics->DrawString((CONST WCHAR*)(wChar), -1, m_pTprEditBoxCtrlTxtFont->pFont, PointF(reWin.left, cCaretPos.y + m_pLogTprEditBoxCtrl->fTopGap), m_pTprEditBoxCtrlTxtFont->pStringFormat, &SolidBrush(m_pTprEditBoxCtrlTxtFont->coColor));
      reWin.left += fGap;
     }

     m_pLogTprEditBoxCtrl->fCharGap = fGap;//保留上一次GDI+写字符的间距

     return TRUE;
    }

    /**
    @relief 取出字符串里的任意位置的一个字符
    @[inout] wStrDes 取出的那个字符 iWhichCharacter 原字符串 iWhichCharacter 取出的那个字符的索引
    @return IN  OUT wchar_t * 返回的是取出的那个字符
    @date [03/20/2011]
    */
    wchar_t * CTprEditBoxCtrl::CopyOneWideCharacter(wchar_t * wStrDes,const wchar_t *wStrSrc,int iWhichCharacter)
    {
     wchar_t *pwDes;
     const wchar_t *pwSrc;
     pwDes = wStrDes;
     pwSrc = wStrSrc;

     int iCount=1;
     assert(pwDes!=NULL||pwDes!=NULL);
     while(*pwSrc!='\0')
     {
      *pwDes=*pwSrc;
      if(iCount==iWhichCharacter)
      {
       break;
      }
      pwSrc++;
      iCount++;
     }
     return pwDes;
    }


    /**
    @relief 绘制控件插入符
    @return BOOL 返回是否成功
    @date [03/19/2011]
    */
    BOOL CTprEditBoxCtrl::DrawCaret(Graphics *pGraphics)
    {
     CPoint cCaretPos;
     cCaretPos = GetCaretPos();
     Point Point1(cCaretPos.x + m_pLogTprEditBoxCtrl->fCaretOffsetX, cCaretPos.y + m_pLogTprEditBoxCtrl->fCaretOffsetY);
     Point Point2(cCaretPos.x + m_pLogTprEditBoxCtrl->fCaretOffsetX, cCaretPos.y + m_pLogTprEditBoxCtrl->fCaretOffsetY + m_pLogTprEditBoxCtrl->fCaretHight);
     
     Pen *myPen = new Pen(Color(255, 0, 0, 0), 1);
     pGraphics->DrawLine(myPen,Point1,Point2);
     delete myPen;


     return TRUE;
    }

    /**
    @relief 用来触发绘画文字及插入符
    @return BOOL 返回是否成功
    @date [03/19/2011]
    */
    void CTprEditBoxCtrl::OnPaint()
    {
     ::SendMessage(GetParent()->m_hWnd, WM_PAINT, (WPARAM)0, (LPARAM)0);
    }

     

    转:http://hi.baidu.com/guanfaliu/blog/item/240eefc40ca84bde39db498c.html

    展开全文
  • !!!!!!!!!!!!!!!!!!!!!!!是什么原因造成的呢。。。 OnEraseBkgnd消息返回return造成的??????????
  • 编译环境vs2008,在对话框中插入各种格式的图片,本例子以png图片为例,并将该图片设置为透明背景。。
  • 最近在学Android 学的不好 然后看到了用.9.png写对话框的哪里,但是书上写的太简单 感觉做出来和书上的不一样 然后就去各种百度 感觉网上...1 .9.png格式  用sdk\tools\draw9patch.bat 程序运行    
      最近在学Android 学的不好 然后看到了用.9.png写对话框的哪里,但是书上写的太简单 感觉做出来和书上的不一样 然后就去各种百度 感觉网上关于这个东西的资料都是粘贴复制而且并没有解决问题   
     然后自己瞎搞居然搞出来了
    



    1    .9.png格式


        用sdk\tools\draw9patch.bat 程序运行

          


          出现的这个窗口

       

       

    点file选择 open 然后选择自己的图片路径





    然后开始编辑   在灰色的背景下的图片是我们可编辑的图片    在这个图片上我们可以在图片的边界上画 线


    这个线    分为2组  (1)最左边的线  最上面的线  /表示这个线的部位为要拉伸的部分

                                  (2)最右边的线  最下面的线  /表示这个线的部位为内容存在的部分

                       

          

    然后点file 选择 save 这样就生成了.9.png格式的图片了


    但是但是

    这个图片上是有黑线的  好难看啊

    这个时候需要下个工具  xUltimate-d9pc(百度去下载)  把这个有黑线的图片放在xUltimate-d9pc根目录下的example1\res\drawable-hdpi文件夹下

    然后运行xUltimate-d9pc.exe(xUltimate-d9pc程序根目录下)

    会生成上面的done文件夹 我们的无码图片就在里面了 一路点进去

    这时候把这个图片放入自己的项目 (不需要重命名去掉那个.9)  引用文件的时候用 @drawable/send


    然后运行程序 即可  用这个图片就可以搞出仿微信的UI哦

    展开全文
  • Win32另存为指定文件格式的文件对话框 OPENFILENAME ofn = { 0 }; ofn.lStructSize = sizeof(OPENFILENAME); CString strFilter = _T("PNG 文件(*.png)\0*.png\0JPG 文件(*.jpg)\0*.jpg\0BMP 文件(*.bmp)\0...
  • 很多时候,我们在项目中会用到一些要拉伸部分的图标,诸如对话框,标签等等,有些我们可以直接描绘drawable.xml文件进行解决,而有些则需要UI画出相应的.9图,然后我们可以将对应的图存放到我们的本地资源库中,但这...
  • <p><a href="https://i.stack.imgur.com/ddY02.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ddY02.png" alt="What it looked like"></a></p> <p>Naturally, I built on top of the ...
  • MFC自绘可拉伸对话框

    2014-05-23 10:57:27
    MFC一个自绘可拉伸变形对话框,可拖动拉伸改变对话框大小,从资源文件中加载图片资源,采用GDI技术绘制,代码简洁易懂,可支持win7,xp和vista,且都...PS:如果在编译是遇到 png图片格式问题,删除重新加载一次就好了。
  • 保存为BMP,Jpg,Png格式的图片

    千次阅读 2007-06-05 11:33:00
    以保存当前对话框图片为例:void CMyView::OnButton1() {CClientDC dc(this);CRect rc;GetClientRect(&rc);CDC memDC;memDC.CreateCompatibleDC(&dc);CBitmap bm;bm.CreateCompatibleBitmap(&dc, rc.Width(), rc....
  • C++打开 “打开对话框

    千次阅读 2017-01-16 09:59:21
    // FileTypes 打开文件对话框中 显示的文件类型 参数格式 FString FileTypes = TEXT("FBX (*.fbx *.png)|*.fbx;*.png"); void UMyBlueprintFunctionLibrary::ShowOpenFileDialog(const FString FileTypes) { void*
  • 将本地文件中的图片文件绘制到对话框上,两种方式都可以绘制,本人实践过,觉得正确。IPicture方式跟CImage加载后,然后转CBitmap方式可以绘制多种类型的图片格式,bmp,jpg,jpeg,png.
  • 有时候,我们在Word文档见到好看的封面或者图片,想要快速另存为图片格式,这个要怎么操作呢?我们一起来看下如何直接使用Word将文档转换成图片的小技巧。 Word文档转换成图片首先,我们先打开一个空白文档,然后将...
  • 类似web QQ聊天对话框的界面,以及所有该界面的功能实现代码!编辑框用的是richtextbox,能实现上传文件,图片(png,jpg格式),抖动,字体的改变!等功能。。。
  • std::wstring file_type = L"文件格式(*.jpg)|(*.jpeg)|(*.bmp)|(*.png)"; LPCTSTR filter = L"*.jpg;*.jpeg;*.bmp;*.png;"; std::map<LPCTSTR, LPCTSTR> filters; filters[file_type.c...
  • MFC对话框窗口使用GDI+给按钮贴图

    千次阅读 2015-01-16 09:44:58
    最近要做一个有透明效果的按钮出来,先是大致学了PS教程,制作一个PNG格式的背景透明的按钮,如图1所示。然后使用GDI+进行贴图,最后要达到图2所示效果。开发环境是VS2010,MFC。 图1 PS制作的PNG格式按钮 ...
  • 就是在计算机QQ上,打开一个好友对话框,在对话框里找“剪刀”图标的截图功能,注意,在鼠标停留在剪刀图标上的时候,可以【来回】设置【截图时隐藏当前窗口】这个选项。在保持要截图的界面就在对话框后面一个层次的...
  • ![![图片说明](https://img-ask.csdn.net/upload/201604/18/1460967940_225692.png)图片说明]...请问各位大侠,为什么文件夹里明明有bmp格式的图片,用MFC加载位图资源时显示没有呢?如图
  • 使用WTL现成的一个文件对话框来选择一个图像文件,这个图像文件的格式可以使JPG和PNG。当然其它的图片也是可以的,只要图片文件合法且不要过大。随后使用D3D来载入图像,形成一个纹理。渲染纹理使用了最简单的滤波...
  • 所实现的功能: ...4.对当前文件下所支持图片格式(BMP、JPG、PNG)进行显示; 5.实现“上一张图片”和“下一张图片”功能; 6.随时进行窗口的最小化、正常、最大化显示的切换; 所用到的工具:CImage类
  • 所实现的功能: ...4.对当前文件下所支持图片格式(BMP、JPG、PNG)进行显示; 5.实现“上一张图片”和“下一张图片”功能; 6.随时进行窗口的最小化、正常、最大化显示的切换; 所用到的工具:CImage类
  • 所实现的功能: ...4.对当前文件下所支持图片格式(BMP、JPG、PNG)进行显示; 5.实现“上一张图片”和“下一张图片”功能; 6.随时进行窗口的最小化、正常、最大化显示的切换; 所用到的工具:CImage类
  • 使用WTL现成的一个文件对话框来选择一个图像文件,这个图像文件的格式可以使JPG和PNG。当然其它的图片也是可以的,只要图片文件合法且不要过大。随后使用D3D来载入图像,形成一个纹理。渲染纹理使用了最简单的滤波...
  • 1、用XML格式写一个类似这样的.qrc文件,将图片相对路径添加进去:  images/config.png  images/query.png  images/update.png 2、单击Designer右下方的ResourceBrowser菜单中的铅笔:   3、单击蓝色...
  • RichEditDemo v1.0版发布,仿QQ聊天对话框界面实现

    千次阅读 热门讨论 2013-03-01 20:53:30
    RichEditDemo(WTL版): RichEditDemo(DuiLib版): ...2、支持插入BMP、JPG、PNG、GIF等格式的图片文件。 3、支持图片和文字的复制剪切粘贴拖放,并与QQ、IE、Google Chrome、Word等的剪切板格式互相兼容。

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 292
精华内容 116
关键字:

对话框png格式