现在做了一个登录界面.是一张图片(不规则),已经实现,现在有一个问题就是,上面的Button 也是一个不规则的,但不能切除非图片区域,有代码
BOOL CDlgBmp::OnInitDialog()
m_Test.LoadBitmap(IDB_NO1);
m_bt.SetBitmap(m_Test); BITMAP bmtest; m_Test.GetBitmap(&bmtest); CRect rtWindow;
((CButton *)GetDlgItem(IDC_BUTTON1))->GetWindowRect(&rtWindow);
rtWindow.right = rtWindow.left+bmtest.bmWidth;
rtWindow.bottom =rtWindow.top +bmtest.bmHeight;
((CButton *)GetDlgItem(IDC_BUTTON1))->MoveWindow(&rtWindow);
CClientDC dctest(GetDlgItem(IDC_BUTTON1)); SetupRegion(&dctest,m_Test,RGB(0,0,255));........
void CDlgBmp::SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor)
{
CDC memDC;
//创建与传入DC兼容的临时DC
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldMemBmp=NULL;
//将位图选入临时DC
pOldMemBmp=memDC.SelectObject(&cBitmap);
CRgn wndRgn;
//创建总的窗体区域,初始region为0
wndRgn.CreateRectRgn(0,0,0,0);
BITMAP bit;
cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽
int y;
for(y=0;y<=bit.bmHeight ;y++)
{
CRgn rgnTemp; //保存临时region
int iX = 0;
do
{
//跳过透明色找到下一个非透明色的点.
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)
iX++;
//记住这个起始点
int iLeftX = iX;
//寻找下个透明色的点
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
++iX;
//创建一个包含起点与重点间高为1像素的临时“region”
rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);
//合并到主"region".
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
//删除临时"region",否则下次创建时和出错
rgnTemp.DeleteObject();
}while(iX <bit.bmWidth );
iX = 0;
}
if(pOldMemBmp)
memDC.SelectObject(pOldMemBmp);
CWnd * pWnd = pDC->GetWindow();
pWnd->SetWindowRgn(wndRgn,TRUE);
pWnd->SetForegroundWindow();
}
BOOL CDlgBmp::OnInitDialog()
m_Test.LoadBitmap(IDB_NO1);
m_bt.SetBitmap(m_Test); BITMAP bmtest; m_Test.GetBitmap(&bmtest); CRect rtWindow;
((CButton *)GetDlgItem(IDC_BUTTON1))->GetWindowRect(&rtWindow);
rtWindow.right = rtWindow.left+bmtest.bmWidth;
rtWindow.bottom =rtWindow.top +bmtest.bmHeight;
((CButton *)GetDlgItem(IDC_BUTTON1))->MoveWindow(&rtWindow);
CClientDC dctest(GetDlgItem(IDC_BUTTON1)); SetupRegion(&dctest,m_Test,RGB(0,0,255));........
void CDlgBmp::SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor)
{
CDC memDC;
//创建与传入DC兼容的临时DC
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldMemBmp=NULL;
//将位图选入临时DC
pOldMemBmp=memDC.SelectObject(&cBitmap);
CRgn wndRgn;
//创建总的窗体区域,初始region为0
wndRgn.CreateRectRgn(0,0,0,0);
BITMAP bit;
cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽
int y;
for(y=0;y<=bit.bmHeight ;y++)
{
CRgn rgnTemp; //保存临时region
int iX = 0;
do
{
//跳过透明色找到下一个非透明色的点.
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)
iX++;
//记住这个起始点
int iLeftX = iX;
//寻找下个透明色的点
while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
++iX;
//创建一个包含起点与重点间高为1像素的临时“region”
rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);
//合并到主"region".
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
//删除临时"region",否则下次创建时和出错
rgnTemp.DeleteObject();
}while(iX <bit.bmWidth );
iX = 0;
}
if(pOldMemBmp)
memDC.SelectObject(pOldMemBmp);
CWnd * pWnd = pDC->GetWindow();
pWnd->SetWindowRgn(wndRgn,TRUE);
pWnd->SetForegroundWindow();
}
class HyperText:
public CWindowImpl< HyperText, CButton >,
public CCustomDraw< HyperText >
{
public: BEGIN_MSG_MAP(HyperText)
MESSAGE_HANDLER( WM_PAINT, OnPaint )
CHAIN_MSG_MAP_ALT( CCustomDraw< HyperText >, 1 )
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
}void HyperText::Paint(void)
{
#ifdef RES_NEW_FEATER
WTL::CPaintDC paintDC( m_hWnd );
paintDC.SetBkMode( TRANSPARENT ); CRect rc;
GetClientRect( rc ); CRect rtWnd;
GetWindowRect( rtWnd );
ATL::CWindow cwParent = GetParent();
if( cwParent.IsWindow() )
{
cwParent.ScreenToClient( rtWnd );
} //创建内存作图对象
WTL::CDC dc;
dc.CreateCompatibleDC( paintDC.m_hDC );
WTL::CBitmap memBitmap;
memBitmap.CreateCompatibleBitmap( paintDC.m_hDC, rc.Width(), rc.Height() );
HBITMAP hOldBmp = dc.SelectBitmap( memBitmap ); //获得控件当前使用的字体
//如果得到NULL,则使用系统字体
dc.SetBkMode( TRANSPARENT ); Graphics graph( dc.m_hDC );
RectF rtf( (REAL)rc.left, (REAL)rc.top, (REAL)rc.Width(), (REAL)rc.Height() );
StringFormat format;
format.SetAlignment(StringAlignmentNear);
format.SetLineAlignment( StringAlignmentCenter );
SolidBrush blackBrush(m_bDrawLine?Color(255, 0, 0, 255):Color(255, 50, 50, 50));
Font font01(HYPERTEXT_FONT);
Font font02(HYPERTEXT_HLFONT);
int nWidth = 0;
int nHeight = 0;
Image *pBgImg = NULL;
QsGetImageFromFileEx(_T("ResState\\Res_Coolmart_BG.png"), pBgImg, nWidth, nHeight ); // 绘制背景图像
if(NULL != pBgImg)
{
RectF rect(0,0,(Gdiplus::REAL)rc.Width(),(Gdiplus::REAL)rc.Height());
graph.DrawImage(pBgImg, rect,6,(Gdiplus::REAL)(nHeight - 20),(Gdiplus::REAL)2, (Gdiplus::REAL)HYPERTEXT_DISTANCE, UnitPixel);
}
QsReleaseImageEx(pBgImg); // 获得字符串
if(m_nOldIndex >= (int)m_TextList.size() || NULL == m_TextList[m_nOldIndex])
{
return;
} WTL::CString strText01(m_TextList[m_nOldIndex]->szTitle);
WTL::CString strText02(_T(""));
if(m_nCurrentIndex < (int)m_TextList.size() && NULL != m_TextList[m_nCurrentIndex])
{
strText02 = m_TextList[m_nCurrentIndex]->szTitle;
}
int PosMask = m_bMouseDown?1:0; if(!m_bAniMode)
{
if(!m_bFristRun)
{
RectF rtf01((REAL)rc.left, (REAL)rc.top - m_Animation + PosMask, (REAL)rc.Width(), (REAL)rc.Height());
graph.DrawString( strText01, strText01.GetLength(), &(m_bDrawLine?font02:font01), rtf01, &format, &blackBrush );
} RectF rtf02((REAL)rc.left, (REAL)rc.top - m_Animation + HYPERTEXT_DISTANCE + PosMask, (REAL)rc.Width(), (REAL)rc.Height());
graph.DrawString( strText02, strText02.GetLength(), &(m_bDrawLine?font02:font01), rtf02, &format, &blackBrush );
}
else
{
if(!m_bFristRun)
{
RectF rtf01((REAL)rc.left, (REAL)rc.top + m_Animation + PosMask, (REAL)rc.Width(), (REAL)rc.Height());
graph.DrawString( strText01, strText01.GetLength(), &(m_bDrawLine?font02:font01), rtf01, &format, &blackBrush );
} RectF rtf02((REAL)rc.left, (REAL)rc.top + m_Animation - HYPERTEXT_DISTANCE + PosMask, (REAL)rc.Width(), (REAL)rc.Height());
graph.DrawString( strText02, strText02.GetLength(), &(m_bDrawLine?font02:font01), rtf02, &format, &blackBrush );
}
paintDC.BitBlt( 0, 0, rc.Width(), rc.Height(), dc.m_hDC, 0, 0, SRCCOPY ); dc.SelectBitmap( hOldBmp );
DeleteObject(memBitmap);
#endif
}
????
SetIcon(m_hIcon, FALSE); // Set small icon
//根据路径创建不规则窗体
CDC* pDC; pDC = this->GetDC();
::BeginPath(pDC->m_hDC);
//设置为透明模式
::SetBkMode(pDC->m_hDC, TRANSPARENT);
//
RECT rect;
this->GetClientRect(&rect);
pDC->MoveTo(rect.left, rect.top);
pDC->LineTo(rect.right, rect.top); pDC->LineTo(rect.right, rect.bottom - GLOBAL_OVERLEN); pDC->LineTo(rect.left + (rect.right - rect.left) / 2, rect.bottom - GLOBAL_OVERLEN);
pDC->LineTo(rect.left + (rect.right - rect.left) / 2, rect.bottom);
pDC->LineTo(rect.left + (rect.right - rect.left) / 2 - GLOBAL_OVERWIDTH, rect.bottom - GLOBAL_OVERLEN); pDC->LineTo(rect.left, rect.bottom - GLOBAL_OVERLEN);
pDC->LineTo(rect.left, rect.top);
//
::EndPath(pDC->m_hDC);
hRgn = ::PathToRegion(pDC->m_hDC);
this->SetWindowRgn(hRgn, TRUE);========================================================================
以上代码可以可以改变窗口形状 ,但下面的改变窗口中的一个Button就不行了.
======================================================================== SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
//根据路径创建不规则窗体
CDC* pDC; pDC = ((CButton *)GetDlgItem(IDC_BUTTON1))->GetDC(); ::BeginPath(pDC->m_hDC);
//设置为透明模式
::SetBkMode(pDC->m_hDC, TRANSPARENT);
//
RECT rect;
GetDlgItem(IDC_BUTTON1)->GetClientRect(&rect);
pDC->MoveTo(rect.left, rect.top);
pDC->LineTo(rect.right, rect.top); pDC->LineTo(rect.right, rect.bottom - GLOBAL_OVERLEN); pDC->LineTo(rect.left + (rect.right - rect.left) / 2, rect.bottom - GLOBAL_OVERLEN);
pDC->LineTo(rect.left + (rect.right - rect.left) / 2, rect.bottom);
pDC->LineTo(rect.left + (rect.right - rect.left) / 2 - GLOBAL_OVERWIDTH, rect.bottom - GLOBAL_OVERLEN); pDC->LineTo(rect.left, rect.bottom - GLOBAL_OVERLEN);
pDC->LineTo(rect.left, rect.top);
//
::EndPath(pDC->m_hDC);
hRgn = ::PathToRegion(pDC->m_hDC); ((CButton *)GetDlgItem(IDC_BUTTON1))->SetWindowRgn(hRgn, TRUE);
2.实现CButtonBmp的代码中居然会出现GetDlgItem的函数?有没有搞错?算了,你还是直接看别人源码吧
http://www.codeproject.com/KB/buttons/cxskinbutton.aspx
没有在派生类里,是在button所在的类里. :-( 谢谢.....