æ¹åèæ¯é¢è²
æ¹å对è¯æ¡ï¼çªå£ï¼çèæ¯é¢è²æ¯æç®åçæ¹åWindowsåºç¨ç¨åºå¤è§çæ¹æ³ï¼æ ¹æ®Windowså建ä¸ç®¡çæºçï¼ä¸è¬æ两ç§æ¹æ³ãä¸ç§æ¯å¤çWM_CTLCOLORæ¶æ¯ï¼é¦å
å建æéèæ¯é¢è²çå·åï¼ç¶åè°ç¨SetBkColor()æSetDialogBkColor()以æå建çå·åæ¥ç»å¶çªå£æ对è¯æ¡çèæ¯ãéè¦éç»çªå£æ对è¯ï¼æ对è¯çåæ§ä»¶ï¼æ¶ï¼Windowså对è¯åéæ¶æ¯WM_CTLCOLORï¼åºç¨ç¨åºå¤çWM_CTLCOLORæ¶æ¯å¹¶è¿åä¸ä¸ªç¨æ¥ç»ç»å¯¹è¯èæ¯çå·åå¥æãå¦å¤ä¸ç§æ¯ååºWindowsçWM_ERASEBKGNDæ¶æ¯ï¼Windowsåçªå£åéä¸ä¸ªWM_ERASEBKGNDæ¶æ¯éç¥è¯¥çªå£æ¦é¤èæ¯ï¼å¯ä»¥ä½¿ç¨VC++çClassWizardé载该æ¶æ¯ç缺çå¤çç¨åºæ¥æ¦é¤èæ¯ï¼å®é
æ¯ç¨å·åç»ï¼ï¼å¹¶è¿åTRUE以é²æ¢Windowsæ¦é¤çªå£ã
2ï¼æ¹åçªå£å¤å½¢
éè¿ä½¿ç¨æ°çSDKå½æ°SetWindowRgn()ï¼å¯ä»¥å°ç»ç»åé¼ æ æ¶æ¯éå®å¨çªå£çä¸ä¸ªæå®çåºåï¼å æ¤å®é
ä¸æ¯ä½¿çªå£æ为æå®çä¸è§åå½¢ç¶ï¼åºåå½¢ç¶ï¼ãâåºåâæ¯Windows GDIä¸ä¸ç§å¼ºæåçæºå¶ï¼åºåæ¯è®¾å¤ä¸çä¸å空é´ï¼å¯ä»¥æ¯ä»»æå½¢ç¶ï¼å¤æçåºåå¯ä»¥ç±å个å°åºåç»åèæãWindowså
å«çåºåå建å½æ°æCreateRectRgn()ãCreatePolyRgn()ãCreatePolygonRgn()ãCreateRoundRectRgn()åCreateEllipticRgn()ï¼åéè¿CombineRgn()æ¥ç»ååºåï¼å³å¯å¾å°å¤æå½¢ç¶çåºåï¼è·å¾å¤æå½¢ç¶ççªå£å¤å½¢ã
éè¿ä¸é¢çæ¹æ³è½ç¶å¯ä»¥å¾å°âå¼å½¢âçªå£ï¼ä½æè§é¢è²åè°ï¼å¤å½¢ä¹ä¸å¤âCOOLâï¼è½å¦è·å¾æ´é
·çâå¼å½¢â对è¯æ¡/çªå£å¢ï¼åçæ¯è¯å®çãä¸é¢å°±ä»ç»å©ç¨ä½å¾åèæ¿å建âå¼å½¢â对è¯æ¡/çªå£çæ¹æ³ã
3ï¼å©ç¨ä½å¾å建å¼å½¢å¯¹è¯æ¡çªå£
å©ç¨ä½å¾å建å¼å½¢å¯¹è¯æ¡åçæ¯æ ¹æ®è±¡ç´ çé¢è²æ¥è¿è¡âæ£åâå¤çï¼å¯¹ææéæå®é¢è²è±¡ç´ åºåè¿è¡åºåç»åãå©ç¨è¿ä¸ææ¯ï¼å®é
ä¸å°±æ¯å®ç°å¯¹è¯æ¡/çªå£çä½å¾èæ¯ï¼å¹¶ä¸å¯¹æå®çé¢è²åºåè¿è¡éæå¤çãä¸é¢å°±ä»¥éæä½å¾ä¸ºèæ¯ç对è¯æ¡ä¸ºä¾æ¥è¯´æï¼
é¦å
ç¨ç»å¾è½¯ä»¶å¦PhotoShopç»å¶ç¼è¾ä¸å¹
æå对è¯æ¡èæ¯ç¨çå¾çï¼ç¨BMPæ ¼å¼ä¿åï¼å设å为Back.Bmpãéè¦è¯´æçæ¯ï¼è½ç¶Visual C++éæå¼åç¯å¢çèµæºç¼è¾å¨åªè½ç¼è¾ä¸è¶
è¿16è²çä½å¾ï¼ä½å®å
¨æ们å¯ä»¥ä»¥ç彩è²æ¹å¼åå¨ï¼ä¸å¿
çä¼Visual C++çè¦åã
ä¸ä¸æ¥æ¯ç¨Visual C++çAppWizardå建ä¸ä¸ªåºäºå¯¹è¯æ¡çåºç¨ç¨åºåå®å½å为Transãç¨èµæºç¼è¾å¨å¼å
¥èæ¯å¾çBack.Bmpï¼å¦ææ¯é«å½©è²ï¼ä¸å¿
çä¼åºç°çè¦åä¿¡æ¯ï¼ç¹å»OK确认å³å¯ã为äºæç¡®ï¼ä¿®æ¹é»è®¤çèµæºIDæ è¯IDB_BITMAP1为IDB_BACKBMPãç¶åä¿®æ¹å¯¹è¯æ¡çStyle为Popupï¼Border为Noneï¼å¦å¾1ã
å¾1
åCTransDlg类添å åºåå¤çåè½æ¨¡åvoid CTransDlg::SetupRegion(CDC *pDC /*对è¯æ¡çªå£DC*/, UINT BackBitmapID /*èæ¯ä½å¾èµæºID*/, UINT MaskBitmapID /*åºåå¤çä½å¾èµæºID*/, COLORREF TransColor = 0x00000000 /*éæé¢è²å¼ï¼é»è®¤ä¸ºé»è²*/)ãå°ç®å为æ¢ï¼æ们ææ¶è®¤ä¸ºMaskBitmapIDçåäºBackBitmapIDãå
¶æ ¸å¿å·¥ä½æ¯æ ¹æ®MaskBitmapIDæ示ä½å¾çè±¡ç´ é¢è²è¿è¡åºåç»åãå®æ´ç代ç å¦ä¸ï¼
void CTransDlg::SetupRegion(CDC *pDC /*对è¯æ¡çªå£DC*/,
UINT BackBitmapID /*èæ¯ä½å¾èµæºID*/,
UINT MaskBitmapID /*åºåå¤çä½å¾èµæºID*/,
COLORREF TransColor /*éæé¢è²å¼*/)
{
CDC memDC;
CBitmap cBitmap;
CBitmap* pOldMemBmp = NULL;
COLORREF cl;
CRect cRect;
UINT x, y;
CRgn wndRgn, rgnTemp;
//åå¾çªå£å¤§å°
GetWindowRect(&cRect);
//èæ¯ä½å¾èµæºID
m_BackBitmapID = BackBitmapID
//è£
è½½ä½å¾
cBitmap.LoadBitmap(MaskBitmapID);
memDC.CreateCompatibleDC(pDC);
pOldMemBmp = memDC.SelectObject(&cBitmap);
//é¦å
å建é»è®¤çå®æ´åºå为å®æ´ççªå£åºå
wndRgn.CreateRectRgn(0, 0, cRect.Width(), cRect.Height());
//ä¸é¢ç两å±å¾ªç¯ä¸ºæ£æ¥èæ¯ä½å¾è±¡ç´ é¢è²ï¼è¿è¡éæåºåå¤çï¼
//å½è±¡ç´ é¢è²ä¸ºæå®çéæå¼æ¶ï¼å³å°è¯¥ç¹ä»åºåä¸åªè£æã
//å
¶ä¸ç¨å°çå 个æååém_MaskLeftOffãm_MaskTopOffã
//m_MaskRightOffãm_MaskBottomOffãm_FrameWidth
//åm_CaptionHeightï¼å
¶ä½ç¨åé¢åä½è¯´æï¼æ¤æ¶å¯å
¨é¨å½ä½0æ¥å¤çã
for(x= m_FrameWidth+m_MaskLeftOff;
x <=cRect.Width() - m_FrameWidth-m_MaskRightOff; x++){
for(y = m_CaptionHeight+m_MaskTopOff;
y <=cRect.Height() - m_FrameWidth-m_MaskBottomOff; y++){
//åå¾åæ å¤è±¡ç´ çé¢è²å¼
cl = memDC.GetPixel(x - m_FrameWidth-m_MaskLeftOff,
y - m_CaptionHeight-m_MaskTopOff);
if(col == TransColor)
{
//è±¡ç´ é¢è²ä¸ºæå®çéæè²ï¼å建éæâå¾®åºåâ
rgnTemp.CreateRectRgn(x, y, x+1, y+1);
//âæ£åâï¼ä»å®æ´çåºåä¸âæ£é¤âéæçâå¾®åºåâ
wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);
//å é¤åå建çéæâå¾®åºåâï¼éæ¾ç³»ç»èµæº
rgnTemp.DeleteObject();
}
}
}
if (pOldMemBmp) memDC.SelectObject(pOldMemBmp);
//ç¨è®¾å®çªå£ä¸ºæå®çåºå
SetWindowRgn((HRGN)wndRgn, TRUE);
}
é置系ç»é»è®¤çèæ¯æ¦é¤æä½ï¼å³æ·»å WM_ERASEBKGNDæ¶æ¯å¤çè¿ç¨ï¼è¿ä¸æ¥å¯ä»¥åå©ClassWizardæ¥ç®åæä½ã
BOOL CTransDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
CDC memDC;
CBitmap cBitmap;
CBitmap* pOldMemBmp = NULL;
GetWindowRect(&rect);
//è£
è½½èæ¯ä½å¾
cBitmap.LoadBitmap(m_BackBitmapID);
memDC.CreateCompatibleDC(pDC);
pOldMemBmp = memDC.SelectObject(&cBitmap);
//å°èæ¯ä½å¾å¤å¶å°çªå£å®¢æ·åº
pDC-> BitBlt(0, 0, rect.Width(), rect.Height(),
&memDC, 0, 0, SRCCOPY);
if (pOldMemBmp) memDC.SelectObject( pOldMemBmp );
//å é¤ç³»ç»å´ççOnEraseBkgndåè½
//return CDialog::OnEraseBkgnd(pDC);
return TRUE;
}
æ¥ä¸æ¥æ¯å¨WM_PAINTçæ¶æ¯å¤çå½æ°OnPaint()ä¸æ·»å 代ç ãç±äºå½èæ¯ä½å¾æ¯è¾å¤§æ¶ï¼è¿è¡åºåå¤çæ¯è¾èæ¶ï¼æ以åªå¨å¯å¨æ¶è¿è¡ä¸æ¬¡å¤çãä¸ç§æ¹æ³æ¯OnInitDialog()å¤çï¼ä½è¿æ ·ä¼å¨ä»å¯å¨ç¨åºå°çªå£åºç°æç¸å½ç延è¿ï¼æå¼èµ·ç¨åºå°æªå¯å¨ç误解ãåä¸ç§æ¹æ³å°±æ¯å¨OnPaint()å¤çï¼ä½ä¸ºäºé¿å
éå¤å¤çï¼å¯ä»¥å ä¸ä¸ä¸ªå¤ææ å¿ã以ä¸æ¯OnPaint()ç代ç ï¼æ£ä½ä¸ºAppWizardçæï¼ç²ä½ä¸ºèªå·±æ·»å å
容ã
void CTransDlg::OnPaint()
{
if (IsIconic())
{
â¦â¦
}
else
{
if(m_nFirstRun){ //é¦æ¬¡è¿è¡æ å¿
//ä¿®æ¹é¼ æ å
æ 为çå¾
æ¹å¼
BeginWaitCursor();
//设置èæ¯åºå
SetupRegion(GetWindowDC(),
IDB_BACKBMP,
IDB_BACKBMP,
0x00FFFFFF /*ç½è²*/);
//æ¢å¤é¼ æ å
æ 为æ£å¸¸æ¨¡å¼
EndWaitCursor();
m_nFirstRun = 0;
}
CDialog::OnPaint();
}
}
å©ä¸çå·¥ä½å°±æ¯æ ¹æ®èæ¯ä½å¾ç大å°æ¥è®¾ç½®å¯¹è¯æ¡çªå£ç大å°åä½ç½®ï¼è¿å¯ä»¥å¨OnInitDialog()ä¸éè¿è°ç¨MoveWindowï¼ï¼æ¥å®ç°ãåæ·»å ä¸äºåéç声åååå§åï¼å³å¯ç¼è¯è¿è¡ãå¾2为è¿è¡ç»æ示ä¾ï¼
å¾2
4ï¼è¿ä¸æ¥ç讨论
åé¢å®ç°äºåä¸æ¨¡å¼çå¼å½¢å¯¹è¯æ¡ï¼ä½æäºæ
åµä¸åéè¦ä¸åçæ ·å¼ï¼å¦ææ é¢æ ãè¾¹æ¡çï¼æè
åªä½å±é¨çå¤çï¼è¿å°±æ¯åé¢ä¸¤ä¸ªæååém_FrameWidthåm_CaptionHeightä½ç¨ï¼éè¿å¨OnInitDialog()å¤æçªå£æ ·å¼ï¼ä½¿m_FrameWidthåm_CaptionHeightåä¸åçå¼ãè¿é¨åç代ç 为ï¼
BOOL CTransBmpDlg::OnInitDialog()
{
â¦â¦
// TODO: Add extra initialization here
m_nFirstRun = 1;
//æ°æ®è®¾ç½®ï¼çªå£å·¦ä¸è§åæ ï¼m_Left=0ï¼m_Top=0
//èæ¯ä½å¾å®½é«ï¼m_Width=535ï¼m_Height=105
SetSize(0, 0, 535, 105);
//èæ¿å¤çåºåä¸çªå£è¾¹æ¡çè·ç¦»
m_MaskLeftOff=m_MaskTopOff=m_MaskRightOff=m_MaskBottomOff=0;
//çªå£è¾¹æ¡ä¸æ é¢æ è±¡ç´ å¼
m_FrameWidth = m_CaptionHeight = 0;
//åå¾çªå£æ ·å¼
LONG style = ::GetWindowLong(this-> m_hWnd, GWL_STYLE);
//å¦ä¿ççªå£é£æ ¼æ ·å¼ï¼åæ ¹æ®ä¸åççªå£è¾¹æ¡ç±»å
//éåä¸åçm_FrameWidthåm_CaptionHeightå¼ï¼
//ä¹å¯ä»¥æ ¹æ®å¤çä½ç½®çéè¦è¿è¡ä»å¼
if((style & WS_BORDER) == WS_BORDER)
m_FrameWidth = ::GetSystemMetrics(SM_CXBORDER);
if((style & WS_THICKFRAME) == WS_THICKFRAME)
m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);
if((style & DS_MODALFRAME) == DS_MODALFRAME)
m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);
if((style & WS_CAPTION) == WS_CAPTION){
m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);
m_CaptionHeight = ::GetSystemMetrics(SM_CYSMCAPTION);
}
m_CaptionHeight += m_FrameWidth * 2;
//éç½®çªå£çä½ç½®å大å°
MoveWindow(m_Left, m_Top,
m_Width + m_FrameWidth * 2,
m_Height + m_CaptionHeight, TRUE);
â¦â¦
return TRUE; // return TRUE unless you set the focus to a control
}
å¦å¤ï¼ä¸ºè¿ä¸æ¥å¢å çµæ´»æ§ï¼ä½¿çªå£æ ·å¼ä¸ä»
ä»
åèæ¯ä½å¾é¢è²çæ§å¶ãéè¿æå®SetupRegion()çMaskBitmapID 为ä¸ä¸ªæ们称ä¹ä¸ºâèæ¿âçåè²ä½å¾ï¼å¤è²å½©ä¹å¯ä»¥ï¼ä½ä¸è¬æ²¡æå¿
è¦ï¼ï¼å³å¯å®ç°éè¦çæä½ãå¾4为å¨åä¸èæ¯ä½å¾ä¸ï¼éè¿å¾3çèæ¿ä½å¾å®ç°çææï¼å¹¶ä¸å¢å äºå¯¹è¯æ¡çªä½çè¾¹æ¡åæ é¢æ å±æ§ã
å¾3
å¾4
å©ç¨è¿ç§èæ¿ææ¯ï¼å¯ä»¥å建åºä»»æå½¢ç¶ççªå£ï¼èä¸èæ¯ä½å¾æ å
³ãéè¦æ³¨æçæ¯ï¼å¯¹äºå¯¹è¯æ¡ä¸çæ§ä»¶å¦æé®çï¼å¦å¤å¨æé¨åå¤å¨éæåºåä¸ï¼åéæåºåä¸é¨åä¸å¹¶è¢«åªè£æï¼æ¯å¦åªè£ååªè£ä½ç½®ä¸å¤§å°ï¼å©ç¨èæ¿å¯ä»¥å¾æ¹ä¾¿å°è¿è¡æ§å¶ã
éè¦ç¹å«æåºçæ¯ï¼SetWindowRgnï¼ï¼ææå®çåºåæ¯é对æ´ä¸ªçªå£çï¼èBitbltï¼ï¼/ StretchBltï¼ï¼çè¾åºåºåæ¯é对äºå®¢æ·åºï¼ä¸¤è
å¨å®ä½ä¸æ¯ä¸åçï¼ç¼ç¨ä¸åºå 以注æ并çµæ´»åºç¨ï¼è¿ä¹æ¯åé¢ä¹æ以设置边æ¡å¤§å°çåéçåå ã
5ï¼ç»æè¯
è¿ç§å¼å½¢çªå£çå建ä¸ä»
éåºäºå¯¹è¯æ¡ï¼èä¸éåºäºææçåºäºCWndç±»çæ´¾ççªå£ãéç¨è¿ä¸æ¹æ³ï¼ä½ å¯ä»¥å建åºä»»ä½åªè¦ä½ è½å¤ç»åºççªä½ï¼å®ç°åªè¦å¯ä»¥ç»åºï¼å°±å¯ä»¥ååºçç®æ ã
æ¬æ代ç å¨Visual C++ 5.0ã6.0ä¸è°è¯éè¿ï¼è¿è¡æ£å¸¸ï¼æä½ç³»ç»ä¸ºWindows98SEã
温馨提示:答案为网友推荐,仅供参考