void GColorStatic::OnPaint() { CPaintDC paintdc(this); CDC * cdc = GetDC(); if (cdc == NULL) { // logger.log("cdc null in GColorStatic::OnPaint()"); return; } CRect rect; GetClientRect(rect); COLORREF clr(RGB(212,208,200)); clr=RGB(170,170,170); COLORREF crblack = RGB(0,0,0); CBrush brush(crblack); // CGdiObject * oldbrush = cdc->SelectObject(brush); cdc->FrameRect(rect, &brush); rect.DeflateRect(1,1,1,1); cdc->FrameRect(rect, &brush); rect.DeflateRect(1,1,1,1); cdc->FrameRect(rect, &brush); // cdc->SelectObject(oldbrush); cdc->FillSolidRect( mRect.TopLeft().x, mRect.TopLeft().y, mRect.Width(), mRect.Height(), clr); ReleaseDC(cdc); class CUseBrush { CGdiObject* m_OldBrush; CDC* m_pDC; public: CUseBrush(CDC* pDC, CGdiObject * br) { m_pDC=pDC; m_OldBrush=pDC->SelectObject(br); } ~CUseBrush() { m_pDC->SelectObject(m_OldBrush); } }; }
void COXCoolComboBox::OnPaint() { if(!IsInCoolState()) { Default(); return; } // set up all the pens we are likely to need HPEN penDefault=(HPEN)GetStockObject(BLACK_PEN); static CPen penHilite(PS_SOLID,1,GetSysColor(COLOR_3DHIGHLIGHT)); static CPen penShadow(PS_SOLID,1,GetSysColor(COLOR_3DSHADOW)); static CPen penFace3D(PS_SOLID,1,GetSysColor(COLOR_3DFACE)); static CPen penDkShad3D(PS_SOLID,1,GetSysColor(COLOR_3DDKSHADOW)); // store margins for future use int nLeftMargin=GetLeftMargin(); int nRightMargin=GetRightMargin(); int nTopMargin=GetTopMargin(); int nBottomMargin=GetBtmMargin(); CRect button_rect=GetButtonRect(); const BOOL bSimpleCombo=((GetStyle()&0x000f)==CBS_SIMPLE); const BOOL bIsEnabled=IsWindowEnabled(); const BOOL bIsHot=IsInHotState() & bIsEnabled; // paint background CPaintDC paintdc(this); CDC* dc=&paintdc; CRect rect, rectClient, rectInternal; // temp rect, client rect, internal rect respectively GetClientRect(rectClient); rectClient.right-=::GetSystemMetrics(SM_CXVSCROLL)-GetButtonWidth(); if(bSimpleCombo) { ASSERT(::IsWindow(m_edit.GetSafeHwnd())); CRect rectEdit; m_edit.GetWindowRect(rectEdit); rectClient.bottom=rectClient.top+rectEdit.Height()+5; } // set up internal rectangle rectInternal=rectClient; rectInternal.left+=nLeftMargin; rectInternal.top+=nTopMargin; rectInternal.right-=nRightMargin; rectInternal.bottom-=nBottomMargin; rect=rectInternal; if(!button_rect.IsRectEmpty()) rect.right=button_rect.left; if(!bIsEnabled) ::FillRect(dc->m_hDC,&rect,GetSysColorBrush(COLOR_3DFACE)); else ::FillRect(dc->m_hDC,&rect,GetSysColorBrush(COLOR_WINDOW)); // do default painting if(!::IsWindow(m_edit.GetSafeHwnd())) { DRAWITEMSTRUCT dis={ sizeof(&dis) }; dis.CtlType=ODT_COMBOBOX; dis.CtlID=GetWindowLongPtr(m_hWnd, GWL_ID); dis.itemID=GetCurSel(); dis.itemAction=ODA_DRAWENTIRE; dis.hwndItem=m_hWnd; dis.hDC=dc->m_hDC; dis.rcItem=CRect(nLeftMargin+1,nTopMargin+1, button_rect.left-1,rectClient.bottom-nBottomMargin-1); dis.itemData=GetItemData(GetCurSel()); dis.itemState=((::GetFocus()==GetSafeHwnd() && !IsDroppedDown()) ? ODS_FOCUS : 0); DrawItem(&dis); } // now do our painting - first borderect... // but first exclude the 'real' client area from the DC dc->SelectClipRgn(NULL); // from drawing background dc->ExcludeClipRect(&rectInternal); // draw border if(!bIsHot) { // now paint background if(bSimpleCombo) FillRect(dc->m_hDC, &rectClient, ::GetSysColorBrush(COLOR_WINDOW)); else FillRect(dc->m_hDC, &rectClient, ::GetSysColorBrush(COLOR_3DFACE)); // fill in small area to the left of edit window in appropriate colour, // to make window look bigger rect=rectClient; rect.top+=nTopMargin; rect.left+=nLeftMargin-1; rect.right=rect.left+1; rect.bottom-=nBottomMargin; if(bIsEnabled) FillRect(dc->m_hDC, &rect, GetSysColorBrush(COLOR_WINDOW)); else FillRect(dc->m_hDC, &rect, GetSysColorBrush(COLOR_3DFACE)); } else { // HOT case - difficult to describe, but reasonably obvious rect=rectClient; rect.left++; rect.right--; rect.top++; rect.bottom-=1+EXTRA_BOTTOM_MARGIN; // paint background FillRect(dc->m_hDC, &rect, GetSysColorBrush(COLOR_3DFACE)); // and border rect=rectClient; SelectObject(dc->m_hDC,penShadow); dc->MoveTo(0,0); dc->LineTo(rect.right,0); dc->MoveTo(0,0); dc->LineTo(0,rect.bottom-1-EXTRA_BOTTOM_MARGIN); SelectObject(dc->m_hDC,penHilite); dc->LineTo(rect.right-1,rect.bottom-1-EXTRA_BOTTOM_MARGIN); dc->LineTo(rect.right-1,rect.top); // and paint extra margin if(EXTRA_BOTTOM_MARGIN) { rect=rectClient; rect.top=rect.bottom-EXTRA_BOTTOM_MARGIN; FillRect(dc->m_hDC, &rect, GetSysColorBrush(COLOR_3DFACE)); } } // unselect the clip region SelectClipRgn(dc->m_hDC, NULL); // now draw highlight border, if disabled if(!bIsEnabled) { SelectObject(dc->m_hDC, GetStockObject(NULL_BRUSH)); SelectObject(dc->m_hDC, penHilite); dc->Rectangle(rectInternal.left-1, rectInternal.top-1, rectInternal.right+1, rectInternal.bottom+1); } // and now for the button BOOL pressed=IsDroppedDown(); rect=button_rect; // do the background if(bIsHot) { rect.bottom--; rect.right++; } if(bIsHot || pressed || !bIsEnabled) { ::FillRect(dc->m_hDC, &rect, GetSysColorBrush(COLOR_3DFACE)); } else { if(bIsEnabled) { // cold and unpressed SelectObject(dc->m_hDC, penHilite); SelectObject(dc->m_hDC, GetSysColorBrush(COLOR_3DFACE)); ::Rectangle(dc->m_hDC, rect.left, rect.top, rect.right, rect.bottom); } } rect=button_rect; // set again if(bIsHot || pressed) { if(pressed) { SelectObject(dc->m_hDC, penShadow); dc->MoveTo(rect.left , rect.top); dc->LineTo(rect.right, rect.top); dc->MoveTo(rect.left , rect.top); dc->LineTo(rect.left , rect.bottom); } else { SelectObject(dc->m_hDC, penHilite); dc->MoveTo(rect.right, rect.top); dc->LineTo(rect.left+1, rect.top); dc->LineTo(rect.left+1, rect.bottom); SelectObject(dc->m_hDC, penFace3D); dc->MoveTo(rect.left, rect.top); dc->LineTo(rect.left, rect.bottom); SelectObject(dc->m_hDC, penShadow); dc->MoveTo(rect.left , rect.bottom - 1); dc->LineTo(rect.right-1, rect.bottom - 1); dc->LineTo(rect.right-1, rect.top); } SelectObject(dc->m_hDC, penDefault); } // now draw shadowy arrow SelectObject(dc->m_hDC, penDkShad3D); SelectObject(dc->m_hDC, ::GetSysColorBrush(COLOR_3DDKSHADOW)); POINT p[3]; p[0].x=rect.left +((rect.right - rect.left) / 3); p[1].x=rect.left +(2 *(rect.right - rect.left) / 3) + 1; p[2].x=(p[0].x + p[1].x) / 2; if(((p[1].x - p[0].x) % 2)) p[1].x--; p[0].y=(rect.top + rect.bottom / 2) -(p[1].x - p[0].x) / 4 - 1; p[1].y=p[0].y; p[2].y=p[0].y +(p[1].x - p[0].x) / 2; if(pressed) // offset by a pixel { p[0].x++; p[0].y++; p[1].x++; p[1].y++; p[2].x++; p[2].y++; } Polygon(dc->m_hDC, p, 3); }
void CDoubleBufferDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다. int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 아이콘을 그립니다. dc.DrawIcon(x, y, m_hIcon); } else { #ifndef DOUBLE CPaintDC dc(this); int x, y; CRect rect; GetClientRect(&rect); CPen *oldPen; CPen BlackPen(PS_SOLID, 1, RGB(0,0,0)); CPen GreenPen(PS_SOLID, 1, RGB(0,255,0)); CPen BluePen(PS_SOLID, 5, RGB(0,0,255)); oldPen = dc.SelectObject(&BlackPen); for (x = 0; x < rect.right; x += 10) { dc.MoveTo(x, 0); dc.LineTo(x, rect.bottom); } for (y = 0; y < rect.bottom; y += 10) { dc.MoveTo(0, y); dc.LineTo(rect.right, y); } dc.SelectObject(&GreenPen); dc.Ellipse(ex - r, ey - r, r * 2, r * 2); dc.SelectObject(&BluePen); dc.Ellipse(ex - r, ey - r, r * 2, r * 2); dc.SelectObject(oldPen); #else CPaintDC paintdc(this); CDC dc; CBitmap dcBitmap, *pOldBitmap; CPen BlackPen(PS_SOLID, 1, RGB(0,0,0)); CPen GreenPen(PS_SOLID, 1, RGB(0,255,0)); CPen BluePen(PS_SOLID, 5, RGB(0,0,255)); CPen *pOldPen; int x, y; CRect rect; GetClientRect(&rect); dc.CreateCompatibleDC(&paintdc); dcBitmap.CreateCompatibleBitmap(&paintdc, rect.Width(), rect.Height()); pOldBitmap = dc.SelectObject(&dcBitmap); dc.PatBlt(0, 0, rect.Width(), rect.Height(), WHITENESS); pOldPen = dc.SelectObject(&BlackPen); for (x = 0; x < rect.right; x += 10) { dc.MoveTo(x, 0); dc.LineTo(x, rect.bottom); } for (y = 0; y < rect.bottom; y += 10) { dc.MoveTo(0, y); dc.LineTo(rect.right, y); } dc.SelectObject(&GreenPen); dc.Ellipse(ex - r, ey - r, ex - r + r * 2, ey - r + r * 2); dc.SelectObject(&BluePen); dc.Ellipse(ex - r, ey - r, ex - r + r * 2, ey - r + r * 2); paintdc.BitBlt(0, 0, rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY); dc.SelectObject(pOldPen); dc.SelectObject(pOldBitmap); ReleaseDC(&dc); DeleteDC(dc); #endif CDialogEx::OnPaint(); } }