/**不規(guī)則窗口程序設(shè)計----by sword2008
@2008.2.21 剛好元宵節(jié)
*/
目標(biāo):對話框或者其他窗口控件,利用 函數(shù)繪制任意外觀的控件或者窗口
int SetWindowRgn(
HWND hWnd,
HRGN hRgn,
BOOL bRedraw
);
hWnd為窗口句柄,
bRedraw為是否重繪
hRgn為外觀區(qū)域,這個為最重要的,決定整個外觀,其包括四大函數(shù)
CreateRectRgnIndirect
CreateEllipticRgnIndirect
CreatePolygonRgn
CombineRgn //個人認(rèn)為比較好用的
用CreateEllipticRgnIndirect做個例子
建立一個空的項目,對話框程序。
OnInitDialog()里面
CRgn MyRgn;
RECT m_rect;
m_rect.left=0;m_rect.top=0;m_rect.right=500;m_rect.bottom=500;
MyRgn.CreateEllipticRgnIndirect(&m_rect);
SetWindowRgn(MyRgn,true);
看看吧!hRgn確定外觀的描繪!呵呵!還有其他函數(shù),可以慢慢觀看
例子2,用了CombineRgn跟蹤軌跡
CDC * pDC = this->GetDC();
CFont rfont,*pOldFont;
rfont.CreatePointFont(500,"隸書");
pOldFont=pDC->SelectObject(&rfont);
CRgn MyRgn;
pDC->BeginPath();
pDC->SetBkMode(TRANSPARENT);
CString stxt = "sword2008";
pDC->SetTextColor(RGB(255,0,0));
pDC->TextOut(0,0,stxt);
pDC->EndPath();
MyRgn.CreateFromPath(pDC);
pDC->SelectObject(pOldFont);
ReleaseDC(pDC);
SetWindowRgn(MyRgn,true);
浮動的IE按鈕例子:
IsMouseOn為判斷是否移入按鈕上
父窗口
void CTest2Dlg::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_b1.IsMouseOn)
{
m_b1.IsMouseOn=false;
m_b1.Invalidate();
}
CDialog::OnMouseMove(nFlags, point);
}
子窗口
CIEBUTTON::CIEBUTTON()
{
IsMouseOn = false;
}
----------
void CIEBUTTON::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC ButtonDC;
CBitmap bitmapTrans;
BITMAP bmp;
CDC mem;
CRect rc,rc2;
ButtonDC.Attach(lpDrawItemStruct->hDC);
mem.CreateCompatibleDC(&ButtonDC);
rc=lpDrawItemStruct->rcItem;
rc2=rc;
bitmapTrans.LoadBitmap(IDB_IE);
bitmapTrans.GetBitmap(&bmp);
CBitmap *old = mem.SelectObject(&bitmapTrans);
int x,y;
x=rc.Width()/2 - bmp.bmWidth/2;
y=rc.Height()/2 - bmp.bmHeight/2;
ButtonDC.BitBlt(x,y,rc.right,rc.bottom,&mem,0,0,SRCCOPY);
mem.SelectObject(old);
if(IsMouseOn)
{
rc.top =rc.top+1;rc.bottom =rc.bottom-1;
rc.left=rc.left+1;rc.right =rc.right-1;
ButtonDC.Draw3dRect(&rc2,RGB(255,255,255),RGB(0,0,0));
}
if(lpDrawItemStruct->itemAction &ODA_SELECT)
{
rc2.top =rc.top+1;rc2.bottom =rc.bottom-1;
rc2.left=rc.left+1;rc2.right =rc.right-1;
ButtonDC.Draw3dRect(&rc2,RGB(0,0,0,),RGB(255,255,255));
// ButtonDC.Draw3dRect(&rc2,RGB(255,255,255),RGB(0,0,0));
}
}
void CIEBUTTON::OnMouseMove(UINT nFlags, CPoint point)
{
if(!IsMouseOn)
{
this->IsMouseOn = true;
this->Invalidate();
}
CButton::OnMouseMove(nFlags, point);
}
-------------
void CIEBUTTON::OnMouseMove(UINT nFlags, CPoint point)
{
if(!IsMouseOn)
{
this->IsMouseOn = true;
this->Invalidate();
}
CButton::OnMouseMove(nFlags, point);
}
引用地址:
http://blog.programfan.com/trackback.asp?id=32825