分类: C/C++
2008-03-10 21:06:31
一、SetWindowRgn的合适位置
1、在void C**Dlg::OnPaint()里调用SetWindowRgn
可以在内存画图完毕准备显示到屏幕前调用,如下:
void C**Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this);
...
}
else
{
CPaintDC dc(this); // 用于绘制的设备上下文
CRect rcClient;
GetClientRect(&rcClient);
//构造内存DC,用于画图
CDC m_MemDC;
m_MemDC.CreateCompatibleDC(&dc);
CBitmap btScreen;
btScreen.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
m_MemDC.SelectObject(&btScreen);
btScreen.DeleteObject();
//这里画图
...
//创建不规则窗体
ChangeWindowRgn(&m_MemDC);//这里面调用了SetWindowRgn
//画到显示器上
dc.BitBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &m_MemDC, 0, 0, SRCCOPY);
m_MemDC.DeleteDC();
}
}
void C**Dlg::ChangeWindowRgn(CDC *pDC)
{
COLORREF col = RGB(255,0,255);
CRect rcClient;
GetClientRect (rcClient);
CRgn rgn;
rgn.CreateRectRgn (0, 0, rcClient.Width(), rcClient.Height());
...
SetWindowRgn (rgn, TRUE);
}
2、在void C**Dlg::OnShowWindow()里调用SetWindowRgn, 如下: void C**Dlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CWnd::OnShowWindow(bShow, nStatus);
// TODO: 在此处添加消息处理程序代码
if(bShow)
{
CRect rc;
this->GetClientRect(&rc);
CRgn rgnMain;
rgnMain.CreateRoundRectRgn(0, 0, rcClient.Width(), rcClient.Height());
...
SetWindowRgn( rgnMain, TRUE );
}
}
二、手动做“Resizing对话框”
该思路启发于徐景周的精灵特效窗体。要想点击窗体客户区不放能移动窗体,传统的做法是模拟消息点击标题。
void C**Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,0);
CDialog::OnLButtonDown(nFlags, point);
}
这样很方便实现效果。但不足是窗体被移到屏幕上方,大部分在屏幕所能显示以外以后放开鼠标,窗体会自动向下对齐。徐景周的精灵特效窗体用了SetTimer和MoveWindow结合使用,这样窗体想被移到哪里都可以。正因为如此,让我想到拖放窗体的好思路。当然我们完全可以利用窗体风格WS_THICKFRAME,让系统来为我们做事。void C**Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect rc(*,*,*,*);
if(rc.PtInRect(point))
{
SetTimer(1,20,NULL);//启动记时器
return;
}
CDialog::OnLButtonDown(nFlags, point);
}
void C**Dlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch(nIDEvent)
{
case(1):
{
CRect rcW;
POINT point;
GetWindowRect(rcW);//
//实现拖动时窗体跟着右下角拉伸
::GetCursorPos(&point); //得到“当前位置”
if(point.y代码在Visual2005下编译,在WindowXP运行通过。预览图如下:

预览图