代码改变世界

Win32 窗口篇(3)

2011-03-20 12:59  Clingingboy  阅读(2269)  评论(0编辑  收藏  举报

 

 

1.11 如何显示或隐藏窗口的标题栏

使用ModifyStyle方法改变参数来更改窗体样式

void CDemoDlg::OnTest1() 
{
    //删除标题栏风格
    ModifyStyle(WS_CAPTION, 0, SWP_FRAMECHANGED);
}

void CDemoDlg::OnTest2() 
{
    //添加标题栏风格
    ModifyStyle(0, WS_CAPTION, SWP_FRAMECHANGED);    
}

 

1.12 如何改变窗口的形状

  1. 用CRgn相关Create方法创建区域形状
  2. 使用SetWindowRgn方法设置窗体区域
void CDemoDlg::OnTest1() 
{
    CRect rect;
    GetClientRect(rect);

    //创建矩形区域
    CRgn rgn;
    rgn.CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);

    //设置窗口的区域
    SetWindowRgn((HRGN)rgn, TRUE);
}

效果:

image

1.13 如何设置窗口的透明区域

将2个区域合并成一个区域,貌似没啥用

CRect rect1;
GetWindowRect(rect1);

CRect rect2;
GetClientRect(rect2);
ClientToScreen(rect2);

CRgn rgn1;
rgn1.CreateRectRgn(rect1.left, rect1.top, rect1.right, rect1.bottom);

CRgn rgn2;    
rgn2.CreateRectRgn(rect2.left, rect2.top, rect2.right, rect2.bottom);

CRgn rgn;
rgn.CreateRectRgn(0, 0, 1, 1);

rgn.CombineRgn(&rgn1, &rgn2, RGN_DIFF);

//设置窗口区域
SetWindowRgn((HRGN)rgn2,TRUE);

 

1.14 如何实现透明窗口

先修改窗体样式,然后调用SetLayeredWindowAttributes方法更改透明度

//添加WS_EX_LAYERED(0x80000)扩展风格
ModifyStyleEx(0, 0x80000);
::SetLayeredWindowAttributes(GetSafeHwnd(), 0, 128, 2);

The SetLayeredWindowAttributes function sets the opacity and transparency color key of a layered window.

效果:

image

1.15 如何使窗口闪烁

调用FlashWindow方法,参数True则窗体闪烁一次,False则停止闪烁

void CDemoDlg::OnTest1() 
{
    //设置定时器
    SetTimer(1, 1000, NULL);
}

void CDemoDlg::OnTest2() 
{
    //关闭定时器
    KillTimer(1);

    //窗口返回原始状态
    FlashWindow(FALSE);
}

void CDemoDlg::OnTimer(UINT nIDEvent) 
{
    if (nIDEvent == 1)
    {
        //窗口从一种状态闪烁到另一种状态
        FlashWindow(TRUE);
    }

    CDialog::OnTimer(nIDEvent);
}