int DrawSysButtonFrame(HDC hdc, RECT *pRect, COLORREF clrBorder, COLORREF clrBack, HRGN* hRgns) { HBRUSH hBackBrush; HBRUSH hBorderBrush; HRGN hRgn; int width = pRect->right - pRect->left; POINT prt[2][4] = { {{pRect->left, pRect->top}, {pRect->left + width*0.31, pRect->top}, {pRect->left + width*0.62, pRect->top}, {pRect->right, pRect->top}}, {{pRect->left, pRect->bottom}, {pRect->left + width*0.31, pRect->bottom}, {pRect->left + width*0.62, pRect->bottom}, {pRect->right, pRect->bottom}} }; int radius = 3; hBorderBrush = CreateSolidBrush(clrBorder); //hBorderBrush = GetSysColorBrush(COLOR_3DSHADOW); hBackBrush = CreateSolidBrush (clrBack); MoveToEx(hdc, prt[0][0].x, prt[0][0].y, NULL); BeginPath(hdc); LineTo(hdc, prt[1][0].x, prt[1][0].y - radius); AngleArc(hdc, prt[1][0].x + radius, prt[1][0].y - radius, radius,180, 90); LineTo(hdc, prt[1][1].x, prt[1][1].y); LineTo(hdc, prt[0][1].x, prt[0][1].y); CloseFigure(hdc); EndPath(hdc); hRgn = PathToRegion(hdc); FillRgn(hdc, hRgn, hBackBrush); FrameRgn(hdc, hRgn, hBorderBrush, 1, 1); hRgns[0] = hRgn; MoveToEx(hdc, prt[0][1].x, prt[0][1].y, NULL); BeginPath(hdc); LineTo(hdc, prt[1][1].x, prt[1][1].y); LineTo(hdc, prt[1][2].x, prt[1][2].y); LineTo(hdc, prt[0][2].x, prt[0][2].y); CloseFigure(hdc); EndPath(hdc); hRgn = PathToRegion(hdc); FillRgn(hdc, hRgn, hBackBrush); FrameRgn(hdc, hRgn, hBorderBrush, 1, 1); hRgns[1] = hRgn; MoveToEx(hdc, prt[0][2].x, prt[0][2].y, NULL); BeginPath(hdc); LineTo(hdc, prt[1][2].x, prt[1][2].y); LineTo(hdc, prt[1][3].x - radius, prt[1][3].y); AngleArc(hdc, prt[1][3].x - radius, prt[1][3].y - radius, radius,270, 90); LineTo(hdc, prt[0][3].x, prt[0][3].y); CloseFigure(hdc); EndPath(hdc); hRgn = PathToRegion(hdc); FillRgn(hdc, hRgn, hBackBrush); FrameRgn(hdc, hRgn, hBorderBrush, 1, 1); hRgns[2] = hRgn; //DeleteObject(hBorderBrush); DeleteObject(hBackBrush); return 0; }
static void hugsprim_FrameRgn_13(HugsStackPtr hugs_root) { HsPtr arg1; HsPtr arg2; HsPtr arg3; HsInt arg4; HsInt arg5; HsBool res1; arg1 = hugs->getPtr(); arg2 = hugs->getPtr(); arg3 = hugs->getPtr(); arg4 = hugs->getInt(); arg5 = hugs->getInt(); res1 = FrameRgn(arg1, arg2, arg3, arg4, arg5); hugs->putBool(res1); hugs->returnIO(hugs_root,1); }
void SharedDesktopArea::DrawFrameAroundWindow(HWND hWnd) { HDC hWindowDc=::GetWindowDC(hWnd); HBRUSH hBrush=CreateSolidBrush(RGB(0,0,0)); HRGN Rgn=CreateRectRgn(0,0,1,1); int iRectResult=GetWindowRgn(hWnd,Rgn); if (iRectResult==ERROR || iRectResult==NULLREGION || Rgn==NULL) { RECT rect; GetWindowRect(hWnd,&rect); OffsetRect(&rect,-rect.left,-rect.top); Rgn=CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom); } SetROP2(hWindowDc,R2_MERGEPENNOT); FrameRgn(hWindowDc,Rgn,hBrush,3,3); ::DeleteObject(Rgn); ::DeleteObject(hBrush); ::ReleaseDC(hWnd,hWindowDc); }
LRESULT CALLBACK _export BalloonProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static DWORD lasttime; // ??? should be a property static POINT ttpos; RECT rect; POINT point; int x, y, width, height; SIZE size; LPSTR ptr; char text[256]; switch (message) { case WM_CREATE: { HFONT hfont = CreateFont(-11, 0, 0, 0, FW_NORMAL, FALSE, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_CHARACTER_PRECIS, PROOF_QUALITY, FF_DONTCARE, "MS Sans Serif"); SetProp(hwnd,MAKEINTRESOURCE(atomFont),hfont); break; } /* case */ case WM_DESTROY: { HFONT hfont = (HFONT)GetProp(hwnd,MAKEINTRESOURCE(atomFont)); if (hfont) DeleteObject(hfont); RemoveProp(hwnd,MAKEINTRESOURCE(atomAlignStyle)); RemoveProp(hwnd,MAKEINTRESOURCE(atomTailSize)); RemoveProp(hwnd,MAKEINTRESOURCE(atomTimeout)); RemoveProp(hwnd,MAKEINTRESOURCE(atomFont)); break; } /* case */ case WM_ERASEBKGND: return 0L; case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONUP: ShowWindow(hwnd, SW_HIDE); if (IsWindow(GetParent(hwnd))) PostMessage(GetParent(hwnd), BAN_VISIBLE, (WPARAM)hwnd, 0L); break; case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: return 0L; case WM_PAINT: { PAINTSTRUCT ps; COLORREF clrBackgr; HBRUSH hbrBackgr; HRGN hrgn; int AlignStyle=(int)GetProp(hwnd,MAKEINTRESOURCE(atomAlignStyle)); HFONT hfont = (HFONT)GetProp(hwnd,MAKEINTRESOURCE(atomFont)); HDC hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); clrBackgr=GetNearestColor(hdc, RGB(255,255,192)); hbrBackgr = CreateSolidBrush(clrBackgr); #if defined __WIN32__ hrgn=CreateRectRgn(0,0,1,1); GetWindowRgn(hwnd,hrgn); /* Win32-only */ #else #if BM_RADIUS==0 hrgn=CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom); #else hrgn=CreateRoundRectRgn(rect.left, rect.top, rect.right, rect.bottom, BM_RADIUS, BM_RADIUS); #endif #endif FillRgn(hdc,hrgn,hbrBackgr); FrameRgn(hdc,hrgn,GetStockObject(BLACK_BRUSH),1,1); DeleteObject(hbrBackgr); hfont = SelectObject(hdc, hfont); GetWindowText(hwnd, text, sizeof text); GetTextExtentPoint(hdc, text, lstrlen(text), &size); SetBkMode(hdc, TRANSPARENT); y=BM_MARGINTOP; if (AlignStyle==BAA_TOP) { int TailSize=(int)GetProp(hwnd,MAKEINTRESOURCE(atomTailSize)); y+=TailSize; } /* if */ for (ptr=strtok(text,"\n"); ptr!=NULL; ptr=strtok(NULL,"\n"), y+=size.cy) { GetTextExtentPoint(hdc, ptr, lstrlen(ptr), &size); x = ((rect.right-rect.left) - size.cx) / 2; TextOut(hdc, x, y, ptr, lstrlen(ptr)); } /* for */ SelectObject(hdc, hfont); EndPaint(hwnd, &ps); break; } /* case */ case WM_TIMER: { DWORD timeout=(DWORD)GetProp(hwnd,MAKEINTRESOURCE(atomTimeout)); DWORD curtime=GetTickCount(); GetCursorPos(&point); if (timeout==0) break; if (curtime >= lasttime+timeout) SendMessage(hwnd, BAM_SHOW, 0, 0L); break; } /* if */ case BAM_SETPOS: ttpos=*(LPPOINT)lParam; break; case BAM_SHOW: if (wParam) { HDC hdc; HRGN hrgn; int AlignStyle=(int)GetProp(hwnd,MAKEINTRESOURCE(atomAlignStyle)); int TailSize=(int)GetProp(hwnd,MAKEINTRESOURCE(atomTailSize)); HFONT hfont=(HFONT)GetProp(hwnd,MAKEINTRESOURCE(atomFont)); ASSERT(lParam!=0); lstrcpy(text, (LPSTR)lParam); SetWindowText(hwnd, text); InvalidateRect(hwnd, NULL, FALSE); hdc = GetDC(hwnd); hfont = SelectObject(hdc, hfont); for (ptr=strtok(text,"\n"), width=height=0; ptr!=NULL; ptr=strtok(NULL,"\n")) { GetTextExtentPoint(hdc, ptr, lstrlen(ptr), &size); width = max(width, size.cx); height += size.cy; } /* for */ SelectObject(hdc, hfont); ReleaseDC(hwnd, hdc); width += 2*BM_MARGINX; height += BM_MARGINTOP + BM_MARGINBOTTOM; #if 0 // round width up to multiple of 16 pixels and height up to a multiple // of 8 pixels width+=16-1; width=width - (width%16); height+=8-1; height=height - (height%8); #endif // also add the tail size to the height height+=TailSize; // check alignment switch (AlignStyle) { case BAA_TOP: x = ttpos.x - width/4; y = ttpos.y; break; case BAA_BOTTOM: x = ttpos.x - width/4; y = ttpos.y - height; break; } /* switch */ // check screen position against the screen size (width) if (x < 0) x = 0; else if (x+width >= GetSystemMetrics(SM_CXSCREEN)-1) x = GetSystemMetrics(SM_CXSCREEN) - width - 1; if (y < 0) y = 0; else if (y+height >= GetSystemMetrics(SM_CYSCREEN)-1) y = GetSystemMetrics(SM_CYSCREEN) - height - 1; GetWindowRect(hwnd,&rect); // get first, check later (for new region) SetWindowPos(hwnd, HWND_TOPMOST, x, y, width, height, SWP_SHOWWINDOW|SWP_NOACTIVATE); hrgn=MakeBalloonRegion(width+1,height+1,BM_RADIUS,AlignStyle,TailSize,ttpos.x-x,ttpos.y-y); ASSERT(hrgn!=NULL); SetWindowRgn(hwnd, hrgn, TRUE); UpdateWindow(hwnd); lasttime=GetTickCount(); } else { ShowWindow(hwnd, SW_HIDE); lasttime=GetTickCount(); } /* if */ break; default: return DefWindowProc(hwnd, message, wParam, lParam); } /* switch */ return 0L; }
void GifAvatar::draw(MyBitmap *bmp, int x, int y, int w, int h, POPUPOPTIONS *options) { if (!av || (w <= 0) || (h <= 0)) return; if (!frameCount || !frameDelays || !hBitmap || (cachedWidth != w) || (cachedHeight != h)) { cachedWidth = w; cachedHeight = h; if (frameDelays) { mir_free(frameDelays); frameDelays = NULL; } if (hBitmap) DeleteObject(hBitmap); GDIPlus_ExtractAnimatedGIF(av->szFilename, w, h, &hBitmap, &frameDelays, &frameCount, &frameSize); } if (!frameCount) return; HRGN rgn; if (options->avatarRadius) { rgn = CreateRoundRectRgn(x, y, x+w, y+h, 2 * options->avatarRadius, 2 * options->avatarRadius); SelectClipRgn(bmp->getDC(), rgn); } else { rgn = CreateRectRgn(x, y, x+w, y+h); } HDC hdcTmp = CreateCompatibleDC(bmp->getDC()); SelectObject(hdcTmp, hBitmap); SetStretchBltMode(bmp->getDC(), HALFTONE); if (av->dwFlags & AVS_PREMULTIPLIED) { BLENDFUNCTION bf; bf.BlendOp = AC_SRC_OVER; bf.BlendFlags = 0; bf.SourceConstantAlpha = 255; bf.AlphaFormat = AC_SRC_ALPHA; AlphaBlend(bmp->getDC(), x, y, w, h, hdcTmp, frameSize.cx*activeFrame, 0, frameSize.cx, frameSize.cy, bf); if (options->avatarBorders && options->avatarPNGBorders) { HBRUSH hbr = CreateSolidBrush(fonts.clAvatarBorder); bmp->saveAlpha(x, y, w, h); FrameRgn(bmp->getDC(), rgn, hbr, 1, 1); DeleteObject(hbr); bmp->restoreAlpha(x, y, w, h); } } else { bmp->saveAlpha(x, y, w, h); StretchBlt(bmp->getDC(), x, y, w, h, hdcTmp, frameSize.cx*activeFrame, 0, frameSize.cx, frameSize.cy, SRCCOPY); if (options->avatarBorders) { HBRUSH hbr = CreateSolidBrush(fonts.clAvatarBorder); FrameRgn(bmp->getDC(), rgn, hbr, 1, 1); DeleteObject(hbr); } bmp->restoreAlpha(x, y, w, h); } DeleteObject(rgn); SelectClipRgn(bmp->getDC(), NULL); DeleteDC(hdcTmp); activeFrame = (activeFrame + 1) % frameCount; }
static void BoxPreview_OnPaint(HWND hwnd, HDC mydc, int mode) { RECT rc; switch (mode) { case 0: { // Avatar HDC hdcAvatar = CreateCompatibleDC(mydc); HBITMAP hbmSave = (HBITMAP)SelectObject(hdcAvatar, hbmNoAvatar); GetClientRect(hwnd, &rc); BITMAP bmp; GetObject(hbmNoAvatar, sizeof(bmp), &bmp); StretchBlt(mydc, 0, 0, rc.right, rc.bottom, hdcAvatar, 0, 0, abs(bmp.bmWidth), abs(bmp.bmHeight), SRCCOPY); SelectObject(hdcAvatar, hbmSave); DeleteDC(hdcAvatar); HRGN rgn = CreateRoundRectRgn(0, 0, rc.right, rc.bottom, 2 * PopupOptions.avatarRadius, 2 * PopupOptions.avatarRadius); FrameRgn(mydc, rgn, (HBRUSH)GetStockObject(BLACK_BRUSH), 1, 1); DeleteObject(rgn); break; } case 1: { // Opacity HBRUSH hbr = CreateSolidBrush(fonts.clBack); HFONT hfnt = (HFONT)SelectObject(mydc, fonts.title); GetClientRect(hwnd, &rc); FillRect(mydc, &rc, hbr); DrawIconEx(mydc, 10, (rc.bottom-rc.top-16)/2, IcoLib_GetIcon(ICO_POPUP_ON,0), 16, 16, 0, hbr, DI_NORMAL); SetBkMode(mydc, TRANSPARENT); GetClientRect(hwnd, &rc); rc.left += 30; // 10+16+4 -- icon rc.right -= (rc.right-rc.left)/3; rc.bottom -= (rc.bottom-rc.top)/3; DrawText(mydc, _T(MODULNAME_LONG), lstrlen(_T(MODULNAME_LONG)), &rc, DT_CENTER|DT_NOPREFIX|DT_SINGLELINE|DT_VCENTER); GetClientRect(hwnd, &rc); rc.left += 30; // 10+16+4 -- icon rc.left += (rc.right-rc.left)/3; rc.top += (rc.bottom-rc.top)/3; DrawText(mydc, _T(MODULNAME_LONG), lstrlen(_T(MODULNAME_LONG)), &rc, DT_CENTER|DT_NOPREFIX|DT_SINGLELINE|DT_VCENTER); GetClientRect(hwnd, &rc); FrameRect(mydc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); SelectObject(mydc, hfnt); DeleteObject(hbr); } break; case 2: { // Position HBRUSH hbr = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); GetClientRect(hwnd, &rc); FillRect(mydc, &rc, hbr); DeleteObject(hbr); hbr = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT)); GetClientRect(hwnd, &rc); rc.right -= 100; rc.top += 100; FillRect(mydc, &rc, hbr); DeleteObject(hbr); HPEN hpen = (HPEN)SelectObject(mydc, CreatePen(PS_DOT, 1, RGB(0,0,0))); MoveToEx(mydc, 0, 100, NULL); LineTo (mydc, 201, 100); MoveToEx(mydc, 100, 0, NULL); LineTo (mydc, 100, 201); DeleteObject(SelectObject(mydc, hpen)); HRGN hrgn = CreateRectRgn(0,0,0,0); GetWindowRgn(hwnd, hrgn); FrameRgn(mydc, hrgn, (HBRUSH)GetStockObject(BLACK_BRUSH), 1, 1); DeleteObject(hrgn); } break; } }
HRGN DrawChromeFrame(HDC hdc, RECT *pRect, COLORREF clrBorder, COLORREF clrBack) { HBRUSH hBackBrush = NULL; HBRUSH hBorderBrush; HRGN hRgn; hBorderBrush = CreateSolidBrush(clrBorder); hBackBrush = CreateSolidBrush (clrBack); POINT lpts[4], rpts[4]; int spread, eigth, sixth, quarter; int width = pRect->right - pRect->left; int height = pRect->bottom - pRect->top; if (1){//bottom spread = ((float)height) * 2/3; eigth = ((float)height) * 1/8; sixth = ((float)height) * 1/6; quarter = ((float)height) * 1/4; }else{ spread = ((float)width) * 2/3; eigth = ((float)width) * 1/8; sixth = ((float)width) * 1/6; quarter = ((float)width) * 1/4; } pRect->right += spread; lpts[3].x = pRect->left; lpts[3].y = pRect->bottom; lpts[2].x = pRect->left + sixth; lpts[2].y = pRect->bottom - eigth; lpts[1].x = pRect->left + spread - quarter; lpts[1].y = pRect->top + eigth; lpts[0].x = pRect->left + spread; lpts[0].y = pRect->top; rpts[3].x = pRect->right - spread; rpts[3].y = pRect->top; rpts[2].x = pRect->right - spread + quarter; rpts[2].y = pRect->top + eigth; rpts[1].x = pRect->right - sixth; rpts[1].y = pRect->bottom - eigth; rpts[0].x = pRect->right; rpts[0].y = pRect->bottom; MoveToEx(hdc, lpts[3].x, lpts[3].y, NULL); BeginPath(hdc); PolyBezier(hdc, lpts, sizeof(lpts)/sizeof(POINT)); //MoveToEx(hdc, lpts[0].x, lpts[0].y, NULL); LineTo(hdc, rpts[3].x, rpts[3].y); PolyBezier(hdc, rpts, sizeof(rpts)/sizeof(POINT)); //MoveToEx(hdc, rpts[0].x, rpts[0].y, NULL); LineTo(hdc, lpts[3].x, lpts[3].y); CloseFigure(hdc); EndPath(hdc); //StrokePath (hdc); FlattenPath(hdc); hRgn = PathToRegion(hdc); FillRgn(hdc, hRgn, hBackBrush); FrameRgn(hdc, hRgn, hBorderBrush, 1, 1); DeleteObject(hBorderBrush); DeleteObject(hBackBrush); HGDIOBJ hPen = NULL; HGDIOBJ hOldPen; hPen = CreatePen(PS_SOLID, 2, clrBack); hOldPen = SelectObject(hdc, hPen); DrawLine(hdc, rpts[0].x, rpts[0].y, lpts[3].x, lpts[3].y); SelectObject(hdc, hOldPen); DeleteObject(hPen); pRect->left += spread; pRect->right -= spread; return hRgn; }