MFC不规则窗口



直接在OnPaint()函数里添加语句


SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(RGB(255,255,255), 0, LWA_COLORKEY);


RGB用拾色器拾取


第三个参数,有两个取值:LWA_COLORKEY和LWA_ALPHA。前一个表示使用透明色来设置透明,后一个使用透明值来设置透明。如果使用前者,那么透明值就无效,实现的就是透明色全部完全透明,其他颜色不透明;如果是有后者,那么主窗口和其子窗口全部按照透明值来设置透明,透明色无效。

完成后


void CMFCApplication9Dlg::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_BITMAP2);
  //IDB_BITMAP是你自己的图对应的ID  
  BITMAP   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);
  SetWindowLong(m_hWnd, GWL_EXSTYLE, GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
  SetLayeredWindowAttributes(RGB(255,255,255), 150, LWA_COLORKEY);
 }
}

 


 SetWindowLong这个函数是设置窗口的属性的。第一个参数是指定窗口的句柄,第二个是指定的要设置的属性,第三个是属性值。窗口句柄在窗口对象的m_hWnd成员里保存,GWL_EXSTYLE这个是窗口扩展风格属性的标记,如果你想看其他的,可以在这个宏上面右击,然后转到定义就可以查看其他的了。代表的意思就查看MSDN即可。这个风格的前缀GWL_ 就是GetWindowLong的缩写,这样说帮助你记忆这个标志。前缀后面就是具体的属性。然后后面我们要设置的就是一个扩展风格值,如果你想保留现有的各种风格,那么就使用GetWindowLong(m_hWnd,GWL_EXSTYLE)| WS_EX_LAYERED,GetWindowLong(m_hWnd,GWL_EXSTYLE)获得一个已有的扩展风格值,然后使用位或将层叠风格WS_EX_LAYERED加进去。因为各种风格都是位标识的,只要其中的位为1就表示有这个风格,因此,WS_EX_LAYERED表示1去操作相应的位,如果是位或就表示用1去位或相应的位,这样就设置进去了。如果要取消,就使用&~WS_EX_LAYERED,这个表示将层叠风格变为0,然后用0去位与这个风格,自然这一位就为0了,即取消了这个风格。GetWindowLong得到原有的各种扩展风格,最好使用这种方式,否则如果直接在第三个参数中将层叠风格传进去,那就只有一个层叠的扩展风格了,可能会出现你不希望出现的情况。取得原有的扩展风格,然后位或即可设置相应的风格了。函数返回一个设置后的风格的值,然后将这个值传给第三个参数,就设置了这个风格。希望你好好把这一段看明白,在这是窗口风格时就很灵活了,任何窗口风格都可以通过这些位操作取消或者设置,比如最大化按钮,最小化按钮,标题栏等都可以,这样你可以动态的设置窗口的样式,如单击按钮使窗口没有边框了,再单击一下又有边框了。
      设置好窗口风格后,开始第二句,设置窗口属性。SetLayeredWindowAttributes(0,220,LWA_ALPHA);这一句和代码段1有一点区别。代码段1使用的是API函数,而这里使用的是MFC的函数。这里MFC也只不过是简单的封装,将第一个窗口句柄参数放在了窗口对象的m_hWnd成员中了而已,仅此而已。如果你想使用API函数,使用::放在函数前面即可。这个函数的第一个参数是透明色,第二个参数是透明度值,第三个是透明标志。透明色的意思就是,指定的这个颜色在窗口显示时就是透明的,其他颜色就不透明。通过这个你可以实现不规则的窗口。如,你将透明色设置为蓝色,那么窗口中凡是蓝色的都透明的,其他颜色不透明。这个透明是完全看不见,而不是半透明。设置颜色的方法就是使用RGB宏,如RGB(0,0,255),这就是纯蓝色。颜色值为0-255.RGB的顺序就是红绿蓝。最终的颜色就是这三个颜色合成的颜色。RGB宏返回的值就是COLORREF值,这个值就是第一个参数需要的。第二个参数是透明度,取值是0-255,0就完全透明,255就完全不透明,中间值就是半透明。越靠近255就越不透明。这里的透明是整个窗口的透明,子窗口也跟随主窗口透明。第三个参数,有两个取值:LWA_COLORKEY和LWA_ALPHA。前一个表示使用透明色来设置透明,后一个使用透明值来设置透明。如果使用前者,那么透明值就无效,实现的就是透明色全部完全透明,其他颜色不透明;如果是有后者,那么主窗口和其子窗口全部按照透明值来设置透明,透明色无效。LWA_ 就是LayeredWindowAttributes的缩写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值