程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> VC自繪對話框

VC自繪對話框

編輯:關於VC++

閒來無事,寫了一個簡單的對話框界面,希望給需要的朋友有所幫助。

界面如下:

界面很單調,我只是想說明一下如何實現界面的自繪。如果有需要,也可以繪制更復雜漂亮的界面。

程序的實現也不復雜,接下來就跟著我一步一步做。

首先,創建一個基於對話框的應用程序。

接下來,在CTestDlg類中添加兩個成員函數:

// In CTestDlg.h
public:
  void DrawView();
HBITMAP CreateGradientBMP(HDC hDC,COLORREF cl1,COLORREF cl2,int nWidth,int nHeight,int nDir,int nNumColors);

函數的具體內容如下:

// In CtestDlg.cpp
void CTestDlg::DrawView()
{
    CPaintDC dc(this);
    CRect rect;
    CString strText="TEST. HEllo WoRLD! 你好,VCKBASE!"; //文本內容
    GetClientRect(rect);
    rect.right=27; //自繪區域寬度
    COLORREF  m_clrSideBarStart; //自繪區域起始處顏色
    COLORREF  m_clrSideBarEnd; //自繪區域結束處顏色
    
    m_clrSideBarStart=RGB(205,205,205); //灰色
    m_clrSideBarEnd=RGB(100,0,0); //褐色
    //創建圖及繪制區域
    HBITMAP  bmpBar = CreateGradientBMP(
      dc.m_hDC, m_clrSideBarStart, m_clrSideBarEnd,
      rect.Width(), rect.Height(),
      0, 256);
    if (bmpBar)
    {
      CDC memDC;
      memDC.CreateCompatibleDC(&dc);
      HBITMAP hOldBmp = (HBITMAP)::SelectObject(memDC.m_hDC, bmpBar);
      dc.BitBlt(rect.left, rect.top,
        rect.Width(), rect.Height(),
        &memDC, 0, 0, SRCCOPY);
      ::SelectObject(memDC, hOldBmp);
      ::DeleteObject(bmpBar);
    }
    //繪制文本
    CFont  vertFont;
    //字體
    vertFont.CreateFont(16, 0, 900, 900, FW_BOLD,
      0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
      CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
      DEFAULT_PITCH, "Arial");
    CFont *pOldFont = dc.SelectObject(&vertFont);
    COLORREF oldColor = dc.GetTextColor();
    dc.SetTextColor(RGB(255, 255, 255)); //文本顏色
    dc.SetBkMode(TRANSPARENT);
    dc.TextOut(rect.left+2, rect.bottom-4, strText); //文本起始位置
    dc.SetTextColor(oldColor);
    dc.SelectObject(pOldFont);
    vertFont.DeleteObject();
}

//創建圖

HBITMAP CTestDlg::CreateGradientBMP(HDC hDC, COLORREF cl1, COLORREF cl2, int nWidth, int nHeight, int nDir, int nNumColors)
{
  if(nNumColors > 256)
    nNumColors = 256;
  COLORREF PalVal[256];
  memset(PalVal, 0, sizeof(COLORREF)*256);
  int nIndex;
  BYTE peRed=0,peGreen=0,peBlue=0;
  int r1=GetRValue(cl1);
  int r2=GetRValue(cl2);
  int g1=GetGValue(cl1);
  int g2=GetGValue(cl2);
  int b1=GetBValue(cl1);
  int b2=GetBValue(cl2);
  for (nIndex = 0; nIndex < nNumColors; nIndex++)
  {
    peRed = (BYTE) (r1 + MulDiv((r2-r1),nIndex,nNumColors-1));
    peGreen = (BYTE) (g1 + MulDiv((g2-g1),nIndex,nNumColors-1));
    peBlue = (BYTE) (b1 + MulDiv((b2-b1),nIndex,nNumColors-1));
    PalVal[nIndex]=(peRed << 16) | (peGreen << 8) | (peBlue);
  }
  int x,y,w,h;
  w=nWidth;
  h=nHeight;
  
  LPDWORD      pGradBits;
  BITMAPINFO    GradBitInfo;
  pGradBits=(DWORD*) malloc(w*h*sizeof(DWORD));
  memset(&GradBitInfo,0,sizeof(BITMAPINFO));
  GradBitInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
  GradBitInfo.bmiHeader.biWidth=w;
  GradBitInfo.bmiHeader.biHeight=h;
  GradBitInfo.bmiHeader.biPlanes=1;
  GradBitInfo.bmiHeader.biBitCount=32;
  GradBitInfo.bmiHeader.biCompression=BI_RGB;
  
  if(nDir==0)
  {
    for(y=0;y<h;y++)
    {
      for(x=0;x<w;x++)
      {
        *(pGradBits+(y*w)+x)=PalVal[MulDiv(nNumColors,y,h)];
      }
    }
  }
  else if(nDir==1)
  {
    for(y=0;y<h;y++)
    {
      int l,r;
      l=MulDiv((nNumColors/2),y,h);
      r=l+(nNumColors/2)-1;
      for(x=0;x<w;x++)
      {
        *(pGradBits+(y*w)+x)=PalVal[l+MulDiv((r-l),x,w)];
      }
    }
  }
  else if(nDir==2)
  {
    for(x=0;x<w;x++)
    {
      for(y=0;y<h;y++)
      {
        *(pGradBits+(y*w)+x)=PalVal[MulDiv(nNumColors,x,w)];
      }
    }
  }
  else if(nDir==3)
  {
    for(y=0;y<h;y++)
    {
      int l,r;
      r=MulDiv((nNumColors/2),y,h);
      l=r+(nNumColors/2)-1;
      for(x=0;x<w;x++)
      {
        *(pGradBits+(y*w)+x)=PalVal[l+MulDiv((r-l),x,w)];
      }
    }
  }
  HBITMAP hBmp = CreateDIBitmap(hDC,&GradBitInfo.bmiHeader,CBM_INIT,
            pGradBits,&GradBitInfo,DIB_RGB_COLORS);
  free(pGradBits);
  return hBmp;
}

接下來在CtestDlg類的OnPaint()中添加代碼:

void CTestDlg::OnPaint()
{
  if (IsIconic())
  {
    //省略源碼……….
  }
  else
  {
    this->DrawView(); //此句為自添加
    CDialog::OnPaint();
  }
}

好了,現在編譯運行即可。

祝各位編程快樂!

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved