void CPlugin::onPaint(HWND hWnd) { RECT rc; HDC hDC; PAINTSTRUCT ps; int x, y; hDC = BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rc); x = (rc.right / 2) - (32 / 2); y = (rc.bottom / 2) - ((32) / 2); if(rc.right > 34 && rc.bottom > 34) { if(m_hIcon != NULL) DrawIcon(hDC, x, y, m_hIcon); POINT pt[5]; // left vert and top horiz highlight pt[0].x = 1; pt[0].y = rc.bottom-1; pt[1].x = 1; pt[1].y = 1; pt[2].x = rc.right-1; pt[2].y = 1; HPEN hPen3DLight = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DLIGHT)); HPEN hPen3DShadow = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW)); HPEN hPen3DDKShadow = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DDKSHADOW)); HPEN hPenOld = SelectPen(hDC, hPen3DLight); Polyline(hDC, pt, 3); // left vert and top horiz shadow pt[0].x = 2; pt[0].y = rc.bottom-3; pt[1].x = 2; pt[1].y = 2; pt[2].x = rc.right-2; pt[2].y = 2; SelectPen(hDC, hPen3DShadow); Polyline(hDC, pt, 3); // right vert and bottom horiz highlight pt[0].x = rc.right-3; pt[0].y = 2; pt[1].x = rc.right-3; pt[1].y = rc.bottom-3; pt[2].x = 2; pt[2].y = rc.bottom-3; SelectPen(hDC, hPen3DLight); Polyline(hDC, pt, 3); // right vert and bottom horiz shadow pt[0].x = rc.right-1; pt[0].y = 1; pt[1].x = rc.right-1; pt[1].y = rc.bottom-1; pt[2].x = 0; pt[2].y = rc.bottom-1; SelectPen(hDC, hPen3DDKShadow); Polyline(hDC, pt, 3); // restore the old pen SelectPen(hDC, hPenOld); DeletePen(hPen3DDKShadow); DeletePen(hPen3DShadow); DeletePen(hPen3DLight); DrawCommandMessage(hDC, m_szCommandMessage, &rc); } else if(m_hIcon != NULL) DrawIconEx(hDC, x, y, m_hIcon, rc.right - rc.left, rc.bottom - rc.top, 0, NULL, DI_NORMAL); EndPaint (hWnd, &ps); }
QPixmap QPixmap::fromWinHICON(HICON icon) { bool foundAlpha = false; HDC screenDevice = GetDC(0); HDC hdc = CreateCompatibleDC(screenDevice); ReleaseDC(0, screenDevice); ICONINFO iconinfo; bool result = GetIconInfo(icon, &iconinfo); //x and y Hotspot describes the icon center if (!result) qWarning("QPixmap::fromWinHICON(), failed to GetIconInfo()"); int w = iconinfo.xHotspot * 2; int h = iconinfo.yHotspot * 2; BITMAPINFOHEADER bitmapInfo; bitmapInfo.biSize = sizeof(BITMAPINFOHEADER); bitmapInfo.biWidth = w; bitmapInfo.biHeight = h; bitmapInfo.biPlanes = 1; bitmapInfo.biBitCount = 32; bitmapInfo.biCompression = BI_RGB; bitmapInfo.biSizeImage = 0; bitmapInfo.biXPelsPerMeter = 0; bitmapInfo.biYPelsPerMeter = 0; bitmapInfo.biClrUsed = 0; bitmapInfo.biClrImportant = 0; DWORD* bits; HBITMAP winBitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bitmapInfo, DIB_RGB_COLORS, (VOID**)&bits, NULL, 0); HGDIOBJ oldhdc = (HBITMAP)SelectObject(hdc, winBitmap); DrawIconEx( hdc, 0, 0, icon, iconinfo.xHotspot * 2, iconinfo.yHotspot * 2, 0, 0, DI_NORMAL); QImage image = qt_fromWinHBITMAP(hdc, winBitmap, w, h); for (int y = 0 ; y < h && !foundAlpha ; y++) { QRgb *scanLine= reinterpret_cast<QRgb *>(image.scanLine(y)); for (int x = 0; x < w ; x++) { if (qAlpha(scanLine[x]) != 0) { foundAlpha = true; break; } } } if (!foundAlpha) { //If no alpha was found, we use the mask to set alpha values DrawIconEx( hdc, 0, 0, icon, w, h, 0, 0, DI_MASK); QImage mask = qt_fromWinHBITMAP(hdc, winBitmap, w, h); for (int y = 0 ; y < h ; y++){ QRgb *scanlineImage = reinterpret_cast<QRgb *>(image.scanLine(y)); QRgb *scanlineMask = mask.isNull() ? 0 : reinterpret_cast<QRgb *>(mask.scanLine(y)); for (int x = 0; x < w ; x++){ if (scanlineMask && qRed(scanlineMask[x]) != 0) scanlineImage[x] = 0; //mask out this pixel else scanlineImage[x] |= 0xff000000; // set the alpha channel to 255 } } } //dispose resources created by iconinfo call DeleteObject(iconinfo.hbmMask); DeleteObject(iconinfo.hbmColor); SelectObject(hdc, oldhdc); //restore state DeleteObject(winBitmap); DeleteDC(hdc); return QPixmap::fromImage(image); }
// Draw TreeCtrl Items void VividTree::DrawItems( CDC *pDC ) { // draw items HTREEITEM show_item, parent; CRect rc_item; CString name; COLORREF color; DWORD tree_style; BITMAP bm; CDC dc_mem; CBitmap *button; int count = 0; int state; bool selected; bool has_children; show_item = GetFirstVisibleItem(); if ( show_item == NULL ) return; dc_mem.CreateCompatibleDC(NULL); color = pDC->GetTextColor(); tree_style = ::GetWindowLong( m_hWnd, GWL_STYLE ); do { state = GetItemState( show_item, TVIF_STATE ); parent = GetParentItem( show_item ); has_children = ItemHasChildren( show_item ) || parent == NULL; selected = (state & TVIS_SELECTED) && ((this == GetFocus()) || (tree_style & TVS_SHOWSELALWAYS)); if ( GetItemRect( show_item, rc_item, TRUE ) ) { if( selected) { CRect rc_all; GetItemRect(show_item,&rc_all, FALSE); pDC->FillSolidRect(&rc_all, RGB(170,155,119)); } if ( has_children || selected ) { COLORREF from; CRect rect; // Show if ( selected ) from = m_gradient_bkgd_sel; else from = m_gradient_bkgd_to - (m_gradient_bkgd_from - m_gradient_bkgd_to); rect.top = rc_item.top; rect.bottom = rc_item.bottom; rect.right = m_h_size + m_h_offset; if ( !has_children ) rect.left = rc_item.left + m_h_offset; else rect.left = m_h_offset; //GradientFillRect( pDC, rect, from, m_gradient_bkgd_to, FALSE ); //pDC->SetTextColor( RGB( 0, 0, 255 ) ); pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)); if ( has_children ) { // Draw an Open/Close button if ( state & TVIS_EXPANDED ) button = &m_bmp_tree_open; else button = &m_bmp_tree_closed; VERIFY(button->GetObject(sizeof(bm), (LPVOID)&bm)); CBitmap *bmp_old = (CBitmap*)dc_mem.SelectObject(button); pDC->TransparentBlt(rc_item.left - bm.bmWidth - 2, rc_item.top, bm.bmWidth, bm.bmHeight, &dc_mem, 0, 0,bm.bmWidth,bm.bmWidth, GetSysColor(COLOR_HIGHLIGHTTEXT)); //pDC->BitBlt( rc_item.left - bm.bmWidth - 2, rc_item.top, bm.bmWidth, bm.bmHeight, // &dc_mem, 0, 0, SRCCOPY ); // CleanUp dc_mem.SelectObject( bmp_old ); } } if ( !has_children ) { // lookup the ICON instance (if any) and draw it HICON icon; icon = GetItemIcon( show_item ); if ( icon != NULL ) DrawIconEx( pDC->m_hDC, rc_item.left - 18, rc_item.top, icon, 16, 16,0,0, DI_NORMAL ); } name = GetItemText( show_item ); rc_item.DeflateRect( 0,1,0,1 ); if ( selected ) { if ( !has_children ) pDC->SetTextColor( GetSysColor(COLOR_HIGHLIGHTTEXT) ); COLORREF col = pDC->GetBkColor(); //pDC->SetBkColor( /*GetSysColor(COLOR_HIGHLIGHT)*/RGB(170,155,119) ); pDC->DrawText( name, rc_item, DT_LEFT ); pDC->SetTextColor( color ); pDC->SetBkColor( col ); } else { pDC->SetTextColor( GetSysColor(COLOR_HIGHLIGHTTEXT) ); pDC->DrawText( name, rc_item, DT_LEFT ); pDC->SetTextColor( color ); } //if ( state & TVIS_BOLD ) // pDC->SelectObject( font ); } } while ( (show_item = GetNextVisibleItem( show_item )) != NULL ); }
static INT_PTR CALLBACK FBAPopupProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) { switch (Msg) { // Grab the handle to the font we need to use case WM_SETFONT: { hEditFont = (HFONT)wParam; break; } case WM_DRAWITEM: { if (((LPDRAWITEMSTRUCT)lParam)->CtlID == IDC_MESSAGE_ICON) { DrawIconEx(((LPDRAWITEMSTRUCT)lParam)->hDC, 0, 0, (HICON)LoadImage(NULL, MAKEINTRESOURCE(nIcon), IMAGE_ICON, 0, 0, LR_LOADTRANSPARENT | LR_SHARED), 32, 32, 0, NULL, DI_NORMAL | DI_DEFAULTSIZE); } break; } case WM_INITDIALOG: { int nBeep = -1; TCHAR szCaption[1024] = _T(""); TCHAR* pszTypeEnglish; TCHAR* pszTypeLocal; nIcon = 0; switch (nPopupFlags & 7) { case PUF_TYPE_ERROR: nIcon = OIC_ERROR; nBeep = MB_ICONHAND; pszTypeEnglish = FBALoadStringEx(hAppInst, IDS_ERR_ERROR, false); pszTypeLocal = FBALoadStringEx(hAppInst, IDS_ERR_ERROR, true); break; case PUF_TYPE_WARNING: nIcon = OIC_WARNING; nBeep = MB_ICONEXCLAMATION; pszTypeEnglish = FBALoadStringEx(hAppInst, IDS_ERR_WARNING, false); pszTypeLocal = FBALoadStringEx(hAppInst, IDS_ERR_WARNING, true); break; default: nIcon = OIC_INFORMATION; nBeep = MB_ICONASTERISK; pszTypeEnglish = FBALoadStringEx(hAppInst, IDS_ERR_INFORMATION, false); pszTypeLocal = FBALoadStringEx(hAppInst, IDS_ERR_INFORMATION, true); break; } // Set the icon SendDlgItemMessage(hDlg, IDC_MESSAGE_ICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(NULL, MAKEINTRESOURCE(nIcon), IMAGE_ICON, 32, 32, LR_SHARED)); // Set the caption _sntprintf(szCaption, 1024, _T(APP_TITLE) _T(" %s"), pszTypeLocal); SetWindowText(hDlg, szCaption); { SIZE sizee = { 0, 0 }; SIZE sizel = { 0, 0 }; POINT p = { 0, 0 }; RECT rect; HWND hWnd; { hWnd = GetDlgItem(hDlg, IDC_MESSAGE_EDIT_ENG); HDC hDC = GetDC(hWnd); HFONT hFont = (HFONT)SelectObject(hDC, hEditFont); for (TCHAR* szText = pszBufferEnglish; ; ) { SIZE line; int nLen; for (nLen = 0; szText[nLen] && szText[nLen] != _T('\n'); nLen++) { } GetTextExtentPoint32(hDC, szText, nLen ? nLen : 1, &line); if (sizee.cx < line.cx) { sizee.cx = line.cx; } sizee.cy += line.cy; if (!szText[nLen]) { break; } szText += nLen + 1; } if (bLocalisationActive && pszBufferLocal) { for (TCHAR* szText = pszBufferLocal; ; ) { SIZE line; int nLen; for (nLen = 0; szText[nLen] && szText[nLen] != _T('\n'); nLen++) { } GetTextExtentPoint32(hDC, szText, nLen ? nLen : 1, &line); if (sizel.cx < line.cx) { sizel.cx = line.cx; } sizel.cy += line.cy; if (!szText[nLen]) { break; } szText += nLen + 1; } } SelectObject(hDC, hFont); ReleaseDC(hWnd, hDC); } // Set minimum size if needed hWnd = GetDlgItem(hDlg, IDOK); GetWindowRect(hWnd, &rect); if (sizee.cx < (rect.right - rect.left)) { sizee.cx = rect.right - rect.left; } ClientToScreen(hDlg, &p); GetWindowRect(hDlg, &rect); // Size dialog and edit control containing message text if (bLocalisationActive && pszBufferLocal) { if (sizel.cx < sizee.cx) { sizel.cx = sizee.cx; } else { sizee.cx = sizel.cx; } if (sizel.cy < 32) { sizel.cy = 32; } MoveWindow(hDlg, rect.left, rect.top, rect.right - rect.left + sizee.cx, rect.bottom - rect.top + sizee.cy + sizel.cy + 12, FALSE); hWnd = GetDlgItem(hDlg, IDC_MESSAGE_EDIT_LOCAL); GetWindowRect(hWnd, &rect); SetWindowPos(hWnd, NULL, 0, 0, rect.right - rect.left + sizel.cx, rect.bottom - rect.top + sizel.cy, SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW); SendMessage(hWnd, WM_SETTEXT, (WPARAM)0, (LPARAM)pszBufferLocal); SendMessage(hWnd, EM_SETMARGINS, EC_LEFTMARGIN, 3); ShowWindow(hWnd, SW_SHOW); hWnd = GetDlgItem(hDlg, IDC_MESSAGE_BACK); SetWindowPos(hWnd, NULL, 0, 0, 9999, rect.bottom - p.y + sizel.cy + 6, SWP_NOZORDER | SWP_NOREDRAW); ShowWindow(hWnd, SW_SHOW); p.y -= rect.bottom - rect.top + sizel.cy + 12; } else { if (sizee.cy < 32) { sizee.cy = 32; } MoveWindow(hDlg, rect.left, rect.top, rect.right - rect.left + sizee.cx, rect.bottom - rect.top + sizee.cy, FALSE); } hWnd = GetDlgItem(hDlg, IDC_MESSAGE_EDIT_ENG); SendMessage(hWnd, EM_SETBKGNDCOLOR, 0, GetSysColor(COLOR_3DFACE)); GetWindowRect(hWnd, &rect); SetWindowPos(hWnd, NULL, rect.left - p.x, rect.top - p.y, rect.right - rect.left + sizee.cx, rect.bottom - rect.top + sizee.cy, (pszBufferLocal ? 0 : SWP_NOMOVE) | SWP_NOZORDER | SWP_NOREDRAW); SendMessage(hWnd, WM_SETTEXT, (WPARAM)0, (LPARAM)pszBufferEnglish); SendMessage(hWnd, EM_SETMARGINS, EC_LEFTMARGIN, 3); // Center button GetClientRect(hDlg, &rect); p.x = (rect.right - rect.left) / 2; hWnd = GetDlgItem(hDlg, IDOK); GetWindowRect(hWnd, &rect); SetWindowPos(hWnd, NULL, p.x - (rect.right - rect.left) / 2, rect.top - p.y + sizee.cy, 0, 0, SWP_NOSIZE | SWP_NOZORDER); } WndInMid(hDlg, hScrnWnd); SetForegroundWindow(hDlg); MessageBeep(nBeep); return TRUE; } case WM_COMMAND: { if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK) { SendMessage(hDlg, WM_CLOSE, 0, 0); } break; } case WM_CLOSE: { EndDialog(hDlg, 0); break; } } return 0; }
/* * MainWindowProc * * Purpose: * * Main window procedure. * */ LRESULT CALLBACK MainWindowProc( _In_ HWND hwnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { INT mark; RECT ToolBarRect, crc; LPDRAWITEMSTRUCT pds; LPMEASUREITEMSTRUCT pms; switch (uMsg) { case WM_CONTEXTMENU: RtlSecureZeroMemory(&crc, sizeof(crc)); if ((HWND)wParam == g_hwndObjectTree) { TreeView_GetItemRect(g_hwndObjectTree, TreeView_GetSelection(g_hwndObjectTree), &crc, TRUE); crc.top = crc.bottom; ClientToScreen(g_hwndObjectTree, (LPPOINT)&crc); supHandleTreePopupMenu(hwnd, (LPPOINT)&crc); } if ((HWND)wParam == g_hwndObjectList) { mark = ListView_GetSelectionMark(g_hwndObjectList); if (lParam == MAKELPARAM(-1, -1)) { ListView_GetItemRect(g_hwndObjectList, mark, &crc, TRUE); crc.top = crc.bottom; ClientToScreen(g_hwndObjectList, (LPPOINT)&crc); } else GetCursorPos((LPPOINT)&crc); supHandleObjectPopupMenu(hwnd, g_hwndObjectList, mark, (LPPOINT)&crc); } break; case WM_COMMAND: MainWindowHandleWMCommand(hwnd, wParam, lParam); break; case WM_NOTIFY: MainWindowHandleWMNotify(hwnd, wParam, lParam); break; case WM_MEASUREITEM: pms = (LPMEASUREITEMSTRUCT)lParam; if (pms && pms->CtlType == ODT_MENU) { pms->itemWidth = 16; pms->itemHeight = 16; } break; case WM_DRAWITEM: pds = (LPDRAWITEMSTRUCT)lParam; if (pds && pds->CtlType == ODT_MENU) { DrawIconEx(pds->hDC, pds->rcItem.left - 15, pds->rcItem.top, (HICON)pds->itemData, 16, 16, 0, NULL, DI_NORMAL); } break; case WM_CLOSE: PostQuitMessage(0); break; case WM_LBUTTONDOWN: SetCapture(MainWindow); break; case WM_LBUTTONUP: ReleaseCapture(); break; case WM_MOUSEMOVE: if ((wParam & MK_LBUTTON) != 0) { GetClientRect(MainWindow, &ToolBarRect); SplitterPos = (SHORT)LOWORD(lParam); if (SplitterPos < SplitterMargin) SplitterPos = SplitterMargin; if (SplitterPos > ToolBarRect.right - SplitterMargin) SplitterPos = ToolBarRect.right - SplitterMargin; SendMessage(MainWindow, WM_SIZE, 0, 0); UpdateWindow(MainWindow); } break; case WM_SIZE: if (!IsIconic(hwnd)) { MainWindowResizeHandler(SplitterPos); } break; case WM_GETMINMAXINFO: if (lParam) { ((PMINMAXINFO)lParam)->ptMinTrackSize.x = 400; ((PMINMAXINFO)lParam)->ptMinTrackSize.y = 256; } break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
//界面绘画函数 void CSkinButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { //定义变量 CRect ClientRect; GetClientRect(&ClientRect); bool bDisable=((lpDrawItemStruct->itemState&ODS_DISABLED)!=0); bool bButtonDown=((lpDrawItemStruct->itemState&ODS_SELECTED)!=0); //设置 DC HDC hDC=lpDrawItemStruct->hDC; //获取文字 CString strText; GetWindowText(strText); //加载背景图 CImageHandle ImageHandle; if (m_ImageBack.IsSetLoadInfo()) ImageHandle.AttachResource(&m_ImageBack); else ImageHandle.AttachResource(&m_SkinAttribute.m_ImageBack); if (ImageHandle.IsResourceValid()) { //计算位图位置 int iPartWidth=ImageHandle->GetWidth()/5,iDrawPos=0; if (bDisable) iDrawPos=iPartWidth*4; else if (bButtonDown) iDrawPos=iPartWidth; else if (m_bHovering) iDrawPos=iPartWidth*3; //绘画背景图 if (m_bExpand==false) ImageHandle->BitBlt(hDC,0,0,ClientRect.Width(),ClientRect.Height(),iDrawPos,0,SRCCOPY); else ImageHandle->StretchBlt(hDC,0,0,ClientRect.Width(),ClientRect.Height(),iDrawPos,0,iPartWidth,ImageHandle->GetHeight(),SRCCOPY); } else { //绘画默认界面 CDC * pDC=CDC::FromHandle(hDC); pDC->FillSolidRect(&ClientRect,GetSysColor(COLOR_BTNFACE)); if (bButtonDown) pDC->Draw3dRect(&ClientRect,GetSysColor(COLOR_WINDOWFRAME),GetSysColor(COLOR_3DHILIGHT)); else pDC->Draw3dRect(&ClientRect,GetSysColor(COLOR_3DHILIGHT),GetSysColor(COLOR_WINDOWFRAME)); } //绘画图标 if (bButtonDown) ClientRect.top+=2; if (m_hIcon) { DrawIconEx(hDC,ClientRect.left+6,ClientRect.top+(ClientRect.Height()-16)/2+1,m_hIcon,16,16,0,NULL,DI_NORMAL); ClientRect.left+=22; } //绘画字体 ClientRect.top+=1; ::SetBkMode(hDC,TRANSPARENT); if(!m_bShowTextFrame) { if (bDisable) ::SetTextColor(hDC,GetSysColor(COLOR_GRAYTEXT)); else ::SetTextColor(hDC,m_crTextColor); DrawText(hDC,strText,strText.GetLength(),ClientRect,DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS); } //艺术字体 else { CDC * pDC=CDC::FromHandle(hDC); DrawTextString(pDC,strText,m_crTextColor,m_crTextFrameColor,ClientRect); } return; }
// // Fontlist owner-draw // BOOL FontCombo_DrawItem(HWND hwnd, DRAWITEMSTRUCT *dis) { TCHAR szText[100]; BOOL fFixed = LOWORD(dis->itemData); BOOL fTrueType = HIWORD(dis->itemData); TEXTMETRIC tm; int xpos, ypos; HANDLE hOldFont; if(dis->itemAction & ODA_FOCUS && !(dis->itemState & ODS_NOFOCUSRECT)) { DrawFocusRect(dis->hDC, &dis->rcItem); return TRUE; } /*{ HTHEME hTheme = OpenThemeData(hwnd, L"combobox"); RECT rc; HDC hdc=GetDC(GetParent(hwnd)); CopyRect(&rc, &dis->rcItem); InflateRect(&rc, 3, 3); //GetClientRect(hwnd, &rc); //rc.bottom = rc.top + 22; //DrawThemeBackground( // hTheme, // dis->hDC, // 4,//CP_DROPDOWNBUTTON, // CBXS_HOT,//CBXS_NORMAL, // &rc, // &rc); CloseThemeData(hTheme); ReleaseDC(GetParent(hwnd),hdc); return TRUE; }*/ // // Get the item text // if(dis->itemID == -1) SendMessage(dis->hwndItem, WM_GETTEXT, 0, (LONG)szText); else SendMessage(dis->hwndItem, CB_GETLBTEXT, dis->itemID, (LONG)szText); // // Set text colour and background based on current state // DrawItem_DefaultColours(dis); // set the font: BOLD for fixed-width, NORMAL for 'normal' hOldFont = SelectObject(dis->hDC, fFixed ? g_hBoldFont : g_hNormalFont); GetTextMetrics(dis->hDC, &tm); ypos = dis->rcItem.top + (dis->rcItem.bottom-dis->rcItem.top-tm.tmHeight)/2; xpos = dis->rcItem.left + 20; // draw the text ExtTextOut(dis->hDC, xpos, ypos, ETO_CLIPPED|ETO_OPAQUE, &dis->rcItem, szText, _tcslen(szText), 0); // draw a 'TT' icon if the font is TRUETYPE if(fTrueType) DrawIconEx(dis->hDC, dis->rcItem.left+2, dis->rcItem.top, g_hIcon2,16, 16, 0, 0, DI_NORMAL); //else if(fTrueType == 2) // DrawIconEx(dis->hDC, dis->rcItem.left+2, dis->rcItem.top, g_hIcon3,16, 16, 0, 0, DI_NORMAL); SelectObject(dis->hDC, hOldFont); // draw the focus rectangle if((dis->itemState & ODS_FOCUS) && !(dis->itemState & ODS_NOFOCUSRECT)) { DrawFocusRect(dis->hDC, &dis->rcItem); } return TRUE; }
INT_PTR CALLBACK ModernOptSelector_DlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { TSelectorData *sd = (TSelectorData *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: sd = new TSelectorData; sd->obj = (MODERNOPTOBJECT*)lParam; sd->active = sttGetActiveSkin(sd->obj); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)sd); BuildSkinList(GetDlgItem(hwndDlg, IDC_SKINLIST), _A2T(sd->obj->lpzThemeExtension)); return FALSE; case WM_COMMAND: if (LOWORD(wParam) == IDC_SKINLIST) { switch (HIWORD(wParam)) { case LBN_SELCHANGE: DeleteObject(sd->hbmpPreview); sd->hbmpPreview = 0; RedrawWindow(GetDlgItem(hwndDlg, IDC_PREVIEW1), NULL, NULL, RDW_INVALIDATE); break; case LBN_DBLCLK: int idx = SendDlgItemMessage(hwndDlg, IDC_SKINLIST, LB_GETCURSEL, 0, 0); if (idx >= 0) { TSkinListItem *dat = (TSkinListItem *)SendDlgItemMessage(hwndDlg, IDC_SKINLIST, LB_GETITEMDATA, idx, 0); sttApplySkin(sd->obj, dat->filename); mir_free(sd->active); sd->active = sttGetActiveSkin(sd->obj); RedrawWindow(GetDlgItem(hwndDlg, IDC_SKINLIST), NULL, NULL, RDW_INVALIDATE); } break; } break; } return FALSE; case WM_MEASUREITEM: { LPMEASUREITEMSTRUCT lps = (LPMEASUREITEMSTRUCT)lParam; if (lps->CtlID != IDC_SKINLIST) break; TSkinListItem *dat = (TSkinListItem *)lps->itemData; if (!dat) break; lps->itemWidth = 10; lps->itemHeight = 30; return FALSE; } case WM_DRAWITEM: { LPDRAWITEMSTRUCT lps = (LPDRAWITEMSTRUCT)lParam; if (lps->CtlID == IDC_SKINLIST) { TSkinListItem *dat = (TSkinListItem *)lps->itemData; if (!dat) break; SetBkMode(lps->hDC, TRANSPARENT); COLORREF clLine1, clLine2, clBack; if (lps->itemState & ODS_SELECTED) { FillRect(lps->hDC, &lps->rcItem, GetSysColorBrush(COLOR_HIGHLIGHT)); clBack = GetSysColor(COLOR_HIGHLIGHT); clLine1 = GetSysColor(COLOR_HIGHLIGHTTEXT); } else { FillRect(lps->hDC, &lps->rcItem, GetSysColorBrush(COLOR_WINDOW)); clBack = GetSysColor(COLOR_WINDOW); clLine1 = GetSysColor(COLOR_WINDOWTEXT); } clLine2 = RGB( GetRValue(clLine1) * 0.66 + GetRValue(clBack) * 0.34, GetGValue(clLine1) * 0.66 + GetGValue(clBack) * 0.34, GetBValue(clLine1) * 0.66 + GetBValue(clBack) * 0.34); lps->rcItem.left += 2; lps->rcItem.top += 2; lps->rcItem.bottom -= 2; lps->rcItem.right -= 5; int cxIcon = GetSystemMetrics(SM_CXSMICON); int cyIcon = GetSystemMetrics(SM_CYSMICON); if (sd->active && !mir_tstrcmp(sd->active, dat->filename)) { DrawIconEx(lps->hDC, lps->rcItem.left, (lps->rcItem.top + lps->rcItem.bottom - cyIcon) / 2, Skin_LoadIcon(SKINICON_OTHER_EMPTYBLOB), cxIcon, cyIcon, 0, NULL, DI_NORMAL); } else { DrawIconEx(lps->hDC, lps->rcItem.left, (lps->rcItem.top + lps->rcItem.bottom - cyIcon) / 2, Skin_LoadIcon(SKINICON_OTHER_SMALLDOT), cxIcon, cyIcon, 0, NULL, DI_NORMAL); } lps->rcItem.left += cxIcon; lps->rcItem.left += 5; SetTextColor(lps->hDC, clLine1); DrawText(lps->hDC, dat->title, -1, &lps->rcItem, DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_END_ELLIPSIS | DT_TOP); lps->rcItem.left += cxIcon; SetTextColor(lps->hDC, clLine2); DrawText(lps->hDC, dat->path, -1, &lps->rcItem, DT_LEFT | DT_NOPREFIX | DT_SINGLELINE | DT_PATH_ELLIPSIS | DT_BOTTOM); } else if (lps->CtlID == IDC_PREVIEW1) { int idx = SendDlgItemMessage(hwndDlg, IDC_SKINLIST, LB_GETCURSEL, 0, 0); if (!sd->hbmpPreview) { if (idx >= 0) { TSkinListItem *dat = (TSkinListItem *)SendDlgItemMessage(hwndDlg, IDC_SKINLIST, LB_GETITEMDATA, idx, 0); CreatePreview(sd, dat->filename, lps); } else CreatePreview(sd, NULL, lps); } if (sd->hbmpPreview) { HDC hdc = CreateCompatibleDC(lps->hDC); SelectObject(hdc, sd->hbmpPreview); BitBlt(lps->hDC, lps->rcItem.left, lps->rcItem.top, lps->rcItem.right - lps->rcItem.left, lps->rcItem.bottom - lps->rcItem.top, hdc, 0, 0, SRCCOPY); DeleteDC(hdc); } } return TRUE; } case WM_DELETEITEM: { LPDELETEITEMSTRUCT lps = (LPDELETEITEMSTRUCT)lParam; if (lps->CtlID != IDC_SKINLIST) break; TSkinListItem *dat = (TSkinListItem *)lps->itemData; if (dat) delete dat; return FALSE; } case WM_DESTROY: delete sd; return FALSE; } return FALSE; }
INT_PTR CALLBACK DlgProcRecvFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { FileDlgData *dat = (FileDlgData*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { TCHAR szPath[450]; CLISTEVENT* cle = (CLISTEVENT*)lParam; dat = (FileDlgData*)mir_calloc(sizeof(FileDlgData)); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)dat); dat->hContact = cle->hContact; dat->hDbEvent = cle->hDbEvent; dat->hNotifyEvent = HookEventMessage(ME_PROTO_ACK, hwndDlg, HM_RECVEVENT); dat->hPreshutdownEvent = HookEventMessage(ME_SYSTEM_PRESHUTDOWN, hwndDlg, M_PRESHUTDOWN); dat->dwTicks = GetTickCount(); EnumChildWindows(hwndDlg, ClipSiblingsChildEnumProc, 0); Window_SetSkinIcon_IcoLib(hwndDlg, SKINICON_EVENT_FILE); Button_SetIcon_IcoLib(hwndDlg, IDC_ADD, SKINICON_OTHER_ADDCONTACT, LPGEN("Add contact permanently to list")); Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View user's details")); Button_SetIcon_IcoLib(hwndDlg, IDC_HISTORY, SKINICON_OTHER_HISTORY, LPGEN("View user's history")); Button_SetIcon_IcoLib(hwndDlg, IDC_USERMENU, SKINICON_OTHER_DOWNARROW, LPGEN("User menu")); TCHAR *contactName = pcli->pfnGetContactDisplayName(dat->hContact, 0); SetDlgItemText(hwndDlg, IDC_FROM, contactName); GetContactReceivedFilesDir(dat->hContact, szPath, _countof(szPath), TRUE); SetDlgItemText(hwndDlg, IDC_FILEDIR, szPath); SHAutoComplete(GetWindow(GetDlgItem(hwndDlg, IDC_FILEDIR), GW_CHILD), 1); for (int i = 0; i < MAX_MRU_DIRS; i++) { char idstr[32]; mir_snprintf(idstr, "MruDir%d", i); DBVARIANT dbv; if (db_get_ts(NULL, "SRFile", idstr, &dbv)) break; SendDlgItemMessage(hwndDlg, IDC_FILEDIR, CB_ADDSTRING, 0, (LPARAM)dbv.ptszVal); db_free(&dbv); } db_event_markRead(dat->hContact, dat->hDbEvent); DBEVENTINFO dbei = { sizeof(dbei) }; dbei.cbBlob = db_event_getBlobSize(dat->hDbEvent); if (dbei.cbBlob > 4 && dbei.cbBlob <= 8196) { dbei.pBlob = (PBYTE)alloca(dbei.cbBlob + 1); db_event_get(dat->hDbEvent, &dbei); dbei.pBlob[dbei.cbBlob] = 0; dat->fs = cle->lParam ? (HANDLE)cle->lParam : (HANDLE)*(PDWORD)dbei.pBlob; char *str = (char*)dbei.pBlob + 4; ptrT ptszFileName(DbGetEventStringT(&dbei, str)); SetDlgItemText(hwndDlg, IDC_FILENAMES, ptszFileName); unsigned len = (unsigned)mir_strlen(str) + 1; if (len + 4 < dbei.cbBlob) { str += len; ptrT ptszDescription(DbGetEventStringT(&dbei, str)); SetDlgItemText(hwndDlg, IDC_MSG, ptszDescription); } } else DestroyWindow(hwndDlg); TCHAR datetimestr[64]; TimeZone_PrintTimeStamp(NULL, dbei.timestamp, _T("t d"), datetimestr, _countof(datetimestr), 0); SetDlgItemText(hwndDlg, IDC_DATE, datetimestr); ptrT info(Contact_GetInfo(CNF_UNIQUEID, dat->hContact)); SetDlgItemText(hwndDlg, IDC_NAME, (info) ? info : contactName); if (db_get_b(dat->hContact, "CList", "NotOnList", 0)) { RECT rcBtn1, rcBtn2, rcDateCtrl; GetWindowRect(GetDlgItem(hwndDlg, IDC_ADD), &rcBtn1); GetWindowRect(GetDlgItem(hwndDlg, IDC_USERMENU), &rcBtn2); GetWindowRect(GetDlgItem(hwndDlg, IDC_DATE), &rcDateCtrl); SetWindowPos(GetDlgItem(hwndDlg, IDC_DATE), 0, 0, 0, rcDateCtrl.right - rcDateCtrl.left - (rcBtn2.left - rcBtn1.left), rcDateCtrl.bottom - rcDateCtrl.top, SWP_NOZORDER | SWP_NOMOVE); } else if (db_get_b(NULL, "SRFile", "AutoAccept", 0)) { //don't check auto-min here to fix BUG#647620 PostMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDOK, BN_CLICKED), (LPARAM)GetDlgItem(hwndDlg, IDOK)); } if (!db_get_b(dat->hContact, "CList", "NotOnList", 0)) ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), SW_HIDE); } return TRUE; case WM_MEASUREITEM: return Menu_MeasureItem((LPMEASUREITEMSTRUCT)lParam); case WM_DRAWITEM: { LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; if (dis->hwndItem == GetDlgItem(hwndDlg, IDC_PROTOCOL)) { char *szProto = GetContactProto(dat->hContact); if (szProto) { HICON hIcon = (HICON)CallProtoService(szProto, PS_LOADICON, PLI_PROTOCOL|PLIF_SMALL, 0); if (hIcon) { DrawIconEx(dis->hDC, dis->rcItem.left, dis->rcItem.top, hIcon, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), 0, NULL, DI_NORMAL); DestroyIcon(hIcon); } } } } return Menu_DrawItem((LPDRAWITEMSTRUCT)lParam); case WM_COMMAND: if (CallService(MS_CLIST_MENUPROCESSCOMMAND, MAKEWPARAM(LOWORD(wParam), MPCF_CONTACTMENU), (LPARAM)dat->hContact)) break; switch (LOWORD(wParam)) { case IDC_FILEDIRBROWSE: { TCHAR szDirName[MAX_PATH], szExistingDirName[MAX_PATH]; GetDlgItemText(hwndDlg, IDC_FILEDIR, szDirName, _countof(szDirName)); GetLowestExistingDirName(szDirName, szExistingDirName, _countof(szExistingDirName)); if (BrowseForFolder(hwndDlg, szExistingDirName)) SetDlgItemText(hwndDlg, IDC_FILEDIR, szExistingDirName); } break; case IDOK: { //most recently used directories TCHAR szRecvDir[MAX_PATH], szDefaultRecvDir[MAX_PATH]; GetDlgItemText(hwndDlg, IDC_FILEDIR, szRecvDir, _countof(szRecvDir)); RemoveInvalidPathChars(szRecvDir); GetContactReceivedFilesDir(NULL, szDefaultRecvDir, _countof(szDefaultRecvDir), TRUE); if (_tcsnicmp(szRecvDir, szDefaultRecvDir, mir_tstrlen(szDefaultRecvDir))) { char idstr[32]; int i; DBVARIANT dbv; for (i = MAX_MRU_DIRS-2;i>=0;i--) { mir_snprintf(idstr, "MruDir%d", i); if (db_get_ts(NULL, "SRFile", idstr, &dbv)) continue; mir_snprintf(idstr, "MruDir%d", i+1); db_set_ts(NULL, "SRFile", idstr, dbv.ptszVal); db_free(&dbv); } db_set_ts(NULL, "SRFile", idstr, szRecvDir); } } EnableWindow(GetDlgItem(hwndDlg, IDC_FILENAMES), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_MSG), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_FILEDIR), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_FILEDIRBROWSE), FALSE); GetDlgItemText(hwndDlg, IDC_FILEDIR, dat->szSavePath, _countof(dat->szSavePath)); GetDlgItemText(hwndDlg, IDC_FILE, dat->szFilenames, _countof(dat->szFilenames)); GetDlgItemText(hwndDlg, IDC_MSG, dat->szMsg, _countof(dat->szMsg)); dat->hwndTransfer = FtMgr_AddTransfer(dat); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); //check for auto-minimize here to fix BUG#647620 if (db_get_b(NULL, "SRFile", "AutoAccept", 0) && db_get_b(NULL, "SRFile", "AutoMin", 0)) { ShowWindow(hwndDlg, SW_HIDE); ShowWindow(hwndDlg, SW_SHOWMINNOACTIVE); } DestroyWindow(hwndDlg); break; case IDCANCEL: if (dat->fs) CallContactService(dat->hContact, PSS_FILEDENY, (WPARAM)dat->fs, (LPARAM)TranslateT("Canceled")); dat->fs = NULL; /* the protocol will free the handle */ DestroyWindow(hwndDlg); break; case IDC_ADD: { ADDCONTACTSTRUCT acs = { 0 }; acs.hContact = dat->hContact; acs.handleType = HANDLE_CONTACT; acs.szProto = ""; CallService(MS_ADDCONTACT_SHOW, (WPARAM)hwndDlg, (LPARAM)&acs); if (!db_get_b(dat->hContact, "CList", "NotOnList", 0)) ShowWindow(GetDlgItem(hwndDlg, IDC_ADD), SW_HIDE); } break; case IDC_USERMENU: { RECT rc; GetWindowRect((HWND)lParam, &rc); HMENU hMenu = Menu_BuildContactMenu(dat->hContact); TrackPopupMenu(hMenu, 0, rc.left, rc.bottom, 0, hwndDlg, NULL); DestroyMenu(hMenu); } break; case IDC_DETAILS: CallService(MS_USERINFO_SHOWDIALOG, (WPARAM)dat->hContact, 0); break; case IDC_HISTORY: CallService(MS_HISTORY_SHOWCONTACTHISTORY, (WPARAM)dat->hContact, 0); break; } break; case HM_RECVEVENT: { ACKDATA *ack = (ACKDATA*)lParam; if ((ack == NULL) || (ack->hProcess != dat->fs) || (ack->type != ACKTYPE_FILE) || (ack->hContact != dat->hContact)) break; if (ack->result == ACKRESULT_DENIED || ack->result == ACKRESULT_FAILED) { EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_FILEDIR), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_FILEDIRBROWSE), FALSE); SetDlgItemText(hwndDlg, IDC_MSG, TranslateT("This file transfer has been canceled by the other side")); SkinPlaySound("FileDenied"); FlashWindow(hwndDlg, TRUE); } else if (ack->result != ACKRESULT_FILERESUME) { SendMessage(hwndDlg, WM_COMMAND, MAKEWPARAM(IDCANCEL, 0), (LPARAM)GetDlgItem(hwndDlg, IDCANCEL)); } } break; case WM_DESTROY: Window_FreeIcon_IcoLib(hwndDlg); Button_FreeIcon_IcoLib(hwndDlg, IDC_ADD); Button_FreeIcon_IcoLib(hwndDlg, IDC_DETAILS); Button_FreeIcon_IcoLib(hwndDlg, IDC_HISTORY); Button_FreeIcon_IcoLib(hwndDlg, IDC_USERMENU); FreeFileDlgData(dat); SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0); break; } return FALSE; }
void PictureButton::DrawItem(LPDRAWITEMSTRUCT dis) { UINT state = DFCS_BUTTONPUSH; int style = GetWindowStyle(_hwnd); if (dis->itemState & ODS_DISABLED) state |= DFCS_INACTIVE; POINT imagePos; RECT textRect; int dt_flags; if (style & BS_BOTTOM) { // align horizontal centered, vertical floating imagePos.x = (dis->rcItem.left + dis->rcItem.right - _cx) / 2; imagePos.y = dis->rcItem.top + 3; textRect.left = dis->rcItem.left + 2; textRect.top = dis->rcItem.top + _cy + 4; textRect.right = dis->rcItem.right - 4; textRect.bottom = dis->rcItem.bottom - 4; dt_flags = DT_SINGLELINE|DT_CENTER|DT_VCENTER; } else { // horizontal floating, vertical centered imagePos.x = dis->rcItem.left + 3; imagePos.y = (dis->rcItem.top + dis->rcItem.bottom - _cy)/2; textRect.left = dis->rcItem.left + _cx + 4; textRect.top = dis->rcItem.top + 2; textRect.right = dis->rcItem.right - 4; textRect.bottom = dis->rcItem.bottom - 4; dt_flags = DT_SINGLELINE|DT_VCENTER/*|DT_CENTER*/; } if (dis->itemState & ODS_SELECTED) { state |= DFCS_PUSHED; ++imagePos.x; ++imagePos.y; ++textRect.left; ++textRect.top; ++textRect.right; ++textRect.bottom; } if (_flat) { FillRect(dis->hDC, &dis->rcItem, _hBrush); if (style & BS_FLAT) // Only with BS_FLAT set, there will be drawn a frame without highlight. DrawEdge(dis->hDC, &dis->rcItem, EDGE_RAISED, BF_RECT|BF_FLAT); } else DrawFrameControl(dis->hDC, &dis->rcItem, DFC_BUTTON, state); if (_hIcon) DrawIconEx(dis->hDC, imagePos.x, imagePos.y, _hIcon, _cx, _cy, 0, _hBrush, DI_NORMAL); else { MemCanvas mem_dc; BitmapSelection sel(mem_dc, _hBmp); BitBlt(dis->hDC, imagePos.x, imagePos.y, _cx, _cy, mem_dc, 0, 0, SRCCOPY); } TCHAR title[BUFFER_LEN]; GetWindowText(_hwnd, title, BUFFER_LEN); BkMode bk_mode(dis->hDC, TRANSPARENT); if (dis->itemState & (ODS_DISABLED|ODS_GRAYED)) DrawGrayText(dis->hDC, &textRect, title, dt_flags); else { TextColor lcColor(dis->hDC, GetSysColor(COLOR_BTNTEXT)); DrawText(dis->hDC, title, -1, &textRect, dt_flags); } if (dis->itemState & ODS_FOCUS) { RECT rect = { dis->rcItem.left+3, dis->rcItem.top+3, dis->rcItem.right-dis->rcItem.left-4, dis->rcItem.bottom-dis->rcItem.top-4 }; if (dis->itemState & ODS_SELECTED) { ++rect.left; ++rect.top; ++rect.right; ++rect.bottom; } DrawFocusRect(dis->hDC, &rect); } }
HBITMAP CopyScreenToBitmap(LPRECT lpRect, BYTE *pData, BITMAPINFO *pHeader, BOOL writeCursor) { HDC hScrDC, hMemDC; // screen DC and memory DC HBITMAP hBitmap, hOldBitmap; // handles to deice-dependent bitmaps int nX, nY, nX2, nY2; // coordinates of rectangle to grab int nWidth, nHeight; // DIB width and height int xScrn, yScrn; // screen resolution // check for an empty rectangle if (IsRectEmpty(lpRect)) return NULL; // create a DC for the screen and create // a memory DC compatible to screen DC hScrDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); hMemDC = CreateCompatibleDC(hScrDC); // get points of rectangle to grab nX = lpRect->left; nY = lpRect->top; nX2 = lpRect->right; nY2 = lpRect->bottom; // get screen resolution xScrn = GetDeviceCaps(hScrDC, HORZRES); yScrn = GetDeviceCaps(hScrDC, VERTRES); //make sure bitmap rectangle is visible if (nX < 0) nX = 0; if (nY < 0) nY = 0; if (nX2 > xScrn) nX2 = xScrn; if (nY2 > yScrn) nY2 = yScrn; nWidth = nX2 - nX; nHeight = nY2 - nY; // create a bitmap compatible with the screen DC hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight); // select new bitmap into memory DC hOldBitmap = (HBITMAP) SelectObject(hMemDC, hBitmap); // bitblt screen DC to memory DC BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); // write cursor to output bitmap if (writeCursor) { CURSORINFO pci; pci.cbSize = sizeof(CURSORINFO); if(GetCursorInfo(&pci)) { POINT point = pci.ptScreenPos; DrawIconEx(hMemDC, point.x, point.y, pci.hCursor, 0, 0, 0, NULL, DI_NORMAL); } } // select old bitmap back into memory DC and get handle to // bitmap of the screen hBitmap = (HBITMAP) SelectObject(hMemDC, hOldBitmap); // Copy the bitmap data into the provided BYTE buffer GetDIBits(hScrDC, hBitmap, 0, nHeight, pData, pHeader, DIB_RGB_COLORS); // clean up DeleteDC(hScrDC); DeleteDC(hMemDC); // return handle to the bitmap return hBitmap; }
void CXInfoTip::OnPaint() { CPaintDC dc( this ); CRect rc; CBrush WindowBrush; CBrush FrameBrush; CBrush InnerFrameBrush; HRGN hRegion; CRgn *pRegion; CFont *pSysFont; GetClientRect(rc); InnerFrameBrush.CreateSolidBrush(::GetSysColor(COLOR_SCROLLBAR)); FrameBrush.CreateSolidBrush(::GetSysColor(COLOR_WINDOWTEXT)); WindowBrush.CreateSolidBrush(::GetSysColor(COLOR_WINDOW)); GetWindowRegion(&dc, &hRegion); pRegion = CRgn::FromHandle(hRegion); dc.FillRgn(pRegion, &WindowBrush); dc.FrameRgn(pRegion, &InnerFrameBrush, 3, 3); dc.FrameRgn(pRegion, &FrameBrush, 1, 1); rc.DeflateRect(CX_ROUNDED, CY_ROUNDED, 0, 0); if (m_hIcon != NULL) rc.left = rc.left + m_IconSize.cx + CX_ICON_MARGIN; pSysFont = (CFont *)dc.SelectObject(&m_fntBold); dc.SetBkMode( TRANSPARENT ); dc.DrawText (m_strCaption, &rc, DT_TOP | DT_LEFT); dc.SelectObject(m_pFont); CRect rc2 = rc; rc2.top += m_nCaptionHeight; dc.DrawText(m_szText, &rc2, DT_TOP | DT_LEFT); if (m_bShowDSA && m_bPlaced == false) { m_bPlaced = true; m_btnDSA.MoveWindow (rc.left, m_yDSA, m_cxDSA + 10 + 20, 20); } if (m_hIcon != NULL) DrawIconEx(dc.m_hDC, CX_ROUNDED, CY_ROUNDED, m_hIcon, m_IconSize.cx, m_IconSize.cy, 0, NULL, DI_NORMAL); ::DeleteObject(hRegion); dc.SelectObject(pSysFont); }
void CardButton::Draw(HDC hdc, bool fNormal) { SIZE textsize; int x, y; //text x, y int ix, iy; //icon x, y int iconwidth = 0; RECT cliprect; if(fVisible == 0) return; if(hFont == 0) SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT)); else SelectObject(hdc, hFont); GetTextExtentPoint32(hdc, szText, lstrlen(szText), &textsize); if(hIcon) { x = rect.left + 32 + 8; } else { if(uStyle & CB_ALIGN_LEFT) { x = rect.left + iconwidth; } else if(uStyle & CB_ALIGN_RIGHT) { x = rect.left + (rect.right-rect.left-iconwidth-textsize.cx); } else //centered { x = rect.right - rect.left - iconwidth; x = (x - textsize.cx) / 2; x += rect.left + iconwidth; } } y = rect.bottom - rect.top; y = (y - textsize.cy) / 2; y += rect.top; //calc icon position.. ix = rect.left + 4; iy = rect.top + (rect.bottom-rect.top-32) / 2; //if button is pressed, then shift text if(fNormal == false && (uStyle & CB_PUSHBUTTON)) { x += 1; y += 1; ix += 1; iy += 1; } SetRect(&cliprect, x, y, x+textsize.cx, y+textsize.cy); ExcludeClipRect(hdc, x, y, x+textsize.cx, y+textsize.cy); // // Calc icon pos // if(hIcon) { ExcludeClipRect(hdc, ix, iy, ix + 32, iy + 32); } if(uStyle & CB_PUSHBUTTON) { DrawRect(hdc, &rect, fNormal); SetBkColor(hdc, MAKE_PALETTERGB(crBack)); SetTextColor(hdc, crText);//MAKE_PALETTERGB(crText)); SelectClipRgn(hdc, 0); ExtTextOut(hdc, x, y, ETO_OPAQUE, &cliprect, szText, lstrlen(szText), 0); } else { SetBkColor(hdc, MAKE_PALETTERGB(crBack)); SetTextColor(hdc, crText);//MAKE_PALETTERGB(crText)); SelectClipRgn(hdc, 0); ExtTextOut(hdc, x, y, ETO_OPAQUE, &rect, szText, lstrlen(szText), 0); } if(hIcon) { HBRUSH hbr = CreateSolidBrush(MAKE_PALETTERGB(crBack)); DrawIconEx(hdc, ix, iy, hIcon, 32, 32, 0, hbr, 0); DeleteObject(hbr); } }
INT_PTR CALLBACK AboutDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { HWND hWnd; HDC hDC; RECT rcClient, rcRect; char *owner, *org; switch (uMsg) { case WM_NOTIFY: switch(((LPNMHDR)lParam)->code) { case PSN_APPLY: /*save registration info to registry */ owner = get_text(hDlg, IDC_ABT_OWNER); org = get_text(hDlg, IDC_ABT_ORG); set_reg_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion", "RegisteredOwner", owner ? owner : ""); set_reg_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion", "RegisteredOrganization", org ? org : ""); set_reg_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion", "RegisteredOwner", owner ? owner : ""); set_reg_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion", "RegisteredOrganization", org ? org : ""); apply(); HeapFree(GetProcessHeap(), 0, owner); HeapFree(GetProcessHeap(), 0, org); break; case NM_CLICK: case NM_RETURN: if(wParam == IDC_ABT_WEB_LINK) ShellExecuteA(NULL, "open", PACKAGE_URL, NULL, NULL, SW_SHOW); break; } break; case WM_INITDIALOG: hDC = GetDC(hDlg); /* read owner and organization info from registry, load it into text box */ owner = get_reg_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion", "RegisteredOwner", ""); org = get_reg_key(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion", "RegisteredOrganization", ""); SetDlgItemText(hDlg, IDC_ABT_OWNER, owner); SetDlgItemText(hDlg, IDC_ABT_ORG, org); SendMessage(GetParent(hDlg), PSM_UNCHANGED, 0, 0); HeapFree(GetProcessHeap(), 0, owner); HeapFree(GetProcessHeap(), 0, org); /* prepare the panel */ hWnd = GetDlgItem(hDlg, IDC_ABT_PANEL); if(hWnd) { GetClientRect(hDlg, &rcClient); GetClientRect(hWnd, &rcRect); MoveWindow(hWnd, 0, 0, rcClient.right, rcRect.bottom, FALSE); logo = LoadImageW((HINSTANCE)GetWindowLongPtrW(hDlg, GWLP_HINSTANCE), MAKEINTRESOURCEW(IDI_LOGO), IMAGE_ICON, 0, 0, LR_SHARED); } /* prepare the title text */ hWnd = GetDlgItem(hDlg, IDC_ABT_TITLE_TEXT); if(hWnd) { titleFont = CreateFont( -MulDiv(24, GetDeviceCaps(hDC, LOGPIXELSY), 72), 0, 0, 0, 0, FALSE, 0, 0, 0, 0, 0, 0, 0, "Tahoma"); SendMessage(hWnd, WM_SETFONT, (WPARAM)titleFont, TRUE); SetWindowTextA(hWnd, PACKAGE_NAME); } SetDlgItemTextA(hDlg, IDC_ABT_PANEL_TEXT, PACKAGE_VERSION); /* prepare the web link */ SetDlgItemTextA(hDlg, IDC_ABT_WEB_LINK, "<a href=\"" PACKAGE_URL "\">" PACKAGE_URL "</a>"); ReleaseDC(hDlg, hDC); break; case WM_DESTROY: if(logo) { DestroyIcon(logo); logo = NULL; } if(titleFont) { DeleteObject(titleFont); titleFont = NULL; } break; case WM_COMMAND: switch(HIWORD(wParam)) { case EN_CHANGE: /* enable apply button */ SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); break; } break; case WM_DRAWITEM: if(wParam == IDC_ABT_PANEL) { LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam; FillRect(pDIS->hDC, &pDIS->rcItem, (HBRUSH) (COLOR_WINDOW+1)); DrawIconEx(pDIS->hDC, 0, 0, logo, 0, 0, 0, 0, DI_IMAGE); DrawEdge(pDIS->hDC, &pDIS->rcItem, EDGE_SUNKEN, BF_BOTTOM); } break; case WM_CTLCOLORSTATIC: switch(GetDlgCtrlID((HWND)lParam)) { case IDC_ABT_TITLE_TEXT: /* set the title to a wine color */ SetTextColor((HDC)wParam, 0x0000007F); case IDC_ABT_PANEL_TEXT: case IDC_ABT_LICENSE_TEXT: case IDC_ABT_WEB_LINK: return (INT_PTR)CreateSolidBrush(GetSysColor(COLOR_WINDOW)); } break; } return FALSE; }
void CPanelWnd::PaintCaption(CDC& dc) { CString strCaption; CRect rc, rcWnd; BITMAP info = { 0, 0, CAPTION_HEIGHT }; if ( Skin.m_bmPanelMark.m_hObject) Skin.m_bmPanelMark.GetBitmap( &info ); GetWindowRect( &rcWnd ); rc.SetRect( 0, 0, rcWnd.Width(), info.bmHeight ); GetWindowText( strCaption ); CSize size = rc.Size(); CDC* pBuffer = CoolInterface.GetBuffer( dc, size ); if ( ! CoolInterface.DrawWatermark( pBuffer, &rc, &Skin.m_bmPanelMark, 0, 0 ) ) { pBuffer->FillSolidRect( &rc, Skin.m_crPanelBack ); } int nIconY = rc.Height() / 2 - 8; DrawIconEx( pBuffer->GetSafeHdc(), 4, nIconY, GetIcon( FALSE ), 16, 16, 0, NULL, DI_NORMAL ); CFont* pOldFont = (CFont*)pBuffer->SelectObject( &CoolInterface.m_fntCaption ); CSize szCaption = pBuffer->GetTextExtent( strCaption ); pBuffer->SetBkMode( TRANSPARENT ); if ( Skin.m_crPanelBorder != CLR_NONE ) { pBuffer->SetTextColor( Skin.m_crPanelBorder ); pBuffer->ExtTextOut( 8 + 16 - 1, rc.Height() / 2 - szCaption.cy / 2 - 1, ETO_CLIPPED, &rc, strCaption, NULL ); pBuffer->ExtTextOut( 8 + 16 + 1, rc.Height() / 2 - szCaption.cy / 2 - 1, ETO_CLIPPED, &rc, strCaption, NULL ); pBuffer->ExtTextOut( 8 + 16, rc.Height() / 2 - szCaption.cy / 2 - 1 - 1, ETO_CLIPPED, &rc, strCaption, NULL ); pBuffer->ExtTextOut( 8 + 16, rc.Height() / 2 - szCaption.cy / 2 - 1 + 1, ETO_CLIPPED, &rc, strCaption, NULL ); } pBuffer->SetTextColor( Skin.m_crPanelText ); pBuffer->ExtTextOut( 8 + 16, rc.Height() / 2 - szCaption.cy / 2 - 1, ETO_CLIPPED, &rc, strCaption, NULL ); if ( m_bPanelClose ) { pBuffer->SelectObject( &theApp.m_gdiFont ); CString strText = _T("Close"); CSize szText = pBuffer->GetTextExtent( strText ); m_rcClose.SetRect( rc.right - szText.cx - 8, rc.top, rc.right, rc.bottom ); pBuffer->ExtTextOut( m_rcClose.left + 2, ( m_rcClose.top + m_rcClose.bottom ) / 2 - szText.cy / 2 - 1, ETO_CLIPPED, &m_rcClose, strText, NULL ); m_rcClose.OffsetRect( rcWnd.left, rcWnd.top ); } pBuffer->SelectObject( pOldFont ); dc.BitBlt( rc.left, rc.top, rc.Width(), rc.Height(), pBuffer, 0, 0, SRCCOPY ); dc.SelectStockObject( SYSTEM_FONT ); // GDI font leak fix dc.SelectStockObject( NULL_BRUSH ); // GDI brush leak fix }
static INT_PTR CALLBACK JabberMucJidListDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { JABBER_MUC_JIDLIST_INFO* dat = (JABBER_MUC_JIDLIST_INFO*)GetWindowLongPtr( hwndDlg, GWLP_USERDATA ); switch( msg ) { case WM_INITDIALOG: { LVCOLUMN lvc; RECT rc; HWND hwndList; TranslateDialogDefault( hwndDlg ); hwndList = GetDlgItem( hwndDlg, IDC_LIST ); ListView_SetExtendedListViewStyle(hwndList, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); GetClientRect( hwndList, &rc ); //rc.right -= GetSystemMetrics( SM_CXVSCROLL ); lvc.mask = LVCF_WIDTH; lvc.cx = rc.right - 20; ListView_InsertColumn( hwndList, 0, &lvc ); lvc.cx = 20; ListView_InsertColumn( hwndList, 1, &lvc ); SendMessage( hwndDlg, WM_JABBER_REFRESH, 0, lParam ); dat = (JABBER_MUC_JIDLIST_INFO*)lParam; static struct { int idc; char *title; char *icon; bool push; } buttons[] = { {IDC_BTN_FILTERAPPLY, "Apply filter", "sd_filter_apply", false}, {IDC_BTN_FILTERRESET, "Reset filter", "sd_filter_reset", false}, }; for (int i = 0; i < SIZEOF(buttons); ++i) { SendDlgItemMessage(hwndDlg, buttons[i].idc, BM_SETIMAGE, IMAGE_ICON, (LPARAM)dat->ppro->LoadIconEx(buttons[i].icon)); SendDlgItemMessage(hwndDlg, buttons[i].idc, BUTTONSETASFLATBTN, 0, 0); SendDlgItemMessage(hwndDlg, buttons[i].idc, BUTTONADDTOOLTIP, (WPARAM)buttons[i].title, 0); if (buttons[i].push) SendDlgItemMessage(hwndDlg, buttons[i].idc, BUTTONSETASPUSHBTN, 0, 0); } Utils_RestoreWindowPosition(hwndDlg, NULL, dat->ppro->m_szModuleName, "jidListWnd_"); } return TRUE; case WM_SIZE: { UTILRESIZEDIALOG urd = {0}; urd.cbSize = sizeof(urd); urd.hInstance = hInst; urd.hwndDlg = hwndDlg; urd.lpTemplate = MAKEINTRESOURCEA(IDD_JIDLIST); urd.pfnResizer = sttJidListResizer; CallService(MS_UTILS_RESIZEDIALOG, 0, (LPARAM)&urd); RECT listrc; LVCOLUMN lvc; HWND hwndList = GetDlgItem( hwndDlg, IDC_LIST ); GetClientRect( hwndList, &listrc ); lvc.mask = LVCF_WIDTH; //listrc.right -= GetSystemMetrics( SM_CXVSCROLL ); lvc.cx = listrc.right - 20; SendMessage(hwndList, LVM_SETCOLUMN, 0, (LPARAM)&lvc); break; } break; case WM_JABBER_REFRESH: { // lParam is ( JABBER_MUC_JIDLIST_INFO * ) HXML iqNode, queryNode; const TCHAR* from; TCHAR title[256]; // Clear current GWL_USERDATA, if any if ( dat != NULL ) delete dat; // Set new GWL_USERDATA dat = ( JABBER_MUC_JIDLIST_INFO * ) lParam; SetWindowLongPtr( hwndDlg, GWLP_USERDATA, ( LONG_PTR ) dat ); // Populate displayed list from iqNode lstrcpyn( title, TranslateT( "JID List" ), SIZEOF( title )); if (( dat=( JABBER_MUC_JIDLIST_INFO * ) lParam ) != NULL ) { if (( iqNode = dat->iqNode ) != NULL ) { if (( from = xmlGetAttrValue( iqNode, _T("from"))) != NULL ) { dat->roomJid = mir_tstrdup( from ); if (( queryNode = xmlGetChild( iqNode , "query" )) != NULL ) { TCHAR* localFrom = mir_tstrdup( from ); mir_sntprintf( title, SIZEOF( title ), TranslateT("%s, %d items (%s)"), ( dat->type == MUC_VOICELIST ) ? TranslateT( "Voice List" ) : ( dat->type == MUC_MEMBERLIST ) ? TranslateT( "Member List" ) : ( dat->type == MUC_MODERATORLIST ) ? TranslateT( "Moderator List" ) : ( dat->type == MUC_BANLIST ) ? TranslateT( "Ban List" ) : ( dat->type == MUC_ADMINLIST ) ? TranslateT( "Admin List" ) : ( dat->type == MUC_OWNERLIST ) ? TranslateT( "Owner List" ) : TranslateT( "JID List" ), xmlGetChildCount(queryNode), localFrom ); mir_free( localFrom ); } } } } SetWindowText( hwndDlg, title ); SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_FILTER), GWLP_USERDATA, 0); sttFillJidList(hwndDlg); } break; case WM_NOTIFY: if (( ( LPNMHDR )lParam )->idFrom == IDC_LIST ) { switch (( ( LPNMHDR )lParam )->code ) { case NM_CUSTOMDRAW: { NMLVCUSTOMDRAW *nm = ( NMLVCUSTOMDRAW * ) lParam; switch ( nm->nmcd.dwDrawStage ) { case CDDS_PREPAINT: case CDDS_ITEMPREPAINT: SetWindowLongPtr( hwndDlg, DWLP_MSGRESULT, CDRF_NOTIFYSUBITEMDRAW ); return TRUE; case CDDS_SUBITEM|CDDS_ITEMPREPAINT: { RECT rc; HICON hIcon; ListView_GetSubItemRect( nm->nmcd.hdr.hwndFrom, nm->nmcd.dwItemSpec, nm->iSubItem, LVIR_LABEL, &rc ); if ( nm->iSubItem == 1 ) { if( nm->nmcd.lItemlParam == ( LPARAM )( -1 )) hIcon = ( HICON )LoadImage( hInst, MAKEINTRESOURCE( IDI_ADDCONTACT ), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 ); else hIcon = ( HICON )LoadImage( hInst, MAKEINTRESOURCE( IDI_DELETE ), IMAGE_ICON, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0 ); DrawIconEx( nm->nmcd.hdc, ( rc.left+rc.right-GetSystemMetrics( SM_CXSMICON ))/2, ( rc.top+rc.bottom-GetSystemMetrics( SM_CYSMICON ))/2,hIcon, GetSystemMetrics( SM_CXSMICON ), GetSystemMetrics( SM_CYSMICON ), 0, GetSysColorBrush(COLOR_WINDOW), DI_NORMAL ); DestroyIcon( hIcon ); SetWindowLongPtr( hwndDlg, DWLP_MSGRESULT, CDRF_SKIPDEFAULT ); return TRUE; } } } } break; case NM_CLICK: { NMLISTVIEW *nm = ( NMLISTVIEW * ) lParam; LVITEM lvi; LVHITTESTINFO hti; TCHAR text[128]; if ( nm->iSubItem < 1 ) break; hti.pt.x = ( short ) LOWORD( GetMessagePos()); hti.pt.y = ( short ) HIWORD( GetMessagePos()); ScreenToClient( nm->hdr.hwndFrom, &hti.pt ); if ( ListView_SubItemHitTest( nm->hdr.hwndFrom, &hti ) == -1 ) break; if ( hti.iSubItem != 1 ) break; lvi.mask = LVIF_PARAM | LVIF_TEXT; lvi.iItem = hti.iItem; lvi.iSubItem = 0; lvi.pszText = text; lvi.cchTextMax = sizeof( text ); ListView_GetItem( nm->hdr.hwndFrom, &lvi ); if ( lvi.lParam == ( LPARAM )( -1 )) { TCHAR szBuffer[ 1024 ]; _tcscpy( szBuffer, dat->type2str()); if ( !dat->ppro->EnterString(szBuffer, SIZEOF(szBuffer), NULL, JES_COMBO, "gcAddNick_")) break; // Trim leading and trailing whitespaces TCHAR *p = szBuffer, *q; for ( p = szBuffer; *p!='\0' && isspace( BYTE( *p )); p++); for ( q = p; *q!='\0' && !isspace( BYTE( *q )); q++); if (*q != '\0') *q = '\0'; if (*p == '\0') break; TCHAR rsn[ 1024 ]; _tcscpy( rsn, dat->type2str()); if ( dat->type == MUC_BANLIST ) { dat->ppro->EnterString(rsn, SIZEOF(rsn), TranslateT("Reason to ban") , JES_COMBO, "gcAddReason_"); if ( szBuffer ) dat->ppro->AddMucListItem( dat, p , rsn); else dat->ppro->AddMucListItem( dat, p ); } else dat->ppro->AddMucListItem( dat, p ); } else { //delete TCHAR msgText[128]; mir_sntprintf( msgText, SIZEOF( msgText ), _T("%s %s?"), TranslateT( "Removing" ), text ); if ( MessageBox( hwndDlg, msgText, dat->type2str(), MB_YESNO|MB_SETFOREGROUND ) == IDYES ) { dat->ppro->DeleteMucListItem( dat, ( TCHAR* )lvi.lParam ); mir_free(( void * )lvi.lParam ); ListView_DeleteItem( nm->hdr.hwndFrom, hti.iItem ); } } } break; } break; } break; case WM_COMMAND: if ((LOWORD(wParam) == IDC_BTN_FILTERAPPLY) || ((LOWORD(wParam) == IDOK) && (GetFocus() == GetDlgItem(hwndDlg, IDC_FILTER)))) { SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_FILTER), GWLP_USERDATA, 1); sttFillJidList(hwndDlg); } else if ((LOWORD(wParam) == IDC_BTN_FILTERRESET) || ((LOWORD(wParam) == IDCANCEL) && (GetFocus() == GetDlgItem(hwndDlg, IDC_FILTER)))) { SetWindowLongPtr(GetDlgItem(hwndDlg, IDC_FILTER), GWLP_USERDATA, 0); sttFillJidList(hwndDlg); } break; /* case WM_SETCURSOR: if ( LOWORD( LPARAM )!= HTCLIENT ) break; if ( GetForegroundWindow() == GetParent( hwndDlg )) { POINT pt; GetCursorPos( &pt ); ScreenToClient( hwndDlg,&pt ); SetFocus( ChildWindowFromPoint( hwndDlg,pt )); //ugly hack because listviews ignore their first click } break; */ case WM_CLOSE: { HWND hwndList; int count, i; LVITEM lvi; // Free lParam of the displayed list items hwndList = GetDlgItem( hwndDlg, IDC_LIST ); count = ListView_GetItemCount( hwndList ); lvi.mask = LVIF_PARAM; lvi.iSubItem = 0; for ( i=0; i<count; i++ ) { lvi.iItem = i; if ( ListView_GetItem( hwndList, &lvi ) == TRUE ) { if ( lvi.lParam!=( LPARAM )( -1 ) && lvi.lParam!=( LPARAM )( NULL )) { mir_free(( void * ) lvi.lParam ); } } } ListView_DeleteAllItems( hwndList ); CJabberProto* ppro = dat->ppro; switch ( dat->type ) { case MUC_VOICELIST: ppro->m_hwndMucVoiceList = NULL; break; case MUC_MEMBERLIST: ppro->m_hwndMucMemberList = NULL; break; case MUC_MODERATORLIST: ppro->m_hwndMucModeratorList = NULL; break; case MUC_BANLIST: ppro->m_hwndMucBanList = NULL; break; case MUC_ADMINLIST: ppro->m_hwndMucAdminList = NULL; break; case MUC_OWNERLIST: ppro->m_hwndMucOwnerList = NULL; break; } DestroyWindow( hwndDlg ); } break; case WM_DESTROY: // Clear GWL_USERDATA if ( dat != NULL ) { Utils_SaveWindowPosition(hwndDlg, NULL, dat->ppro->m_szModuleName, "jidListWnd_"); delete dat; } break; } return FALSE; }
static LRESULT CALLBACK ParentSubclassProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { CMsgTree *dat = CWndUserData(hWnd).GetMsgTree(); switch (Msg) { case WM_NOTIFY: if (((LPNMHDR)lParam)->hwndFrom == dat->hTreeView) { switch (((LPNMHDR)lParam)->code) { case TVN_BEGINDRAG: { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam; NMMSGTREE nm = { 0 }; COptItem_TreeCtrl *TreeCtrl = dat->GetTreeCtrl(); int Order = TreeCtrl->hItemToOrder(pnmtv->itemNew.hItem); _ASSERT(Order != -1); if (Order != -1) { nm.ItemOld = (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order]; nm.hdr.code = MTN_BEGINDRAG; nm.hdr.hwndFrom = dat->hTreeView; nm.hdr.idFrom = GetDlgCtrlID(dat->hTreeView); if (!SendMessage(hWnd, WM_NOTIFY, 0, (LPARAM)&nm)) { SetCapture(hWnd); dat->hPrevDropTarget = dat->hDragItem = pnmtv->itemNew.hItem; SetFocus(dat->hTreeView); TreeView_SelectItem(dat->hTreeView, dat->hDragItem); } } } break; case TVN_SELCHANGED: if (dat->UpdateLock) return 0; else { LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam; NMMSGTREE nm = { 0 }; COptItem_TreeCtrl *TreeCtrl = dat->GetTreeCtrl(); if (pnmtv->itemOld.hItem) { int Order = TreeCtrl->IDToOrder(pnmtv->itemOld.lParam); if (Order != -1) { nm.ItemOld = (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order]; } } if (pnmtv->itemNew.hItem) { int Order = TreeCtrl->IDToOrder(pnmtv->itemNew.lParam); if (Order != -1) { nm.ItemNew = (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order]; } } nm.hdr.code = MTN_SELCHANGED; nm.hdr.hwndFrom = dat->hTreeView; nm.hdr.idFrom = GetDlgCtrlID(dat->hTreeView); SendMessage(hWnd, WM_NOTIFY, 0, (LPARAM)&nm); } break; case TVN_BEGINLABELEDIT: if (dat->GetTreeCtrl()->IDToOrder(((LPNMTVDISPINFO)lParam)->item.lParam) < 0) return true; // cancel editing g_OrigEditProc = (WNDPROC)SetWindowLongPtr(TreeView_GetEditControl(dat->hTreeView), GWLP_WNDPROC, (LONG_PTR)EditSubclassProc); break; case TVN_ENDLABELEDIT: { LPNMTVDISPINFO ptvdi = (LPNMTVDISPINFO)lParam; if (ptvdi->item.pszText) { COptItem_TreeCtrl *TreeCtrl = dat->GetTreeCtrl(); int Order = TreeCtrl->IDToOrder(ptvdi->item.lParam); if (Order >= 0) { TreeCtrl->Value[Order].Title = ptvdi->item.pszText; TreeCtrl->SetModified(true); NMMSGTREE nm = { 0 }; nm.ItemNew = &TreeCtrl->Value[Order]; nm.hdr.code = MTN_ITEMRENAMED; nm.hdr.hwndFrom = dat->hTreeView; nm.hdr.idFrom = GetDlgCtrlID(dat->hTreeView); SendMessage(GetParent(dat->hTreeView), WM_NOTIFY, 0, (LPARAM)&nm); return true; // commit new text } } } break; case NM_CLICK: case NM_RCLICK: { TVHITTESTINFO hitTest; hitTest.pt.x = (short)LOWORD(GetMessagePos()); hitTest.pt.y = (short)HIWORD(GetMessagePos()); ScreenToClient(dat->hTreeView, &hitTest.pt); TreeView_HitTest(dat->hTreeView, &hitTest); if (hitTest.hItem) { if (TreeView_GetSelection(dat->hTreeView) == hitTest.hItem) // make sure TVN_SELCHANGED notification is sent always, even if previous selected item was the same as new TreeView_SelectItem(dat->hTreeView, NULL); TreeView_SelectItem(dat->hTreeView, hitTest.hItem); } } break; case NM_CUSTOMDRAW: NMTVCUSTOMDRAW *lpNMCD = (NMTVCUSTOMDRAW*)lParam; switch (lpNMCD->nmcd.dwDrawStage) { case CDDS_PREPAINT: // the control is about to start painting return CDRF_NOTIFYITEMDRAW; // instruct the control to return information when it draws items case CDDS_ITEMPREPAINT: return CDRF_NOTIFYPOSTPAINT; case CDDS_ITEMPOSTPAINT: RECT rc; TreeView_GetItemRect(lpNMCD->nmcd.hdr.hwndFrom, (HTREEITEM)lpNMCD->nmcd.dwItemSpec, &rc, true); int iSize = GetSystemMetrics(SM_CXSMICON); int x = rc.left - iSize - 5; for (int i = 0; i < _countof(SettingsList); i++) { if (lpNMCD->nmcd.lItemlParam == dat->MsgTreePage.GetValue(SettingsList[i].DBSetting)) { DrawIconEx(lpNMCD->nmcd.hdc, x, rc.top, Skin_LoadProtoIcon(NULL, SettingsList[i].Status), iSize, iSize, 0, GetSysColorBrush(COLOR_WINDOW), DI_NORMAL); x -= iSize + 1; } } } } } break; case WM_MOUSEMOVE: if (dat->hDragItem) { TVHITTESTINFO hti; hti.pt.x = (short)LOWORD(lParam); hti.pt.y = (short)HIWORD(lParam); ClientToScreen(hWnd, &hti.pt); ScreenToClient(dat->hTreeView, &hti.pt); TreeView_HitTest(dat->hTreeView, &hti); if (hti.hItem) { TreeView_SelectDropTarget(dat->hTreeView, hti.hItem); SetTimer(hWnd, MSGTREE_TIMER_ID, MSGTREE_DRAGANDDROP_GROUPEXPANDTIME, NULL); } else { if (hti.flags & TVHT_ABOVE) SendMessage(dat->hTreeView, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), 0); if (hti.flags & TVHT_BELOW) SendMessage(dat->hTreeView, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), 0); TreeView_SelectDropTarget(dat->hTreeView, NULL); KillTimer(hWnd, MSGTREE_TIMER_ID); } } break; case WM_LBUTTONUP: if (dat->hDragItem) { TreeView_SelectDropTarget(dat->hTreeView, NULL); KillTimer(hWnd, MSGTREE_TIMER_ID); ReleaseCapture(); TVHITTESTINFO hti; hti.pt.x = (short)LOWORD(lParam); hti.pt.y = (short)HIWORD(lParam); ClientToScreen(hWnd, &hti.pt); ScreenToClient(dat->hTreeView, &hti.pt); TreeView_HitTest(dat->hTreeView, &hti); if (hti.hItem && dat->hDragItem != hti.hItem) { NMMSGTREE nm = { 0 }; COptItem_TreeCtrl *TreeCtrl = dat->GetTreeCtrl(); int OrderOld = TreeCtrl->hItemToOrder(dat->hDragItem); int OrderNew = TreeCtrl->hItemToOrder(hti.hItem); _ASSERT(OrderOld != -1 && OrderNew != -1); nm.ItemOld = (OrderOld <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(OrderOld)] : (CBaseTreeItem*)&TreeCtrl->Value[OrderOld]; nm.ItemNew = (OrderNew <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(OrderNew)] : (CBaseTreeItem*)&TreeCtrl->Value[OrderNew]; nm.hdr.code = MTN_ENDDRAG; nm.hdr.hwndFrom = dat->hTreeView; nm.hdr.idFrom = GetDlgCtrlID(dat->hTreeView); if (!SendMessage(hWnd, WM_NOTIFY, 0, (LPARAM)&nm)) { dat->UpdateLock++; dat->GetTreeCtrl()->MoveItem(hWnd, dat->hDragItem, hti.hItem); dat->UpdateLock--; } } dat->hDragItem = NULL; } break; case WM_TIMER: if (wParam == MSGTREE_TIMER_ID) { KillTimer(hWnd, MSGTREE_TIMER_ID); TVHITTESTINFO hti; hti.pt.x = (short)LOWORD(GetMessagePos()); hti.pt.y = (short)HIWORD(GetMessagePos()); ScreenToClient(dat->hTreeView, &hti.pt); TreeView_HitTest(dat->hTreeView, &hti); if (hti.hItem && dat->hDragItem != hti.hItem && TreeView_GetChild(dat->hTreeView, hti.hItem)) // target is a group and is not the same item that we're dragging TreeView_Expand(dat->hTreeView, hti.hItem, TVE_EXPAND); } } return CallWindowProc(dat->OrigParentProc, hWnd, Msg, wParam, lParam); }
/*********************************************************************** * create_cgimage_from_icon_bitmaps */ CGImageRef create_cgimage_from_icon_bitmaps(HDC hdc, HANDLE icon, HBITMAP hbmColor, unsigned char *color_bits, int color_size, HBITMAP hbmMask, unsigned char *mask_bits, int mask_size, int width, int height, int istep) { int i, has_alpha = FALSE; DWORD *ptr; CGBitmapInfo alpha_format; CGColorSpaceRef colorspace; CFDataRef data; CGDataProviderRef provider; CGImageRef cgimage; /* draw the cursor frame to a temporary buffer then create a CGImage from that */ memset(color_bits, 0x00, color_size); SelectObject(hdc, hbmColor); if (!DrawIconEx(hdc, 0, 0, icon, width, height, istep, NULL, DI_NORMAL)) { WARN("Could not draw frame %d (walk past end of frames).\n", istep); return NULL; } /* check if the cursor frame was drawn with an alpha channel */ for (i = 0, ptr = (DWORD*)color_bits; i < width * height; i++, ptr++) if ((has_alpha = (*ptr & 0xff000000) != 0)) break; if (has_alpha) alpha_format = kCGImageAlphaFirst; else alpha_format = kCGImageAlphaNoneSkipFirst; colorspace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); if (!colorspace) { WARN("failed to create colorspace\n"); return NULL; } data = CFDataCreate(NULL, (UInt8*)color_bits, color_size); if (!data) { WARN("failed to create data\n"); CGColorSpaceRelease(colorspace); return NULL; } provider = CGDataProviderCreateWithCFData(data); CFRelease(data); if (!provider) { WARN("failed to create data provider\n"); CGColorSpaceRelease(colorspace); return NULL; } cgimage = CGImageCreate(width, height, 8, 32, width * 4, colorspace, alpha_format | kCGBitmapByteOrder32Little, provider, NULL, FALSE, kCGRenderingIntentDefault); CGDataProviderRelease(provider); CGColorSpaceRelease(colorspace); if (!cgimage) { WARN("failed to create image\n"); return NULL; } /* if no alpha channel was drawn then generate it from the mask */ if (!has_alpha) { unsigned int width_bytes = (width + 31) / 32 * 4; CGImageRef cgmask, temp; /* draw the cursor mask to a temporary buffer */ memset(mask_bits, 0xFF, mask_size); SelectObject(hdc, hbmMask); if (!DrawIconEx(hdc, 0, 0, icon, width, height, istep, NULL, DI_MASK)) { WARN("Failed to draw frame mask %d.\n", istep); CGImageRelease(cgimage); return NULL; } data = CFDataCreate(NULL, (UInt8*)mask_bits, mask_size); if (!data) { WARN("failed to create data\n"); CGImageRelease(cgimage); return NULL; } provider = CGDataProviderCreateWithCFData(data); CFRelease(data); if (!provider) { WARN("failed to create data provider\n"); CGImageRelease(cgimage); return NULL; } cgmask = CGImageMaskCreate(width, height, 1, 1, width_bytes, provider, NULL, FALSE); CGDataProviderRelease(provider); if (!cgmask) { WARN("failed to create mask\n"); CGImageRelease(cgimage); return NULL; } temp = CGImageCreateWithMask(cgimage, cgmask); CGImageRelease(cgmask); CGImageRelease(cgimage); if (!temp) { WARN("failed to create masked image\n"); return NULL; } cgimage = temp; } return cgimage; }
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; } }
BOOL CALLBACK vncConnDialog::vncConnDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // This is a static method, so we don't know which instantiation we're // dealing with. But we can get a pseudo-this from the parameter to // WM_INITDIALOG, which we therafter store with the window and retrieve // as follows: vncConnDialog *_this = helper::SafeGetWindowUserData<vncConnDialog>(hwnd); switch (uMsg) { case WM_PAINT: { //adzm 2009-06-20 if (GetUpdateRect(hwnd, NULL, TRUE)) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); { RECT rcIcon; rcIcon.top = 0; rcIcon.left = 0; rcIcon.bottom = 48; rcIcon.right = 48; RECT rcClient; if (GetClientRect(hwnd, &rcClient)) { int nDifference = (rcClient.bottom - rcIcon.bottom) / 2; if (nDifference > 0) { rcIcon.top += nDifference; rcIcon.bottom += nDifference; } } RECT rcLabel; HWND hwndLabel = GetDlgItem(hwnd, IDC_CONNECTION_NUMBER_STATIC); if (GetWindowRect(hwndLabel, &rcLabel)) { LPRECT lprcLabel = &rcLabel; ScreenToClient(hwnd, (LPPOINT)lprcLabel); ScreenToClient(hwnd, ((LPPOINT)lprcLabel)+1); int nAdjustment = (rcLabel.left - rcIcon.right) / 2; rcIcon.left += nAdjustment; rcIcon.right += nAdjustment; } RECT rcIntersect; if (IntersectRect(&rcIntersect, &rcIcon, &(ps.rcPaint))) { if (_this->m_hicon == NULL) { _this->m_hicon = (HICON)LoadImage(hInstResDLL, MAKEINTRESOURCE(IDI_WINVNC), IMAGE_ICON, 48, 48, 0); } if (_this->m_hicon) { HBRUSH hbr = (HBRUSH)SendMessage(hwnd, WM_CTLCOLORDLG, (WPARAM)hdc, (WPARAM)hwnd); DrawIconEx(hdc, rcIcon.left, rcIcon.top, _this->m_hicon, 48, 48, 0, hbr, DI_NORMAL); } } } EndPaint(hwnd, &ps); } return 0; } // Dialog has just been created case WM_INITDIALOG: { // Save the lParam into our user data so that subsequent calls have // access to the parent C++ object helper::SafeSetWindowUserData(hwnd, lParam); vncConnDialog *_this = (vncConnDialog *) lParam; //adzm 2009-06-20 if (g_szRepeaterHost) { SetDlgItemText(hwnd, IDC_HOSTNAME_EDIT, g_szRepeaterHost); //adzm 2009-06-20 if (SPECIAL_SC_PROMPT) { HWND hwndChild = GetDlgItem(hwnd, IDC_HOSTNAME_EDIT); if (hwndChild) { ShowWindow(hwndChild, SW_HIDE); } hwndChild = GetDlgItem(hwnd, IDC_HOSTNAME_STATIC); if (hwndChild) { ShowWindow(hwndChild, SW_HIDE); } HWND hwndEdit = GetDlgItem(hwnd, IDC_IDCODE); HWND hwndLabel = GetDlgItem(hwnd, IDC_CONNECTION_NUMBER_STATIC); RECT rcEdit; RECT rcLabel; GetWindowRect(hwndEdit, &rcEdit); GetWindowRect(hwndLabel, &rcLabel); LPRECT lprcEdit = &rcEdit; LPRECT lprcLabel = &rcLabel; ScreenToClient(hwnd, (LPPOINT)lprcEdit); ScreenToClient(hwnd, ((LPPOINT)lprcEdit)+1); ScreenToClient(hwnd, (LPPOINT)lprcLabel); ScreenToClient(hwnd, ((LPPOINT)lprcLabel)+1); RECT rcClient; GetClientRect(hwnd, &rcClient); long nTotalHeight = rcEdit.bottom - rcLabel.top; long nAdjustedTop = (rcClient.bottom - nTotalHeight) / 2; long nAdjustment = nAdjustedTop - rcLabel.top; MoveWindow(hwndLabel, rcLabel.left, rcLabel.top + nAdjustment, rcLabel.right - rcLabel.left, rcLabel.bottom - rcLabel.top, TRUE); MoveWindow(hwndEdit, rcEdit.left, rcEdit.top + nAdjustment, rcEdit.right - rcEdit.left, rcEdit.bottom - rcEdit.top, TRUE); HWND hwndCaption = GetDlgItem(hwnd, IDC_CAPTION_STATIC); HFONT hFont = (HFONT)SendMessage(hwndCaption, WM_GETFONT, 0, 0); if (hFont) { LOGFONT lf; if (GetObject(hFont, sizeof(LOGFONT), &lf)) { lf.lfWidth = 0; lf.lfHeight = (lf.lfHeight * 6) / 4; _this->m_hfont = CreateFontIndirect(&lf); if (_this->m_hfont) { SendMessage(hwndCaption, WM_SETFONT, (WPARAM)_this->m_hfont, (LPARAM)TRUE); } } } SetWindowText(hwndCaption, "Connect to Technical Support"); ShowWindow(hwndCaption, SW_SHOWNA); } SetFocus(GetDlgItem(hwnd, IDC_IDCODE)); } else { // Make the text entry box active SetFocus(GetDlgItem(hwnd, IDC_HOSTNAME_EDIT)); } SetForegroundWindow(hwnd); // Return success! return TRUE; } // Dialog has just received a command case WM_COMMAND: switch (LOWORD(wParam)) { // User clicked OK or pressed return case IDOK: { // sf@2002 - host:num & host::num analyse. // Compatible with both RealVNC and TightVNC methods char hostname[_MAX_PATH]; char idcode[_MAX_PATH]; char *portp; int port; bool id; // Get the hostname of the VNCviewer GetDlgItemText(hwnd, IDC_HOSTNAME_EDIT, hostname, _MAX_PATH); GetDlgItemText(hwnd, IDC_IDCODE, idcode, _MAX_PATH); if (strcmp(idcode,"")==NULL) id=false; else id=true; // Calculate the Display and Port offset. port = INCOMING_PORT_OFFSET; portp = strchr(hostname, ':'); if (portp) { *portp++ = '\0'; if (*portp == ':') // Tight127 method { port = atoi(++portp); // Port number after "::" } else // RealVNC method { if (atoi(portp) < 100) // If < 100 after ":" -> display number port += atoi(portp); else port = atoi(portp); // If > 100 after ":" -> Port number } } // Attempt to create a new socket VSocket *tmpsock; tmpsock = new VSocket; if (!tmpsock) { return TRUE; } // Connect out to the specified host on the VNCviewer listen port // To be really good, we should allow a display number here but // for now we'll just assume we're connecting to display zero tmpsock->Create(); if (tmpsock->Connect(hostname, port)) { if (id) { char finalidcode[_MAX_PATH]; //adzm 2009-06-20 { size_t i = 0; for (i = 0; i < strlen(idcode); i++) { finalidcode[i] = toupper(idcode[i]); } finalidcode[i] = 0; if (0 != strncmp("ID:", idcode, 3)) { strcpy(finalidcode, "ID:"); for (i = 0; i < strlen(idcode); i++) { finalidcode[i+3] = toupper(idcode[i]); } finalidcode[i+3] = 0; } } tmpsock->Send(finalidcode,250); tmpsock->SetTimeout(0); /* if (strncmp(hostname,"ID",2)!=0) { while (true) { char result[1]; tmpsock->Read(result,1); if (strcmp(result,"2")==0) break; tmpsock->Send("1",1); } }*/ // adzm 2009-07-05 - repeater IDs // Add the new client to this server // adzm 2009-08-02 _this->m_server->AddClient(tmpsock, TRUE, TRUE, 0, NULL, finalidcode, hostname, port); } else { // Add the new client to this server // adzm 2009-08-02 _this->m_server->AddClient(tmpsock, TRUE, TRUE, 0, NULL, NULL, hostname, port); } // And close the dialog EndDialog(hwnd, TRUE); } else { // Print up an error message MessageBox(NULL, sz_ID_FAILED_CONNECT_LISTING_VIEW, sz_ID_OUTGOING_CONNECTION, MB_OK | MB_ICONEXCLAMATION ); delete tmpsock; } return TRUE; } // Cancel the dialog case IDCANCEL: EndDialog(hwnd, FALSE); return TRUE; }; break; case WM_DESTROY: EndDialog(hwnd, FALSE); if (_this->m_hicon != NULL) { DestroyIcon(_this->m_hicon); _this->m_hicon = NULL; } if (_this->m_hfont != NULL) { DeleteObject(_this->m_hfont); _this->m_hfont = NULL; } return TRUE; } return 0; }
INT_PTR CALLBACK DlgProcSendFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { struct FileDlgData *dat; dat=(struct FileDlgData*)GetWindowLongPtr(hwndDlg,GWLP_USERDATA); switch (msg) { case WM_INITDIALOG: { struct FileSendData *fsd=(struct FileSendData*)lParam; dat=(struct FileDlgData*)mir_calloc(sizeof(struct FileDlgData)); SetWindowLongPtr(hwndDlg,GWLP_USERDATA,(LONG_PTR)dat); dat->hContact=fsd->hContact; dat->send=1; dat->hPreshutdownEvent=HookEventMessage(ME_SYSTEM_PRESHUTDOWN,hwndDlg,M_PRESHUTDOWN); dat->fs=NULL; dat->dwTicks=GetTickCount(); TranslateDialogDefault(hwndDlg); EnumChildWindows(hwndDlg,ClipSiblingsChildEnumProc,0); OldSendEditProc=(WNDPROC)SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_MSG),GWLP_WNDPROC,(LONG_PTR)SendEditSubclassProc); Window_SetIcon_IcoLib(hwndDlg, SKINICON_EVENT_FILE); Button_SetIcon_IcoLib(hwndDlg, IDC_DETAILS, SKINICON_OTHER_USERDETAILS, LPGEN("View User's Details")); Button_SetIcon_IcoLib(hwndDlg, IDC_HISTORY, SKINICON_OTHER_HISTORY, LPGEN("View User's History")); Button_SetIcon_IcoLib(hwndDlg, IDC_USERMENU, SKINICON_OTHER_DOWNARROW, LPGEN("User Menu")); EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); if(fsd->ppFiles!=NULL && fsd->ppFiles[0]!=NULL) { int totalCount,i; for(totalCount=0;fsd->ppFiles[totalCount];totalCount++); dat->files = ( TCHAR** )mir_alloc( sizeof(TCHAR*)*(totalCount+1)); // Leaks for(i=0;i<totalCount;i++) dat->files[i] = mir_tstrdup( fsd->ppFiles[i] ); dat->files[totalCount]=NULL; SetFileListAndSizeControls(hwndDlg,dat); } { char *szProto; TCHAR* contactName = cli.pfnGetContactDisplayName( dat->hContact, 0 ); SetDlgItemText(hwndDlg,IDC_TO,contactName); szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)dat->hContact,0); if (szProto) { CONTACTINFO ci; int hasName = 0; char buf[128]; ZeroMemory(&ci,sizeof(ci)); ci.cbSize = sizeof(ci); ci.hContact = dat->hContact; ci.szProto = szProto; ci.dwFlag = CNF_UNIQUEID; if (!CallService(MS_CONTACT_GETCONTACTINFO,0,(LPARAM)&ci)) { switch(ci.type) { case CNFT_ASCIIZ: hasName = 1; mir_snprintf(buf, SIZEOF(buf), "%s", ci.pszVal); mir_free(ci.pszVal); break; case CNFT_DWORD: hasName = 1; mir_snprintf(buf, SIZEOF(buf),"%u",ci.dVal); break; } } if ( hasName ) SetDlgItemTextA(hwndDlg,IDC_NAME,buf); else SetDlgItemText(hwndDlg,IDC_NAME,contactName); } } if ( fsd->ppFiles == NULL ) { EnableWindow(hwndDlg, FALSE); dat->closeIfFileChooseCancelled=1; PostMessage(hwndDlg,WM_COMMAND,MAKEWPARAM(IDC_CHOOSE,BN_CLICKED),(LPARAM)GetDlgItem(hwndDlg,IDC_CHOOSE)); } return TRUE; } case WM_MEASUREITEM: return CallService(MS_CLIST_MENUMEASUREITEM,wParam,lParam); case WM_DRAWITEM: { LPDRAWITEMSTRUCT dis=(LPDRAWITEMSTRUCT)lParam; if(dis->hwndItem==GetDlgItem(hwndDlg, IDC_PROTOCOL)) { char *szProto; szProto=(char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)dat->hContact,0); if (szProto) { HICON hIcon = (HICON)CallProtoService(szProto,PS_LOADICON,PLI_PROTOCOL|PLIF_SMALL,0); if (hIcon) { DrawIconEx(dis->hDC,dis->rcItem.left,dis->rcItem.top,hIcon,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),0,NULL,DI_NORMAL); DestroyIcon(hIcon); } } } } return CallService(MS_CLIST_MENUDRAWITEM,wParam,lParam); case M_FILECHOOSEDONE: if( lParam != 0 ) { FilenameToFileList( hwndDlg, dat, ( TCHAR* )lParam ); mir_free(( TCHAR* )lParam ); dat->closeIfFileChooseCancelled = 0; } else if(dat->closeIfFileChooseCancelled) DestroyWindow(hwndDlg); EnableWindow(hwndDlg,TRUE); break; case WM_COMMAND: if(CallService(MS_CLIST_MENUPROCESSCOMMAND,MAKEWPARAM(LOWORD(wParam),MPCF_CONTACTMENU),(LPARAM)dat->hContact)) break; switch (LOWORD(wParam)) { case IDC_CHOOSE: EnableWindow(hwndDlg,FALSE); //GetOpenFileName() creates its own message queue which prevents any incoming events being processed forkthread(ChooseFilesThread,0,hwndDlg); break; case IDOK: EnableWindow(GetDlgItem(hwndDlg,IDC_FILENAME),FALSE); EnableWindow(GetDlgItem(hwndDlg,IDC_MSG),FALSE); EnableWindow(GetDlgItem(hwndDlg,IDC_CHOOSE),FALSE); GetDlgItemText(hwndDlg,IDC_FILEDIR,dat->szSavePath,SIZEOF(dat->szSavePath)); GetDlgItemText(hwndDlg,IDC_FILE,dat->szFilenames,SIZEOF(dat->szFilenames)); GetDlgItemText(hwndDlg,IDC_MSG,dat->szMsg,SIZEOF(dat->szMsg)); dat->hwndTransfer = FtMgr_AddTransfer(dat); SetWindowLongPtr( hwndDlg, GWLP_USERDATA, 0); DestroyWindow(hwndDlg); return TRUE; case IDCANCEL: DestroyWindow(hwndDlg); return TRUE; case IDC_USERMENU: { RECT rc; HMENU hMenu=(HMENU)CallService(MS_CLIST_MENUBUILDCONTACT,(WPARAM)dat->hContact,0); GetWindowRect((HWND)lParam,&rc); TrackPopupMenu(hMenu,0,rc.left,rc.bottom,0,hwndDlg,NULL); DestroyMenu(hMenu); break; } case IDC_DETAILS: CallService(MS_USERINFO_SHOWDIALOG,(WPARAM)dat->hContact,0); return TRUE; case IDC_HISTORY: CallService(MS_HISTORY_SHOWCONTACTHISTORY,(WPARAM)dat->hContact,0); return TRUE; } break; case WM_DESTROY: Window_FreeIcon_IcoLib(hwndDlg); Button_FreeIcon_IcoLib(hwndDlg,IDC_DETAILS); Button_FreeIcon_IcoLib(hwndDlg,IDC_HISTORY); Button_FreeIcon_IcoLib(hwndDlg,IDC_USERMENU); if ( dat ) FreeFileDlgData( dat ); SetWindowLongPtr(GetDlgItem(hwndDlg,IDC_MSG),GWLP_WNDPROC,(LONG_PTR)OldSendEditProc); return TRUE; } return FALSE; }
void CtrlDisplayListView::onPaint(WPARAM wParam, LPARAM lParam) { if (!validDisplayList || !gpuDebug) return; PAINTSTRUCT ps; HDC actualHdc = BeginPaint(wnd, &ps); HDC hdc = CreateCompatibleDC(actualHdc); HBITMAP hBM = CreateCompatibleBitmap(actualHdc, rect.right-rect.left, rect.bottom-rect.top); SelectObject(hdc, hBM); SetBkMode(hdc, TRANSPARENT); HPEN nullPen=CreatePen(0,0,0xffffff); HPEN condPen=CreatePen(0,0,0xFF3020); HBRUSH nullBrush=CreateSolidBrush(0xffffff); HBRUSH currentBrush=CreateSolidBrush(0xFFEfE8); HPEN oldPen=(HPEN)SelectObject(hdc,nullPen); HBRUSH oldBrush=(HBRUSH)SelectObject(hdc,nullBrush); HFONT oldFont = (HFONT)SelectObject(hdc,(HGDIOBJ)font); HICON breakPoint = (HICON)LoadIcon(GetModuleHandle(0),(LPCWSTR)IDI_STOP); auto disasm = gpuDebug->DissassembleOpRange(windowStart, windowStart + (visibleRows + 2) * instructionSize); for (int i = 0; i < visibleRows+2; i++) { unsigned int address=windowStart + i*instructionSize; bool stall = address == list.stall; int rowY1 = rowHeight*i; int rowY2 = rowHeight*(i+1); // draw background COLORREF backgroundColor = stall ? 0xCCCCFF : 0xFFFFFF; COLORREF textColor = 0x000000; if (address >= selectRangeStart && address < selectRangeEnd) { if (hasFocus) { backgroundColor = address == curAddress ? 0xFF8822 : 0xFF9933; textColor = 0xFFFFFF; } else { backgroundColor = 0xC0C0C0; } } HBRUSH backgroundBrush = CreateSolidBrush(backgroundColor); HPEN backgroundPen = CreatePen(0,0,backgroundColor); SelectObject(hdc,backgroundBrush); SelectObject(hdc,backgroundPen); Rectangle(hdc,0,rowY1,rect.right,rowY1+rowHeight); SelectObject(hdc,currentBrush); SelectObject(hdc,nullPen); DeleteObject(backgroundBrush); DeleteObject(backgroundPen); // display address/symbol if (GPUBreakpoints::IsAddressBreakpoint(address)) { textColor = 0x0000FF; int yOffset = std::max(-1,(rowHeight-14+1)/2); DrawIconEx(hdc,2,rowY1+1+yOffset,breakPoint,32,32,0,0,DI_NORMAL); } SetTextColor(hdc,textColor); GPUDebugOp op = i < (int)disasm.size() ? disasm[i] : GPUDebugOp(); char addressText[64]; sprintf(addressText,"%08X %08X",op.pc,op.op); TextOutA(hdc,pixelPositions.addressStart,rowY1+2,addressText,(int)strlen(addressText)); if (address == list.pc) { TextOut(hdc,pixelPositions.opcodeStart-8,rowY1,L"■",1); } const char* opcode = op.desc.c_str(); SelectObject(hdc,stall ? boldfont : font); TextOutA(hdc,pixelPositions.opcodeStart,rowY1+2,opcode,(int)strlen(opcode)); SelectObject(hdc,font); } SelectObject(hdc,oldFont); SelectObject(hdc,oldPen); SelectObject(hdc,oldBrush); // copy bitmap to the actual hdc BitBlt(actualHdc, 0, 0, rect.right, rect.bottom, hdc, 0, 0, SRCCOPY); DeleteObject(hBM); DeleteDC(hdc); DeleteObject(nullPen); DeleteObject(condPen); DeleteObject(nullBrush); DeleteObject(currentBrush); DestroyIcon(breakPoint); EndPaint(wnd, &ps); }
BOOL CMyDialog::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default // BOOL bResult=CDialog::OnEraseBkgnd(pDC); if (!m_bHaveStoreBgDC) { CRect rect; GetClientRect(rect); m_bHaveStoreBgDC=TRUE; Color clrStart=Color(230,230,230); Color clrEnd=Color(255,255,255); m_StoreBgDC.DeleteDC(); m_StoreBgDC.CreateCompatibleDC(pDC); CBitmap bmp; bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()); CBitmap *pOldBmp=m_StoreBgDC.SelectObject(&bmp); Graphics myGraphics(m_StoreBgDC.m_hDC); LinearGradientBrush linGrBrush( Rect(0,0,rect.Width(),rect.Height()), clrStart, clrEnd, LinearGradientModeVertical); myGraphics.FillRectangle(&linGrBrush, 0,31,rect.Width(),rect.Height()); Color clrCaptionStart(219,219,220); Color clrCaptionEnd(190,192,193); LinearGradientBrush linGrBrush1( Rect(0,0,rect.Width(),30), clrCaptionStart, clrCaptionEnd, LinearGradientModeVertical); myGraphics.FillRectangle(&linGrBrush1, 0,0,rect.Width(),30); DrawCloseButton(&m_StoreBgDC,DTS_NORMAL); DrawMinButton(&m_StoreBgDC,DTS_NORMAL); CPen MarkPen(PS_SOLID,1,RGB(158,158,158)); CBrush *pOldBrush=(CBrush *)m_StoreBgDC.SelectStockObject(NULL_BRUSH); CPen *pOldPen=m_StoreBgDC.SelectObject(&MarkPen); m_StoreBgDC.RoundRect(m_rcMin.left-1,m_rcMin.top-5,m_rcClose.right+1,m_rcClose.bottom+1,5,5); CPen penBorder(PS_SOLID,1,RGB(150,150,150)); m_StoreBgDC.SelectObject(&penBorder); m_StoreBgDC.MoveTo(0,30); m_StoreBgDC.LineTo(rect.Width(),30); m_StoreBgDC.MoveTo(m_rcClose.left-1,1); m_StoreBgDC.LineTo(m_rcClose.left-1,21); rect.DeflateRect(0,0,1,1); m_StoreBgDC.RoundRect(rect,CPoint(7,5)); m_StoreBgDC.SelectObject(pOldPen); m_StoreBgDC.SelectObject(pOldBrush); rect.bottom=30; HICON hIcon=GetIcon(FALSE); if (hIcon) //画Icon { DrawIconEx(m_StoreBgDC.m_hDC,5,7,hIcon,16,16,0,NULL,DI_NORMAL | DI_COMPAT); rect.left+=21; m_rcIcon.SetRect(5,7,21,23); } CString str; GetWindowText(str); if (str!="") //写标题 { rect.left+=5; rect.top+=4; m_StoreBgDC.SetBkMode(TRANSPARENT); COLORREF OldClr=m_StoreBgDC.SetTextColor(RGB(50,50,50)); CFont font; font.CreatePointFont(100,"雅黑",&m_StoreBgDC); CFont *pOldFont=m_StoreBgDC.SelectObject(&font); m_StoreBgDC.DrawText(str,rect,DT_VCENTER | DT_SINGLELINE); m_StoreBgDC.SelectObject(pOldFont); m_StoreBgDC.SetTextColor(OldClr); font.DeleteObject(); } /* m_StoreBgDC.SelectObject(pOldBmp);*/ bmp.DeleteObject(); } CRect rect; GetClientRect(rect); pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_StoreBgDC,0,0,SRCCOPY); return TRUE; }
static LRESULT CALLBACK ComboBoxSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_ERASEBKGND: return TRUE; case EM_SETSEL: if (!hOpClistControl) return HideCaret(hwnd); break; case WM_GETDLGCODE: if (!hOpClistControl) return DLGC_WANTARROWS; break; case WM_SETCURSOR: if (!hOpClistControl) { SetCursor(LoadCursor(NULL, IDC_ARROW)); return TRUE; } break; case WM_LBUTTONDOWN: if (hOpClistControl) break; HideCaret(hwnd); case WM_LBUTTONDBLCLK: case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: SendMessage(hComboBox,CB_SHOWDROPDOWN,1,0); return TRUE; case WM_NCLBUTTONDBLCLK: case WM_NCLBUTTONDOWN: if (!bChecked) { MarkUserDefSession(opses_count,1); hIcon = hMarked; bChecked = TRUE; RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW|RDW_FRAME); } else { MarkUserDefSession(opses_count,0); hIcon = hNotMarked; bChecked = FALSE; RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW|RDW_FRAME); } break; case WM_MOUSEMOVE: if (hOpClistControl) break; case WM_NCMOUSEMOVE: return TRUE; case WM_NCPAINT: hdc = GetDC(hwnd); GetClientRect(hwnd, &rc); rc.left=rc.right; rc.right=rc.left+16; FillRect(hdc, &rc, (HBRUSH)GetSysColor(COLOR_WINDOW)); DrawIconEx(hdc, rc.left, 0, hIcon, 16, 16, 0, NULL, DI_NORMAL); ReleaseDC(hwnd, hdc); break; case WM_NCCALCSIZE: { NCCALCSIZE_PARAMS *ncsParam = (NCCALCSIZE_PARAMS*)lParam; ncsParam->rgrc[ 0 ].right -= 16; } break; case WM_NCHITTEST: { LRESULT lr = mir_callNextSubclass(hwnd, ComboBoxSubclassProc, msg, wParam, lParam ); if (lr == HTNOWHERE ) lr = HTOBJECT; return lr; } } return mir_callNextSubclass(hwnd, ComboBoxSubclassProc, msg, wParam, lParam); }
HICON CMeterIcon::CreateMeterIcon(const int *pBarData) // the returned icon must be cleaned up using DestroyIcon() { // begin CreateMeterIcon ICONINFO iiNewIcon= {0}; iiNewIcon.fIcon = true; // set that it is an icon // create DC's HDC hScreenDC = ::GetDC(NULL); HDC hIconDC = CreateCompatibleDC(hScreenDC); HDC hMaskDC = CreateCompatibleDC(hScreenDC); if(hScreenDC == NULL) { // begin error check return NULL; }// end error check if(hIconDC == NULL) { // begin error check return NULL; }// end error check if(hMaskDC == NULL) { // begin error check return NULL; }// end error check // load bitmaps iiNewIcon.hbmColor = CreateCompatibleBitmap(hScreenDC,m_sDimensions.cx,m_sDimensions.cy); if(iiNewIcon.hbmColor == NULL) { // begin error check return NULL; }// end error check if(!::ReleaseDC(NULL,hScreenDC)) // release this ASAP { // begin DC not released return NULL; }// end DC not released iiNewIcon.hbmMask = CreateCompatibleBitmap(hMaskDC,m_sDimensions.cx,m_sDimensions.cy); if(iiNewIcon.hbmMask == NULL) { // begin error check return NULL; }// end error check HGDIOBJ hOldIconDC = ::SelectObject(hIconDC,iiNewIcon.hbmColor); if(hOldIconDC == NULL) { // begin error check return NULL; }// end error check HGDIOBJ hOldMaskDC = ::SelectObject(hMaskDC,iiNewIcon.hbmMask); if(hOldMaskDC == NULL) { // begin error check return NULL; }// end error check // initilize the bitmaps if(!BitBlt(hIconDC,0,0,m_sDimensions.cx,m_sDimensions.cy,NULL,0,0,BLACKNESS)) { // begin BitBlt failed return NULL; }// end BitBlt failed if(!BitBlt(hMaskDC,0,0,m_sDimensions.cx,m_sDimensions.cy,NULL,0,0,WHITENESS)) { // begin BitBlt failed return NULL; }// end BitBlt failed if(!DrawIconEx(hIconDC,0,0,m_hFrame,m_sDimensions.cx,m_sDimensions.cy,NULL,NULL,/*DI_NORMAL|*/DI_IMAGE)) { // begin error check return NULL; }// end error check if(!DrawIconEx(hMaskDC,0,0,m_hFrame,m_sDimensions.cx,m_sDimensions.cy,NULL,NULL,/*DI_NORMAL|*/DI_MASK)) { // begin error check return NULL; }// end error check // draw the meters for(int i = 0; i < m_nNumBars; i++) if(DrawIconMeter(hIconDC,hMaskDC,pBarData[i],i) == false) return false; // create icon ::SelectObject(hIconDC,hOldIconDC); ::SelectObject(hMaskDC,hOldMaskDC); HICON hNewIcon = CreateIconIndirect(&iiNewIcon); // cleanup DeleteObject(iiNewIcon.hbmColor); DeleteObject(iiNewIcon.hbmMask); DeleteDC(hMaskDC); DeleteDC(hIconDC); return hNewIcon; }// end CreateMeterIcon
static void button_paint_split(HWND win, button_t* button, HDC dc) { RECT rect; RECT rect_left, rect_right; int state_left, state_right; int text_offset = 0; HFONT font, old_font; int old_bk_mode; COLORREF old_text_color; HRGN old_clip; HICON glyph; int width_right = DROPDOWN_W; glyph = ImageList_GetIcon(mc_bmp_glyphs, MC_BMP_GLYPH_MORE_OPTIONS, ILD_TRANSPARENT); GetClientRect(win, &rect); font = (HFONT) MC_SEND(win, WM_GETFONT, 0, 0); if(font == NULL) font = GetStockObject(SYSTEM_FONT); old_font = SelectObject(dc, font); old_bk_mode = GetBkMode(dc); old_text_color = GetTextColor(dc); old_clip = get_clip(dc); /* Draw what's common for left and right parts background. */ if(!button->theme && (button->style & BS_DEFPUSHBUTTON)) { SelectObject(dc, GetSysColorBrush(COLOR_WINDOWFRAME)); Rectangle(dc, rect.left, rect.top, rect.right, rect.bottom); mc_rect_inflate(&rect, -1, -1); width_right--; } /* Setup subrectangles (mainpart 1 and push-down part 2) */ mc_rect_copy(&rect_left, &rect); rect_left.right -= width_right; mc_rect_copy(&rect_right, &rect); rect_right.left = rect_left.right; /* Draw background. */ if(button->theme) { UINT transparent; RECT tmp; /* Determine styles for left and right parts */ if(button->style & WS_DISABLED) { state_left = state_right = PBS_DISABLED; } else { LRESULT state; state = MC_SEND(win, BM_GETSTATE, 0, 0); if(state & MC_BST_DROPDOWNPUSHED) { state_left = PBS_NORMAL; state_right = PBS_PRESSED; } else { if(state & BST_PUSHED) state_left = state_right = PBS_PRESSED; else if(state & BST_HOT) state_left = state_right = PBS_HOT; else if(button->style & BS_DEFPUSHBUTTON) state_left = state_right = PBS_DEFAULTED; else state_left = state_right = PBS_NORMAL; } } /* Handle (semi-)transparent themes. */ transparent = 0; if(mcIsThemeBackgroundPartiallyTransparent(button->theme, BP_PUSHBUTTON, state_left)) transparent |= 0x1; if(mcIsThemeBackgroundPartiallyTransparent(button->theme, BP_PUSHBUTTON, state_right)) transparent |= 0x2; switch(transparent) { case 0x1: mcDrawThemeParentBackground(win, dc, &rect_left); break; case 0x2: mcDrawThemeParentBackground(win, dc, &rect_right); break; case 0x3: mcDrawThemeParentBackground(win, dc, &rect); break; } /* Draw backgrond. */ mcDrawThemeBackground(button->theme, dc, BP_PUSHBUTTON, state_left, &rect, &rect_left); mcDrawThemeBackground(button->theme, dc, BP_PUSHBUTTON, state_right, &rect, &rect_right); /* Deflate both rects to content rects only */ mcGetThemeBackgroundContentRect(button->theme, dc, BP_PUSHBUTTON, state_left, &rect_left, &tmp); rect_left.left = tmp.left; rect_left.top = tmp.top; rect_left.bottom = tmp.bottom; mcGetThemeBackgroundContentRect(button->theme, dc, BP_PUSHBUTTON, state_right, &rect_right, &tmp); rect_right.top = tmp.top; rect_right.right = tmp.right; rect_right.bottom = tmp.bottom; /* Draw delimiter of left and right parts. */ rect_right.top += 1; rect_right.bottom -= 1; mcDrawThemeEdge(button->theme, dc, BP_PUSHBUTTON, state_right, &rect_right, BDR_SUNKEN, BF_LEFT, NULL); rect_right.left = tmp.left; } else { /* Determine styles for left and right parts */ if(button->style & WS_DISABLED) { state_left = state_right = DFCS_INACTIVE; } else { LRESULT s = MC_SEND(win, BM_GETSTATE, 0, 0); if(s & MC_BST_DROPDOWNPUSHED) { state_left = 0; state_right = DFCS_PUSHED; } else { if(s & BST_PUSHED) { state_left = state_right = DFCS_PUSHED; } else { state_left = state_right = 0; } } } button_send_ctlcolorbtn(win, dc); /* Draw control edges */ IntersectClipRect(dc, rect_left.left, rect_left.top, rect_left.right, rect_left.bottom); DrawFrameControl(dc, &rect, DFC_BUTTON, DFCS_BUTTONPUSH | state_left); SelectClipRgn(dc, NULL); IntersectClipRect(dc, rect_right.left, rect_right.top, rect_right.right, rect_right.bottom); DrawFrameControl(dc, &rect, DFC_BUTTON, DFCS_BUTTONPUSH | state_right); /* Parts which are pushed, should have the contents moved a bit */ if(state_left == DFCS_PUSHED) mc_rect_offset(&rect_left, 1, 1); if(state_right == DFCS_PUSHED) mc_rect_offset(&rect_right, 1, 1); /* Draw delimiter */ if(state_left == state_right) { DrawEdge(dc, &rect_right, BDR_SUNKENOUTER | BDR_RAISEDINNER, BF_LEFT | BF_SOFT); } else { rect_right.left--; DrawEdge(dc, &rect_right, BDR_SUNKENOUTER, BF_LEFT | BF_SOFT); rect_right.left++; } /* Adjust for the outer control edges */ mc_rect_inflate(&rect_left, 0, -2); rect_left.left += 2; mc_rect_inflate(&rect_right, -2, -2); } /* Draw focus rectangle. */ if((MC_SEND(win, BM_GETSTATE, 0, 0) & BST_FOCUS) && !button->hide_focus) { SelectClipRgn(dc, NULL); if(button->theme) { mc_rect_set(&rect, rect_left.left, rect_left.top, rect_right.right - DROPDOWN_W, rect_right.bottom); DrawFocusRect(dc, &rect); } else { mc_rect_inflate(&rect_left, -1, -2); DrawFocusRect(dc, &rect_left); mc_rect_inflate(&rect_left, -1, -1); } } /* Draw glyph into the right part */ SelectClipRgn(dc, NULL); IntersectClipRect(dc, rect_right.left, rect_right.top, rect_right.right, rect_right.bottom); DrawIconEx(dc, (rect_right.right + rect_right.left - MC_BMP_GLYPH_W) / 2, (rect_right.bottom + rect_right.top - MC_BMP_GLYPH_H) / 2, glyph, MC_BMP_GLYPH_W, MC_BMP_GLYPH_H, 0, NULL, DI_NORMAL); /* Draw left part contents */ SelectClipRgn(dc, NULL); IntersectClipRect(dc, rect_left.left, rect_left.top, rect_left.right, rect_left.bottom); if(button->style & BS_ICON) { /* Paint (BS_SPLITBUTTON | BS_ICON). Note that this is used even on * Vista, as according to some my testing this style combination * is not supported there... */ HICON icon; icon = (HICON) MC_SEND(win, BM_GETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) 0); if(icon != NULL) { SIZE size; UINT flags; mc_icon_size(icon, &size); flags = DST_ICON; if(button->style & WS_DISABLED) flags |= DSS_DISABLED; DrawState(dc, NULL, NULL, (LPARAM) icon, 0, (rect_left.right + rect_left.left - size.cx) / 2, (rect_left.bottom + rect_left.top - size.cy) / 2, size.cx, size.cy, flags); } } else { /* Paint text label */ TCHAR buffer[256]; int n; UINT flags = 0; /* Setup flags for TextOut/mcDrawThemeText */ switch(button->style & (BS_LEFT | BS_CENTER | BS_RIGHT)) { case BS_LEFT: flags |= DT_LEFT; break; case BS_RIGHT: flags |= DT_RIGHT; break; default: if(GetWindowLong(win, GWL_EXSTYLE) & WS_EX_RIGHT) flags |= DT_RIGHT; else flags |= DT_CENTER; break; } switch(button->style & (BS_TOP | BS_VCENTER | BS_BOTTOM)) { case BS_TOP: flags |= DT_TOP; break; case BS_BOTTOM: flags |= DT_BOTTOM; break; default: flags |= DT_VCENTER; break; } if(button->style & BS_MULTILINE) flags |= DT_WORDBREAK; else flags |= DT_SINGLELINE; if(button->hide_accel) flags |= DT_HIDEPREFIX; n = MC_SEND(win, WM_GETTEXT, MC_SIZEOF_ARRAY(buffer), buffer); if(button->theme) { mcDrawThemeText(button->theme, dc, BP_PUSHBUTTON, state_left, buffer, n, flags, 0, &rect_left); } else { SetBkMode(dc, TRANSPARENT); SetTextColor(dc, GetSysColor(COLOR_BTNTEXT)); mc_rect_offset(&rect_left, text_offset, text_offset); DrawText(dc, buffer, n, &rect_left, flags); } } SelectObject(dc, old_font); SetBkMode(dc, old_bk_mode); SetTextColor(dc, old_text_color); SelectObject(dc, old_clip); }
QPixmap QPixmap::fromWinHICON(HICON icon) { HDC screenDevice = GetDC(0); HDC hdc = CreateCompatibleDC(screenDevice); ReleaseDC(0, screenDevice); ICONINFO iconinfo; bool result = GetIconInfo(icon, &iconinfo); if (!result) qWarning("QPixmap::fromWinHICON(), failed to GetIconInfo()"); int w = 0; int h = 0; if (!iconinfo.xHotspot || !iconinfo.yHotspot) { // We could not retrieve the icon size via GetIconInfo, // so we try again using the icon bitmap. BITMAP bm; int result = GetObject(iconinfo.hbmColor, sizeof(BITMAP), &bm); if (!result) result = GetObject(iconinfo.hbmMask, sizeof(BITMAP), &bm); if (!result) { qWarning("QPixmap::fromWinHICON(), failed to retrieve icon size"); return QPixmap(); } w = bm.bmWidth; h = bm.bmHeight; } else { // x and y Hotspot describes the icon center w = iconinfo.xHotspot * 2; h = iconinfo.yHotspot * 2; } const DWORD dwImageSize = w * h * 4; BITMAPINFO bmi; memset(&bmi, 0, sizeof(bmi)); bmi.bmiHeader.biSize = sizeof(BITMAPINFO); bmi.bmiHeader.biWidth = w; bmi.bmiHeader.biHeight = -h; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; bmi.bmiHeader.biSizeImage = dwImageSize; uchar* bits; HBITMAP winBitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void**) &bits, 0, 0); if (winBitmap ) memset(bits, 0xff, dwImageSize); if (!winBitmap) { qWarning("QPixmap::fromWinHICON(), failed to CreateDIBSection()"); return QPixmap(); } HGDIOBJ oldhdc = (HBITMAP)SelectObject(hdc, winBitmap); if (!DrawIconEx( hdc, 0, 0, icon, w, h, 0, 0, DI_NORMAL)) qWarning("QPixmap::fromWinHICON(), failed to DrawIcon()"); uint mask = 0xff000000; // Create image and copy data into image. QImage image(w, h, QImage::Format_ARGB32); if (!image.isNull()) { // failed to alloc? int bytes_per_line = w * sizeof(QRgb); for (int y=0; y < h; ++y) { QRgb *dest = (QRgb *) image.scanLine(y); const QRgb *src = (const QRgb *) (bits + y * bytes_per_line); for (int x=0; x < w; ++x) { dest[x] = src[x]; } } } if (!DrawIconEx( hdc, 0, 0, icon, w, h, 0, 0, DI_MASK)) qWarning("QPixmap::fromWinHICON(), failed to DrawIcon()"); if (!image.isNull()) { // failed to alloc? int bytes_per_line = w * sizeof(QRgb); for (int y=0; y < h; ++y) { QRgb *dest = (QRgb *) image.scanLine(y); const QRgb *src = (const QRgb *) (bits + y * bytes_per_line); for (int x=0; x < w; ++x) { if (!src[x]) dest[x] = dest[x] | mask; } } } SelectObject(hdc, oldhdc); //restore state DeleteObject(winBitmap); DeleteDC(hdc); return QPixmap::fromImage(image); }
void CpermoDlg::DrawInfo(CDC* pDC) { CFont font, *pOldFont; LOGFONT logFont; pDC->GetCurrentFont()->GetLogFont(&logFont); logFont.lfWidth = 0; logFont.lfHeight = nFontSize; logFont.lfWeight = FW_REGULAR; lstrcpy(logFont.lfFaceName, _T("微软雅黑")); font.CreateFontIndirect(&logFont); pOldFont = pDC->SelectObject(&font); COLORREF cOldTextColor; if (IDM_GREEN == nSkin || IDM_ORANGE == nSkin) { cOldTextColor = pDC->SetTextColor(RGB(0, 0, 0)); } else { cOldTextColor = pDC->SetTextColor(RGB(255, 255, 255)); } int nOldBkMode = pDC->SetBkMode(TRANSPARENT); CString strCPU, strMem, strNetUp, strNetDown; strCPU.Format(_T("%d%%"), nCPU); strMem.Format(_T("%d%%"), nMem); if (fNetUp >= 1000) { strNetUp.Format(_T("%.2fMB/S"), fNetUp/1024.0); } else { if (fNetUp < 100) { strNetUp.Format(_T("%.1fKB/S"), fNetUp); } else { strNetUp.Format(_T("%.0fKB/S"), fNetUp); } } if (fNetDown >= 1000) { strNetDown.Format(_T("%.2fMB/S"), fNetDown/1024.0); } else { if (fNetDown < 100) { strNetDown.Format(_T("%.1fKB/S"), fNetDown); } else { strNetDown.Format(_T("%.0fKB/S"), fNetDown); } } CRect rText; rText.left = 1; rText.right = 36; rText.top = 2; rText.bottom = 21; pDC->DrawText(strCPU, &rText, DT_CENTER | DT_VCENTER | DT_SINGLELINE); rText.left = 186; rText.right = 219; pDC->DrawText(strMem, &rText, DT_CENTER | DT_VCENTER | DT_SINGLELINE); if (IDM_BLACK == nSkin || IDM_BLUE == nSkin) { pDC->SetTextColor(RGB(255, 255, 255)); } else { pDC->SetTextColor(RGB(0, 0, 0)); } CRect rcIcon; rcIcon.left = 38; rcIcon.right = 50; rcIcon.top = 5; rcIcon.bottom = 17; DrawIconEx(pDC->GetSafeHdc(), rcIcon.left, rcIcon.top, LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_DOWN)), rcIcon.Width(), rcIcon.Height(), 0, NULL, DI_NORMAL); rText.left = 52; rText.right = 110; pDC->DrawText(strNetDown, &rText, DT_CENTER | DT_VCENTER | DT_SINGLELINE); rcIcon.left = 112; rcIcon.right = 124; DrawIconEx(pDC->GetSafeHdc(), rcIcon.left, rcIcon.top, LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_UP)), rcIcon.Width(), rcIcon.Height(), 0, NULL, DI_NORMAL); rText.left = 126; rText.right = 185; pDC->DrawText(strNetUp, &rText, DT_CENTER | DT_VCENTER | DT_SINGLELINE); pDC->SetTextColor(cOldTextColor); pDC->SetBkMode(nOldBkMode); pDC->SelectObject(pOldFont); font.DeleteObject(); }
/* ================ rvGENavigator::WndProc Window Procedure ================ */ LRESULT CALLBACK rvGENavigator::WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { rvGENavigator *nav = ( rvGENavigator * ) GetWindowLong( hWnd, GWL_USERDATA ); switch( msg ) { case WM_INITMENUPOPUP: return SendMessage( gApp.GetMDIFrame( ), msg, wParam, lParam ); case WM_ACTIVATE: common->ActivateTool( LOWORD( wParam ) != WA_INACTIVE ); break; case WM_ERASEBKGND: return TRUE; case WM_DESTROY: gApp.GetOptions().SetWindowPlacement( "navigator", hWnd ); break; case WM_CLOSE: gApp.GetOptions().SetNavigatorVisible( false ); nav->Show( false ); return 0; case WM_DRAWITEM: { DRAWITEMSTRUCT *dis = ( DRAWITEMSTRUCT * ) lParam; idWindow *window = ( idWindow * )dis->itemData; if( window ) { rvGEWindowWrapper *wrapper = rvGEWindowWrapper::GetWrapper( window ); idStr name = window->GetName(); RECT rDraw; float offset; bool disabled; idWindow *parent = window; offset = 1; disabled = false; while( parent = parent->GetParent( ) ) { if( rvGEWindowWrapper::GetWrapper( parent )->IsHidden( ) ) { disabled = true; } offset += 10; } CopyRect( &rDraw, &dis->rcItem ); rDraw.right = rDraw.left + GENAV_ITEMHEIGHT; rDraw.top ++; rDraw.right ++; FrameRect( dis->hDC, &rDraw, ( HBRUSH )GetStockObject( BLACK_BRUSH ) ); rDraw.right --; FillRect( dis->hDC, &rDraw, GetSysColorBrush( COLOR_3DFACE ) ); Draw3dRect( dis->hDC, &rDraw, GetSysColorBrush( COLOR_3DHILIGHT ), GetSysColorBrush( COLOR_3DSHADOW ) ); InflateRect( &rDraw, -3, -3 ); Draw3dRect( dis->hDC, &rDraw, GetSysColorBrush( COLOR_3DSHADOW ), GetSysColorBrush( COLOR_3DHILIGHT ) ); if( !wrapper->IsHidden( ) ) { DrawIconEx( dis->hDC, rDraw.left, rDraw.top, disabled ? nav->mVisibleIconDisabled : nav->mVisibleIcon, 16, 16, 0, NULL, DI_NORMAL ); } CopyRect( &rDraw, &dis->rcItem ); rDraw.left += GENAV_ITEMHEIGHT; rDraw.left += 1; if( dis->itemState & ODS_SELECTED ) { FillRect( dis->hDC, &rDraw, GetSysColorBrush( COLOR_HIGHLIGHT ) ); } else { FillRect( dis->hDC, &rDraw, GetSysColorBrush( COLOR_WINDOW ) ); } if( wrapper->CanHaveChildren( ) && window->GetChildCount( ) ) { if( wrapper->IsExpanded( ) ) { DrawIconEx( dis->hDC, rDraw.left + offset, rDraw.top + 3, nav->mCollapseIcon, 16, 16, 0, NULL, DI_NORMAL ); } else { DrawIconEx( dis->hDC, rDraw.left + offset, rDraw.top + 3, nav->mExpandIcon, 16, 16, 0, NULL, DI_NORMAL ); } } HPEN pen = CreatePen( PS_SOLID, 1, GetSysColor( COLOR_3DSHADOW ) ); HPEN oldpen = ( HPEN )SelectObject( dis->hDC, pen ); MoveToEx( dis->hDC, rDraw.left, dis->rcItem.top, NULL ); LineTo( dis->hDC, dis->rcItem.right, dis->rcItem.top ); MoveToEx( dis->hDC, rDraw.left, dis->rcItem.bottom, NULL ); LineTo( dis->hDC, dis->rcItem.right, dis->rcItem.bottom ); SelectObject( dis->hDC, oldpen ); DeleteObject( pen ); rDraw.left += offset; rDraw.left += 20; int colorIndex = ( ( dis->itemState & ODS_SELECTED ) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT ); SetTextColor( dis->hDC, GetSysColor( colorIndex ) ); DrawText( dis->hDC, name, name.Length(), &rDraw, DT_LEFT | DT_VCENTER | DT_SINGLELINE ); if( wrapper->GetVariableDict().GetNumKeyVals( ) || wrapper->GetScriptDict().GetNumKeyVals( ) ) { DrawIconEx( dis->hDC, dis->rcItem.right - 16, ( dis->rcItem.bottom + dis->rcItem.top ) / 2 - 6, ( dis->itemState & ODS_SELECTED ) ? nav->mScriptsLightIcon : nav->mScriptsIcon, 13, 13, 0, NULL, DI_NORMAL ); } } break; } case WM_MEASUREITEM: { MEASUREITEMSTRUCT *mis = ( MEASUREITEMSTRUCT * ) lParam; mis->itemHeight = 22; break; } case WM_CREATE: { LPCREATESTRUCT cs; LVCOLUMN col; // Attach the class to the window first cs = ( LPCREATESTRUCT ) lParam; nav = ( rvGENavigator * ) cs->lpCreateParams; SetWindowLong( hWnd, GWL_USERDATA, ( LONG )nav ); // Create the List view nav->mTree = CreateWindowEx( 0, "SysListView32", "", WS_VSCROLL | WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_NOCOLUMNHEADER | LVS_SHOWSELALWAYS, 0, 0, 0, 0, hWnd, ( HMENU )IDC_GUIED_WINDOWTREE, win32.hInstance, 0 ); ListView_SetExtendedListViewStyle( nav->mTree, LVS_EX_FULLROWSELECT ); ListView_SetBkColor( nav->mTree, GetSysColor( COLOR_3DFACE ) ); ListView_SetTextBkColor( nav->mTree, GetSysColor( COLOR_3DFACE ) ); nav->mListWndProc = ( WNDPROC )GetWindowLong( nav->mTree, GWL_WNDPROC ); SetWindowLong( nav->mTree, GWL_USERDATA, ( LONG )nav ); SetWindowLong( nav->mTree, GWL_WNDPROC, ( LONG )ListWndProc ); // Insert the only column col.mask = 0; ListView_InsertColumn( nav->mTree, 0, &col ); break; } case WM_SIZE: { RECT rClient; MoveWindow( nav->mTree, 0, 0, LOWORD( lParam ), HIWORD( lParam ), TRUE ); GetClientRect( nav->mTree, &rClient ); ListView_SetColumnWidth( nav->mTree, 0, rClient.right - rClient.left - 1 ); break; } case WM_NCACTIVATE: return gApp.ToolWindowActivate( gApp.GetMDIFrame(), msg, wParam, lParam ); case WM_NOTIFY: { LPNMHDR nh; nh = ( LPNMHDR ) lParam; switch( nh->code ) { case NM_CLICK: case NM_DBLCLK: { DWORD dwpos = GetMessagePos(); LVHITTESTINFO info; info.pt.x = LOWORD( dwpos ); info.pt.y = HIWORD( dwpos ); MapWindowPoints( HWND_DESKTOP, nh->hwndFrom, &info.pt, 1 ); int index = ListView_HitTest( nav->mTree, &info ); if( index != -1 ) { RECT rItem; int offset; ListView_GetItemRect( nav->mTree, index, &rItem, LVIR_BOUNDS ); LVITEM item; item.mask = LVIF_PARAM; item.iItem = index; ListView_GetItem( nav->mTree, &item ); idWindow *window = ( idWindow * )item.lParam; rvGEWindowWrapper *wrapper = rvGEWindowWrapper::GetWrapper( window ); offset = wrapper->GetDepth( ) * 10 + 1; if( info.pt.x < GENAV_ITEMHEIGHT ) { if( !rvGEWindowWrapper::GetWrapper( window )->IsHidden( ) ) { nav->mWorkspace->HideWindow( window ); } else { nav->mWorkspace->UnhideWindow( window ); } } else if( info.pt.x > GENAV_ITEMHEIGHT + offset && info.pt.x < GENAV_ITEMHEIGHT + offset + 16 ) { if( wrapper->CanHaveChildren( ) && window->GetChildCount( ) ) { if( wrapper->IsExpanded( ) ) { wrapper->Collapse( ); nav->Update( ); } else { wrapper->Expand( ); nav->Update( ); } } } else if( nh->code == NM_DBLCLK ) { SendMessage( gApp.GetMDIFrame( ), WM_COMMAND, MAKELONG( ID_GUIED_ITEM_PROPERTIES, 0 ), 0 ); } } break; } case NM_RCLICK: { DWORD dwpos = GetMessagePos(); LVHITTESTINFO info; info.pt.x = LOWORD( dwpos ); info.pt.y = HIWORD( dwpos ); MapWindowPoints( HWND_DESKTOP, nh->hwndFrom, &info.pt, 1 ); int index = ListView_HitTest( nav->mTree, &info ); if( index != -1 ) { ClientToScreen( hWnd, &info.pt ); HMENU menu = GetSubMenu( LoadMenu( gApp.GetInstance(), MAKEINTRESOURCE( IDR_GUIED_ITEM_POPUP ) ), 0 ); TrackPopupMenu( menu, TPM_RIGHTBUTTON | TPM_LEFTALIGN, info.pt.x, info.pt.y, 0, gApp.GetMDIFrame( ), NULL ); DestroyMenu( menu ); } break; } case LVN_ITEMCHANGED: { NMLISTVIEW *nml = ( NMLISTVIEW * ) nh; if( ( nml->uNewState & LVIS_SELECTED ) != ( nml->uOldState & LVIS_SELECTED ) ) { LVITEM item; item.iItem = nml->iItem; item.mask = LVIF_PARAM; ListView_GetItem( nav->mTree, &item ); if( nml->uNewState & LVIS_SELECTED ) { nav->mWorkspace->GetSelectionMgr().Add( ( idWindow * )item.lParam, false ); } else { nav->mWorkspace->GetSelectionMgr().Remove( ( idWindow * )item.lParam ); } } break; } } break; } } return DefWindowProc( hWnd, msg, wParam, lParam ); }
void CtrlDisAsmView::onPaint(WPARAM wParam, LPARAM lParam) { if (!debugger->isAlive()) return; PAINTSTRUCT ps; HDC actualHdc = BeginPaint(wnd, &ps); HDC hdc = CreateCompatibleDC(actualHdc); HBITMAP hBM = CreateCompatibleBitmap(actualHdc, rect.right-rect.left, rect.bottom-rect.top); SelectObject(hdc, hBM); SetBkMode(hdc, TRANSPARENT); HPEN nullPen=CreatePen(0,0,0xffffff); HBRUSH nullBrush=CreateSolidBrush(0xffffff); HBRUSH currentBrush=CreateSolidBrush(0xffefe8); HPEN oldPen=(HPEN)SelectObject(hdc,nullPen); HBRUSH oldBrush=(HBRUSH)SelectObject(hdc,nullBrush); HFONT oldFont = (HFONT)SelectObject(hdc,(HGDIOBJ)font); HICON breakPoint = (HICON)LoadIcon(GetModuleHandle(0),(LPCWSTR)IDI_STOP); HICON breakPointDisable = (HICON)LoadIcon(GetModuleHandle(0),(LPCWSTR)IDI_STOPDISABLE); unsigned int address = windowStart; std::map<u32,int> addressPositions; const std::set<std::string> currentArguments = getSelectedLineArguments(); DisassemblyLineInfo line; for (int i = 0; i < visibleRows; i++) { manager.getLine(address,displaySymbols,line); int rowY1 = rowHeight*i; int rowY2 = rowHeight*(i+1); addressPositions[address] = rowY1; // draw background COLORREF backgroundColor = whiteBackground ? 0xFFFFFF : debugger->getColor(address); COLORREF textColor = 0x000000; if (isInInterval(address,line.totalSize,debugger->getPC())) { backgroundColor = scaleColor(backgroundColor,1.05f); } if (address >= selectRangeStart && address < selectRangeEnd && searching == false) { if (hasFocus) { backgroundColor = address == curAddress ? 0xFF8822 : 0xFF9933; textColor = 0xFFFFFF; } else { backgroundColor = 0xC0C0C0; } } HBRUSH backgroundBrush = CreateSolidBrush(backgroundColor); HPEN backgroundPen = CreatePen(0,0,backgroundColor); SelectObject(hdc,backgroundBrush); SelectObject(hdc,backgroundPen); Rectangle(hdc,0,rowY1,rect.right,rowY1+rowHeight); SelectObject(hdc,currentBrush); SelectObject(hdc,nullPen); DeleteObject(backgroundBrush); DeleteObject(backgroundPen); // display address/symbol bool enabled; if (CBreakPoints::IsAddressBreakPoint(address,&enabled)) { if (enabled) textColor = 0x0000FF; int yOffset = max(-1,(rowHeight-14+1)/2); if (!enabled) yOffset++; DrawIconEx(hdc,2,rowY1+1+yOffset,enabled ? breakPoint : breakPointDisable,32,32,0,0,DI_NORMAL); } SetTextColor(hdc,textColor); char addressText[64]; getDisasmAddressText(address,addressText,true,line.type == DISTYPE_OPCODE); TextOutA(hdc,pixelPositions.addressStart,rowY1+2,addressText,(int)strlen(addressText)); if (isInInterval(address,line.totalSize,debugger->getPC())) { TextOut(hdc,pixelPositions.opcodeStart-8,rowY1,L"■",1); } // display whether the condition of a branch is met if (line.info.isConditional && address == debugger->getPC()) { line.params += line.info.conditionMet ? " ; true" : " ; false"; } drawArguments(hdc, line, pixelPositions.argumentsStart, rowY1 + 2, textColor, currentArguments); SelectObject(hdc,boldfont); TextOutA(hdc,pixelPositions.opcodeStart,rowY1+2,line.name.c_str(),(int)line.name.size()); SelectObject(hdc,font); address += line.totalSize; } std::vector<BranchLine> branchLines = manager.getBranchLines(windowStart,address-windowStart); for (size_t i = 0; i < branchLines.size(); i++) { drawBranchLine(hdc,addressPositions,branchLines[i]); } SelectObject(hdc,oldFont); SelectObject(hdc,oldPen); SelectObject(hdc,oldBrush); // copy bitmap to the actual hdc BitBlt(actualHdc, 0, 0, rect.right, rect.bottom, hdc, 0, 0, SRCCOPY); DeleteObject(hBM); DeleteDC(hdc); DeleteObject(nullPen); DeleteObject(nullBrush); DeleteObject(currentBrush); DestroyIcon(breakPoint); DestroyIcon(breakPointDisable); EndPaint(wnd, &ps); }