WEB开发网
开发学院软件开发VC 透明窗体的又一实现 阅读

透明窗体的又一实现

 2010-07-01 20:43:16 来源:WEB开发网   
核心提示:我的MaskColor = 0xFF00,也就是 RGB(0,255,0).建立一个基于对话框的工程,修改对话框资源的属性,透明窗体的又一实现(2),主要修改两个地方,一是指定没有TitleBar,二是指定BorderStyle为None.这样才能保证出来的窗体符合你的要求把图片加入资源,c.向OnPaint中添加代码

我的MaskColor = 0xFF00,也就是 RGB(0,255,0).

建立一个基于对话框的工程,修改对话框资源的属性,主要修改两个地方。一是指定没有TitleBar,二是指定BorderStyle为None.这样才能保证出来的窗体符合你的要求

把图片加入资源,付ID = IDB_BACKGROUND

下面就开始写代码了,呵呵,看下面的代码这么长。是不是头有点大呀,别急,这些多半都是工程向导自动生成的,我加的都已经注解上了,并用黄色表示没有几行的。要不然我怎么敢向各位吹嘘这个实现方法简单呢。

a.首先我们给窗体添加两个成员变量:CBitmap * m_oldBitmap; //指向内存DC原来的 Bitmap
  CDC m_DC;  //用于存放背景图片的内存DC

b.在窗体的OnInitDialog()函数中做一番初始化: BOOL CTransWindowDlg::OnInitDialog()
{
   CDialog::OnInitDialog();
   // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
   // 执行此操作
   SetIcon(m_hIcon, TRUE);     // 设置大图标
   SetIcon(m_hIcon, FALSE);    // 设置小图标
   ///////////////////////////////////////
   //段会锋添加的代码
   //实现背景图以及窗口透明
   //调用背景图片
   CBitmap bitmap;
   BITMAP bitInfo;
   bitmap.LoadBitmap(IDB_BACKGROUND);
   //得到图片大小并调整窗口大小适应图片
   bitmap.GetBitmap(&bitInfo);
   CRect rect;
   GetWindowRect(&rect);
   rect.right = rect.left + bitInfo.bmWidth;
   rect.bottom = rect.top + bitInfo.bmHeight;
   MoveWindow(rect);
   //创建并保存DC
   m_DC.CreateCompatibleDC(GetDC());
   m_oldBitmap = m_DC.SelectObject(&bitmap);
   //设置窗口掩码颜色和模式
   //首先获得掩码颜色
   COLORREF maskColor = m_DC.GetPixel(0,0);

   #define LWA_COLORKEY 0x00000001
   #define WS_EX_LAYERED 0x00080000

   typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)(HWND hWnd,
           COLORREF crKey,
           BYTE bAlpha,
           DWORD dwFlags);

   lpfnSetLayeredWindowAttributes SetLayeredWindowAttributes;

   HMODULE hUser32 = GetModuleHandle("user32.dll");
   SetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)GetProcAddress(hUser32,
     "SetLayeredWindowAttributes");
   SetWindowLong(GetSafeHwnd(),
          GWL_EXSTYLE,
          GetWindowLong(GetSafeHwnd(),
          GWL_EXSTYLE) | WS_EX_LAYERED);
   SetLayeredWindowAttributes(GetSafeHwnd(),
          maskColor,
          255,
          LWA_COLORKEY);
   FreeLibrary(hUser32);
   ////////////////////////////////////////  
   return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
就像注释的那样,我们首先把图片Load进来,然后把m_DC创建一个与窗口DC兼容的DC,并把刚才Load进来的图片绑定到该内存DC上,并用m_oldBitmap 记录下原有Bitmap,用户最后释放。

c.向OnPaint中添加代码,用于把背景图片绘制到窗口上: void CTransWindowDlg::OnPaint()
{
  if (IsIconic())
  {
    //这里是MFC的框架代码,为了减少篇幅省略…
  }
  else
  {
    ////////////////////////////////////
    //段会锋修改的代码,用于绘制背景图片
    //CDialog::OnPaint();
    CDC * pDC = this->GetDC();
    CRect rect;
    GetWindowRect(&rect);
    pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_DC,0,0,SRCCOPY);
    ////////////////////////////////////
  }
}

Tags:透明 窗体 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接