/*********************************************************************** * PROGRESS_Draw * Draws the progress bar. */ static LRESULT PROGRESS_Draw (PROGRESS_INFO *infoPtr, HDC hdc) { HBRUSH hbrBar; int rightBar, rightMost, ledWidth; RECT rect; DWORD dwStyle; TRACE("(infoPtr=%p, hdc=%x)\n", infoPtr, hdc); /* get the required bar brush */ if (infoPtr->ColorBar == CLR_DEFAULT) hbrBar = GetSysColorBrush(COLOR_HIGHLIGHT); else hbrBar = CreateSolidBrush (infoPtr->ColorBar); /* get client rectangle */ GetClientRect (infoPtr->Self, &rect); InflateRect(&rect, -1, -1); /* get the window style */ dwStyle = GetWindowLongW (infoPtr->Self, GWL_STYLE); /* compute extent of progress bar */ if (dwStyle & PBS_VERTICAL) { rightBar = rect.bottom - MulDiv (infoPtr->CurVal - infoPtr->MinVal, rect.bottom - rect.top, infoPtr->MaxVal - infoPtr->MinVal); ledWidth = MulDiv (rect.right - rect.left, 2, 3); rightMost = rect.top; } else { rightBar = rect.left + MulDiv (infoPtr->CurVal - infoPtr->MinVal, rect.right - rect.left, infoPtr->MaxVal - infoPtr->MinVal); ledWidth = MulDiv (rect.bottom - rect.top, 2, 3); rightMost = rect.right; } /* now draw the bar */ if (dwStyle & PBS_SMOOTH) { if (dwStyle & PBS_VERTICAL) rect.top = rightBar; else rect.right = rightBar; FillRect(hdc, &rect, hbrBar); } else { if (dwStyle & PBS_VERTICAL) { while(rect.bottom > rightBar) { rect.top = rect.bottom - ledWidth; if (rect.top < rightMost) rect.top = rightMost; FillRect(hdc, &rect, hbrBar); rect.bottom = rect.top - LED_GAP; } } else { while(rect.left < rightBar) { rect.right = rect.left + ledWidth; if (rect.right > rightMost) rect.right = rightMost; FillRect(hdc, &rect, hbrBar); rect.left = rect.right + LED_GAP; } } } /* delete bar brush */ if (infoPtr->ColorBar != CLR_DEFAULT) DeleteObject (hbrBar); return 0; }
void ME_DrawParagraph(ME_Context *c, ME_DisplayItem *paragraph) { int align = SetTextAlign(c->hDC, TA_BASELINE); ME_DisplayItem *p; ME_Run *run; ME_Paragraph *para = NULL; RECT rc, rcPara; int y = c->pt.y; int height = 0, baseline = 0, no=0, pno = 0; int xs, xe; int visible = 0; int nMargWidth = 0; c->pt.x = c->rcView.left; rcPara.left = c->rcView.left; rcPara.right = c->rcView.right; for (p = paragraph; p!=paragraph->member.para.next_para; p = p->next) { switch(p->type) { case diParagraph: para = &p->member.para; break; case diStartRow: assert(para); nMargWidth = (pno==0?para->nFirstMargin:para->nLeftMargin); xs = c->rcView.left+nMargWidth; xe = c->rcView.right-para->nRightMargin; y += height; rcPara.top = y; rcPara.bottom = y+p->member.row.nHeight; visible = RectVisible(c->hDC, &rcPara); if (visible) { HBRUSH hbr; hbr = CreateSolidBrush(ME_GetBackColor(c->editor)); /* left margin */ rc.left = c->rcView.left; rc.right = c->rcView.left+nMargWidth; rc.top = y; rc.bottom = y+p->member.row.nHeight; FillRect(c->hDC, &rc, hbr/* c->hbrMargin */); /* right margin */ rc.left = xe; rc.right = c->rcView.right; FillRect(c->hDC, &rc, hbr/* c->hbrMargin */); rc.left = c->rcView.left+nMargWidth; rc.right = xe; FillRect(c->hDC, &rc, hbr); DeleteObject(hbr); } if (me_debug) { const WCHAR wszRowDebug[] = {'r','o','w','[','%','d',']',0}; WCHAR buf[128]; POINT pt = c->pt; wsprintfW(buf, wszRowDebug, no); pt.y = 12+y; ME_DebugWrite(c->hDC, &pt, buf); } height = p->member.row.nHeight; baseline = p->member.row.nBaseline; pno++; break; case diRun: assert(para); run = &p->member.run; if (visible && me_debug) { rc.left = c->rcView.left+run->pt.x; rc.right = c->rcView.left+run->pt.x+run->nWidth; rc.top = c->pt.y+run->pt.y; rc.bottom = c->pt.y+run->pt.y+height; TRACE("rc = (%ld, %ld, %ld, %ld)\n", rc.left, rc.top, rc.right, rc.bottom); if (run->nFlags & MERF_SKIPPED) DrawFocusRect(c->hDC, &rc); else FrameRect(c->hDC, &rc, GetSysColorBrush(COLOR_GRAYTEXT)); } if (visible) ME_DrawRun(c, run->pt.x, c->pt.y+run->pt.y+baseline, p, ¶graph->member.para); if (me_debug) { /* I'm using %ls, hope wsprintfW is not going to use wrong (4-byte) WCHAR version */ const WCHAR wszRunDebug[] = {'[','%','d',':','%','x',']',' ','%','l','s',0}; WCHAR buf[2560]; POINT pt; pt.x = run->pt.x; pt.y = c->pt.y + run->pt.y; wsprintfW(buf, wszRunDebug, no, p->member.run.nFlags, p->member.run.strText->szData); ME_DebugWrite(c->hDC, &pt, buf); } /* c->pt.x += p->member.run.nWidth; */ break; default: break; } no++; } SetTextAlign(c->hDC, align); }
BOOL CPropPageFrameDefault::Create(DWORD dwWindowStyle, const RECT &rect, CWnd *pwndParent, UINT nID) { return CWnd::Create( AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, AfxGetApp()->LoadStandardCursor(IDC_ARROW), GetSysColorBrush(COLOR_3DFACE)), _T("Page Frame"), dwWindowStyle, rect, pwndParent, nID); }
void CToolTipCtrlX::CustomPaint(LPNMTTCUSTOMDRAW pNMCD) { CWnd* pwnd = CWnd::FromHandle(pNMCD->nmcd.hdr.hwndFrom); CDC* pdc = CDC::FromHandle(pNMCD->nmcd.hdc); // Windows Vista (General) // ----------------------- // *Need* to use (some aspects) of the 'TOOLTIP' theme to get typical Vista tooltips. // // Windows Vista *without* SP1 // --------------------------- // The Vista 'TOOLTIP' theme offers a bold version of the standard tooltip font via // the TTP_STANDARDTITLE part id. Furthermore TTP_STANDARDTITLE is the same font as // the standard tooltip font (TTP_STANDARD). So, the 'TOOLTIP' theme can get used // thoroughly. // // Windows Vista *with* SP1 // ------------------------ // The Vista SP1(!) 'TOOLTIP' theme does though *not* offer a bold font. Keep // in mind that TTP_STANDARDTITLE does not return a bold font. Keep also in mind // that TTP_STANDARDTITLE is even a *different* font than TTP_STANDARD! // Which means, that TTP_STANDARDTITLE should *not* be used within the same line // as TTP_STANDARD. It just looks weird. TTP_STANDARDTITLE could be used for a // single line (the title line), but it would though not give us a bold font. // So, actually we can use the Vista 'TOOLTIP' theme only for getting the proper // tooltip background. // // Windows XP // ---------- // Can *not* use the 'TOOLTIP' theme at all because it would give us only a (non-bold) // black font on a white tooltip window background. Seems that the 'TOOLTIP' theme under // WinXP is just using the default Window values (black+white) and does not // use any of the tooltip specific Window metrics... // bool bUseEmbeddedThemeFonts = false; HTHEME hTheme = NULL; if (theApp.IsVistaThemeActive()) { hTheme = OpenThemeData(*pwnd, L"TOOLTIP"); // Using the theme's fonts works only under Vista without SP1. When SP1 // is installed the fonts which are used for TTP_STANDARDTITLE and TTP_STANDARD // do no longer match (should not get displayed within the same text line). if (hTheme) bUseEmbeddedThemeFonts = true; } CString strText; pwnd->GetWindowText(strText); CRect rcWnd; pwnd->GetWindowRect(&rcWnd); CFont* pOldDCFont = NULL; if (hTheme == NULL || !bUseEmbeddedThemeFonts) { // If we have a theme, we try to query the correct fonts from it if (m_fontNormal.m_hObject == NULL && hTheme) { // Windows Vista Ultimate, 6.0.6001 SP1 Build 6001, English with German Language Pack // ---------------------------------------------------------------------------------- // TTP_STANDARD, TTSS_NORMAL // Height -12 // Weight 400 // CharSet 1 // Quality 5 // FaceName "Segoe UI" // // TTP_STANDARDTITLE, TTSS_NORMAL // Height -12 // Weight 400 // CharSet 1 // Quality 5 // FaceName "Segoe UI Fett" (!!!) Note: "Fett" (that is German !?) // // That font name ("Segoe UI *Fett*") looks quite suspicious. I would not be surprised // if that eventually leads to a problem within the font mapper which may not be capable // of finding the (english) version of that font and thus falls back to the standard // system font. At least this would explain why the TTP_STANDARD and TTP_STANDARDTITLE // fonts are *different* on that particular Windows Vista system. LOGFONT lf = {0}; if (GetThemeFont(hTheme, pdc->m_hDC, TTP_STANDARD, TTSS_NORMAL, TMT_FONT, &lf) == S_OK) { VERIFY( m_fontNormal.CreateFontIndirect(&lf) ); if (m_bCol1Bold && m_fontBold.m_hObject == NULL) { memset(&lf, 0, sizeof(lf)); if (GetThemeFont(hTheme, pdc->m_hDC, TTP_STANDARDTITLE, TTSS_NORMAL, TMT_FONT, &lf) == S_OK) VERIFY( m_fontBold.CreateFontIndirect(&lf) ); } // Get the tooltip font color COLORREF crText; if (GetThemeColor(hTheme, TTP_STANDARD, TTSS_NORMAL, TMT_TEXTCOLOR, &crText) == S_OK) m_crTooltipTextColor = crText; } } // If needed, create the standard tooltip font which was queried from the system metrics if (m_fontNormal.m_hObject == NULL && m_lfNormal.lfHeight != 0) VERIFY( m_fontNormal.CreateFontIndirect(&m_lfNormal) ); // Select the tooltip font if (m_fontNormal.m_hObject != NULL) { pOldDCFont = pdc->SelectObject(&m_fontNormal); // If needed, create the bold version of the tooltip font by deriving it from the standard font if (m_bCol1Bold && m_fontBold.m_hObject == NULL) { LOGFONT lf; m_fontNormal.GetLogFont(&lf); lf.lfWeight = FW_BOLD; VERIFY( m_fontBold.CreateFontIndirect(&lf) ); } } // Set the font color (queried from system metrics or queried from theme) pdc->SetTextColor(m_crTooltipTextColor); } // Auto-format the text only if explicitly requested. Otherwise we would also format // single line tooltips for regular list items, and if those list items contain ':' // characters they would be shown partially in bold. For performance reasons, the // auto-format is to be requested by appending the TOOLTIP_AUTOFORMAT_SUFFIX_CH // character. Appending, because we can remove that character efficiently without // re-allocating the entire string. bool bAutoFormatText = strText.GetLength() > 0 && strText[strText.GetLength() - 1] == TOOLTIP_AUTOFORMAT_SUFFIX_CH; if (bAutoFormatText) strText.Truncate(strText.GetLength() - 1); // truncate the TOOLTIP_AUTOFORMAT_SUFFIX_CH char by setting it to NUL bool bShowFileIcon = m_bShowFileIcon && bAutoFormatText; if (bShowFileIcon) { int iPosNL = strText.Find(_T('\n')); if (iPosNL > 0) { int iPosColon = strText.Find(_T(':')); if (iPosColon < iPosNL) bShowFileIcon = false; // 1st line does not contain a filename } } int iTextHeight = 0; int iMaxCol1Width = 0; int iMaxCol2Width = 0; int iMaxSingleLineWidth = 0; CSize sizText(0); int iPos = 0; int iCaptionHeight = 0; const int iCaptionEnd = bShowFileIcon ? max(strText.Find(_T("\n<br_head>\n")), 0) : 0; // special tooltip with file icon const int iLineHeightOff = 1; const int iIconMinYBorder = bShowFileIcon ? 3 : 0; const int iIconWidth = bShowFileIcon ? theApp.GetBigSytemIconSize().cx : 0; const int iIconHeight = bShowFileIcon ? theApp.GetBigSytemIconSize().cy : 0; const int iIconDrawingWidth = bShowFileIcon ? (iIconWidth + 9) : 0; while (iPos != -1) { CString strLine = GetNextString(strText, _T('\n'), iPos); int iColon = bAutoFormatText ? strLine.Find(_T(':')) : -1; if (iColon != -1) { CSize siz; if (hTheme && bUseEmbeddedThemeFonts) { CRect rcExtent; CRect rcBounding(0, 0, 32767, 32767); GetThemeTextExtent(hTheme, *pdc, m_bCol1Bold ? TTP_STANDARDTITLE : TTP_STANDARD, TTSS_NORMAL, strLine, iColon + 1, m_dwCol1DrawTextFlags, &rcBounding, &rcExtent); siz.cx = rcExtent.Width(); siz.cy = rcExtent.Height(); } else { CFont* pOldFont = m_bCol1Bold ? pdc->SelectObject(&m_fontBold) : NULL; siz = pdc->GetTextExtent(strLine, iColon + 1); if (pOldFont) pdc->SelectObject(pOldFont); } iMaxCol1Width = max<int>(iMaxCol1Width, siz.cx + ((bShowFileIcon && iPos <= iCaptionEnd + strLine.GetLength()) ? iIconDrawingWidth : 0)); iTextHeight = siz.cy + iLineHeightOff; // update height with 'col1' string, because 'col2' string might be empty and therefore has no height if (iPos <= iCaptionEnd) iCaptionHeight += siz.cy + iLineHeightOff; else sizText.cy += siz.cy + iLineHeightOff; LPCTSTR pszCol2 = (LPCTSTR)strLine + iColon + 1; while (_istspace((_TUCHAR)*pszCol2)) pszCol2++; if (*pszCol2 != _T('\0')) { if (hTheme && bUseEmbeddedThemeFonts) { CRect rcExtent; CRect rcBounding(0, 0, 32767, 32767); GetThemeTextExtent(hTheme, *pdc, TTP_STANDARD, TTSS_NORMAL, pszCol2, ((LPCTSTR)strLine + strLine.GetLength()) - pszCol2, m_dwCol2DrawTextFlags, &rcBounding, &rcExtent); siz.cx = rcExtent.Width(); siz.cy = rcExtent.Height(); } else { siz = pdc->GetTextExtent(pszCol2, ((LPCTSTR)strLine + strLine.GetLength()) - pszCol2); } iMaxCol2Width = max<int>(iMaxCol2Width, siz.cx); } } else if (bShowFileIcon && iPos <= iCaptionEnd && iPos == strLine.GetLength() + 1){ // file name, printed bold on top without any tabbing or desc CSize siz; if (hTheme && bUseEmbeddedThemeFonts) { CRect rcExtent; CRect rcBounding(0, 0, 32767, 32767); GetThemeTextExtent(hTheme, *pdc, m_bCol1Bold ? TTP_STANDARDTITLE : TTP_STANDARD, TTSS_NORMAL, strLine, strLine.GetLength(), m_dwCol1DrawTextFlags, &rcBounding, &rcExtent); siz.cx = rcExtent.Width(); siz.cy = rcExtent.Height(); } else { CFont* pOldFont = m_bCol1Bold ? pdc->SelectObject(&m_fontBold) : NULL; siz = pdc->GetTextExtent(strLine); if (pOldFont) pdc->SelectObject(pOldFont); } iMaxSingleLineWidth = max<int>(iMaxSingleLineWidth, siz.cx + iIconDrawingWidth); iCaptionHeight += siz.cy + iLineHeightOff; } else if (!strLine.IsEmpty() && strLine.Compare(_T("<br>")) != 0 && strLine.Compare(_T("<br_head>")) != 0) { CSize siz; if (hTheme && bUseEmbeddedThemeFonts) { CRect rcExtent; CRect rcBounding(0, 0, 32767, 32767); GetThemeTextExtent(hTheme, *pdc, TTP_STANDARD, TTSS_NORMAL, strLine, strLine.GetLength(), m_dwCol2DrawTextFlags, &rcBounding, &rcExtent); siz.cx = rcExtent.Width(); siz.cy = rcExtent.Height(); } else { siz = pdc->GetTextExtent(strLine); } iMaxSingleLineWidth = max<int>(iMaxSingleLineWidth, siz.cx + ((bShowFileIcon && iPos <= iCaptionEnd) ? iIconDrawingWidth : 0)); if (bShowFileIcon && iPos <= iCaptionEnd + strLine.GetLength()) iCaptionHeight += siz.cy + iLineHeightOff; else sizText.cy += siz.cy + iLineHeightOff; } else{ CSize siz; if (hTheme && bUseEmbeddedThemeFonts) { CRect rcExtent; CRect rcBounding(0, 0, 32767, 32767); GetThemeTextExtent(hTheme, *pdc, TTP_STANDARD, TTSS_NORMAL, _T(" "), 1, m_dwCol2DrawTextFlags, &rcBounding, &rcExtent); siz.cx = rcExtent.Width(); siz.cy = rcExtent.Height(); } else { // TODO: Would need to use 'GetTabbedTextExtent' here, but do we actually use 'tabbed' text here at all ?? siz = pdc->GetTextExtent(_T(" "), 1); } sizText.cy += siz.cy + iLineHeightOff; } } if (bShowFileIcon && iCaptionEnd > 0) iCaptionHeight = max<int>(iCaptionHeight, theApp.GetBigSytemIconSize().cy + (2*iIconMinYBorder)); sizText.cy += iCaptionHeight; if (hTheme && theApp.m_ullComCtrlVer >= MAKEDLLVERULL(6,16,0,0)) sizText.cy += 2; // extra bottom margin for Vista/Theme iMaxCol1Width = min(m_iScreenWidth4, iMaxCol1Width); iMaxCol2Width = min(m_iScreenWidth4*2, iMaxCol2Width); const int iMiddleMargin = 6; iMaxSingleLineWidth = max(iMaxSingleLineWidth, iMaxCol1Width + iMiddleMargin + iMaxCol2Width); if (iMaxSingleLineWidth > m_iScreenWidth4*3) iMaxSingleLineWidth = m_iScreenWidth4*3; sizText.cx = iMaxSingleLineWidth; if (pNMCD->uDrawFlags & DT_CALCRECT) { pNMCD->nmcd.rc.left = rcWnd.left; pNMCD->nmcd.rc.top = rcWnd.top; pNMCD->nmcd.rc.right = rcWnd.left + sizText.cx; pNMCD->nmcd.rc.bottom = rcWnd.top + sizText.cy; } else { pwnd->ScreenToClient(&rcWnd); int iOldBkColor = -1; if (hTheme) { int iPartId = TTP_STANDARD; int iStateId = TTSS_NORMAL; if (IsThemeBackgroundPartiallyTransparent(hTheme, iPartId, iStateId)) DrawThemeParentBackground(m_hWnd, pdc->m_hDC, &rcWnd); DrawThemeBackground(hTheme, pdc->m_hDC, iPartId, iStateId, &rcWnd, NULL); } else { ::FillRect(*pdc, &rcWnd, GetSysColorBrush(COLOR_INFOBK)); iOldBkColor = pdc->SetBkColor(m_crTooltipBkColor); // Vista: Need to draw the window border explicitly !? if (theApp.m_ullComCtrlVer >= MAKEDLLVERULL(6,16,0,0)) { CPen pen; pen.CreatePen(0, 1, m_crTooltipTextColor); CPen *pOP = pdc->SelectObject(&pen); pdc->MoveTo(rcWnd.left, rcWnd.top); pdc->LineTo(rcWnd.right - 1, rcWnd.top); pdc->LineTo(rcWnd.right - 1, rcWnd.bottom - 1); pdc->LineTo(rcWnd.left, rcWnd.bottom - 1); pdc->LineTo(rcWnd.left, rcWnd.top); pdc->SelectObject(pOP); pen.DeleteObject(); } } int iOldBkMode = 0; if ((hTheme && !bUseEmbeddedThemeFonts) || (hTheme == NULL && iOldBkColor != -1)) iOldBkMode = pdc->SetBkMode(TRANSPARENT); CPoint ptText(pNMCD->nmcd.rc.left, pNMCD->nmcd.rc.top); iPos = 0; while (iPos != -1) { CString strLine = GetNextString(strText, _T('\n'), iPos); int iColon = bAutoFormatText ? strLine.Find(_T(':')) : -1; CRect rcDT; if (!bShowFileIcon || (unsigned)iPos > (unsigned)iCaptionEnd + strLine.GetLength()) rcDT.SetRect(ptText.x, ptText.y, ptText.x + iMaxCol1Width, ptText.y + iTextHeight); else rcDT.SetRect(ptText.x + iIconDrawingWidth, ptText.y, ptText.x + iMaxCol1Width, ptText.y + iTextHeight); if (iColon != -1) { // don't draw empty <col1> strings (they are still handy to use for skipping the <col1> space) if (iColon > 0) { if (hTheme && bUseEmbeddedThemeFonts) DrawThemeText(hTheme, pdc->m_hDC, m_bCol1Bold ? TTP_STANDARDTITLE : TTP_STANDARD, TTSS_NORMAL, strLine, iColon + 1, m_dwCol1DrawTextFlags, 0, &rcDT); else { CFont* pOldFont = m_bCol1Bold ? pdc->SelectObject(&m_fontBold) : NULL; pdc->DrawText(strLine, iColon + 1, &rcDT, m_dwCol1DrawTextFlags); if (pOldFont) pdc->SelectObject(pOldFont); } } LPCTSTR pszCol2 = (LPCTSTR)strLine + iColon + 1; while (_istspace((_TUCHAR)*pszCol2)) pszCol2++; if (*pszCol2 != _T('\0')) { rcDT.left = ptText.x + iMaxCol1Width + iMiddleMargin; rcDT.right = rcDT.left + iMaxCol2Width; if (hTheme && bUseEmbeddedThemeFonts) DrawThemeText(hTheme, pdc->m_hDC, TTP_STANDARD, TTSS_NORMAL, pszCol2, ((LPCTSTR)strLine + strLine.GetLength()) - pszCol2, m_dwCol2DrawTextFlags, 0, &rcDT); else pdc->DrawText(pszCol2, ((LPCTSTR)strLine + strLine.GetLength()) - pszCol2, &rcDT, m_dwCol2DrawTextFlags); } ptText.y += iTextHeight; } else if (bShowFileIcon && iPos <= iCaptionEnd && iPos == strLine.GetLength() + 1){ // first line on special fileicon tab - draw icon and bold filename if (hTheme && bUseEmbeddedThemeFonts) DrawThemeText(hTheme, pdc->m_hDC, m_bCol1Bold ? TTP_STANDARDTITLE : TTP_STANDARD, TTSS_NORMAL, strLine, strLine.GetLength(), m_dwCol1DrawTextFlags, 0, &CRect(ptText.x + iIconDrawingWidth, ptText.y, ptText.x + iMaxSingleLineWidth, ptText.y + iTextHeight)); else { CFont* pOldFont = m_bCol1Bold ? pdc->SelectObject(&m_fontBold) : NULL; pdc->DrawText(strLine, CRect(ptText.x + iIconDrawingWidth, ptText.y, ptText.x + iMaxSingleLineWidth, ptText.y + iTextHeight), m_dwCol1DrawTextFlags); if (pOldFont) pdc->SelectObject(pOldFont); } ptText.y += iTextHeight; int iImage = (int) theApp.GetFileTypeSystemImageIdx(strLine, -1, true); if (theApp.GetBigSystemImageList() != NULL) { int iPosY = rcDT.top; if (iCaptionHeight > iIconHeight) iPosY += (iCaptionHeight - iIconHeight) / 2; ::ImageList_Draw(theApp.GetBigSystemImageList(), iImage, pdc->GetSafeHdc(), ptText.x, iPosY, ILD_TRANSPARENT); } } else { bool bIsBrHeadLine = false; if (bAutoFormatText && (strLine.Compare(_T("<br>")) == 0 || (bIsBrHeadLine = strLine.Compare(_T("<br_head>")) == 0) == true)){ CPen pen; pen.CreatePen(0, 1, m_crTooltipTextColor); CPen *pOP = pdc->SelectObject(&pen); if (bIsBrHeadLine) ptText.y = iCaptionHeight; pdc->MoveTo(ptText.x, ptText.y + ((iTextHeight - 2) / 2)); pdc->LineTo(ptText.x + iMaxSingleLineWidth, ptText.y + ((iTextHeight - 2) / 2)); ptText.y += iTextHeight; pdc->SelectObject(pOP); pen.DeleteObject(); } else{ if (hTheme && bUseEmbeddedThemeFonts) { CRect rcLine(ptText.x, ptText.y, 32767, 32767); DrawThemeText(hTheme, pdc->m_hDC, TTP_STANDARD, TTSS_NORMAL, strLine, strLine.GetLength(), DT_EXPANDTABS | m_dwCol2DrawTextFlags, 0, &rcLine); ptText.y += iTextHeight; } else { // Text is written in the currently selected font. If 'nTabPositions' is 0 and 'lpnTabStopPositions' is NULL, // tabs are expanded to eight times the average character width. CSize siz; if (strLine.IsEmpty()) // Win98: To draw an empty line we need to output at least a space. siz = pdc->TabbedTextOut(ptText.x, ptText.y, _T(" "), 1, NULL, 0); else siz = pdc->TabbedTextOut(ptText.x, ptText.y, strLine, strLine.GetLength(), NULL, 0); ptText.y += siz.cy + iLineHeightOff; } } } } if (iOldBkColor != -1) pdc->SetBkColor(iOldBkColor); if (hTheme && !bUseEmbeddedThemeFonts) pdc->SetBkMode(iOldBkMode); } if (pOldDCFont) pdc->SelectObject(pOldDCFont); if (hTheme) CloseThemeData(hTheme); }
static void PaintWorker(MButtonCtrl *ctl, HDC hdcPaint) { if (hdcPaint) { HDC hdcMem; HBITMAP hbmMem; HBITMAP hbmOld = 0; RECT rcClient; HFONT hOldFont = 0; int xOffset = 0; GetClientRect(ctl->hwnd, &rcClient); hdcMem = CreateCompatibleDC(hdcPaint); hbmMem = CreateCompatibleBitmap(hdcPaint, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top); hbmOld = SelectObject(hdcMem, hbmMem); hOldFont = SelectObject(hdcMem, ctl->hFont); // If its a push button, check to see if it should stay pressed if (ctl->pushBtn && ctl->pbState) ctl->stateId = PBS_PRESSED; // Draw the flat button if (ctl->flatBtn) { if (ctl->hThemeToolbar && ctl->bThemed) { RECT rc = rcClient; int state = IsWindowEnabled(ctl->hwnd) ? (ctl->stateId == PBS_NORMAL && ctl->defbutton ? PBS_DEFAULTED : ctl->stateId) : PBS_DISABLED; SkinDrawBg(ctl->hwnd, hdcMem); if (MyIsThemeBackgroundPartiallyTransparent(ctl->hThemeToolbar, TP_BUTTON, TBStateConvert2Flat(state))) { MyDrawThemeParentBackground(ctl->hwnd, hdcMem, &rc); } MyDrawThemeBackground(ctl->hThemeToolbar, hdcMem, TP_BUTTON, TBStateConvert2Flat(state), &rc, &rc); } else { HBRUSH hbr; RECT rc = rcClient; if(ctl->buttonItem) { RECT rcParent; POINT pt; HWND hwndParent = pcli->hwndContactList; ImageItem *imgItem = ctl->stateId == PBS_HOT ? ctl->buttonItem->imgHover : (ctl->stateId == PBS_PRESSED ? ctl->buttonItem->imgPressed : ctl->buttonItem->imgNormal); LONG *glyphMetrics = ctl->stateId == PBS_HOT ? ctl->buttonItem->hoverGlyphMetrics : (ctl->stateId == PBS_PRESSED ? ctl->buttonItem->pressedGlyphMetrics : ctl->buttonItem->normalGlyphMetrics); //if(ctl->stateId == PBS_HOT && glyphMetrics[2] <= 1 && glyphMetrics[3] <= 1) // glyphMetrics = ctl->lastGlyphMetrics; GetWindowRect(ctl->hwnd, &rcParent); pt.x = rcParent.left; pt.y = rcParent.top; ScreenToClient(pcli->hwndContactList, &pt); BitBlt(hdcMem, 0, 0, rc.right, rc.bottom, g_CluiData.hdcBg, pt.x, pt.y, SRCCOPY); if(imgItem) DrawAlpha(hdcMem, &rc, 0, 0, 0, 0, 0, 0, 0, imgItem); if(g_glyphItem) { AlphaBlend(hdcMem, (rc.right - glyphMetrics[2]) / 2, (rc.bottom - glyphMetrics[3]) / 2, glyphMetrics[2], glyphMetrics[3], g_glyphItem->hdc, glyphMetrics[0], glyphMetrics[1], glyphMetrics[2], glyphMetrics[3], g_glyphItem->bf); //CopyMemory(ctl->lastGlyphMetrics, glyphMetrics, 4 * sizeof(LONG)); } } else if(ctl->bSkinned) { // skinned RECT rcParent; POINT pt; HWND hwndParent = pcli->hwndContactList; StatusItems_t *item; int item_id; GetWindowRect(ctl->hwnd, &rcParent); pt.x = rcParent.left; pt.y = rcParent.top; ScreenToClient(pcli->hwndContactList, &pt); if(HIWORD(ctl->bSkinned)) item_id = ctl->stateId == PBS_HOT ? ID_EXTBKTBBUTTONMOUSEOVER : (ctl->stateId == PBS_PRESSED ? ID_EXTBKTBBUTTONSPRESSED : ID_EXTBKTBBUTTONSNPRESSED); //GetItemByStatus(ctl->stateId == PBS_HOT ? ID_EXTBKBUTTONSMOUSEOVER : (ctl->stateId == PBS_PRESSED ? ID_EXTBKTBBUTTONSPRESSED : ID_EXTBKTBBUTTONSNPRESSED), &item); else item_id = ctl->stateId == PBS_HOT ? ID_EXTBKBUTTONSMOUSEOVER : (ctl->stateId == PBS_PRESSED ? ID_EXTBKBUTTONSPRESSED : ID_EXTBKBUTTONSNPRESSED); item = &StatusItems[item_id - ID_STATUS_OFFLINE]; //GetItemByStatus(ctl->stateId == PBS_PRESSED ? ID_EXTBKBUTTONSPRESSED : ID_EXTBKBUTTONSNPRESSED, &item); SetTextColor(hdcMem, item->TEXTCOLOR); if(item->IGNORED) { if(pt.y < 10 || g_CluiData.bWallpaperMode) //SkinDrawBg(ctl->hwnd, hdcMem); BitBlt(hdcMem, 0, 0, rc.right, rc.bottom, g_CluiData.hdcBg, pt.x, pt.y, SRCCOPY); else FillRect(hdcMem, &rc, GetSysColorBrush(COLOR_3DFACE)); } else { if(pt.y < 10 || g_CluiData.bWallpaperMode) //SkinDrawBg(ctl->hwnd, hdcMem); BitBlt(hdcMem, 0, 0, rc.right, rc.bottom, g_CluiData.hdcBg, pt.x, pt.y, SRCCOPY); else FillRect(hdcMem, &rc, GetSysColorBrush(COLOR_3DFACE)); rc.top += item->MARGIN_TOP; rc.bottom -= item->MARGIN_BOTTOM; rc.left += item->MARGIN_LEFT; rc.right -= item->MARGIN_RIGHT; DrawAlpha(hdcMem, &rc, item->COLOR, item->ALPHA, item->COLOR2, item->COLOR2_TRANSPARENT, item->GRADIENT, item->CORNER, item->BORDERSTYLE, item->imageItem); } } else { if (ctl->stateId == PBS_PRESSED || ctl->stateId == PBS_HOT) hbr = GetSysColorBrush(COLOR_3DFACE); else { HDC dc; HWND hwndParent; hwndParent = GetParent(ctl->hwnd); dc = GetDC(hwndParent); hbr = (HBRUSH) SendMessage(hwndParent, WM_CTLCOLORDLG, (WPARAM) dc, (LPARAM) hwndParent); ReleaseDC(hwndParent, dc); } if (hbr) { FillRect(hdcMem, &rc, hbr); DeleteObject(hbr); } } if(!ctl->bSkinned && ctl->buttonItem == 0) { if (ctl->stateId == PBS_HOT || ctl->focus) { if (ctl->pbState) DrawEdge(hdcMem, &rc, EDGE_ETCHED, BF_RECT | BF_SOFT); else DrawEdge(hdcMem, &rc, BDR_RAISEDOUTER, BF_RECT | BF_SOFT); } else if (ctl->stateId == PBS_PRESSED) DrawEdge(hdcMem, &rc, BDR_SUNKENOUTER, BF_RECT | BF_SOFT); } } } else { // Draw background/border if (ctl->hThemeButton && ctl->bThemed) { int state = IsWindowEnabled(ctl->hwnd) ? (ctl->stateId == PBS_NORMAL && ctl->defbutton ? PBS_DEFAULTED : ctl->stateId) : PBS_DISABLED; POINT pt; RECT rcParent; GetWindowRect(ctl->hwnd, &rcParent); pt.x = rcParent.left; pt.y = rcParent.top; ScreenToClient(pcli->hwndContactList, &pt); BitBlt(hdcMem, 0, 0, rcClient.right, rcClient.bottom, g_CluiData.hdcBg, pt.x, pt.y, SRCCOPY); if (MyIsThemeBackgroundPartiallyTransparent(ctl->hThemeButton, BP_PUSHBUTTON, state)) { MyDrawThemeParentBackground(ctl->hwnd, hdcMem, &rcClient); } MyDrawThemeBackground(ctl->hThemeButton, hdcMem, BP_PUSHBUTTON, state, &rcClient, &rcClient); } else { UINT uState = DFCS_BUTTONPUSH | ((ctl->stateId == PBS_HOT) ? DFCS_HOT : 0) | ((ctl->stateId == PBS_PRESSED) ? DFCS_PUSHED : 0); if (ctl->defbutton && ctl->stateId == PBS_NORMAL) uState |= DLGC_DEFPUSHBUTTON; DrawFrameControl(hdcMem, &rcClient, DFC_BUTTON, uState); } // Draw focus rectangle if button has focus if (ctl->focus) { RECT focusRect = rcClient; InflateRect(&focusRect, -3, -3); DrawFocusRect(hdcMem, &focusRect); } } // If we have an icon or a bitmap, ignore text and only draw the image on the button if (ctl->hIcon || ctl->hIconPrivate || ctl->iIcon) { int ix = (rcClient.right - rcClient.left) / 2 - (g_cxsmIcon / 2); int iy = (rcClient.bottom - rcClient.top) / 2 - (g_cxsmIcon / 2); HICON hIconNew = ctl->hIconPrivate != 0 ? ctl->hIconPrivate : ctl->hIcon; if (lstrlen(ctl->szText) == 0) { if (ctl->iIcon) ImageList_DrawEx(ctl->hIml, ctl->iIcon, hdcMem, ix, iy, g_cxsmIcon, g_cysmIcon, CLR_NONE, CLR_NONE, ILD_NORMAL); else DrawState(hdcMem, NULL, NULL, (LPARAM) hIconNew, 0, ix, iy, g_cxsmIcon, g_cysmIcon, IsWindowEnabled(ctl->hwnd) ? DST_ICON | DSS_NORMAL : DST_ICON | DSS_DISABLED); ctl->sLabel.cx = ctl->sLabel.cy = 0; } else { GetTextExtentPoint32(hdcMem, ctl->szText, lstrlen(ctl->szText), &ctl->sLabel); if(g_cxsmIcon + ctl->sLabel.cx + 8 > rcClient.right - rcClient.left) ctl->sLabel.cx = (rcClient.right - rcClient.left) - g_cxsmIcon - 8; else ctl->sLabel.cx += 4; ix = (rcClient.right - rcClient.left) / 2 - ((g_cxsmIcon + ctl->sLabel.cx) / 2); if (ctl->iIcon) ImageList_DrawEx(ctl->hIml, ctl->iIcon, hdcMem, ix, iy, g_cxsmIcon, g_cysmIcon, CLR_NONE, CLR_NONE, ILD_NORMAL); else DrawState(hdcMem, NULL, NULL, (LPARAM) hIconNew, 0, ix, iy, g_cxsmIcon, g_cysmIcon, IsWindowEnabled(ctl->hwnd) ? DST_ICON | DSS_NORMAL : DST_ICON | DSS_DISABLED); xOffset = ix + g_cxsmIcon + 4; } } else if (ctl->hBitmap) { BITMAP bminfo; int ix, iy; GetObject(ctl->hBitmap, sizeof(bminfo), &bminfo); ix = (rcClient.right - rcClient.left) / 2 - (bminfo.bmWidth / 2); iy = (rcClient.bottom - rcClient.top) / 2 - (bminfo.bmHeight / 2); if (ctl->stateId == PBS_PRESSED) { ix++; iy++; } DrawState(hdcMem, NULL, NULL, (LPARAM) ctl->hBitmap, 0, ix, iy, bminfo.bmWidth, bminfo.bmHeight, IsWindowEnabled(ctl->hwnd) ? DST_BITMAP : DST_BITMAP | DSS_DISABLED); } if (GetWindowTextLength(ctl->hwnd)) { // Draw the text and optinally the arrow RECT rcText; CopyRect(&rcText, &rcClient); SetBkMode(hdcMem, TRANSPARENT); // XP w/themes doesn't used the glossy disabled text. Is it always using COLOR_GRAYTEXT? Seems so. if(!ctl->bSkinned) SetTextColor(hdcMem, IsWindowEnabled(ctl->hwnd) || !ctl->hThemeButton ? GetSysColor(COLOR_BTNTEXT) : GetSysColor(COLOR_GRAYTEXT)); if (ctl->arrow) DrawState(hdcMem, NULL, NULL, (LPARAM) ctl->arrow, 0, rcClient.right - rcClient.left - 5 - g_cxsmIcon + (!ctl->hThemeButton && ctl->stateId == PBS_PRESSED ? 1 : 0), (rcClient.bottom - rcClient.top) / 2 - g_cysmIcon / 2 + (!ctl->hThemeButton && ctl->stateId == PBS_PRESSED ? 1 : 0), g_cxsmIcon, g_cysmIcon, IsWindowEnabled(ctl->hwnd) ? DST_ICON : DST_ICON | DSS_DISABLED); DrawState(hdcMem, NULL, NULL, (LPARAM) ctl->szText, 0, xOffset + (!ctl->hThemeButton && ctl->stateId == PBS_PRESSED ? 1 : 0), ctl->hThemeButton ? (rcText.bottom - rcText.top - ctl->sLabel.cy) / 2 + 1 : (rcText.bottom - rcText.top - ctl->sLabel.cy) / 2 + (ctl->stateId == PBS_PRESSED ? 1 : 0), ctl->sLabel.cx, ctl->sLabel.cy, IsWindowEnabled(ctl->hwnd) || ctl->hThemeButton ? DST_PREFIXTEXT | DSS_NORMAL : DST_PREFIXTEXT | DSS_DISABLED); } if (hOldFont) SelectObject(hdcMem, hOldFont); BitBlt(hdcPaint, 0, 0, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, hdcMem, 0, 0, SRCCOPY); SelectObject(hdcMem, hbmOld); DeleteObject(hbmMem); DeleteDC(hdcMem); DeleteObject(hbmOld); } }
LRESULT CALLBACK Listview_WindowProc( HWND hwnd, // handle of window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { LPLISTVIEW_PARAM lv = LPLISTVIEW_PARAM(GetWindowLong(hwnd, 16)); WNDPROC pwndProc = (WNDPROC) GetWindowLong(hwnd, 12); switch(uMsg) { case WM_NCCREATE: { lv = InitializeListViewInstance(hwnd); TCHAR pszClassName[MAX_PATH] = { 0 }; GetClassName(hwnd, pszClassName, MAX_PATH); if ( lstrcmpi(pszClassName, TEXT("DBFListView32")) ) { int preflen = sizeof(DBF_CONTROL) / sizeof(TCHAR) - 1, chr = 0; while(chr <= preflen && pszClassName[chr] == DBF_CONTROL[chr] ) chr++; if ( chr == preflen ) { WNDCLASS wc = { 0 }; if ( GetClassInfo( (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), &pszClassName[chr], &wc ) ) { SetWindowLong(hwnd, 12, (LONG) wc.lpfnWndProc); lv->pfnWndProc = wc.lpfnWndProc; lv->fIsListView = FALSE; pwndProc = wc.lpfnWndProc; } else return FALSE; } else return FALSE; } SetRect(&lv->rc, LPCREATESTRUCT(lParam)->x, LPCREATESTRUCT(lParam)->y, LPCREATESTRUCT(lParam)->cx, LPCREATESTRUCT(lParam)->cy ); lv->hHeader = NULL; break; } case WM_ERASEBKGND: { if ( lv->fIsListView ) { if ( !lv->hHeader ) lv->hHeader = (HWND) lv->pfnWndProc(hwnd, LVM_GETHEADER, 0, 0); GetClientRect(lv->hHeader, &lv->header_rc); return CallWindowProc(lv->pfnWndProc, hwnd, uMsg, WPARAM(lv->hDC), lParam); } else return pwndProc(hwnd, uMsg, WPARAM(lv->hDC), lParam); break; } case WM_SIZING: case WM_SIZE: { GetClientRect(hwnd, &lv->rc); if ( lv->fIsListView ) { if ( !lv->hHeader ) lv->hHeader = (HWND) lv->pfnWndProc(hwnd, LVM_GETHEADER, 0, 0); GetClientRect(lv->hHeader, &lv->header_rc); } break; } case WM_PRINT: { WNDPROC pwnd = ( lv->fIsListView ? lv->pfnWndProc : pwndProc ); // pwnd(hwnd, WM_ERASEBKGND, (WPARAM) lv->hDC, 0); // pwnd(hwnd, WM_PAINT, (WPARAM) lv->hDC, 0); pwnd(hwnd, WM_PRINT, (WPARAM) lv->hDC, lParam); if ( !PBYTE(lv->pvBits)[0] ) FillRect((HDC) wParam, &lv->rc, GetSysColorBrush(COLOR_WINDOW)); else BitBlt((HDC) wParam, 0, 0, lv->rc.right, lv->rc.bottom, lv->hDC, 0, 0, SRCCOPY); return 0; } case WM_PAINT: { PAINTSTRUCT ps = { 0 }; HDC hdc = BeginPaint(hwnd, &ps); if ( lv->fIsListView ) CallWindowProc(lv->pfnWndProc, hwnd, uMsg, WPARAM(lv->hDC), lParam); else pwndProc(hwnd, uMsg, WPARAM(lv->hDC), lParam); if ( lv->fIsListView ) BitBlt(hdc, 0, lv->header_rc.bottom, lv->rc.right, lv->rc.bottom - lv->header_rc.bottom, lv->hDC, 0, lv->header_rc.bottom, SRCCOPY); else BitBlt(hdc, 0, 0, lv->rc.right, lv->rc.bottom, lv->hDC, 0, 0, SRCCOPY); EndPaint(hwnd, &ps); return 0; } case WM_NCDESTROY: { LRESULT ret = ( lv->fIsListView ? lv->pfnWndProc(hwnd, uMsg, wParam, lParam) : pwndProc(hwnd, uMsg, wParam, lParam) ); UninitializeListViewInstance(hwnd); return ret; } } if ( lv->fIsListView && lv->pfnWndProc ) return lv->pfnWndProc(hwnd, uMsg, wParam, lParam); else if ( !lv->fIsListView && pwndProc ) return pwndProc(hwnd, uMsg, wParam, lParam); return DefWindowProc(hwnd, uMsg, wParam, lParam); }
INT_PTR TlevelsPage::msgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: SelectObject(hdcGradient, oldHDCgradient); DeleteDC(hdcGradient); DeleteBitmap(bmpGradient); DeleteFont(fontGradient); SendMessage(GetDlgItem(m_hwnd, IDC_LBX_LEVELS_CURVES), WM_SETFONT, NULL, FALSE); DeleteFont(fontCurier); break; case WM_DRAWITEM: switch (wParam) { case IDC_BMP_HISTOGRAM: { LPDRAWITEMSTRUCT dis = LPDRAWITEMSTRUCT(lParam); int full = cfgGet(IDFF_levelsFullY); StretchDIBits(dis->hDC, 0, 0, dis->rcItem.right, dis->rcItem.bottom, full ? 0 : 16, 0, full ? 256 : 234 - 16 + 1, 64, histogramBits, (BITMAPINFO*)&histogramBmp, DIB_RGB_COLORS, SRCCOPY); wIn->draw(dis); return TRUE; } case IDC_BMP_LEVELS_IN: { LPDRAWITEMSTRUCT dis = LPDRAWITEMSTRUCT(lParam); StretchBlt(dis->hDC, 0, 0, dis->rcItem.right, 10, hdcGradient, 0, 0, 256, 1, SRCCOPY); RECT r = dis->rcItem; r.top = 10; FillRect(dis->hDC, &r, GetSysColorBrush(COLOR_BTNFACE)); if (filter && getCheck(IDC_CHB_LEVELS_INPUT_AUTO)) { int min, max; filter->getInAuto(&min, &max); drawTriangle(dis, min, true); drawTriangle(dis, max, true); } drawTriangle(dis, cfgGet(IDFF_levelsInMin)); drawTriangle(dis, cfgGet(IDFF_levelsInMax)); return TRUE; } case IDC_BMP_LEVELS_OUT: { LPDRAWITEMSTRUCT dis = LPDRAWITEMSTRUCT(lParam); StretchBlt(dis->hDC, 0, 0, dis->rcItem.right, 10, hdcGradient, 0, 0, 256, 1, SRCCOPY); RECT r = dis->rcItem; r.top = 10; FillRect(dis->hDC, &r, GetSysColorBrush(COLOR_BTNFACE)); drawTriangle(dis, cfgGet(IDFF_levelsOutMin)); drawTriangle(dis, cfgGet(IDFF_levelsOutMax)); return TRUE; } case IDC_BMP_LEVELS_CURVES: { LPDRAWITEMSTRUCT dis = LPDRAWITEMSTRUCT(lParam); StretchDIBits(dis->hDC, 0, 0, dis->rcItem.right, dis->rcItem.bottom, 0, 0, 256, 256, histogramBits, (BITMAPINFO*)&curvesBmp, DIB_RGB_COLORS, SRCCOPY); wCurves->draw(dis); return TRUE; } } break; case WM_SETCURSOR: if (HWND(wParam) == hcurves) { if (wCurves->setCursor()) { SetCursor(LoadCursor(NULL, IDC_SIZEALL)); setDlgResult(TRUE); } return TRUE; } break; } return TconfPageDecVideo::msgProc(uMsg, wParam, lParam); }
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // Window dimensions RECT rWnd; RECT rClt; switch (uMsg) { case WM_CREATE: // Get the window and client dimensions GetWindowRect(hWnd, &rWnd); GetClientRect(hWnd, &rClt); // Calculate desired window width and height int border = (rWnd.right - rWnd.left) - rClt.right; int width = WIDTH + border; int height = HEIGHT; // Set new dimensions SetWindowPos(hWnd, NULL, 0, 0, width, height, SWP_NOMOVE | SWP_NOZORDER); // Get client dimensions GetWindowRect(hWnd, &rWnd); GetClientRect(hWnd, &rClt); width = rClt.right - rClt.left; height = rClt.bottom - rClt.top; // Create scale scale.hwnd = CreateWindow(WC_STATIC, NULL, WS_VISIBLE | WS_CHILD | SS_NOTIFY | SS_OWNERDRAW, 8, 8, 160, 40, hWnd, (HMENU)SCALE_ID, hInst, NULL); // Create tooltip tooltip.hwnd = CreateWindow(TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, NULL, hInst, NULL); SetWindowPos(tooltip.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); // Add scale to tooltip tooltip.info.cbSize = sizeof(tooltip.info); tooltip.info.hwnd = hWnd; tooltip.info.uFlags = TTF_IDISHWND | TTF_SUBCLASS; tooltip.info.uId = (UINT_PTR)scale.hwnd; tooltip.info.lpszText = "Frequency scale"; SendMessage(tooltip.hwnd, TTM_ADDTOOL, 0, (LPARAM) &tooltip.info); // Create display display.hwnd = CreateWindow(WC_STATIC, NULL, WS_VISIBLE | WS_CHILD | SS_NOTIFY | SS_OWNERDRAW, 176, 8, 136, 60, hWnd, (HMENU)DISPLAY_ID, hInst, NULL); // Add display to tooltip tooltip.info.uId = (UINT_PTR)display.hwnd; tooltip.info.lpszText = "Frequency and level display"; SendMessage(tooltip.hwnd, TTM_ADDTOOL, 0, (LPARAM) &tooltip.info); // Create knob knob.hwnd = CreateWindow(KNOBCLASS, NULL, WS_VISIBLE | WS_CHILD, 4, 52, 168, 168, hWnd, (HMENU)KNOB_ID, hInst, NULL); // Add knob to tooltip tooltip.info.uId = (UINT_PTR)knob.hwnd; tooltip.info.lpszText = "Frequency adjustment knob"; SendMessage(tooltip.hwnd, TTM_ADDTOOL, 0, (LPARAM) &tooltip.info); // Create frequency slider fine.hwnd = CreateWindow(TRACKBAR_CLASS, NULL, WS_VISIBLE | WS_CHILD | TBS_VERT | TBS_NOTICKS, 176, 76, 24, 140, hWnd, (HMENU)FINE_ID, hInst, NULL); SendMessage(fine.hwnd, TBM_SETRANGE, TRUE, MAKELONG(FINE_MIN, FINE_MAX)); SendMessage(fine.hwnd, TBM_SETPAGESIZE, 0, FINE_STEP); SendMessage(fine.hwnd, TBM_SETPOS, TRUE, FINE_REF); // Add slider to tooltip tooltip.info.uId = (UINT_PTR)fine.hwnd; tooltip.info.lpszText = "Fine frequency adjustment"; SendMessage(tooltip.hwnd, TTM_ADDTOOL, 0, (LPARAM) &tooltip.info); // Create level slider level.hwnd = CreateWindow(TRACKBAR_CLASS, NULL, WS_VISIBLE | WS_CHILD | TBS_VERT | TBS_NOTICKS | TBS_LEFT, 208, 76, 24, 140, hWnd, (HMENU)LEVEL_ID, hInst, NULL); SendMessage(level.hwnd, TBM_SETRANGE, TRUE, MAKELONG(LEVEL_MIN, LEVEL_MAX)); SendMessage(level.hwnd, TBM_SETPAGESIZE, 0, LEVEL_STEP); SendMessage(level.hwnd, TBM_SETPOS, TRUE, LEVEL_REF); // Add slider to tooltip tooltip.info.uId = (UINT_PTR)level.hwnd; tooltip.info.lpszText = "Level adjustment"; SendMessage(tooltip.hwnd, TTM_ADDTOOL, 0, (LPARAM) &tooltip.info); // Create sine button buttons.sine.hwnd = CreateWindow(WC_BUTTON, "Sine", WS_VISIBLE | WS_CHILD | WS_GROUP | BS_AUTORADIOBUTTON | BS_PUSHLIKE, 240, 76, 72, 24, hWnd, (HMENU)SINE_ID, hInst, NULL); SendMessage(buttons.sine.hwnd, BM_SETCHECK, BST_CHECKED, 0); // Create square button buttons.square.hwnd = CreateWindow(WC_BUTTON, "Square", WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | BS_PUSHLIKE, 240, 105, 72, 24, hWnd, (HMENU)SQUARE_ID, hInst, NULL); // Create sawtooth button buttons.sawtooth.hwnd = CreateWindow(WC_BUTTON, "Sawtooth", WS_VISIBLE | WS_CHILD | BS_AUTORADIOBUTTON | BS_PUSHLIKE, 240, 134, 72, 24, hWnd, (HMENU)SAWTOOTH_ID, hInst, NULL); // Create mute button buttons.mute.hwnd = CreateWindow(WC_BUTTON, "Mute", WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_PUSHLIKE, 240, 161, 72, 24, hWnd, (HMENU)MUTE_ID, hInst, NULL); // Create quit button buttons.quit.hwnd = CreateWindow(WC_BUTTON, "Quit", WS_VISIBLE | WS_CHILD, 240, 192, 72, 24, hWnd, (HMENU)QUIT_ID, hInst, NULL); // Create status bar status.hwnd = CreateWindow(STATUSCLASSNAME, " Turn knob to adjust frequency," " fine left, level right slider", WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, hWnd, (HMENU)STATUS_ID, hInst, NULL); // Start audio thread audio.thread = CreateThread(NULL, 0, AudioThread, hWnd, 0, &audio.id); break; // Colour static text case WM_CTLCOLORSTATIC: return (LRESULT)GetSysColorBrush(COLOR_WINDOW); break; // Draw item case WM_DRAWITEM: return DrawItem(wParam, lParam); break; // Disable menus by capturing this message case WM_INITMENU: break; // Capture system character key to stop pop up menus and other // nonsense case WM_SYSCHAR: break; // Char pressed case WM_CHAR: CharPressed(wParam, lParam); break; // Key pressed case WM_KEYDOWN: KeyDown(wParam, lParam); break; // Buttons case WM_COMMAND: switch (LOWORD(wParam)) { // Sine case SINE_ID: audio.waveform = SINE; break; // Square case SQUARE_ID: audio.waveform = SQUARE; break; // Sawtooth case SAWTOOTH_ID: audio.waveform = SAWTOOTH; break; // Mute case MUTE_ID: audio.mute = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0); break; // Quit case QUIT_ID: waveOutReset(audio.hwo); waveOutClose(audio.hwo); PostQuitMessage(0); break; } // Set the focus back to the window SetFocus(hWnd); break; // Slider change case WM_VSCROLL: SliderChange(wParam, lParam); // Set the focus back to the window SetFocus(hWnd); break; // Set the focus back to the window by clicking case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: SetFocus(hWnd); break; case WM_RBUTTONDOWN: // Not used break; // Notify case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { // Tooltip case TTN_SHOW: TooltipShow(wParam, lParam); break; case TTN_POP: TooltipPop(wParam, lParam); break; } break; // Process other messages. case WM_DESTROY: PostQuitMessage(0); waveOutReset(audio.hwo); waveOutClose(audio.hwo); break; // Everything else default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; }
LRESULT OnPaint(HWND hWnd,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; int idx; HPEN hPen,hOldPen; HBRUSH hBrush,hOldBrush; RECT crt; HDC hMemDC; HBITMAP hOldBitmap; int x,y; hdc=BeginPaint(hWnd, &ps); hMemDC=CreateCompatibleDC(hdc); GetClientRect(hWnd,&crt); if (hBackBit == NULL) { hBackBit=CreateCompatibleBitmap(hdc,crt.right,crt.bottom); } hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBackBit); FillRect(hMemDC,&crt,GetSysColorBrush(COLOR_WINDOW)); if (bGridLine) { hPen=CreatePen(PS_SOLID,1,RGB(192,192,192)); hOldPen=(HPEN)SelectObject(hMemDC,hPen); for (y=0;y<crt.bottom;y=y+GridLineY*GridY) { MoveToEx(hMemDC,0,y,NULL); LineTo(hMemDC,crt.right,y); } for (x=0;x<crt.right;x=x+GridLineX*GridX) { MoveToEx(hMemDC,x,0,NULL); LineTo(hMemDC,x,crt.bottom); } DeleteObject(SelectObject(hMemDC,hOldPen)); } for (idx=0;idx<arNum;idx++) { if (arObj[idx]->LineColor == (COLORREF)-1) { hPen=(HPEN)GetStockObject(NULL_PEN); } else { hPen=CreatePen(PS_INSIDEFRAME,arObj[idx]->LineWidth,arObj[idx]->LineColor); } hOldPen=(HPEN)SelectObject(hMemDC,hPen); if (arObj[idx]->PlaneColor == (COLORREF)-1) { hBrush=(HBRUSH)GetStockObject(NULL_BRUSH); } else { hBrush=CreateSolidBrush(arObj[idx]->PlaneColor); } hOldBrush=(HBRUSH)SelectObject(hMemDC,hBrush); switch (arObj[idx]->Type) { case DT_LINE: if ((arObj[idx]->Flag & 0x3) == DS_LT || (arObj[idx]->Flag & 0x3) == DS_RB) { MoveToEx(hMemDC,arObj[idx]->rt.left,arObj[idx]->rt.top,NULL); LineTo(hMemDC,arObj[idx]->rt.right,arObj[idx]->rt.bottom); } else { MoveToEx(hMemDC,arObj[idx]->rt.left,arObj[idx]->rt.bottom,NULL); LineTo(hMemDC,arObj[idx]->rt.right,arObj[idx]->rt.top); } break; case DT_ELLIPSE: Ellipse(hMemDC,arObj[idx]->rt.left,arObj[idx]->rt.top, arObj[idx]->rt.right,arObj[idx]->rt.bottom); break; case DT_RECTANGLE: Rectangle(hMemDC,arObj[idx]->rt.left,arObj[idx]->rt.top, arObj[idx]->rt.right,arObj[idx]->rt.bottom); break; } SelectObject(hMemDC,hOldPen); SelectObject(hMemDC,hOldBrush); if (arObj[idx]->LineColor != (COLORREF)-1) { DeleteObject(hPen); } if (arObj[idx]->PlaneColor != (COLORREF)-1) { DeleteObject(hBrush); } } if (NowSel != -1) { DrawTracker(hMemDC,NowSel); } BitBlt(hdc,0,0,crt.right,crt.bottom,hMemDC,0,0,SRCCOPY); SelectObject(hMemDC,hOldBitmap); DeleteDC(hMemDC); EndPaint(hWnd, &ps); return 0; }
/*------------------------------------------------ owner-drawn start menu (Win95 without IE 4) called in taskbar.c --------------------------------------------------*/ BOOL OnDrawItemStartMenu(HWND hwnd, DRAWITEMSTRUCT* pdis) { HDC hdc, hdcMem; HBITMAP hbmpMem; RECT rcBox, rcItem; HBRUSH hbr; if(!m_bStartMenu) return FALSE; if(!IsStartMenu((HMENU)pdis->hwndItem)) return FALSE; hdc = pdis->hDC; CopyRect(&rcItem, &(pdis->rcItem)); GetClipBox(hdc, &rcBox); // menu size // offscreen DC and BMP hdcMem = CreateCompatibleDC(hdc); hbmpMem = CreateCompatibleBitmap(hdc, rcBox.right, rcBox.bottom); SelectObject(hdcMem, hbmpMem); hbr = GetSysColorBrush(COLOR_MENU); FillRect(hdcMem, &rcBox, hbr); SelectObject(hdcMem, (HFONT)GetCurrentObject(hdc, OBJ_FONT)); // background and text color if(pdis->itemState & ODS_FOCUS) { SetTextColor(hdcMem, GetSysColor(COLOR_HIGHLIGHTTEXT)); SetBkColor(hdcMem, GetSysColor(COLOR_HIGHLIGHT)); } else { SetTextColor(hdcMem, GetSysColor(COLOR_MENUTEXT)); SetBkColor(hdcMem, GetSysColor(COLOR_MENU)); } // default drawing pdis->hDC = hdcMem; // width of "Windows95" rcItem.right = pdis->rcItem.left; if(rcItem.right > 0) { COLORREF col; if(!m_bTile) { col = m_colMenu; if(col & 0x80000000) col = GetSysColor(col & 0x00ffffff); hbr = CreateSolidBrush(col); FillRect(hdcMem, &rcItem, hbr); DeleteObject(hbr); } if(m_hdcMemMenu && m_hbmpMenu) { int i, j; int wbmp, hbmp; GetBmpSize(m_hbmpMenu, &wbmp, &hbmp); for(i = 0; ; i++) { int y, ysrc, h, x, w; for(j = 0; ; j++) { y = rcBox.bottom - ((i + 1) * hbmp); ysrc = 0; h = hbmp; if(y < 0) { y = 0; ysrc = ((i + 1) * hbmp) - rcBox.bottom; h -= ysrc; } x = j * wbmp; w = wbmp; if(x + w > rcItem.right) { w -= ((j + 1) * wbmp) - rcItem.right; } if(w > 0 && h > 0) BitBlt(hdcMem, x, y, w, h, m_hdcMemMenu, 0, ysrc, SRCCOPY); if(!m_bTile || w < wbmp) break; } if(!m_bTile || y == 0) break; } } } BitBlt(hdc, 0, rcItem.top, pdis->rcItem.right, rcItem.bottom - rcItem.top, hdcMem, 0, rcItem.top, SRCCOPY); pdis->hDC = hdc; DeleteDC(hdcMem); DeleteObject(hbmpMem); return TRUE; }
int CTaskbarNotifier::Create(CWnd *pWndParent) { m_pWndParent=pWndParent; CString strWndClass=AfxRegisterWndClass(0,AfxGetApp()->LoadStandardCursor(IDC_ARROW),GetSysColorBrush(COLOR_WINDOW),NULL); return CreateEx(0,strWndClass,NULL,WS_POPUP,0,0,0,0,pWndParent->m_hWnd,NULL); }
/** * name: PaintThemeButton * desc: Draws the none themed button * param: ctl - BTNCTRL structure for the button * hdcMem - device context to draw to * rcClient - rectangle of the whole button * return: nothing **/ static void __fastcall PaintButton(BTNCTRL *ctl, HDC hdcMem, LPRECT rcClient) { RECT rcText = { 0, 0, 0, 0 }; TCHAR szText[MAX_PATH] = { 0 }; WORD ccText; // Draw the flat button if (ctl->dwStyle & MBS_FLAT) { HBRUSH hbr = NULL; if (ctl->stateId == PBS_PRESSED || ctl->stateId == PBS_HOT) hbr = GetSysColorBrush(COLOR_3DLIGHT); else { HDC dc; HWND hwndParent; hwndParent = GetParent(ctl->hwnd); if (dc = GetDC(hwndParent)) { hbr = (HBRUSH)SendMessage(hwndParent, WM_CTLCOLORDLG, (WPARAM)dc, (LPARAM)hwndParent); ReleaseDC(hwndParent, dc); } } if (hbr) { FillRect(hdcMem, rcClient, hbr); DeleteObject(hbr); } if (ctl->stateId == PBS_HOT || ctl->bFocus) { if (ctl->pbState) DrawEdge(hdcMem, rcClient, EDGE_ETCHED, BF_RECT|BF_SOFT); else DrawEdge(hdcMem, rcClient, BDR_RAISEDOUTER, BF_RECT|BF_SOFT|BF_FLAT); } else if (ctl->stateId == PBS_PRESSED) DrawEdge(hdcMem, rcClient, BDR_SUNKENOUTER, BF_RECT|BF_SOFT); } else { UINT uState = DFCS_BUTTONPUSH|((ctl->stateId == PBS_HOT) ? DFCS_HOT : 0)|((ctl->stateId == PBS_PRESSED) ? DFCS_PUSHED : 0); if (ctl->defbutton&&ctl->stateId==PBS_NORMAL) uState |= DLGC_DEFPUSHBUTTON; DrawFrameControl(hdcMem, rcClient, DFC_BUTTON, uState); // Draw focus rectangle if button has focus if (ctl->bFocus) { RECT focusRect = *rcClient; InflateRect(&focusRect, -3, -3); DrawFocusRect(hdcMem, &focusRect); } } // calculate text rect { SIZE sizeText; HFONT hOldFont; ccText = GetWindowText(ctl->hwnd, szText, SIZEOF(szText)); if (ccText > 0) { hOldFont = (HFONT)SelectObject(hdcMem, ctl->hFont); GetTextExtentPoint32(hdcMem, szText, ccText, &sizeText); if (ctl->cHot) { SIZE sizeHot; GetTextExtentPoint32A(hdcMem, "&", 1, &sizeHot); sizeText.cx -= sizeHot.cx; } SelectObject(hdcMem, hOldFont); rcText.left = (ctl->hIcon) ? 0 : (rcClient->right - rcClient->left - sizeText.cx) / 2; rcText.top = (rcClient->bottom - rcClient->top - sizeText.cy) / 2; rcText.right = rcText.left + sizeText.cx; rcText.bottom = rcText.top + sizeText.cy; if (ctl->stateId == PBS_PRESSED) OffsetRect(&rcText, 1, 1); } } PaintIcon(ctl, hdcMem, &ccText, rcClient, &rcText); // draw text if (ccText > 0) { HFONT hOldFont; hOldFont = (HFONT)SelectObject(hdcMem, ctl->hFont); SetBkMode(hdcMem, TRANSPARENT); SetTextColor(hdcMem, IsWindowEnabled(ctl->hwnd) || !ctl->hThemeButton ? ctl->stateId == PBS_HOT ? GetSysColor(COLOR_HOTLIGHT) : GetSysColor(COLOR_BTNTEXT) : GetSysColor(COLOR_GRAYTEXT)); DrawState(hdcMem, NULL, NULL, (LPARAM)szText, 0, rcText.left, rcText.top, rcText.right - rcText.left, rcText.bottom - rcText.top, IsWindowEnabled(ctl->hwnd) || ctl->hThemeButton ? DST_PREFIXTEXT | DSS_NORMAL : DST_PREFIXTEXT | DSS_DISABLED); SelectObject(hdcMem, hOldFont); } }
void track_bar_impl::draw_thumb (HDC dc, const RECT * rc) const { if (get_theme_handle()) { DrawThemeBackground(get_theme_handle(), dc, get_orientation() ? TKP_THUMBVERT : TKP_THUMB, get_enabled() ? (get_tracking() ? TUS_PRESSED : (get_hot() ? TUS_HOT : TUS_NORMAL)) : TUS_DISABLED, rc, 0); } else { HPEN pn_highlight = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DHIGHLIGHT)); HPEN pn_light = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DLIGHT)); HPEN pn_dkshadow = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DDKSHADOW)); HPEN pn_shadow = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DSHADOW)); HPEN pn_old = SelectPen(dc, pn_highlight); MoveToEx(dc, rc->left, rc->top, 0); LineTo(dc, rc->right-1, rc->top); SelectPen(dc, pn_dkshadow); LineTo(dc, rc->right-1, rc->bottom-1); SelectPen(dc, pn_highlight); MoveToEx(dc, rc->left, rc->top, 0); LineTo(dc, rc->left, rc->bottom-1); SelectPen(dc, pn_dkshadow); LineTo(dc, rc->right, rc->bottom-1); SelectPen(dc, pn_light); MoveToEx(dc, rc->left+1, rc->top+1, 0); LineTo(dc, rc->right-2, rc->top+1); MoveToEx(dc, rc->left+1, rc->top+1, 0); LineTo(dc, rc->left+1, rc->bottom-2); SelectPen(dc, pn_shadow); LineTo(dc, rc->right-1, rc->bottom-2); MoveToEx(dc, rc->right-2, rc->top+1, 0); LineTo(dc, rc->right-2, rc->bottom-2); SelectPen(dc, pn_old); DeleteObject(pn_light); DeleteObject(pn_highlight); DeleteObject(pn_shadow); DeleteObject(pn_dkshadow); RECT rc_fill = *rc; rc_fill.top+=2; rc_fill.left+=2; rc_fill.right-=2; rc_fill.bottom-=2; HBRUSH br = GetSysColorBrush(COLOR_BTNFACE); FillRect(dc, &rc_fill, br); if (!get_enabled()) { COLORREF cr_btnhighlight = GetSysColor(COLOR_BTNHIGHLIGHT); int x, y; for (x=rc_fill.left; x<rc_fill.right; x++) for (y=rc_fill.top; y<rc_fill.bottom; y++) if ((x+y)%2) SetPixel(dc, x, y, cr_btnhighlight); //i dont have anything better than SetPixel } } }
/********************************************************************** * Push Button Functions */ static void PB_Paint( HWND hwnd, HDC hDC, UINT action ) { RECT rc, focus_rect, r; UINT dtFlags, uState; HPEN hOldPen; HBRUSH hOldBrush; INT oldBkMode; COLORREF oldTxtColor; HFONT hFont; LONG state = get_button_state( hwnd ); LONG style = GetWindowLongW( hwnd, GWL_STYLE ); BOOL pushedState = (state & BUTTON_HIGHLIGHTED); HWND parent; GetClientRect( hwnd, &rc ); /* Send WM_CTLCOLOR to allow changing the font (the colors are fixed) */ if ((hFont = get_button_font( hwnd ))) SelectObject( hDC, hFont ); parent = GetParent(hwnd); if (!parent) parent = hwnd; SendMessageW( parent, WM_CTLCOLORBTN, (WPARAM)hDC, (LPARAM)hwnd ); setup_clipping( hwnd, hDC ); hOldPen = SelectObject(hDC, SYSCOLOR_GetPen(COLOR_WINDOWFRAME)); hOldBrush = SelectObject(hDC,GetSysColorBrush(COLOR_BTNFACE)); oldBkMode = SetBkMode(hDC, TRANSPARENT); if (get_button_type(style) == BS_DEFPUSHBUTTON) { if (action != ODA_FOCUS) Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); InflateRect( &rc, -1, -1 ); } focus_rect = rc; /* completely skip the drawing if only focus has changed */ if (action == ODA_FOCUS) goto draw_focus; uState = DFCS_BUTTONPUSH | DFCS_ADJUSTRECT; if (style & BS_FLAT) uState |= DFCS_MONO; else if (pushedState) { if (get_button_type(style) == BS_DEFPUSHBUTTON ) uState |= DFCS_FLAT; else uState |= DFCS_PUSHED; } if (state & (BUTTON_CHECKED | BUTTON_3STATE)) uState |= DFCS_CHECKED; DrawFrameControl( hDC, &rc, DFC_BUTTON, uState ); /* draw button label */ r = rc; dtFlags = BUTTON_CalcLabelRect(hwnd, hDC, &r); if (dtFlags == (UINT)-1L) goto cleanup; if (pushedState) OffsetRect(&r, 1, 1); IntersectClipRect(hDC, rc.left, rc.top, rc.right, rc.bottom); oldTxtColor = SetTextColor( hDC, GetSysColor(COLOR_BTNTEXT) ); BUTTON_DrawLabel(hwnd, hDC, dtFlags, &r); SetTextColor( hDC, oldTxtColor ); draw_focus: if ((action == ODA_FOCUS) || ((action == ODA_DRAWENTIRE) && (state & BUTTON_HASFOCUS))) { InflateRect( &focus_rect, -1, -1 ); IntersectRect(&focus_rect, &focus_rect, &rc); DrawFocusRect( hDC, &focus_rect ); } cleanup: SelectObject( hDC, hOldPen ); SelectObject( hDC, hOldBrush ); SetBkMode(hDC, oldBkMode); }
static BOOL CALLBACK SpectrumPopupProc(HWND wnd,UINT msg,WPARAM wp,LPARAM lp) { switch(msg) { case WM_INITDIALOG: uSetWindowLong(wnd,DWL_USER,lp); { spec_param * ptr = reinterpret_cast<spec_param*>(lp); ptr->m_scope.initialize(FindOwningPopup(wnd)); uSendDlgItemMessage(wnd, IDC_BARS, BM_SETCHECK, ptr->ptr->mode == MODE_BARS, 0); HWND wnd_combo = GetDlgItem(wnd, IDC_FRAME_COMBO); EnableWindow(wnd_combo, ptr->b_show_frame); if (ptr->b_show_frame) { ComboBox_AddString(wnd_combo, _T("None")); ComboBox_AddString(wnd_combo, _T("Sunken")); ComboBox_AddString(wnd_combo, _T("Grey")); ComboBox_SetCurSel(wnd_combo, ptr->frame); } wnd_combo = GetDlgItem(wnd, IDC_SCALE); ComboBox_AddString(wnd_combo, _T("Linear")); ComboBox_AddString(wnd_combo, _T("Logarithmic")); ComboBox_SetCurSel(wnd_combo, ptr->m_scale); wnd_combo = GetDlgItem(wnd, IDC_VERTICAL_SCALE); ComboBox_AddString(wnd_combo, _T("Linear")); ComboBox_AddString(wnd_combo, _T("Logarithmic")); ComboBox_SetCurSel(wnd_combo, ptr->m_vertical_scale); } return TRUE; case WM_ERASEBKGND: SetWindowLongPtr(wnd, DWL_MSGRESULT, TRUE); return TRUE; case WM_PAINT: ui_helpers::innerWMPaintModernBackground(wnd, GetDlgItem(wnd, IDOK)); return TRUE; case WM_CTLCOLORSTATIC: { spec_param * ptr = reinterpret_cast<spec_param*>(uGetWindowLong(wnd,DWL_USER)); if (GetDlgItem(wnd, IDC_PATCH_FORE) == (HWND)lp) { HDC dc =(HDC)wp; if (!ptr->br_fore) { ptr->br_fore = CreateSolidBrush(ptr->cr_fore); } return (BOOL)ptr->br_fore; } else if (GetDlgItem(wnd, IDC_PATCH_BACK) == (HWND)lp) { HDC dc =(HDC)wp; if (!ptr->br_back) { ptr->br_back = CreateSolidBrush(ptr->cr_back); } return (BOOL)ptr->br_back; } else return (BOOL)GetSysColorBrush(COLOR_3DHIGHLIGHT); } break; case WM_COMMAND: switch(wp) { case IDCANCEL: EndDialog(wnd,0); return TRUE; case IDC_CHANGE_BACK: { spec_param * ptr = reinterpret_cast<spec_param*>(uGetWindowLong(wnd,DWL_USER)); COLORREF COLOR = ptr->cr_back; COLORREF COLORS[16] = {get_default_colour(colours::COLOUR_BACK),GetSysColor(COLOR_3DFACE),0,0,0,0,0,0,0,0,0,0,0,0,0,0}; if (uChooseColor(&COLOR, wnd, &COLORS[0])) { ptr->cr_back = COLOR; ptr->flush_back(); RedrawWindow(GetDlgItem(wnd, IDC_PATCH_BACK), 0, 0, RDW_INVALIDATE|RDW_UPDATENOW); } } break; case IDC_CHANGE_FORE: { spec_param * ptr = reinterpret_cast<spec_param*>(uGetWindowLong(wnd,DWL_USER)); COLORREF COLOR = ptr->cr_fore; COLORREF COLORS[16] = {get_default_colour(colours::COLOUR_TEXT),GetSysColor(COLOR_3DSHADOW),0,0,0,0,0,0,0,0,0,0,0,0,0,0}; if (uChooseColor(&COLOR, wnd, &COLORS[0])) { ptr->cr_fore = COLOR; ptr->flush_fore(); RedrawWindow(GetDlgItem(wnd, IDC_PATCH_FORE), 0, 0, RDW_INVALIDATE|RDW_UPDATENOW); } } break; case IDC_BARS: { spec_param * ptr = reinterpret_cast<spec_param*>(uGetWindowLong(wnd,DWL_USER)); ptr->mode = (uSendMessage((HWND)lp, BM_GETCHECK, 0, 0) != TRUE ? MODE_STANDARD : MODE_BARS); } break; case IDC_FRAME_COMBO|(CBN_SELCHANGE<<16): { spec_param * ptr = reinterpret_cast<spec_param*>(uGetWindowLong(wnd,DWL_USER)); ptr->frame = ComboBox_GetCurSel(HWND(lp)); } break; case IDC_SCALE|(CBN_SELCHANGE<<16): { spec_param * ptr = reinterpret_cast<spec_param*>(uGetWindowLong(wnd,DWL_USER)); ptr->m_scale = ComboBox_GetCurSel(HWND(lp)); } break; case IDC_VERTICAL_SCALE|(CBN_SELCHANGE<<16): { spec_param * ptr = reinterpret_cast<spec_param*>(uGetWindowLong(wnd,DWL_USER)); ptr->m_vertical_scale = ComboBox_GetCurSel(HWND(lp)); } break; case IDOK: { spec_param * ptr = reinterpret_cast<spec_param*>(uGetWindowLong(wnd,DWL_USER)); EndDialog(wnd,1); } return TRUE; default: return FALSE; } default: return FALSE; } }
BOOL CALLBACK PropertyDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam) { static DObject *Obj; LPMEASUREITEMSTRUCT lpmis; LPDRAWITEMSTRUCT lpdis; HBRUSH ColorBrush, OldBrush; COLORREF Color; int i; switch(iMessage) { case WM_INITDIALOG: for (i=0;i<sizeof(arColor)/sizeof(arColor[0]);i++) { SendDlgItemMessage(hDlg,IDC_CBLINECOLOR,CB_ADDSTRING,0,(LPARAM)arColor[i]); SendDlgItemMessage(hDlg,IDC_CBPLANECOLOR,CB_ADDSTRING,0,(LPARAM)arColor[i]); } SendDlgItemMessage(hDlg,IDC_SPLINEWIDTH,UDM_SETRANGE,0,MAKELONG(10,0)); Obj=(DObject *)lParam; SetDlgItemInt(hDlg,IDC_EDLINEWIDTH,Obj->LineWidth,FALSE); for (i=0;i<sizeof(arColor)/sizeof(arColor[0]);i++) { if (arColor[i] == Obj->LineColor) { break; } } SendDlgItemMessage(hDlg,IDC_CBLINECOLOR,CB_SETCURSEL,i,0); for (i=0;i<sizeof(arColor)/sizeof(arColor[0]);i++) { if (arColor[i] == Obj->PlaneColor) { break; } } SendDlgItemMessage(hDlg,IDC_CBPLANECOLOR,CB_SETCURSEL,i,0); return TRUE; case WM_MEASUREITEM: lpmis=(LPMEASUREITEMSTRUCT)lParam; lpmis->itemHeight=24; return TRUE; case WM_DRAWITEM: lpdis=(LPDRAWITEMSTRUCT)lParam; if (lpdis->itemState & ODS_SELECTED) { FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_HIGHLIGHT)); } else { FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_WINDOW)); } Color=(COLORREF)SendMessage(lpdis->hwndItem, CB_GETITEMDATA, lpdis->itemID, 0); if (Color == (COLORREF)-1) { ColorBrush=(HBRUSH)GetStockObject(NULL_BRUSH); } else { ColorBrush=CreateSolidBrush(Color); } OldBrush=(HBRUSH)SelectObject(lpdis->hDC, ColorBrush); Rectangle(lpdis->hDC,lpdis->rcItem.left+5,lpdis->rcItem.top+2, lpdis->rcItem.right-5, lpdis->rcItem.bottom-2); SelectObject(lpdis->hDC, OldBrush); if (Color == (COLORREF)-1) { SetTextAlign(lpdis->hDC,TA_CENTER); SetBkMode(lpdis->hDC,TRANSPARENT); TextOut(lpdis->hDC,(lpdis->rcItem.right+lpdis->rcItem.left)/2, lpdis->rcItem.top+4,"투명",4); } else { DeleteObject(ColorBrush); } return TRUE; case WM_COMMAND: switch (wParam) { case IDOK: Obj->LineWidth=GetDlgItemInt(hDlg,IDC_EDLINEWIDTH,NULL,FALSE); i=SendDlgItemMessage(hDlg,IDC_CBLINECOLOR,CB_GETCURSEL,0,0); Obj->LineColor=arColor[i]; i=SendDlgItemMessage(hDlg,IDC_CBPLANECOLOR,CB_GETCURSEL,0,0); Obj->PlaneColor=arColor[i]; EndDialog(hDlg,IDOK); return TRUE; case IDCANCEL: EndDialog(hDlg,IDCANCEL); return TRUE; } break; } return FALSE; }
// // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; int wmId, wmEvent; PAINTSTRUCT ps; unsigned short* str[100]; RECT rt; int i; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_HELP_ABOUT: DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDOK: SendMessage(hWnd, WM_ACTIVATE, MAKEWPARAM(WA_INACTIVE, 0), (LPARAM)hWnd); SendMessage(hWnd, WM_CLOSE, 0, 0); break; case ID_TOOLS_EXIT: ILibStopChain(TheChain); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_CREATE: g_hwndCB = CreateRpCommandBar(hWnd); // Initialize the shell activate info structure // Clear up all of the active transfers. for (i=0;i<10;i++) {g_DownloadStatsMapping[i] = -1;} // Load all of the icon resources we will need to draw the UI. HICON_MEDIASERVER = LoadIcon(g_hInst, (LPCTSTR)IDI_MEDIASERVER); HICON_MEDIASERVER2 = LoadIcon(g_hInst, (LPCTSTR)IDI_MEDIASERVER2); HICON_RIGHTARROW = LoadIcon(g_hInst, (LPCTSTR)IDI_RIGHTARROW); HICON_LEFTARROW = LoadIcon(g_hInst, (LPCTSTR)IDI_LEFTARROW); // Create the Micro Media Server thread. This thread will exist for // the duration of the application and will be owned by the media // server library. CreateThread(NULL, 0, &UPnPMain, 0, 0, NULL ); memset (&s_sai, 0, sizeof (s_sai)); s_sai.cbSize = sizeof (s_sai); break; case WM_PAINT: // Paint the complete screen here. Quite workout to get the UI looking // event half decent using Win32 directly. GetClientRect(hWndMainWindow, &rt); hdc = BeginPaint(hWnd, &ps); // Paint the top portion of the screen RECT r; r.left = 1; r.right = rt.right-1; r.top = 0; r.bottom = 40; FillRect(hdc,&r,GetSysColorBrush(COLOR_SCROLLBAR)); DrawEdge(hdc,&r,EDGE_RAISED,BF_RECT); DrawIcon(hdc,8,5,HICON_MEDIASERVER2); SetBkColor(hdc,GetSysColor(COLOR_SCROLLBAR)); // Paint the title r.left = 50; r.right = rt.right-1; r.top = 4; r.bottom = 50; DrawText(hdc,TEXT("Intel Micro Media Server"),-1,&r,0); // Paint the transfer count stat label & value r.left = 50; r.right = rt.right-1; r.top = 20; r.bottom = 50; if (MmsCurrentTransfersCount == 0) { DrawText(hdc,TEXT("No File Transfers "),-1,&r,0); } if (MmsCurrentTransfersCount == 1) { DrawText(hdc,TEXT("1 File Transfer "),-1,&r,0); } if (MmsCurrentTransfersCount > 1) { wsprintf((unsigned short*)str,TEXT("%d File Transfers "),MmsCurrentTransfersCount); DrawText(hdc,(unsigned short*)str,-1,&r,0); } // Paint the main portion of the screen r.left = 1; r.right = rt.right-1; r.top = 42; r.bottom = 267; FillRect(hdc,&r,GetSysColorBrush(COLOR_SCROLLBAR)); // Paint global media server stats labels r.left = 8; r.right = 150; r.top = 50; r.bottom = 70; DrawText(hdc,TEXT("Browse Requests"),-1,&r,0); r.left = 8; r.right = 150; r.top = 70; r.bottom = 90; DrawText(hdc,TEXT("HTTP Requests"),-1,&r,0); // Paint global media server stats values wsprintf((unsigned short*)str,TEXT("%d"),MmsBrowseCount); r.left = 180; r.right = rt.right-5; r.top = 50; r.bottom = 70; DrawText(hdc,(unsigned short*)str,-1,&r,DT_RIGHT); wsprintf((unsigned short*)str,TEXT("%d"),MmsHttpRequestCount); r.left = 180; r.right = rt.right-5; r.top = 70; r.bottom = 90; DrawText(hdc,(unsigned short*)str,-1,&r,DT_RIGHT); // Paint the transfer window edge r.left = 2; r.right = rt.right-1; r.top = 94; r.bottom = 264; DrawEdge(hdc,&r,EDGE_SUNKEN,BF_RECT); // Paint the white transfer window r.left = 4; r.right = rt.right-5; r.top = 96; r.bottom = 262; FillRect(hdc,&r,GetSysColorBrush(COLOR_MENU)); // Draw all of the active transfers on the screen (up to 5) for (i=0;i<5;i++) { DrawTransferInfo(hdc,i,g_DownloadStatsMapping[i]); } EndPaint(hWnd, &ps); break; case WM_CLOSE: ILibStopChain(TheChain); break; case WM_DESTROY: DestroyIcon(HICON_MEDIASERVER); DestroyIcon(HICON_MEDIASERVER2); DestroyIcon(HICON_RIGHTARROW); DestroyIcon(HICON_LEFTARROW); CommandBar_Destroy(g_hwndCB); PostQuitMessage(0); break; case WM_ACTIVATE: // Notify shell of our activate message SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE); break; case WM_SETTINGCHANGE: SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
INT_PTR CALLBACK NetworkPingWndProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { PNETWORK_OUTPUT_CONTEXT context = NULL; if (uMsg == WM_INITDIALOG) { context = (PNETWORK_OUTPUT_CONTEXT)lParam; SetProp(hwndDlg, L"Context", (HANDLE)context); } else { context = (PNETWORK_OUTPUT_CONTEXT)GetProp(hwndDlg, L"Context"); } if (context == NULL) return FALSE; switch (uMsg) { case WM_INITDIALOG: { PH_RECTANGLE windowRectangle; PPH_LAYOUT_ITEM panelItem; // We have already set the group boxes to have WS_EX_TRANSPARENT to fix // the drawing issue that arises when using WS_CLIPCHILDREN. However // in removing the flicker from the graphs the group boxes will now flicker. // It's a good tradeoff since no one stares at the group boxes. PhSetWindowStyle(hwndDlg, WS_CLIPCHILDREN, WS_CLIPCHILDREN); context->WindowHandle = hwndDlg; context->StatusHandle = GetDlgItem(hwndDlg, IDC_MAINTEXT); context->MaxPingTimeout = PhGetIntegerSetting(SETTING_NAME_PING_MINIMUM_SCALING); context->PingSize = PhGetIntegerSetting(SETTING_NAME_PING_SIZE); windowRectangle.Position = PhGetIntegerPairSetting(SETTING_NAME_PING_WINDOW_POSITION); windowRectangle.Size = PhGetScalableIntegerPairSetting(SETTING_NAME_PING_WINDOW_SIZE, TRUE).Pair; // Create the font handle. context->FontHandle = CommonCreateFont(-15, context->StatusHandle); // Create the graph control. context->PingGraphHandle = CreateWindow( PH_GRAPH_CLASSNAME, NULL, WS_VISIBLE | WS_CHILD | WS_BORDER, 0, 0, 3, 3, hwndDlg, NULL, NULL, NULL ); Graph_SetTooltip(context->PingGraphHandle, TRUE); // Load the Process Hacker icon. context->IconHandle = (HICON)LoadImage( NtCurrentPeb()->ImageBaseAddress, MAKEINTRESOURCE(PHAPP_IDI_PROCESSHACKER), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_SHARED ); // Set window icon. if (context->IconHandle) SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)context->IconHandle); // Initialize the WorkQueue with a maximum of 20 threads (fix pinging slow-links with a high interval update). PhInitializeWorkQueue(&context->PingWorkQueue, 0, 20, 5000); PhInitializeGraphState(&context->PingGraphState); PhInitializeLayoutManager(&context->LayoutManager, hwndDlg); PhInitializeCircularBuffer_ULONG(&context->PingHistory, PhGetIntegerSetting(L"SampleCount")); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_ICMP_PANEL), NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_LEFT); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_ICMP_AVG), NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_LEFT); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_ICMP_MIN), NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_LEFT); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_ICMP_MAX), NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_LEFT); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_PINGS_SENT), NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_LEFT); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_PINGS_LOST), NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_LEFT); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_BAD_HASH), NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_LEFT); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_ANON_ADDR), NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_LEFT); PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDOK), NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_RIGHT); panelItem = PhAddLayoutItem(&context->LayoutManager, GetDlgItem(hwndDlg, IDC_PING_LAYOUT), NULL, PH_ANCHOR_ALL); PhAddLayoutItemEx(&context->LayoutManager, context->PingGraphHandle, NULL, PH_ANCHOR_ALL, panelItem->Margin); // Load window settings. if (windowRectangle.Position.X == 0 || windowRectangle.Position.Y == 0) PhCenterWindow(hwndDlg, GetParent(hwndDlg)); else { PhLoadWindowPlacementFromSetting(SETTING_NAME_PING_WINDOW_POSITION, SETTING_NAME_PING_WINDOW_SIZE, hwndDlg); } // Initialize window layout. PhLayoutManagerLayout(&context->LayoutManager); // Convert IP Address to string format. if (context->IpAddress.Type == PH_IPV4_NETWORK_TYPE) { RtlIpv4AddressToString(&context->IpAddress.InAddr, context->IpAddressString); } else { RtlIpv6AddressToString(&context->IpAddress.In6Addr, context->IpAddressString); } SetWindowText(hwndDlg, PhaFormatString(L"Ping %s", context->IpAddressString)->Buffer); SetWindowText(context->StatusHandle, PhaFormatString(L"Pinging %s with %lu bytes of data:", context->IpAddressString, context->PingSize)->Buffer); PhRegisterCallback( &PhProcessesUpdatedEvent, NetworkPingUpdateHandler, context, &context->ProcessesUpdatedRegistration ); } return TRUE; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDCANCEL: case IDOK: DestroyWindow(hwndDlg); break; } } break; case WM_DESTROY: { PhUnregisterCallback( &PhProcessesUpdatedEvent, &context->ProcessesUpdatedRegistration ); PhSaveWindowPlacementToSetting( SETTING_NAME_PING_WINDOW_POSITION, SETTING_NAME_PING_WINDOW_SIZE, hwndDlg ); if (context->PingGraphHandle) DestroyWindow(context->PingGraphHandle); if (context->IconHandle) DestroyIcon(context->IconHandle); if (context->FontHandle) DeleteObject(context->FontHandle); PhDeleteWorkQueue(&context->PingWorkQueue); PhDeleteGraphState(&context->PingGraphState); PhDeleteLayoutManager(&context->LayoutManager); RemoveProp(hwndDlg, L"Context"); PhFree(context); PostQuitMessage(0); } break; case WM_SIZE: PhLayoutManagerLayout(&context->LayoutManager); break; case WM_SIZING: PhResizingMinimumSize((PRECT)lParam, wParam, 420, 250); break; case WM_CTLCOLORBTN: case WM_CTLCOLORDLG: case WM_CTLCOLORSTATIC: { HDC hDC = (HDC)wParam; HWND hwndChild = (HWND)lParam; // Check for our static label and change the color. if (GetDlgCtrlID(hwndChild) == IDC_MAINTEXT) { SetTextColor(hDC, RGB(19, 112, 171)); } // Set a transparent background for the control backcolor. SetBkMode(hDC, TRANSPARENT); // set window background color. return (INT_PTR)GetSysColorBrush(COLOR_WINDOW); } break; case WM_PING_UPDATE: { ULONG i = 0; ULONG maxGraphHeight = 0; ULONG pingAvgValue = 0; NetworkPingUpdateGraph(context); for (i = 0; i < context->PingHistory.Count; i++) { maxGraphHeight = maxGraphHeight + PhGetItemCircularBuffer_ULONG(&context->PingHistory, i); pingAvgValue = maxGraphHeight / context->PingHistory.Count; } SetDlgItemText(hwndDlg, IDC_ICMP_AVG, PhaFormatString( L"Average: %lums", pingAvgValue)->Buffer); SetDlgItemText(hwndDlg, IDC_ICMP_MIN, PhaFormatString( L"Minimum: %lums", context->PingMinMs)->Buffer); SetDlgItemText(hwndDlg, IDC_ICMP_MAX, PhaFormatString( L"Maximum: %lums", context->PingMaxMs)->Buffer); SetDlgItemText(hwndDlg, IDC_PINGS_SENT, PhaFormatString( L"Pings sent: %lu", context->PingSentCount)->Buffer); SetDlgItemText(hwndDlg, IDC_PINGS_LOST, PhaFormatString( L"Pings lost: %lu (%.0f%%)", context->PingLossCount, ((FLOAT)context->PingLossCount / context->PingSentCount * 100) )->Buffer); SetDlgItemText(hwndDlg, IDC_BAD_HASH, PhaFormatString( L"Bad hashes: %lu", context->HashFailCount)->Buffer); SetDlgItemText(hwndDlg, IDC_ANON_ADDR, PhaFormatString( L"Anon replies: %lu", context->UnknownAddrCount)->Buffer); } break; case WM_NOTIFY: { LPNMHDR header = (LPNMHDR)lParam; switch (header->code) { case GCN_GETDRAWINFO: { PPH_GRAPH_GETDRAWINFO getDrawInfo = (PPH_GRAPH_GETDRAWINFO)header; PPH_GRAPH_DRAW_INFO drawInfo = getDrawInfo->DrawInfo; if (header->hwndFrom == context->PingGraphHandle) { if (PhGetIntegerSetting(L"GraphShowText")) { HDC hdc = Graph_GetBufferedContext(context->PingGraphHandle); PhMoveReference(&context->PingGraphState.Text, PhFormatString(L"Ping: %lums", context->CurrentPingMs) ); SelectObject(hdc, PhApplicationFont); PhSetGraphText(hdc, drawInfo, &context->PingGraphState.Text->sr, &NormalGraphTextMargin, &NormalGraphTextPadding, PH_ALIGN_TOP | PH_ALIGN_LEFT); } else { drawInfo->Text.Buffer = NULL; } drawInfo->Flags = PH_GRAPH_USE_GRID_X | PH_GRAPH_USE_GRID_Y; PhSiSetColorsGraphDrawInfo(drawInfo, PhGetIntegerSetting(L"ColorCpuKernel"), 0); PhGraphStateGetDrawInfo(&context->PingGraphState, getDrawInfo, context->PingHistory.Count); if (!context->PingGraphState.Valid) { ULONG i; FLOAT max = 0; for (i = 0; i < drawInfo->LineDataCount; i++) { FLOAT data1; context->PingGraphState.Data1[i] = data1 = (FLOAT)PhGetItemCircularBuffer_ULONG(&context->PingHistory, i); if (max < data1) max = data1; } // Minimum scaling of timeout (1000ms default). if (max < (FLOAT)context->MaxPingTimeout) max = (FLOAT)context->MaxPingTimeout; // Scale the data. PhDivideSinglesBySingle( context->PingGraphState.Data1, max, drawInfo->LineDataCount ); context->PingGraphState.Valid = TRUE; } } } break; case GCN_GETTOOLTIPTEXT: { PPH_GRAPH_GETTOOLTIPTEXT getTooltipText = (PPH_GRAPH_GETTOOLTIPTEXT)lParam; if (getTooltipText->Index < getTooltipText->TotalCount) { if (header->hwndFrom == context->PingGraphHandle) { if (context->PingGraphState.TooltipIndex != getTooltipText->Index) { ULONG pingMs = PhGetItemCircularBuffer_ULONG(&context->PingHistory, getTooltipText->Index); PhMoveReference(&context->PingGraphState.TooltipText, PhFormatString(L"Ping: %lums", pingMs) ); } getTooltipText->Text = context->PingGraphState.TooltipText->sr; } } } break; } } break; } return FALSE; }
INT_PTR SettingsPublish::ProcMessage(UINT message, WPARAM wParam, LPARAM lParam) { HWND hwndTemp; switch(message) { case WM_INITDIALOG: { LocalizeWindow(hwnd); RECT serviceRect, saveToFileRect; GetWindowRect(GetDlgItem(hwnd, IDC_SERVICE), &serviceRect); GetWindowRect(GetDlgItem(hwnd, IDC_SAVEPATH), &saveToFileRect); data.fileControlOffset = saveToFileRect.top-serviceRect.top; //-------------------------------------------- hwndTemp = GetDlgItem(hwnd, IDC_MODE); SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)Str("Settings.Publish.Mode.LiveStream")); SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)Str("Settings.Publish.Mode.FileOnly")); int mode = LoadSettingComboInt(hwndTemp, TEXT("Publish"), TEXT("Mode"), 0, 2); data.mode = mode; //-------------------------------------------- hwndTemp = GetDlgItem(hwnd, IDC_SERVICE); int itemId = (int)SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)TEXT("Custom")); SendMessage(hwndTemp, CB_SETITEMDATA, itemId, 0); UINT numServices = 0; XConfig serverData; if(serverData.Open(TEXT("services.xconfig"))) { XElement *services = serverData.GetElement(TEXT("services")); if(services) { numServices = services->NumElements(); for(UINT i=0; i<numServices; i++) { XElement *service = services->GetElementByID(i); itemId = (int)SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)service->GetName()); SendMessage(hwndTemp, CB_SETITEMDATA, itemId, service->GetInt(TEXT("id"))); } } } int serviceID = AppConfig->GetInt(TEXT("Publish"), TEXT("Service"), 0); if(mode != 0) ShowWindow(hwndTemp, SW_HIDE); //-------------------------------------------- hwndTemp = GetDlgItem(hwnd, IDC_PLAYPATH); LoadSettingEditString(hwndTemp, TEXT("Publish"), TEXT("PlayPath"), NULL); if(mode != 0) ShowWindow(hwndTemp, SW_HIDE); if(serviceID == 0) //custom { ShowWindow(GetDlgItem(hwnd, IDC_SERVERLIST), SW_HIDE); hwndTemp = GetDlgItem(hwnd, IDC_URL); LoadSettingEditString(hwndTemp, TEXT("Publish"), TEXT("URL"), NULL); SendDlgItemMessage(hwnd, IDC_SERVICE, CB_SETCURSEL, 0, 0); } else { ShowWindow(GetDlgItem(hwnd, IDC_URL), SW_HIDE); hwndTemp = GetDlgItem(hwnd, IDC_SERVERLIST); XElement *services = serverData.GetElement(TEXT("services")); if(services) { XElement *service = NULL; numServices = services->NumElements(); for(UINT i=0; i<numServices; i++) { XElement *curService = services->GetElementByID(i); if(curService->GetInt(TEXT("id")) == serviceID) { SendDlgItemMessage(hwnd, IDC_SERVICE, CB_SETCURSEL, i+1, 0); service = curService; break; } } if(service) { XElement *servers = service->GetElement(TEXT("servers")); if(servers) { UINT numServers = servers->NumDataItems(); for(UINT i=0; i<numServers; i++) { XDataItem *server = servers->GetDataItemByID(i); SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)server->GetName()); } } } } LoadSettingComboString(hwndTemp, TEXT("Publish"), TEXT("URL"), NULL); } if(mode != 0) ShowWindow(hwndTemp, SW_HIDE); //-------------------------------------------- hwndTemp = GetDlgItem(hwnd, IDC_LOWLATENCYMODE); BOOL bLowLatencyMode = AppConfig->GetInt(TEXT("Publish"), TEXT("LowLatencyMode"), 0); SendMessage(hwndTemp, BM_SETCHECK, bLowLatencyMode ? BST_CHECKED : BST_UNCHECKED, 0); //-------------------------------------------- hwndTemp = GetDlgItem(hwnd, IDC_AUTORECONNECT); BOOL bAutoReconnect = AppConfig->GetInt(TEXT("Publish"), TEXT("AutoReconnect"), 1); SendMessage(hwndTemp, BM_SETCHECK, bAutoReconnect ? BST_CHECKED : BST_UNCHECKED, 0); if(mode != 0) ShowWindow(hwndTemp, SW_HIDE); hwndTemp = GetDlgItem(hwnd, IDC_AUTORECONNECT_TIMEOUT); EnableWindow(GetDlgItem(hwnd, IDC_AUTORECONNECT_TIMEOUT_EDIT), bAutoReconnect); EnableWindow(hwndTemp, bAutoReconnect); int retryTime = AppConfig->GetInt(TEXT("Publish"), TEXT("AutoReconnectTimeout"), 10); if(retryTime > 60) retryTime = 60; else if(retryTime < 0) retryTime = 0; SendMessage(hwndTemp, UDM_SETRANGE32, 0, 60); SendMessage(hwndTemp, UDM_SETPOS32, 0, retryTime); if(mode != 0) ShowWindow(hwndTemp, SW_HIDE); //-------------------------------------------- hwndTemp = GetDlgItem(hwnd, IDC_DELAY); int delayTime = AppConfig->GetInt(TEXT("Publish"), TEXT("Delay"), 0); SendMessage(hwndTemp, UDM_SETRANGE32, 0, 900); SendMessage(hwndTemp, UDM_SETPOS32, 0, delayTime); //-------------------------------------------- if(mode != 0) { ShowWindow(GetDlgItem(hwnd, IDC_SERVICE_STATIC), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_PLAYPATH_STATIC), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_URL_STATIC), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_SERVER_STATIC), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_LOWLATENCYMODE), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_AUTORECONNECT_TIMEOUT_STATIC), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_AUTORECONNECT_TIMEOUT_EDIT), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_DELAY_STATIC), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_DELAY_EDIT), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_DELAY), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_KEEPRECORDING), SW_HIDE); //ShowWindow(GetDlgItem(hwnd, IDC_DASHBOARDLINK), SW_HIDE); //ShowWindow(GetDlgItem(hwnd, IDC_DASHBOARDLINK_STATIC), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_SAVETOFILE), SW_HIDE); AdjustWindowPos(GetDlgItem(hwnd, IDC_SAVEPATH_STATIC), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_SAVEPATH), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_BROWSE), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STOPSTREAMHOTKEY_STATIC), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STOPSTREAMHOTKEY), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_CLEARHOTKEY), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STARTSTREAMHOTKEY_STATIC), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STARTSTREAMHOTKEY), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_CLEARHOTKEY_STARTSTREAM), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STARTRECORDINGHOTKEY_STATIC), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STOPRECORDINGHOTKEY_STATIC), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STARTRECORDINGHOTKEY), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STOPRECORDINGHOTKEY), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_CLEARHOTKEY_STARTRECORDING), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_CLEARHOTKEY_STOPRECORDING), 0, -data.fileControlOffset); } //-------------------------------------------- DWORD startHotkey = AppConfig->GetInt(TEXT("Publish"), TEXT("StartStreamHotkey")); SendMessage(GetDlgItem(hwnd, IDC_STARTSTREAMHOTKEY), HKM_SETHOTKEY, startHotkey, 0); //-------------------------------------------- DWORD stopHotkey = AppConfig->GetInt(TEXT("Publish"), TEXT("StopStreamHotkey")); SendMessage(GetDlgItem(hwnd, IDC_STOPSTREAMHOTKEY), HKM_SETHOTKEY, stopHotkey, 0); //-------------------------------------------- startHotkey = AppConfig->GetInt(TEXT("Publish"), TEXT("StartRecordingHotkey")); SendMessage(GetDlgItem(hwnd, IDC_STARTRECORDINGHOTKEY), HKM_SETHOTKEY, startHotkey, 0); //-------------------------------------------- stopHotkey = AppConfig->GetInt(TEXT("Publish"), TEXT("StopRecordingHotkey")); SendMessage(GetDlgItem(hwnd, IDC_STOPRECORDINGHOTKEY), HKM_SETHOTKEY, stopHotkey, 0); //-------------------------------------------- BOOL bKeepRecording = AppConfig->GetInt(TEXT("Publish"), TEXT("KeepRecording")); SendMessage(GetDlgItem(hwnd, IDC_KEEPRECORDING), BM_SETCHECK, bKeepRecording ? BST_CHECKED : BST_UNCHECKED, 0); BOOL bSaveToFile = AppConfig->GetInt(TEXT("Publish"), TEXT("SaveToFile")); SendMessage(GetDlgItem(hwnd, IDC_SAVETOFILE), BM_SETCHECK, bSaveToFile ? BST_CHECKED : BST_UNCHECKED, 0); CTSTR lpSavePath = AppConfig->GetStringPtr(TEXT("Publish"), TEXT("SavePath")); SetWindowText(GetDlgItem(hwnd, IDC_SAVEPATH), lpSavePath); EnableWindow(GetDlgItem(hwnd, IDC_KEEPRECORDING), bSaveToFile || (mode != 0)); EnableWindow(GetDlgItem(hwnd, IDC_SAVEPATH), bSaveToFile || (mode != 0)); EnableWindow(GetDlgItem(hwnd, IDC_BROWSE), bSaveToFile || (mode != 0)); //-------------------------------------------- //SetWindowText(GetDlgItem(hwnd, IDC_DASHBOARDLINK), App->strDashboard); //-------------------------------------------- SetWarningInfo(); ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_HIDE); SetChangedSettings(false); return TRUE; } case WM_CTLCOLORSTATIC: { switch (GetDlgCtrlID((HWND)lParam)) { case IDC_WARNINGS: SetTextColor((HDC)wParam, RGB(255, 0, 0)); SetBkColor((HDC)wParam, COLORREF(GetSysColor(COLOR_3DFACE))); return (INT_PTR)GetSysColorBrush(COLOR_BTNFACE); } } break; case WM_DESTROY: { } break; case WM_NOTIFY: { NMHDR *nmHdr = (NMHDR*)lParam; if(nmHdr->idFrom == IDC_AUTORECONNECT_TIMEOUT) { if(nmHdr->code == UDN_DELTAPOS) SetChangedSettings(true); } break; } case WM_COMMAND: { bool bDataChanged = false; switch(LOWORD(wParam)) { case IDC_MODE: { if(HIWORD(wParam) != CBN_SELCHANGE) break; int mode = (int)SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0); int swShowControls = (mode == 0) ? SW_SHOW : SW_HIDE; ShowWindow(GetDlgItem(hwnd, IDC_SERVICE), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_PLAYPATH), swShowControls); int serviceID = (int)SendMessage(GetDlgItem(hwnd, IDC_SERVICE), CB_GETCURSEL, 0, 0); if(serviceID == 0) { ShowWindow(GetDlgItem(hwnd, IDC_SERVERLIST), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_URL), swShowControls); } else { ShowWindow(GetDlgItem(hwnd, IDC_SERVERLIST), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_URL), SW_HIDE); } BOOL bSaveToFile = SendMessage(GetDlgItem(hwnd, IDC_SAVETOFILE), BM_GETCHECK, 0, 0) != BST_UNCHECKED; EnableWindow(GetDlgItem(hwnd, IDC_KEEPRECORDING), bSaveToFile || (mode != 0)); EnableWindow(GetDlgItem(hwnd, IDC_SAVEPATH), bSaveToFile || (mode != 0)); EnableWindow(GetDlgItem(hwnd, IDC_BROWSE), bSaveToFile || (mode != 0)); if(mode == 0 && data.mode == 1) { AdjustWindowPos(GetDlgItem(hwnd, IDC_SAVEPATH_STATIC), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_SAVEPATH), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_BROWSE), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STOPSTREAMHOTKEY_STATIC), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STOPSTREAMHOTKEY), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_CLEARHOTKEY), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STARTSTREAMHOTKEY_STATIC), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STARTSTREAMHOTKEY), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_CLEARHOTKEY_STARTSTREAM), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STARTRECORDINGHOTKEY_STATIC), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STOPRECORDINGHOTKEY_STATIC), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STARTRECORDINGHOTKEY), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STOPRECORDINGHOTKEY), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_CLEARHOTKEY_STARTRECORDING), 0, data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_CLEARHOTKEY_STOPRECORDING), 0, data.fileControlOffset); } else if(mode == 1 && data.mode == 0) { AdjustWindowPos(GetDlgItem(hwnd, IDC_SAVEPATH_STATIC), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_SAVEPATH), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_BROWSE), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STOPSTREAMHOTKEY_STATIC), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STOPSTREAMHOTKEY), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_CLEARHOTKEY), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STARTSTREAMHOTKEY_STATIC), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STARTSTREAMHOTKEY), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_CLEARHOTKEY_STARTSTREAM), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STARTRECORDINGHOTKEY_STATIC), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STOPRECORDINGHOTKEY_STATIC), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STARTRECORDINGHOTKEY), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_STOPRECORDINGHOTKEY), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_CLEARHOTKEY_STARTRECORDING), 0, -data.fileControlOffset); AdjustWindowPos(GetDlgItem(hwnd, IDC_CLEARHOTKEY_STOPRECORDING), 0, -data.fileControlOffset); } data.mode = mode; ShowWindow(GetDlgItem(hwnd, IDC_SERVICE_STATIC), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_PLAYPATH_STATIC), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_URL_STATIC), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_SERVER_STATIC), swShowControls); //ShowWindow(GetDlgItem(hwnd, IDC_DASHBOARDLINK), swShowControls); //ShowWindow(GetDlgItem(hwnd, IDC_DASHBOARDLINK_STATIC), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_LOWLATENCYMODE), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_AUTORECONNECT), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_AUTORECONNECT_TIMEOUT), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_AUTORECONNECT_TIMEOUT_STATIC), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_AUTORECONNECT_TIMEOUT_EDIT), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_DELAY_STATIC), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_DELAY_EDIT), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_DELAY), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_SAVETOFILE), swShowControls); ShowWindow(GetDlgItem(hwnd, IDC_KEEPRECORDING), swShowControls); SetWarningInfo(); bDataChanged = true; break; } case IDC_SERVICE: if(HIWORD(wParam) == CBN_SELCHANGE) { int serviceID = (int)SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0); if(serviceID == 0) { ShowWindow(GetDlgItem(hwnd, IDC_SERVERLIST), SW_HIDE); ShowWindow(GetDlgItem(hwnd, IDC_URL), SW_SHOW); SetWindowText(GetDlgItem(hwnd, IDC_URL), NULL); //SetWindowText(GetDlgItem(hwnd, IDC_DASHBOARDLINK), NULL); } else { ShowWindow(GetDlgItem(hwnd, IDC_URL), SW_HIDE); hwndTemp = GetDlgItem(hwnd, IDC_SERVERLIST); ShowWindow(hwndTemp, SW_SHOW); SendMessage(hwndTemp, CB_RESETCONTENT, 0, 0); XConfig serverData; if(serverData.Open(TEXT("services.xconfig"))) { XElement *services = serverData.GetElement(TEXT("services")); if(services) { XElement *service = services->GetElementByID(serviceID-1); if(service) { XElement *servers = service->GetElement(TEXT("servers")); if(servers) { UINT numServers = servers->NumDataItems(); for(UINT i=0; i<numServers; i++) { XDataItem *server = servers->GetDataItemByID(i); SendMessage(hwndTemp, CB_ADDSTRING, 0, (LPARAM)server->GetName()); } } } } } SendMessage(hwndTemp, CB_SETCURSEL, 0, 0); } SetWindowText(GetDlgItem(hwnd, IDC_PLAYPATH), NULL); bDataChanged = true; } SetWarningInfo(); break; case IDC_AUTORECONNECT: if(HIWORD(wParam) == BN_CLICKED) { BOOL bAutoReconnect = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED; EnableWindow(GetDlgItem(hwnd, IDC_AUTORECONNECT_TIMEOUT), bAutoReconnect); EnableWindow(GetDlgItem(hwnd, IDC_AUTORECONNECT_TIMEOUT_EDIT), bAutoReconnect); SetChangedSettings(true); } break; case IDC_AUTORECONNECT_TIMEOUT_EDIT: if(HIWORD(wParam) == EN_CHANGE) SetChangedSettings(true); break; case IDC_DELAY_EDIT: if(HIWORD(wParam) == EN_CHANGE) bDataChanged = true; break; case IDC_SAVETOFILE: if(HIWORD(wParam) == BN_CLICKED) { BOOL bSaveToFile = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED; EnableWindow(GetDlgItem(hwnd, IDC_KEEPRECORDING), bSaveToFile); EnableWindow(GetDlgItem(hwnd, IDC_SAVEPATH), bSaveToFile); EnableWindow(GetDlgItem(hwnd, IDC_BROWSE), bSaveToFile); bDataChanged = true; } break; case IDC_KEEPRECORDING: if(HIWORD(wParam) == BN_CLICKED) { BOOL bKeepRecording = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED; App->bKeepRecording = bKeepRecording != 0; bDataChanged = true; } break; case IDC_BROWSE: { TCHAR lpFile[512]; OPENFILENAME ofn; zero(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwnd; ofn.lpstrFile = lpFile; ofn.nMaxFile = 511; ofn.lpstrFile[0] = 0; ofn.lpstrFilter = TEXT("MP4 File (*.mp4)\0*.mp4\0Flash Video File (*.flv)\0*.flv\0"); ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.nFilterIndex = 1; ofn.lpstrInitialDir = AppConfig->GetStringPtr(TEXT("Publish"), TEXT("LastSaveDir")); ofn.Flags = OFN_PATHMUSTEXIST; TCHAR curDirectory[512]; GetCurrentDirectory(511, curDirectory); BOOL bChoseFile = GetSaveFileName(&ofn); SetCurrentDirectory(curDirectory); if(*lpFile && bChoseFile) { String strFile = lpFile; strFile.FindReplace(TEXT("\\"), TEXT("/")); String strExtension = GetPathExtension(strFile); if(strExtension.IsEmpty() || (!strExtension.CompareI(TEXT("flv")) && /*!strExtension.CompareI(TEXT("avi")) &&*/ !strExtension.CompareI(TEXT("mp4")))) { switch(ofn.nFilterIndex) { case 1: strFile << TEXT(".mp4"); break; case 2: strFile << TEXT(".flv"); break; /*case 3: strFile << TEXT(".avi"); break;*/ } } String strFilePath = GetPathDirectory(strFile).FindReplace(TEXT("/"), TEXT("\\")) << TEXT("\\"); AppConfig->SetString(TEXT("Publish"), TEXT("LastSaveDir"), strFilePath); strFile.FindReplace(TEXT("/"), TEXT("\\")); SetWindowText(GetDlgItem(hwnd, IDC_SAVEPATH), strFile); bDataChanged = true; } break; } case IDC_LOWLATENCYMODE: if(HIWORD(wParam) == BN_CLICKED) bDataChanged = true; break; case IDC_STARTSTREAMHOTKEY: case IDC_STOPSTREAMHOTKEY: //case IDC_DASHBOARDLINK: case IDC_STARTRECORDINGHOTKEY: case IDC_STOPRECORDINGHOTKEY: if(HIWORD(wParam) == EN_CHANGE) SetChangedSettings(true); break; case IDC_PLAYPATH: case IDC_URL: case IDC_SAVEPATH: if(HIWORD(wParam) == EN_CHANGE) bDataChanged = true; break; case IDC_CLEARHOTKEY_STARTSTREAM: if(HIWORD(wParam) == BN_CLICKED) { if(SendMessage(GetDlgItem(hwnd, IDC_STARTSTREAMHOTKEY), HKM_GETHOTKEY, 0, 0)) { SendMessage(GetDlgItem(hwnd, IDC_STARTSTREAMHOTKEY), HKM_SETHOTKEY, 0, 0); SetChangedSettings(true); } } break; case IDC_CLEARHOTKEY: if(HIWORD(wParam) == BN_CLICKED) { if(SendMessage(GetDlgItem(hwnd, IDC_STOPSTREAMHOTKEY), HKM_GETHOTKEY, 0, 0)) { SendMessage(GetDlgItem(hwnd, IDC_STOPSTREAMHOTKEY), HKM_SETHOTKEY, 0, 0); SetChangedSettings(true); } } break; case IDC_CLEARHOTKEY_STARTRECORDING: if (HIWORD(wParam) == BN_CLICKED) { if (SendMessage(GetDlgItem(hwnd, IDC_STARTRECORDINGHOTKEY), HKM_GETHOTKEY, 0, 0)) { SendMessage(GetDlgItem(hwnd, IDC_STARTRECORDINGHOTKEY), HKM_SETHOTKEY, 0, 0); SetChangedSettings(true); } } break; case IDC_CLEARHOTKEY_STOPRECORDING: if (HIWORD(wParam) == BN_CLICKED) { if (SendMessage(GetDlgItem(hwnd, IDC_STOPRECORDINGHOTKEY), HKM_GETHOTKEY, 0, 0)) { SendMessage(GetDlgItem(hwnd, IDC_STOPRECORDINGHOTKEY), HKM_SETHOTKEY, 0, 0); SetChangedSettings(true); } } break; case IDC_SERVERLIST: if(HIWORD(wParam) == CBN_EDITCHANGE || HIWORD(wParam) == CBN_SELCHANGE) bDataChanged = true; break; } if(bDataChanged) { ShowWindow(GetDlgItem(hwnd, IDC_INFO), SW_SHOW); SetChangedSettings(true); } break; } } return FALSE; }
/** * Below CheckMessageBoxProc adds everyones favorite "don't show again" checkbox to the dialog * much of the layout code (especially for XP and older windows versions) is copied with changes * from a GPL'ed project emabox at SourceForge. **/ LRESULT CALLBACK CheckMessageBoxProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_COMMAND: { if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == 2025) { const LRESULT res = SendMessage((HWND)lParam, BM_GETSTATE, 0, 0); bool bCheckedAfter = ((res & BST_CHECKED) == 0); // Update usedata ExMessageBox::SetUserData((void*)(bCheckedAfter ? BST_CHECKED : BST_UNCHECKED)); SendMessage((HWND)lParam, BM_SETCHECK, bCheckedAfter ? BST_CHECKED : BST_UNCHECKED, 0); } } break; case WM_ERASEBKGND: { // Vista+ has grey strip if (WinUtil::getOsMajor() >= 6) { RECT rc = {0}; HDC dc = (HDC)wParam; // Fill the entire dialog GetClientRect(hWnd, &rc); FillRect(dc, &rc, GetSysColorBrush(COLOR_WINDOW)); // Calculate strip height RECT rcButton = {0}; GetWindowRect(FindWindowEx(hWnd, NULL, L"BUTTON", NULL), &rcButton); int stripHeight = (rcButton.bottom - rcButton.top) + 24; // Fill the strip rc.top += (rc.bottom - rc.top) - stripHeight; FillRect(dc, &rc, GetSysColorBrush(COLOR_3DFACE)); // Make a line HGDIOBJ oldPen = SelectObject(dc, CreatePen(PS_SOLID, 1, GetSysColor(COLOR_3DLIGHT))); MoveToEx(dc, rc.left - 1, rc.top, (LPPOINT)NULL); LineTo(dc, rc.right, rc.top); DeleteObject(SelectObject(dc, oldPen)); return S_OK; } } break; case WM_CTLCOLORSTATIC: { // Vista+ has grey strip if ((WinUtil::getOsMajor() >= 6) && ((HWND)lParam == GetDlgItem(hWnd, 2025))) { HDC hdc = (HDC)wParam; SetBkMode(hdc, TRANSPARENT); return (LRESULT)GetSysColorBrush(COLOR_3DFACE); } } break; case WM_INITDIALOG: { RECT rc = {0}; HWND current = NULL; int iWindowWidthBefore; int iWindowHeightBefore; int iClientHeightBefore; int iClientWidthBefore; pair<LPCTSTR, UINT> checkdata = (*(pair<LPCTSTR, UINT>*)ExMessageBox::GetUserData()); GetClientRect(hWnd, &rc); iClientHeightBefore = rc.bottom - rc.top; iClientWidthBefore = rc.right - rc.left; GetWindowRect(hWnd, &rc); iWindowWidthBefore = rc.right - rc.left; iWindowHeightBefore = rc.bottom - rc.top; // Create checkbox (resized and moved later) HWND check = CreateWindow(L"BUTTON", checkdata.first, WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_VCENTER | BS_CHECKBOX, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, (HMENU)2025, GetModuleHandle(NULL), NULL ); // Assume checked by default SendMessage(check, BM_SETCHECK, checkdata.second, 0); ExMessageBox::SetUserData((void*)checkdata.second); // Apply default font const int cyMenuSize = GetSystemMetrics(SM_CYMENUSIZE); const int cxMenuSize = GetSystemMetrics(SM_CXMENUSIZE); const HFONT hNewFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); HFONT hOldFont; SIZE size; SendMessage(check, WM_SETFONT, (WPARAM)hNewFont, (LPARAM)TRUE); // Get the size of the checkbox HDC hdc = GetDC(check); hOldFont = (HFONT)SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT)); GetTextExtentPoint32(hdc, checkdata.first, wcslen(checkdata.first), &size); SelectObject(hdc, hOldFont); ReleaseDC(check, hdc); // Checkbox dimensions int iCheckboxWidth = cxMenuSize + size.cx + 1; int iCheckboxHeight = (cyMenuSize > size.cy) ? cyMenuSize : size.cy; // Vista+ has a different kind of layout altogether if (WinUtil::getOsMajor() >= 6) { // Align checkbox with buttons (aproximately) int iCheckboxTop = int(iClientHeightBefore - (iCheckboxHeight * 1.70)); MoveWindow(check, 5, iCheckboxTop, iCheckboxWidth, iCheckboxHeight, FALSE); // Resize and re-center dialog int iWindowWidthAfter = iWindowWidthBefore + iCheckboxWidth; int iWindowLeftAfter = rc.left + (iWindowWidthBefore - iWindowWidthAfter) / 2; MoveWindow(hWnd, iWindowLeftAfter, rc.top, iWindowWidthAfter, iWindowHeightBefore, TRUE); // Go through the buttons and move them while ((current = FindWindowEx(hWnd, current, L"BUTTON", NULL)) != NULL) { if (current == check) continue; RECT rc; GetWindowRect(current, &rc); ScreenToClient(hWnd, &rc); MoveWindow(current, rc.left + iCheckboxWidth, rc.top, rc.right - rc.left, rc.bottom - rc.top, FALSE); } } else { RECT rt = {0}, rb = {0}; // Let's find us the label while ((current = FindWindowEx(hWnd, current, L"STATIC", NULL)) != NULL) { if (GetWindowTextLength(current) > 0) { GetWindowRect(current, &rt); ScreenToClient(hWnd, &rt); current = NULL; break; } } // For correcting width, here just to make lines shorter int iWidthAdjustment = (rt.left + iCheckboxWidth) - iWindowWidthBefore; // Go through the buttons and move them current = NULL; while ((current = FindWindowEx(hWnd, current, L"BUTTON", NULL)) != NULL) { if (current == check) continue; GetWindowRect(current, &rb); ScreenToClient(hWnd, &rb); MoveWindow(current, rb.left + (iWidthAdjustment > 0 ? (iWidthAdjustment + 15) / 2 : 0), rb.top + iCheckboxHeight, rb.right - rb.left, rb.bottom - rb.top, FALSE); } // Move the checkbox int iCheckboxTop = rt.top + (rt.bottom - rt.top) + ((rb.top - rt.bottom) / 2); MoveWindow(check, rt.left, iCheckboxTop, iCheckboxWidth, iCheckboxHeight, FALSE); // Resize and re-center dialog int iWindowHeightAfter = iWindowHeightBefore + iCheckboxHeight; int iWindowTopAfter = rc.top + (iWindowHeightBefore - iWindowHeightAfter) / 2; int iWindowWidthAfter = (iWidthAdjustment > 0) ? iWindowWidthBefore + iWidthAdjustment + 15 : iWindowWidthBefore; int iWindowLeftAfter = rc.left + (iWindowWidthBefore - iWindowWidthAfter) / 2; MoveWindow(hWnd, iWindowLeftAfter, iWindowTopAfter, iWindowWidthAfter, iWindowHeightAfter, TRUE); } } break; } return CallWindowProc(ExMessageBox::GetMessageBoxProc(), hWnd, uMsg, wParam, lParam); }
static VOID DrawBackgroundPreview(LPDRAWITEMSTRUCT draw, PDATA pData) { float scaleX; float scaleY; int scaledWidth; int scaledHeight; int posX, desX; int posY, desY; HBRUSH hBrush; int x; int y; HDC hDC; HGDIOBJ hOldObj; RECT rcItem = { MONITOR_LEFT, MONITOR_TOP, MONITOR_RIGHT, MONITOR_BOTTOM }; hDC = CreateCompatibleDC(draw->hDC); hOldObj = SelectObject(hDC, pData->hBitmap); if (pData->backgroundItems[pData->backgroundSelection].bWallpaper == FALSE) { /* Update desktop background color image */ hBrush = CreateSolidBrush(g_GlobalData.desktop_color); FillRect(hDC, &rcItem, hBrush); DeleteObject(hBrush); } else if (pData->pWallpaperBitmap != NULL) { scaleX = ((float)GetSystemMetrics(SM_CXSCREEN) - 1) / (float)MONITOR_WIDTH; scaleY = ((float)GetSystemMetrics(SM_CYSCREEN) - 1) / (float)MONITOR_HEIGHT; scaledWidth = (int)(pData->pWallpaperBitmap->width / scaleX); scaledHeight = (int)(pData->pWallpaperBitmap->height / scaleY); FillRect(hDC, &rcItem, GetSysColorBrush(COLOR_BACKGROUND)); SetStretchBltMode(hDC, COLORONCOLOR); switch (pData->placementSelection) { case PLACEMENT_CENTER: posX = (MONITOR_WIDTH - scaledWidth + 1) / 2; posY = (MONITOR_HEIGHT - scaledHeight + 1) / 2; desX = 0; desY = 0; if (posX < 0) { desX = -posX / 2; posX = 0; } if (posY < 0) { desY = -posY / 2; posY = 0; } if (scaledWidth > MONITOR_WIDTH) scaledWidth = MONITOR_WIDTH; if (scaledHeight > MONITOR_HEIGHT) scaledHeight = MONITOR_HEIGHT; StretchDIBits(hDC, MONITOR_LEFT+posX, MONITOR_TOP+posY, scaledWidth, scaledHeight, desX, desY, pData->pWallpaperBitmap->width - (int)(desX * scaleX), pData->pWallpaperBitmap->height - (int)(desY * scaleY), pData->pWallpaperBitmap->bits, pData->pWallpaperBitmap->info, DIB_RGB_COLORS, SRCCOPY); break; case PLACEMENT_STRETCH: StretchDIBits(hDC, MONITOR_LEFT, MONITOR_TOP, MONITOR_WIDTH, MONITOR_HEIGHT, 0, 0, pData->pWallpaperBitmap->width, pData->pWallpaperBitmap->height, pData->pWallpaperBitmap->bits, pData->pWallpaperBitmap->info, DIB_RGB_COLORS, SRCCOPY); break; case PLACEMENT_TILE: for (y = 0; y < MONITOR_HEIGHT; y += scaledHeight) { for (x = 0; x < MONITOR_WIDTH; x += scaledWidth) { if ((MONITOR_WIDTH-x) >= scaledWidth) posX = scaledWidth; else posX = MONITOR_WIDTH-x; if ((MONITOR_HEIGHT-y) >= scaledHeight) posY = scaledHeight; else posY = MONITOR_HEIGHT-y; StretchDIBits(hDC, MONITOR_LEFT + x, MONITOR_TOP + y, posX, posY, 0, 0, pData->pWallpaperBitmap->width * posX / scaledWidth, pData->pWallpaperBitmap->height * posY / scaledHeight, pData->pWallpaperBitmap->bits, pData->pWallpaperBitmap->info, DIB_RGB_COLORS, SRCCOPY); } } break; } } GdiTransparentBlt(draw->hDC, draw->rcItem.left, draw->rcItem.top, draw->rcItem.right-draw->rcItem.left+1, draw->rcItem.bottom-draw->rcItem.top+1, hDC, 0, 0, pData->cxSource, pData->cySource, 0xFF00FF); SelectObject(hDC, hOldObj); DeleteDC(hDC); }
VOID PaintConsole(LPDRAWITEMSTRUCT drawItem, PCONSOLE_PROPS pConInfo) { PGUI_CONSOLE_INFO GuiInfo = pConInfo->TerminalInfo.TermInfo; HBRUSH hBrush; RECT cRect, fRect; DWORD startx, starty; DWORD endx, endy; DWORD sizex, sizey; FillRect(drawItem->hDC, &drawItem->rcItem, GetSysColorBrush(COLOR_BACKGROUND)); sizex = drawItem->rcItem.right - drawItem->rcItem.left; sizey = drawItem->rcItem.bottom - drawItem->rcItem.top; if ( GuiInfo->WindowOrigin.x == MAXDWORD && GuiInfo->WindowOrigin.y == MAXDWORD ) { startx = sizex / 3; starty = sizey / 3; } else { // TODO: // Calculate pos correctly when console centered startx = sizex / 3; starty = sizey / 3; } // TODO: // Strech console when bold fonts are selected endx = drawItem->rcItem.right - startx + 15; endy = starty + sizey / 3; /* Draw console size */ SetRect(&cRect, startx, starty, endx, endy); FillRect(drawItem->hDC, &cRect, GetSysColorBrush(COLOR_WINDOWFRAME)); /* Draw console border */ SetRect(&fRect, startx + 1, starty + 1, cRect.right - 1, cRect.bottom - 1); FrameRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVEBORDER)); /* Draw left box */ SetRect(&fRect, startx + 3, starty + 3, startx + 5, starty + 5); FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVEBORDER)); /* Draw window title */ SetRect(&fRect, startx + 7, starty + 3, cRect.right - 9, starty + 5); FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVECAPTION)); /* Draw first right box */ SetRect(&fRect, fRect.right + 1, starty + 3, fRect.right + 3, starty + 5); FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVEBORDER)); /* Draw second right box */ SetRect(&fRect, fRect.right + 1, starty + 3, fRect.right + 3, starty + 5); FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_ACTIVEBORDER)); /* Draw scrollbar */ SetRect(&fRect, cRect.right - 5, fRect.bottom + 1, cRect.right - 3, cRect.bottom - 3); FillRect(drawItem->hDC, &fRect, GetSysColorBrush(COLOR_SCROLLBAR)); /* Draw console background */ hBrush = CreateSolidBrush(pConInfo->ci.Colors[BkgdAttribFromAttrib(pConInfo->ci.ScreenAttrib)]); SetRect(&fRect, startx + 3, starty + 6, cRect.right - 6, cRect.bottom - 3); FillRect(drawItem->hDC, &fRect, hBrush); DeleteObject((HGDIOBJ)hBrush); }
INT_PTR CALLBACK DbgPropDlgProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { switch (uMsg) { case WM_INITDIALOG: { PDEBUG_LOG_ENTRY entry = (PDEBUG_LOG_ENTRY)lParam; PhCenterWindow(hwndDlg, GetParent(hwndDlg)); PhInitializeLayoutManager(&LayoutManager, hwndDlg); PhAddLayoutItem(&LayoutManager, GetDlgItem(hwndDlg, IDC_MESSAGE), NULL, PH_ANCHOR_ALL); PhAddLayoutItem(&LayoutManager, GetDlgItem(hwndDlg, IDCLOSE), NULL, PH_ANCHOR_BOTTOM | PH_ANCHOR_RIGHT); Edit_SetText(GetDlgItem(hwndDlg, IDC_MESSAGE), entry->Message->Buffer); //SendMessage(GetDlgItem(hwndDlg, IDC_MESSAGE), WM_SETFONT, (WPARAM)PhApplicationFont, FALSE); } return TRUE; case WM_DESTROY: PhDeleteLayoutManager(&LayoutManager); break; case WM_SIZE: PhLayoutManagerLayout(&LayoutManager); break; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDCANCEL: case IDCLOSE: EndDialog(hwndDlg, IDOK); break; } } break; case WM_CTLCOLORBTN: case WM_CTLCOLORDLG: case WM_CTLCOLORSTATIC: { HDC hDC = (HDC)wParam; HWND hwndChild = (HWND)lParam; // Check for our static label and change the color. if (GetDlgCtrlID(hwndChild) == IDC_MESSAGE) { SetBkMode(hDC, TRANSPARENT); // set window background color. return (INT_PTR)GetSysColorBrush(COLOR_WINDOW); } } break; } return FALSE; }
BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG: { SendDlgItemMessage(hwndDlg, IDC_CHECK_READONLY, BM_SETCHECK, replayReadOnlySetting?BST_CHECKED:BST_UNCHECKED, 0); SendDlgItemMessage(hwndDlg, IDC_CHECK_STOPMOVIE,BM_SETCHECK, BST_UNCHECKED, 0); #define NUM_OF_MOVIEGLOB_PATHS 1 char* findGlob[NUM_OF_MOVIEGLOB_PATHS] = {strdup(FCEU_MakeFName(FCEUMKF_MOVIEGLOB, 0, 0).c_str())}; int items=0; for(int j = 0;j < NUM_OF_MOVIEGLOB_PATHS; j++) { char* temp=0; do { temp=strchr(findGlob[j],'/'); if(temp) *temp = '\\'; } while(temp); // disabled because... apparently something is case sensitive?? // for(i=1;i<strlen(findGlob[j]);i++) // findGlob[j][i] = tolower(findGlob[j][i]); } for(int j = 0;j < NUM_OF_MOVIEGLOB_PATHS; j++) { // if the two directories are the same, only look through one of them to avoid adding everything twice if(j==1 && !strnicmp(findGlob[0],findGlob[1],MAX(strlen(findGlob[0]),strlen(findGlob[1]))-6)) continue; char globBase[512]; strcpy(globBase,findGlob[j]); globBase[strlen(globBase)-5]='\0'; //char szFindPath[512]; //mbg merge 7/17/06 removed WIN32_FIND_DATA wfd; HANDLE hFind; memset(&wfd, 0, sizeof(wfd)); hFind = FindFirstFile(findGlob[j], &wfd); if(hFind != INVALID_HANDLE_VALUE) { do { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; //TODO - a big copy/pasted block below. factor out extension extractor or use another one // filter out everything that's not an extension we like (*.fm2 and *.fm3) // (because FindFirstFile is too dumb to do that) { std::string ext = getExtension(wfd.cFileName); if(ext != "fm2") if(ext != "fm3") if(ext != "zip") if(ext != "rar") if(ext != "7z") continue; } char filename [512]; sprintf(filename, "%s%s", globBase, wfd.cFileName); //replay system requires this to stay put. SetCurrentDirectory(BaseDirectory.c_str()); ArchiveScanRecord asr = FCEUD_ScanArchive(filename); if(!asr.isArchive()) { FCEUFILE* fp = FCEU_fopen(filename,0,"rb",0); if(fp) { //fp->stream = fp->stream->memwrap(); - no need to load whole movie to memory! We only need to read movie header! HandleScan(hwndDlg, fp, items); delete fp; } } else { asr.files.FilterByExtension(fm2ext); for(uint32 i=0;i<asr.files.size();i++) { FCEUFILE* fp = FCEU_fopen(filename,0,"rb",0,asr.files[i].index); if(fp) { HandleScan(hwndDlg,fp, items); delete fp; } } } } while(FindNextFile(hFind, &wfd)); FindClose(hFind); } } for(int j = 0; j < NUM_OF_MOVIEGLOB_PATHS; j++) free(findGlob[j]); if(items>0) SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_SETCURSEL, items-1, 0); SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_INSERTSTRING, items++, (LPARAM)"Browse..."); UpdateReplayDialog(hwndDlg); } SetFocus(GetDlgItem(hwndDlg, IDC_COMBO_FILENAME)); return FALSE; case WM_COMMAND: if (HIWORD(wParam) == EN_CHANGE) { if (LOWORD(wParam) == IDC_EDIT_STOPFRAME) // Check if Stop movie at value has changed { if (stopframeWasEditedByUser) { HWND hwnd1 = GetDlgItem(hwndDlg,IDC_CHECK_STOPMOVIE); Button_SetCheck(hwnd1,BST_CHECKED); stopframeWasEditedByUser = true; } else stopframeWasEditedByUser = true; } } if (HIWORD(wParam) == CBN_SELCHANGE) { UpdateReplayDialog(hwndDlg); } else if(HIWORD(wParam) == CBN_CLOSEUP) { LONG lCount = SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_GETCOUNT, 0, 0); LONG lIndex = SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_GETCURSEL, 0, 0); if (lIndex != CB_ERR && lIndex == lCount-1) SendMessage(hwndDlg, WM_COMMAND, (WPARAM)IDOK, 0); // send an OK notification to open the file browser } else { int wID = LOWORD(wParam); switch(wID) { case IDC_BUTTON_METADATA: DialogBoxParam(fceu_hInstance, "IDD_REPLAY_METADATA", hwndDlg, ReplayMetadataDialogProc, (LPARAM)0); break; case IDOK: { LONG lCount = SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_GETCOUNT, 0, 0); LONG lIndex = SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_GETCURSEL, 0, 0); if(lIndex != CB_ERR) { if(lIndex == lCount-1) { // pop open a file browser... char *pn=strdup(FCEU_GetPath(FCEUMKF_MOVIE).c_str()); char szFile[MAX_PATH]={0}; OPENFILENAME ofn; //int nRet; //mbg merge 7/17/06 removed memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwndDlg; ofn.lpstrFilter = "FCEUX Movie Files (*.fm2), TAS Editor Projects (*.fm3)\0*.fm2;*.fm3\0FCEUX Movie Files (*.fm2)\0*.fm2\0Archive Files (*.zip,*.rar,*.7z)\0*.zip;*.rar;*.7z\0All Files (*.*)\0*.*\0\0"; ofn.lpstrFile = szFile; ofn.nMaxFile = sizeof(szFile); ofn.lpstrInitialDir = pn; ofn.Flags = OFN_NOCHANGEDIR | OFN_HIDEREADONLY; ofn.lpstrDefExt = "fm2"; ofn.lpstrTitle = "Play Movie from File"; if(GetOpenFileName(&ofn)) { char relative[MAX_PATH*2]; AbsoluteToRelative(relative, szFile, BaseDirectory.c_str()); //replay system requires this to stay put. SetCurrentDirectory(BaseDirectory.c_str()); ArchiveScanRecord asr = FCEUD_ScanArchive(relative); FCEUFILE* fp = FCEU_fopen(relative,0,"rb",0,-1,fm2ext); if(!fp) goto abort; strcpy(relative,fp->fullFilename.c_str()); delete fp; LONG lOtherIndex = SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_FINDSTRING, (WPARAM)-1, (LPARAM)relative); if(lOtherIndex != CB_ERR) { // select already existing string SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_SETCURSEL, lOtherIndex, 0); UpdateReplayDialog(hwndDlg); } else { SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_INSERTSTRING, lIndex, (LPARAM)relative); SendDlgItemMessage(hwndDlg, IDC_COMBO_FILENAME, CB_SETCURSEL, lIndex, 0); //UpdateReplayDialog(hwndDlg); - this call would be redundant, because the update is always triggered by CBN_SELCHANGE message anyway } // restore focus to the dialog SetFocus(GetDlgItem(hwndDlg, IDC_COMBO_FILENAME)); } abort: free(pn); } else { // user had made their choice // TODO: warn the user when they open a movie made with a different ROM char* fn=GetReplayPath(hwndDlg); //char TempArray[16]; //mbg merge 7/17/06 removed replayReadOnlySetting = (SendDlgItemMessage(hwndDlg, IDC_CHECK_READONLY, BM_GETCHECK, 0, 0) == BST_CHECKED); char offset1Str[32]={0}; SendDlgItemMessage(hwndDlg, IDC_EDIT_STOPFRAME, WM_GETTEXT, (WPARAM)32, (LPARAM)offset1Str); replayStopFrameSetting = (SendDlgItemMessage(hwndDlg, IDC_CHECK_STOPMOVIE, BM_GETCHECK,0,0) == BST_CHECKED)? strtol(offset1Str,0,10):0; EndDialog(hwndDlg, (INT_PTR)fn); } } } return TRUE; case IDCANCEL: EndDialog(hwndDlg, 0); return TRUE; } } return FALSE; case WM_CTLCOLORSTATIC: if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_LABEL_CURRCHECKSUM)) { // draw the md5 sum in red if it's different from the md5 of the rom used in the replay HDC hdcStatic = (HDC)wParam; char szMd5Text[35]; GetDlgItemText(hwndDlg, IDC_LABEL_ROMCHECKSUM, szMd5Text, 35); if (!strlen(szMd5Text) || !strcmp(szMd5Text, "unknown") || !strcmp(szMd5Text, "00000000000000000000000000000000") || !strcmp(szMd5Text, md5_asciistr(GameInfo->MD5))) SetTextColor(hdcStatic, RGB(0,0,0)); // use black color for a match (or no comparison) else SetTextColor(hdcStatic, RGB(255,0,0)); // use red for a mismatch SetBkMode((HDC)wParam,TRANSPARENT); return (BOOL)GetSysColorBrush(COLOR_BTNFACE); } else if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_LABEL_NEWPPUUSED)) { HDC hdcStatic = (HDC)wParam; char szMd5Text[35]; GetDlgItemText(hwndDlg, IDC_LABEL_NEWPPUUSED, szMd5Text, 35); bool want_newppu = (strcmp(szMd5Text, "Off") != 0); extern int newppu; if ((want_newppu && newppu) || (!want_newppu && !newppu)) SetTextColor(hdcStatic, RGB(0,0,0)); // use black color for a match else SetTextColor(hdcStatic, RGB(255,0,0)); // use red for a mismatch SetBkMode((HDC)wParam,TRANSPARENT); return (BOOL)GetSysColorBrush(COLOR_BTNFACE); } else { return FALSE; } } return FALSE; };
static LRESULT CALLBACK BaseBar_WindowProc(HWND hwnd, UINT uMessage, WPARAM wParam, LPARAM lParam) { LPBASEBARINFO lpbi = (LPBASEBARINFO)GetProp(hwnd, (LPCTSTR)MAKEWORD(s_hBaseBarAtom, 0));//GetWindowLong(hwnd, GWL_USERDATA); switch (uMessage) { case WM_CREATE: { LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam; DWORD dwStyle = RBS_VERTICALGRIPPER | RBS_REGISTERDROP | RBS_AUTOSIZE | RBS_VARHEIGHT | RBS_DBLCLKTOGGLE | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE; REBARBANDINFO rbBand; TBBUTTON tbb; if (lpcs->lpszName) lpbi->pszTitle = String_Duplicate(lpcs->lpszName); lpbi->dwAlign = BaseBar_GetAlign(hwnd); lpbi->dwAllowableAligns = CCS_LEFT | CCS_RIGHT | CCS_TOP | CCS_BOTTOM; if (lpbi->dwAlign == CCS_LEFT || lpbi->dwAlign == CCS_RIGHT) dwStyle |= CCS_VERT; if (!(lpbi->hwndRebar = CreateWindowEx(0, REBARCLASSNAME, NULL, WS_VISIBLE | WS_BORDER | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | dwStyle, 0, 0, 0, 0, hwnd, (HMENU) REBARID, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL))) return (0); SendMessage(lpbi->hwndRebar, RB_SETBKCOLOR, 0, (LPARAM)GetSysColor(COLOR_BTNFACE)); ZeroMemory(&rbBand, sizeof(REBARBANDINFO)); rbBand.cbSize = sizeof(REBARBANDINFO); rbBand.fMask = RBBIM_HEADERSIZE | RBBIM_ID | RBBIM_STYLE | RBBIM_COLORS; rbBand.fStyle = RBBS_FIXEDSIZE | RBBS_VARIABLEHEIGHT | RBBS_NOGRIPPER; rbBand.clrFore = GetSysColor(COLOR_BTNTEXT); rbBand.clrBack = GetSysColor(COLOR_BTNFACE); rbBand.cxHeader = ((lpcs->style & CCS_VERT) ? 21 : 24); rbBand.wID = (UINT)lpcs->hMenu; if (lpcs->style & CCS_VERT) { rbBand.fMask |= RBBIM_TEXT; rbBand.lpText = (char*)lpcs->lpszName; } SendMessage(lpbi->hwndRebar, RB_INSERTBAND, (int) -1, (LPARAM) &rbBand); ZeroMemory(&tbb, sizeof(TBBUTTON)); tbb.iBitmap = 0; tbb.idCommand = IDM_BAND_CLOSE; tbb.fsState = TBSTATE_ENABLED; tbb.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE; lpbi->hwndToolbar = CreateToolbarEx(lpbi->hwndRebar, WS_CHILDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NOMOVEY | CCS_NORESIZE | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT | TBSTYLE_TRANSPARENT, IDC_TOOLBAR, 1, PCPControls_GetHandle(), IDB_CHECKBOX, &tbb, 1, 13, 12, 11, 10, sizeof (TBBUTTON)); SendMessage(lpbi->hwndToolbar, TB_SETBUTTONSIZE, 0, (LPARAM) MAKELONG(20, 18)); SendMessage(lpbi->hwndToolbar, TB_SETBITMAPSIZE, 0, (LPARAM) MAKELONG(10, 9)); } return (TRUE); case WM_SIZE: { RECT rcNew; GetClientRect(hwnd, &rcNew); if (wParam == SIZE_RESTORED && !EqualRect(&rcNew, &lpbi->rcSize)) { NMHDR nmhdr; MoveWindow(lpbi->hwndRebar, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); nmhdr.code = RBN_HEIGHTCHANGE; nmhdr.hwndFrom = hwnd; nmhdr.idFrom = GetDlgCtrlID(hwnd); SendMessage(GetParent(hwnd), WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); if (lpbi->hwndToolbar) { RECT rcBand; DWORD dwSize = (DWORD)SendMessage(lpbi->hwndToolbar, TB_GETBUTTONSIZE, 0, 0); SendMessage(lpbi->hwndRebar, RB_GETBANDBORDERS, 0, (LPARAM)&rcBand); if (lpbi->dwAlign == CCS_LEFT || lpbi->dwAlign == CCS_RIGHT) { int x = (LOWORD(lParam) - 24); int y = ((rcBand.top - HIWORD(dwSize)) / 2); MoveWindow(lpbi->hwndToolbar, x, y, 20, 18, TRUE); } else { MoveWindow(lpbi->hwndToolbar, 2, 2, 20, 18, TRUE); } } } GetClientRect(hwnd, &lpbi->rcSize); } break; case WM_NOTIFY: { LPNMHDR lphdr = (LPNMHDR)lParam; if (lphdr->code == NM_NCHITTEST && lphdr->idFrom == REBARID) { if (HIBYTE(GetAsyncKeyState(VK_RBUTTON))) { HMENU hMenu = LoadMenu(PCPControls_GetHandle(), MAKEINTRESOURCE(IDR_BANDMENU)); HMENU hPopupMenu = GetSubMenu(hMenu, 0); POINT pt; if (lpbi->dwAllowableAligns & CCS_VERT) { if (!(lpbi->dwAllowableAligns & CCS_LEFT)) Menu_EnableMenuItem(hPopupMenu, IDM_BAND_LEFT, FALSE); if (!(lpbi->dwAllowableAligns & CCS_RIGHT)) Menu_EnableMenuItem(hPopupMenu, IDM_BAND_RIGHT, FALSE); Menu_EnableMenuItem(hPopupMenu, IDM_BAND_TOP, FALSE); Menu_EnableMenuItem(hPopupMenu, IDM_BAND_BOTTOM, FALSE); } else { if (!(lpbi->dwAllowableAligns & CCS_TOP)) Menu_EnableMenuItem(hPopupMenu, IDM_BAND_TOP, FALSE); if (!(lpbi->dwAllowableAligns & CCS_BOTTOM)) Menu_EnableMenuItem(hPopupMenu, IDM_BAND_BOTTOM, FALSE); Menu_EnableMenuItem(hPopupMenu, IDM_BAND_LEFT, FALSE); Menu_EnableMenuItem(hPopupMenu, IDM_BAND_RIGHT, FALSE); } GetCursorPos(&pt); Menu_TrackPopupMenu(hPopupMenu, pt.x, pt.y, hwnd); } return (HTCLIENT); } else if (lphdr->code == NM_CUSTOMDRAW && lphdr->idFrom == REBARID) { LPNMCUSTOMDRAW lpnmcd = (LPNMCUSTOMDRAW) lParam; if (lpnmcd->dwDrawStage == CDDS_PREPAINT) return (CDRF_NOTIFYPOSTPAINT); else if (lpnmcd->dwDrawStage == CDDS_POSTPAINT && (lpbi->dwAlign == CCS_TOP || lpbi->dwAlign == CCS_BOTTOM)) { DrawEdge(lpnmcd->hdc, &lpnmcd->rc, EDGE_ETCHED, BF_RIGHT); } } else if (lphdr->idFrom == IDC_TOOLBAR) { } } return (SendMessage(GetParent(hwnd), uMessage, wParam, lParam)); case WM_COMMAND: { DWORD dwAlign; switch (LOWORD(wParam)) { case IDM_BAND_LEFT: dwAlign = CCS_LEFT; break; case IDM_BAND_RIGHT: dwAlign = CCS_RIGHT; break; case IDM_BAND_TOP: dwAlign = CCS_TOP; break; case IDM_BAND_BOTTOM: dwAlign = CCS_BOTTOM; break; case IDM_BAND_CLOSE: { NMHDR nmhdr; nmhdr.code = BBN_CLOSE; nmhdr.hwndFrom = hwnd; nmhdr.idFrom = GetDlgCtrlID(hwnd); SendMessage(GetParent(hwnd), WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); } return (0); default: return (0); } SendMessage(hwnd, BCM_SETALIGNMENT, (WPARAM)dwAlign, 0L); } case WM_GETMINMAXINFO: { MINMAXINFO *lpmmi = (MINMAXINFO *)lParam; if (lpmmi != NULL) { int cx = GetSystemMetrics(SM_CXSCREEN); int cy = GetSystemMetrics(SM_CYSCREEN); if (lpbi->dwAlign == CCS_LEFT || lpbi->dwAlign == CCS_RIGHT) lpmmi->ptMaxTrackSize.x = cx / 2; else lpmmi->ptMaxTrackSize.y = cy / 2; if (lpbi->dwAlign == CCS_LEFT) { lpmmi->ptMinTrackSize.x = 50; } else if (lpbi->dwAlign == CCS_RIGHT) { lpmmi->ptMinTrackSize.x = 50; } else if (lpbi->dwAlign == CCS_TOP) { lpmmi->ptMinTrackSize.y = 50; } else if (lpbi->dwAlign == CCS_BOTTOM) { lpmmi->ptMinTrackSize.y = 50; } else { lpmmi->ptMinTrackSize.x = 56; lpmmi->ptMinTrackSize.y = 24; } } } return (FALSE); case WM_NCCREATE: { lpbi = Mem_Alloc(sizeof(BASEBARINFO)); if (lpbi == NULL) return (FALSE); SetProp(hwnd, (LPCTSTR)MAKEWORD(s_hBaseBarAtom, 0), lpbi); } return (TRUE); case WM_NCDESTROY: { RemoveProp(hwnd, (LPCTSTR)MAKEWORD(s_hBaseBarAtom, 0)); if (lpbi != NULL) { if (lpbi->pszTitle != NULL) Mem_Free(lpbi->pszTitle); Mem_Free(lpbi); } } return (TRUE); case WM_NCHITTEST: { POINT pt = {LOWORD(lParam), HIWORD(lParam)}; RECT re; GetWindowRect(hwnd, &re); if (!PtInRect(&re, pt)) return (HTNOWHERE); if (lpbi->dwAlign == CCS_LEFT) { re.left = re.right - 4; if (PtInRect(&re, pt)) return (HTRIGHT); } else if (lpbi->dwAlign == CCS_RIGHT) { re.right = re.left + 4; if (PtInRect(&re, pt)) return (HTLEFT); } else if (lpbi->dwAlign == CCS_BOTTOM) { re.bottom = re.top + 4; if (PtInRect(&re, pt)) return (HTTOP); } else if (lpbi->dwAlign == CCS_TOP) { re.top = re.bottom - 4; if (PtInRect(&re, pt)) return (HTBOTTOM); } } return (HTCLIENT); case WM_NCCALCSIZE: { if (wParam == TRUE) { NCCALCSIZE_PARAMS *ncp = (NCCALCSIZE_PARAMS *) lParam; if (lpbi->dwAlign == CCS_LEFT) { ncp->rgrc[0].top += 4; ncp->rgrc[0].right -= 4; } else if (lpbi->dwAlign == CCS_RIGHT) { ncp->rgrc[0].top += 4; ncp->rgrc[0].left += 4; } else if (lpbi->dwAlign == CCS_BOTTOM) { ncp->rgrc[0].top += 4; } else if (lpbi->dwAlign == CCS_TOP) { ncp->rgrc[0].bottom -= 4; } else { ncp->rgrc[0].top += 4; ncp->rgrc[0].right -= 4; ncp->rgrc[0].left += 4; ncp->rgrc[0].bottom -= 4; } } } break; case WM_ERASEBKGND: return (TRUE); case WM_NCPAINT: { HDC hdc = GetWindowDC(hwnd); RECT rcWindow, rcClient; if (hdc == NULL) break; GetClientRect(hwnd, &rcClient); GetWindowRect(hwnd, &rcWindow); MapWindowPoints(NULL, hwnd, (LPPOINT)&rcWindow, 2); OffsetRect(&rcClient, -rcWindow.left, -rcWindow.top); OffsetRect(&rcWindow, -rcWindow.left, -rcWindow.top); ExcludeClipRect(hdc, rcClient.left, rcClient.top, rcClient.right, rcClient.bottom); FillRect(hdc, &rcWindow, (HBRUSH)GetSysColorBrush(COLOR_BTNFACE)); ReleaseDC(hwnd, hdc); } return (TRUE); case BCM_SETCLIENTWND: { REBARBANDINFO rbBand; ZeroMemory(&rbBand, sizeof(REBARBANDINFO)); rbBand.cbSize = sizeof(REBARBANDINFO); rbBand.fMask = RBBIM_CHILDSIZE | RBBIM_CHILD; rbBand.cyIntegral = 1; rbBand.cyMaxChild = -1; rbBand.hwndChild = (HWND)lParam; return (SendMessage(lpbi->hwndRebar, RB_SETBANDINFO, 0, (LPARAM)&rbBand)); } case BCM_GETCLIENTWND: { REBARBANDINFO rbBand; ZeroMemory(&rbBand, sizeof(REBARBANDINFO)); rbBand.cbSize = sizeof(REBARBANDINFO); rbBand.fMask = RBBIM_CHILD; SendMessage(lpbi->hwndRebar, RB_GETBANDINFO, 0, (LPARAM)&rbBand); return (LRESULT)((IsWindow(rbBand.hwndChild) ? rbBand.hwndChild : NULL)); } case BCM_SETIMAGELIST: { REBARINFO rbi; HIMAGELIST hilOld = BandCtrl_GetImageList(hwnd); rbi.cbSize = sizeof(REBARINFO); rbi.fMask = RBIM_IMAGELIST; rbi.himl = (HIMAGELIST)lParam; if (!SendMessage(lpbi->hwndRebar, RB_SETBARINFO, 0, (LPARAM) &rbi)) return ((LRESULT)NULL); return ((LRESULT)hilOld); } case BCM_GETIMAGELIST: { REBARINFO rbi; rbi.cbSize = sizeof(REBARINFO); rbi.fMask = RBIM_IMAGELIST; rbi.himl = 0; if (!SendMessage(lpbi->hwndRebar, RB_GETBARINFO, 0, (LPARAM) &rbi)) return ((LRESULT)NULL); return ((LRESULT)rbi.himl); } case BCM_SETTITLEIMAGE: { REBARBANDINFO rbBand; ZeroMemory(&rbBand, sizeof(REBARBANDINFO)); rbBand.cbSize = sizeof(REBARBANDINFO); rbBand.fMask = RBBIM_IMAGE; rbBand.iImage = wParam; return (SendMessage(lpbi->hwndRebar, RB_SETBANDINFO, 0, (LPARAM)&rbBand)); } case BCM_GETTITLEIMAGE: { REBARBANDINFO rbBand; ZeroMemory(&rbBand, sizeof(REBARBANDINFO)); rbBand.cbSize = sizeof(REBARBANDINFO); rbBand.fMask = RBBIM_IMAGE; rbBand.iImage = -1; SendMessage(lpbi->hwndRebar, RB_GETBANDINFO, 0, (LPARAM)&rbBand); return (rbBand.iImage); } case BCM_GETALIGNMENT: return ((LRESULT)lpbi->dwAlign); case BCM_SETALIGNMENT: { NMHDR nmhdr; DWORD dwStyle; if (lpbi->dwAlign == wParam) return (wParam); lpbi->dwAlign = wParam; dwStyle = GetWindowLong(lpbi->hwndRebar, GWL_STYLE); dwStyle &= ~(CCS_BOTTOM | CCS_TOP | CCS_LEFT | CCS_RIGHT); dwStyle |= lpbi->dwAlign; SetWindowLong(lpbi->hwndRebar, GWL_STYLE, dwStyle); SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); nmhdr.code = RBN_HEIGHTCHANGE; nmhdr.hwndFrom = hwnd; nmhdr.idFrom = GetDlgCtrlID(hwnd); SendMessage(GetParent(hwnd), WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); return (lpbi->dwAlign); } case BCM_SETDATA: { LPARAM lParamOld = lpbi->lParam; lpbi->lParam = lParam; return (lParamOld); } case BCM_GETDATA: return (lpbi->lParam); case BCM_SETALLOWABLEALIGNS: { DWORD dwOldAllowableAligns = lpbi->dwAllowableAligns; lpbi->dwAllowableAligns = lParam; return (dwOldAllowableAligns); } case BCM_GETALLOWABLEALIGNS: return (lpbi->dwAllowableAligns); } return (DefWindowProc(hwnd, uMessage, wParam, lParam)); }
static INT_PTR CALLBACK SettingsDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hwndDlg); { hwndSettingsDlg = hwndDlg; LCID locale = Langpack_GetDefaultLocale(); SendDlgItemMessage(hwndDlg, IDC_ICON_HEADER, STM_SETIMAGE, IMAGE_ICON, (LPARAM)IcoLib_GetIcon("AutoShutdown_Header")); { HFONT hBoldFont; LOGFONT lf; if (GetObject((HFONT)SendDlgItemMessage(hwndDlg, IDC_TEXT_HEADER, WM_GETFONT, 0, 0), sizeof(lf), &lf)) { lf.lfWeight = FW_BOLD; hBoldFont = CreateFontIndirect(&lf); } else hBoldFont = NULL; SendDlgItemMessage(hwndDlg, IDC_TEXT_HEADER, WM_SETFONT, (WPARAM)hBoldFont, FALSE); } /* read-in watcher flags */ { WORD watcherType = db_get_w(NULL, "AutoShutdown", "WatcherFlags", SETTING_WATCHERFLAGS_DEFAULT); CheckRadioButton(hwndDlg, IDC_RADIO_STTIME, IDC_RADIO_STCOUNTDOWN, (watcherType&SDWTF_ST_TIME) ? IDC_RADIO_STTIME : IDC_RADIO_STCOUNTDOWN); CheckDlgButton(hwndDlg, IDC_CHECK_SPECIFICTIME, (watcherType&SDWTF_SPECIFICTIME) != 0 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_MESSAGE, (watcherType&SDWTF_MESSAGE) != 0 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_FILETRANSFER, (watcherType&SDWTF_FILETRANSFER) != 0 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_IDLE, (watcherType&SDWTF_IDLE) != 0 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_STATUS, (watcherType&SDWTF_STATUS) != 0 ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(hwndDlg, IDC_CHECK_CPUUSAGE, (watcherType&SDWTF_CPUUSAGE) != 0 ? BST_CHECKED : BST_UNCHECKED); } /* read-in countdown val */ { SYSTEMTIME st; if (!TimeStampToSystemTime((time_t)db_get_dw(NULL, "AutoShutdown", "TimeStamp", SETTING_TIMESTAMP_DEFAULT), &st)) GetLocalTime(&st); DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_TIME_TIMESTAMP), GDT_VALID, &st); DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_DATE_TIMESTAMP), GDT_VALID, &st); SendMessage(hwndDlg, M_CHECK_DATETIME, 0, 0); } { DWORD setting = db_get_dw(NULL, "AutoShutdown", "Countdown", SETTING_COUNTDOWN_DEFAULT); if (setting < 1) setting = SETTING_COUNTDOWN_DEFAULT; SendDlgItemMessage(hwndDlg, IDC_SPIN_COUNTDOWN, UDM_SETRANGE, 0, MAKELPARAM(UD_MAXVAL, 1)); SendDlgItemMessage(hwndDlg, IDC_EDIT_COUNTDOWN, EM_SETLIMITTEXT, (WPARAM)10, 0); SendDlgItemMessage(hwndDlg, IDC_SPIN_COUNTDOWN, UDM_SETPOS, 0, MAKELPARAM(setting, 0)); SetDlgItemInt(hwndDlg, IDC_EDIT_COUNTDOWN, setting, FALSE); } { HWND hwndCombo = GetDlgItem(hwndDlg, IDC_COMBO_COUNTDOWNUNIT); DWORD lastUnit = db_get_dw(NULL, "AutoShutdown", "CountdownUnit", SETTING_COUNTDOWNUNIT_DEFAULT); SendMessage(hwndCombo, CB_SETLOCALE, (WPARAM)locale, 0); /* sort order */ SendMessage(hwndCombo, CB_INITSTORAGE, _countof(unitNames), _countof(unitNames) * 16); /* approx. */ for (int i = 0; i < _countof(unitNames); ++i) { int index = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)TranslateTS(unitNames[i])); if (index != LB_ERR) { SendMessage(hwndCombo, CB_SETITEMDATA, index, (LPARAM)unitValues[i]); if (i == 0 || unitValues[i] == lastUnit) SendMessage(hwndCombo, CB_SETCURSEL, index, 0); } } } { DBVARIANT dbv; if (!db_get_ts(NULL, "AutoShutdown", "Message", &dbv)) { SetDlgItemText(hwndDlg, IDC_EDIT_MESSAGE, dbv.ptszVal); mir_free(dbv.ptszVal); } } /* cpuusage threshold */ { BYTE setting = DBGetContactSettingRangedByte(NULL, "AutoShutdown", "CpuUsageThreshold", SETTING_CPUUSAGETHRESHOLD_DEFAULT, 1, 100); SendDlgItemMessage(hwndDlg, IDC_SPIN_CPUUSAGE, UDM_SETRANGE, 0, MAKELPARAM(100, 1)); SendDlgItemMessage(hwndDlg, IDC_EDIT_CPUUSAGE, EM_SETLIMITTEXT, (WPARAM)3, 0); SendDlgItemMessage(hwndDlg, IDC_SPIN_CPUUSAGE, UDM_SETPOS, 0, MAKELPARAM(setting, 0)); SetDlgItemInt(hwndDlg, IDC_EDIT_CPUUSAGE, setting, FALSE); } /* shutdown types */ { HWND hwndCombo = GetDlgItem(hwndDlg, IDC_COMBO_SHUTDOWNTYPE); BYTE lastShutdownType = db_get_b(NULL, "AutoShutdown", "ShutdownType", SETTING_SHUTDOWNTYPE_DEFAULT); SendMessage(hwndCombo, CB_SETLOCALE, (WPARAM)locale, 0); /* sort order */ SendMessage(hwndCombo, CB_SETEXTENDEDUI, TRUE, 0); SendMessage(hwndCombo, CB_INITSTORAGE, SDSDT_MAX, SDSDT_MAX * 32); for (BYTE shutdownType = 1; shutdownType <= SDSDT_MAX; ++shutdownType) if (ServiceIsTypeEnabled(shutdownType, 0)) { TCHAR *pszText = (TCHAR*)ServiceGetTypeDescription(shutdownType, GSTDF_TCHAR); /* never fails */ int index = SendMessage(hwndCombo, CB_ADDSTRING, 0, (LPARAM)pszText); if (index != LB_ERR) { SendMessage(hwndCombo, CB_SETITEMDATA, index, (LPARAM)shutdownType); if (shutdownType == 1 || shutdownType == lastShutdownType) SendMessage(hwndCombo, CB_SETCURSEL, (WPARAM)index, 0); } } SendMessage(hwndDlg, M_UPDATE_SHUTDOWNDESC, 0, (LPARAM)hwndCombo); } /* check if proto is installed that supports instant messages and check if a message dialog plugin is installed */ if (!AnyProtoHasCaps(PF1_IMRECV) || !ServiceExists(MS_MSG_SENDMESSAGE)) { /* no srmessage present? */ CheckDlgButton(hwndDlg, IDC_CHECK_MESSAGE, BST_UNCHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_CHECK_MESSAGE), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_MESSAGE), FALSE); } /* check if proto is installed that supports file transfers and check if a file transfer dialog is available */ if (!AnyProtoHasCaps(PF1_FILESEND) && !AnyProtoHasCaps(PF1_FILERECV)) { /* no srfile present? */ CheckDlgButton(hwndDlg, IDC_CHECK_FILETRANSFER, BST_UNCHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_CHECK_FILETRANSFER), FALSE); } /* check if cpu usage can be detected */ if (!PollCpuUsage(DisplayCpuUsageProc, (LPARAM)GetDlgItem(hwndDlg, IDC_TEXT_CURRENTCPU), 1800)) { CheckDlgButton(hwndDlg, IDC_CHECK_CPUUSAGE, BST_UNCHECKED); EnableWindow(GetDlgItem(hwndDlg, IDC_CHECK_CPUUSAGE), FALSE); } } SendMessage(hwndDlg, M_ENABLE_SUBCTLS, 0, 0); Utils_RestoreWindowPositionNoSize(hwndDlg, NULL, "AutoShutdown", "SettingsDlg_"); return TRUE; /* default focus */ case WM_DESTROY: Utils_SaveWindowPosition(hwndDlg, NULL, "AutoShutdown", "SettingsDlg_"); { HFONT hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_TEXT_HEADER, WM_GETFONT, 0, 0); SendDlgItemMessage(hwndDlg, IDC_TEXT_HEADER, WM_SETFONT, 0, FALSE); /* no return value */ if (hFont != NULL) DeleteObject(hFont); hwndSettingsDlg = NULL; } return TRUE; case WM_CTLCOLORSTATIC: switch (GetDlgCtrlID((HWND)lParam)) { case IDC_ICON_HEADER: SetBkMode((HDC)wParam, TRANSPARENT); case IDC_RECT_HEADER: /* need to set COLOR_WINDOW manually for Win9x */ SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW)); return (INT_PTR)GetSysColorBrush(COLOR_WINDOW); case IDC_TEXT_HEADER: case IDC_TEXT_HEADERDESC: SetBkMode((HDC)wParam, TRANSPARENT); return (INT_PTR)GetStockObject(NULL_BRUSH); } break; case M_ENABLE_SUBCTLS: { BOOL checked = IsDlgButtonChecked(hwndDlg, IDC_CHECK_MESSAGE) != 0; EnableDlgItem(hwndDlg, IDC_EDIT_MESSAGE, checked); checked = IsDlgButtonChecked(hwndDlg, IDC_CHECK_SPECIFICTIME) != 0; EnableDlgItem(hwndDlg, IDC_RADIO_STTIME, checked); EnableDlgItem(hwndDlg, IDC_RADIO_STCOUNTDOWN, checked); checked = (IsDlgButtonChecked(hwndDlg, IDC_CHECK_SPECIFICTIME) && IsDlgButtonChecked(hwndDlg, IDC_RADIO_STTIME)); EnableDlgItem(hwndDlg, IDC_TIME_TIMESTAMP, checked); EnableDlgItem(hwndDlg, IDC_DATE_TIMESTAMP, checked); checked = (IsDlgButtonChecked(hwndDlg, IDC_CHECK_SPECIFICTIME) && IsDlgButtonChecked(hwndDlg, IDC_RADIO_STCOUNTDOWN)); EnableDlgItem(hwndDlg, IDC_EDIT_COUNTDOWN, checked); EnableDlgItem(hwndDlg, IDC_SPIN_COUNTDOWN, checked); EnableDlgItem(hwndDlg, IDC_COMBO_COUNTDOWNUNIT, checked); checked = IsDlgButtonChecked(hwndDlg, IDC_CHECK_IDLE) != 0; EnableDlgItem(hwndDlg, IDC_URL_IDLE, checked); checked = IsDlgButtonChecked(hwndDlg, IDC_CHECK_CPUUSAGE) != 0; EnableDlgItem(hwndDlg, IDC_EDIT_CPUUSAGE, checked); EnableDlgItem(hwndDlg, IDC_SPIN_CPUUSAGE, checked); EnableDlgItem(hwndDlg, IDC_TEXT_PERCENT, checked); EnableDlgItem(hwndDlg, IDC_TEXT_CURRENTCPU, checked); checked = (IsDlgButtonChecked(hwndDlg, IDC_CHECK_SPECIFICTIME) || IsDlgButtonChecked(hwndDlg, IDC_CHECK_MESSAGE) || IsDlgButtonChecked(hwndDlg, IDC_CHECK_IDLE) || IsDlgButtonChecked(hwndDlg, IDC_CHECK_STATUS) || IsDlgButtonChecked(hwndDlg, IDC_CHECK_FILETRANSFER) || IsDlgButtonChecked(hwndDlg, IDC_CHECK_CPUUSAGE)); EnableDlgItem(hwndDlg, IDOK, checked); } return TRUE; case M_UPDATE_SHUTDOWNDESC: /* lParam=(LPARAM)(HWND)hwndCombo */ { BYTE shutdownType = (BYTE)SendMessage((HWND)lParam, CB_GETITEMDATA, SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0), 0); SetDlgItemText(hwndDlg, IDC_TEXT_SHUTDOWNTYPE, (TCHAR*)ServiceGetTypeDescription(shutdownType, GSTDF_LONGDESC | GSTDF_TCHAR)); } return TRUE; case WM_TIMECHANGE: /* system time changed */ SendMessage(hwndDlg, M_CHECK_DATETIME, 0, 0); return TRUE; case M_CHECK_DATETIME: { SYSTEMTIME st, stBuf; time_t timestamp; DateTime_GetSystemtime(GetDlgItem(hwndDlg, IDC_DATE_TIMESTAMP), &stBuf); DateTime_GetSystemtime(GetDlgItem(hwndDlg, IDC_TIME_TIMESTAMP), &st); st.wDay = stBuf.wDay; st.wDayOfWeek = stBuf.wDayOfWeek; st.wMonth = stBuf.wMonth; st.wYear = stBuf.wYear; GetLocalTime(&stBuf); if (SystemTimeToTimeStamp(&st, ×tamp)) { /* set to current date if earlier */ if (timestamp < time(NULL)) { st.wDay = stBuf.wDay; st.wDayOfWeek = stBuf.wDayOfWeek; st.wMonth = stBuf.wMonth; st.wYear = stBuf.wYear; if (SystemTimeToTimeStamp(&st, ×tamp)) { /* step one day up if still earlier */ if (timestamp < time(NULL)) { timestamp += 24 * 60 * 60; TimeStampToSystemTime(timestamp, &st); } } } } DateTime_SetRange(GetDlgItem(hwndDlg, IDC_DATE_TIMESTAMP), GDTR_MIN, &stBuf); DateTime_SetRange(GetDlgItem(hwndDlg, IDC_TIME_TIMESTAMP), GDTR_MIN, &stBuf); DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_DATE_TIMESTAMP), GDT_VALID, &st); DateTime_SetSystemtime(GetDlgItem(hwndDlg, IDC_TIME_TIMESTAMP), GDT_VALID, &st); } return TRUE; case WM_NOTIFY: switch (((NMHDR*)lParam)->idFrom) { case IDC_TIME_TIMESTAMP: case IDC_DATE_TIMESTAMP: switch (((NMHDR*)lParam)->code) { case DTN_CLOSEUP: case NM_KILLFOCUS: PostMessage(hwndDlg, M_CHECK_DATETIME, 0, 0); return TRUE; } } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CHECK_MESSAGE: case IDC_CHECK_FILETRANSFER: case IDC_CHECK_IDLE: case IDC_CHECK_CPUUSAGE: case IDC_CHECK_STATUS: case IDC_CHECK_SPECIFICTIME: case IDC_RADIO_STTIME: case IDC_RADIO_STCOUNTDOWN: SendMessage(hwndDlg, M_ENABLE_SUBCTLS, 0, 0); return TRUE; case IDC_EDIT_COUNTDOWN: if (HIWORD(wParam) == EN_KILLFOCUS) { if ((int)GetDlgItemInt(hwndDlg, IDC_EDIT_COUNTDOWN, NULL, TRUE) < 1) { SendDlgItemMessage(hwndDlg, IDC_SPIN_COUNTDOWN, UDM_SETPOS, 0, MAKELPARAM(1, 0)); SetDlgItemInt(hwndDlg, IDC_EDIT_COUNTDOWN, 1, FALSE); } return TRUE; } break; case IDC_EDIT_CPUUSAGE: if (HIWORD(wParam) == EN_KILLFOCUS) { WORD val = (WORD)GetDlgItemInt(hwndDlg, IDC_EDIT_CPUUSAGE, NULL, FALSE); if (val < 1) val = 1; else if (val>100) val = 100; SendDlgItemMessage(hwndDlg, IDC_SPIN_CPUUSAGE, UDM_SETPOS, 0, MAKELPARAM(val, 0)); SetDlgItemInt(hwndDlg, IDC_EDIT_CPUUSAGE, val, FALSE); return TRUE; } break; case IDC_URL_IDLE: { OPENOPTIONSDIALOG ood; ood.cbSize = sizeof(ood); ood.pszGroup = "Status"; /* autotranslated */ ood.pszPage = "Idle"; /* autotranslated */ ood.pszTab = NULL; Options_Open(&ood); return TRUE; } case IDC_COMBO_SHUTDOWNTYPE: if (HIWORD(wParam) == CBN_SELCHANGE) SendMessage(hwndDlg, M_UPDATE_SHUTDOWNDESC, 0, lParam); return TRUE; case IDOK: /* save settings and start watcher */ ShowWindow(hwndDlg, SW_HIDE); /* message text */ { HWND hwndEdit = GetDlgItem(hwndDlg, IDC_EDIT_MESSAGE); int len = GetWindowTextLength(hwndEdit) + 1; TCHAR *pszText = (TCHAR*)mir_alloc(len*sizeof(TCHAR)); if (pszText != NULL && GetWindowText(hwndEdit, pszText, len + 1)) { TrimString(pszText); db_set_ts(NULL, "AutoShutdown", "Message", pszText); } mir_free(pszText); /* does NULL check */ } /* timestamp */ { SYSTEMTIME st; time_t timestamp; DateTime_GetSystemtime(GetDlgItem(hwndDlg, IDC_TIME_TIMESTAMP), &st); /* time gets synchronized */ if (!SystemTimeToTimeStamp(&st, ×tamp)) timestamp = time(NULL); db_set_dw(NULL, "AutoShutdown", "TimeStamp", (DWORD)timestamp); } /* shutdown type */ { int index = SendDlgItemMessage(hwndDlg, IDC_COMBO_SHUTDOWNTYPE, CB_GETCURSEL, 0, 0); if (index != LB_ERR) db_set_b(NULL, "AutoShutdown", "ShutdownType", (BYTE)SendDlgItemMessage(hwndDlg, IDC_COMBO_SHUTDOWNTYPE, CB_GETITEMDATA, (WPARAM)index, 0)); index = SendDlgItemMessage(hwndDlg, IDC_COMBO_COUNTDOWNUNIT, CB_GETCURSEL, 0, 0); if (index != LB_ERR) db_set_dw(NULL, "AutoShutdown", "CountdownUnit", (DWORD)SendDlgItemMessage(hwndDlg, IDC_COMBO_COUNTDOWNUNIT, CB_GETITEMDATA, (WPARAM)index, 0)); db_set_dw(NULL, "AutoShutdown", "Countdown", (DWORD)GetDlgItemInt(hwndDlg, IDC_EDIT_COUNTDOWN, NULL, FALSE)); db_set_b(NULL, "AutoShutdown", "CpuUsageThreshold", (BYTE)GetDlgItemInt(hwndDlg, IDC_EDIT_CPUUSAGE, NULL, FALSE)); } /* watcher type */ { WORD watcherType = (WORD)(IsDlgButtonChecked(hwndDlg, IDC_RADIO_STTIME) ? SDWTF_ST_TIME : SDWTF_ST_COUNTDOWN); if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_SPECIFICTIME)) watcherType |= SDWTF_SPECIFICTIME; if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_MESSAGE)) watcherType |= SDWTF_MESSAGE; if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_FILETRANSFER)) watcherType |= SDWTF_FILETRANSFER; if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_IDLE)) watcherType |= SDWTF_IDLE; if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_STATUS)) watcherType |= SDWTF_STATUS; if (IsDlgButtonChecked(hwndDlg, IDC_CHECK_CPUUSAGE)) watcherType |= SDWTF_CPUUSAGE; db_set_w(NULL, "AutoShutdown", "WatcherFlags", watcherType); ServiceStartWatcher(0, watcherType); } DestroyWindow(hwndDlg); return TRUE; // fall through case IDCANCEL: /* WM_CLOSE */ DestroyWindow(hwndDlg); SetShutdownToolbarButton(false); SetShutdownMenuItem(false); return TRUE; } break; } return FALSE; }
static INT_PTR CALLBACK startup_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HBITMAP hbmp = NULL; HDC hdc; switch (uMsg) { case WM_INITDIALOG: { HWND hwnd; RECT r, rdlg, chrome, rtab, rcancel, rstart; int xoffset = 0, yoffset = 0; // Fetch the positions (in screen coordinates) of all the windows we need to tweak ZeroMemory(&chrome, sizeof(chrome)); AdjustWindowRect(&chrome, GetWindowLong(hwndDlg, GWL_STYLE), FALSE); GetWindowRect(hwndDlg, &rdlg); GetWindowRect(GetDlgItem(hwndDlg, WIN_STARTWIN_TABCTL), &rtab); GetWindowRect(GetDlgItem(hwndDlg, WIN_STARTWIN_CANCEL), &rcancel); GetWindowRect(GetDlgItem(hwndDlg, WIN_STARTWIN_START), &rstart); // Knock off the non-client area of the main dialogue to give just the client area rdlg.left -= chrome.left; rdlg.top -= chrome.top; rdlg.right -= chrome.right; rdlg.bottom -= chrome.bottom; // Translate them to client-relative coordinates wrt the main dialogue window rtab.right -= rtab.left - 1; rtab.bottom -= rtab.top - 1; rtab.left -= rdlg.left; rtab.top -= rdlg.top; rcancel.right -= rcancel.left - 1; rcancel.bottom -= rcancel.top - 1; rcancel.left -= rdlg.left; rcancel.top -= rdlg.top; rstart.right -= rstart.left - 1; rstart.bottom -= rstart.top - 1; rstart.left -= rdlg.left; rstart.top -= rdlg.top; // And then convert the main dialogue coordinates to just width/length rdlg.right -= rdlg.left - 1; rdlg.bottom -= rdlg.top - 1; rdlg.left = 0; rdlg.top = 0; // Load the bitmap into the bitmap control and fetch its dimensions hbmp = LoadBitmap((HINSTANCE)win_gethinstance(), MAKEINTRESOURCE(RSRC_BMP)); hwnd = GetDlgItem(hwndDlg,WIN_STARTWIN_BITMAP); SendMessage(hwnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbmp); GetClientRect(hwnd, &r); xoffset = r.right; yoffset = r.bottom - rdlg.bottom; // Shift and resize the controls that require it rtab.left += xoffset; rtab.bottom += yoffset; rcancel.left += xoffset; rcancel.top += yoffset; rstart.left += xoffset; rstart.top += yoffset; rdlg.right += xoffset; rdlg.bottom += yoffset; // Move the controls to their new positions MoveWindow(GetDlgItem(hwndDlg, WIN_STARTWIN_TABCTL), rtab.left, rtab.top, rtab.right, rtab.bottom, FALSE); MoveWindow(GetDlgItem(hwndDlg, WIN_STARTWIN_CANCEL), rcancel.left, rcancel.top, rcancel.right, rcancel.bottom, FALSE); MoveWindow(GetDlgItem(hwndDlg, WIN_STARTWIN_START), rstart.left, rstart.top, rstart.right, rstart.bottom, FALSE); // Move the main dialogue to the centre of the screen hdc = GetDC(NULL); rdlg.left = (GetDeviceCaps(hdc, HORZRES) - rdlg.right) / 2; rdlg.top = (GetDeviceCaps(hdc, VERTRES) - rdlg.bottom) / 2; ReleaseDC(NULL, hdc); MoveWindow(hwndDlg, rdlg.left + chrome.left, rdlg.top + chrome.left, rdlg.right + (-chrome.left+chrome.right), rdlg.bottom + (-chrome.top+chrome.bottom), TRUE); // Add tabs to the tab control { TCITEM tab; hwnd = GetDlgItem(hwndDlg, WIN_STARTWIN_TABCTL); ZeroMemory(&tab, sizeof(tab)); tab.mask = TCIF_TEXT; tab.pszText = TEXT("Configuration"); SendMessage(hwnd, TCM_INSERTITEM, (WPARAM)TAB_CONFIG, (LPARAM)&tab); tab.mask = TCIF_TEXT; tab.pszText = TEXT("Game"); SendMessage(hwnd, TCM_INSERTITEM, (WPARAM)TAB_GAME, (LPARAM)&tab); tab.mask = TCIF_TEXT; tab.pszText = TEXT("Messages"); SendMessage(hwnd, TCM_INSERTITEM, (WPARAM)TAB_MESSAGES, (LPARAM)&tab); // Work out the position and size of the area inside the tab control for the pages ZeroMemory(&r, sizeof(r)); GetClientRect(hwnd, &r); SendMessage(hwnd, TCM_ADJUSTRECT, FALSE, (LPARAM)&r); r.right -= r.left-1; r.bottom -= r.top-1; r.top += rtab.top; r.left += rtab.left; // Create the pages and position them in the tab control, but hide them pages[TAB_CONFIG] = CreateDialog((HINSTANCE)win_gethinstance(), MAKEINTRESOURCE(WIN_STARTWINPAGE_CONFIG), hwndDlg, ConfigPageProc); pages[TAB_GAME] = CreateDialog((HINSTANCE)win_gethinstance(), MAKEINTRESOURCE(WIN_STARTWINPAGE_GAME), hwndDlg, GamePageProc); pages[TAB_MESSAGES] = GetDlgItem(hwndDlg, WIN_STARTWIN_MESSAGES); SetWindowPos(pages[TAB_CONFIG], hwnd,r.left,r.top,r.right,r.bottom,SWP_HIDEWINDOW); SetWindowPos(pages[TAB_GAME], hwnd,r.left,r.top,r.right,r.bottom,SWP_HIDEWINDOW); SetWindowPos(pages[TAB_MESSAGES], hwnd,r.left,r.top,r.right,r.bottom,SWP_HIDEWINDOW); // Tell the editfield acting as the console to exclude the width of the scrollbar GetClientRect(pages[TAB_MESSAGES],&r); r.right -= GetSystemMetrics(SM_CXVSCROLL)+4; r.left = r.top = 0; SendMessage(pages[TAB_MESSAGES], EM_SETRECTNP,0,(LPARAM)&r); // Set a tab stop in the game data listbox { DWORD tabs[1] = { 150 }; ListBox_SetTabStops(GetDlgItem(pages[TAB_GAME], IDGDATA), 1, tabs); } SetFocus(GetDlgItem(hwndDlg, WIN_STARTWIN_START)); SetWindowText(hwndDlg, apptitle); } return FALSE; } case WM_NOTIFY: { LPNMHDR nmhdr = (LPNMHDR)lParam; int cur; if (nmhdr->idFrom != WIN_STARTWIN_TABCTL) break; cur = (int)SendMessage(nmhdr->hwndFrom, TCM_GETCURSEL,0,0); switch (nmhdr->code) { case TCN_SELCHANGING: { if (cur < 0 || !pages[cur]) break; ShowWindow(pages[cur],SW_HIDE); return TRUE; } case TCN_SELCHANGE: { if (cur < 0 || !pages[cur]) break; ShowWindow(pages[cur],SW_SHOW); return TRUE; } } break; } case WM_CLOSE: if (mode == TAB_CONFIG) done = 0; else quitevent++; return TRUE; case WM_DESTROY: if (hbmp) { DeleteObject(hbmp); hbmp = NULL; } if (pages[TAB_GAME]) { DestroyWindow(pages[TAB_GAME]); pages[TAB_GAME] = NULL; } if (pages[TAB_CONFIG]) { DestroyWindow(pages[TAB_CONFIG]); pages[TAB_CONFIG] = NULL; } startupdlg = NULL; return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case WIN_STARTWIN_CANCEL: if (mode == TAB_CONFIG) done = 0; else quitevent++; return TRUE; case WIN_STARTWIN_START: done = 1; return TRUE; } return FALSE; case WM_CTLCOLORSTATIC: if ((HWND)lParam == pages[TAB_MESSAGES]) return (BOOL)GetSysColorBrush(COLOR_WINDOW); break; default: break; } return FALSE; }
/** * Responsible for drawing each list item. */ void ToggleListView::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CListCtrl& ListCtrl=GetListCtrl(); int nItem = lpDrawItemStruct->itemID; // get item data LV_ITEM lvi; _TCHAR szBuff[MAX_PATH]; memset(&lvi, 0, sizeof(LV_ITEM)); lvi.mask = LVIF_TEXT; lvi.iItem = nItem; lvi.pszText = szBuff; lvi.cchTextMax = sizeof(szBuff); ListCtrl.GetItem(&lvi); RECT rDraw; CopyRect ( &rDraw, &lpDrawItemStruct->rcItem ); rDraw.right = rDraw.left + TOGGLELIST_ITEMHEIGHT; rDraw.top ++; rDraw.right ++; FrameRect ( lpDrawItemStruct->hDC, &rDraw, (HBRUSH)GetStockObject ( BLACK_BRUSH ) ); rDraw.right --; FillRect ( lpDrawItemStruct->hDC, &rDraw, GetSysColorBrush ( COLOR_3DFACE ) ); Draw3dRect ( lpDrawItemStruct->hDC, &rDraw, GetSysColorBrush ( COLOR_3DHILIGHT ), GetSysColorBrush ( COLOR_3DSHADOW ) ); InflateRect ( &rDraw, -3, -3 ); Draw3dRect ( lpDrawItemStruct->hDC, &rDraw, GetSysColorBrush ( COLOR_3DSHADOW ), GetSysColorBrush ( COLOR_3DHILIGHT ) ); switch(GetToggleState(lvi.iItem)) { case TOGGLE_STATE_DISABLED: if(disabledIcon) { DrawIconEx ( lpDrawItemStruct->hDC, rDraw.left, rDraw.top, disabledIcon, 16, 16,0, NULL, DI_NORMAL ); } break; case TOGGLE_STATE_ON: if(onIcon) { DrawIconEx ( lpDrawItemStruct->hDC, rDraw.left, rDraw.top, onIcon, 16, 16,0, NULL, DI_NORMAL ); } break; case TOGGLE_STATE_OFF: if(offIcon) { DrawIconEx ( lpDrawItemStruct->hDC, rDraw.left, rDraw.top, offIcon, 16, 16,0, NULL, DI_NORMAL ); } break; }; CopyRect ( &rDraw, &lpDrawItemStruct->rcItem ); rDraw.left += TOGGLELIST_ITEMHEIGHT; rDraw.left += 1; if ( lpDrawItemStruct->itemState & ODS_SELECTED ) { FillRect ( lpDrawItemStruct->hDC, &rDraw, GetSysColorBrush ( COLOR_HIGHLIGHT ) ); } else { FillRect ( lpDrawItemStruct->hDC, &rDraw, GetSysColorBrush ( COLOR_WINDOW ) ); } rDraw.left += TEXT_OFFSET; int colorIndex = ( (lpDrawItemStruct->itemState & ODS_SELECTED ) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT ); SetTextColor ( lpDrawItemStruct->hDC, GetSysColor ( colorIndex ) ); DrawText ( lpDrawItemStruct->hDC, szBuff, strlen(szBuff), &rDraw, DT_LEFT|DT_VCENTER|DT_SINGLELINE ); }
//"Arrow settings" dialog procedure INT_PTR CALLBACK ASDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch(uMsg) //Message switch { case WM_INITDIALOG: { //Associate the parameters to the window SetWindowLongPtr(hwndDlg,GWLP_USERDATA,(__int3264)(LONG_PTR)lParam); //Get the ASDP ArrowSettingsDlgParam * asdp=(ArrowSettingsDlgParam *)(LONG_PTR)GetWindowLongPtr(hwndDlg,GWLP_USERDATA); //Load the captions of the child windows (and of itself) langFile->InitializeDialogCaptions(hwndDlg, IDD_ARROWSETTINGS); //Set the range of the width updown control UpDown_SetRange(GetDlgItem(hwndDlg,IDC_AS_UD_WIDTH),MAXARROWWL,MINARROWWL); //Set the current width to the current value SetDlgItemInt(hwndDlg,IDC_AS_TX_WIDTH,(UINT)asdp->as->arrowBase,FALSE); //Set the range of the length updown control UpDown_SetRange(GetDlgItem(hwndDlg,IDC_AS_UD_LENGTH),MAXARROWWL,MINARROWWL); //Set the current length to the current value SetDlgItemInt(hwndDlg,IDC_AS_TX_LENGTH,(UINT)asdp->as->arrowLength,FALSE); //Set the "first arrow" check Button_SetCheck(GetDlgItem(hwndDlg,IDC_AS_CH_FIRST),asdp->as->drawFirstArrow?BST_CHECKED:BST_UNCHECKED); //Set the "second arrow" check Button_SetCheck(GetDlgItem(hwndDlg,IDC_AS_CH_SECOND),asdp->as->drawSecondArrow?BST_CHECKED:BST_UNCHECKED); //Set the "open head" check Button_SetCheck(GetDlgItem(hwndDlg,IDC_AS_CH_OPENHEAD),asdp->as->openArrowHead?BST_CHECKED:BST_UNCHECKED); return TRUE; } break; case WM_COMMAND: //Selections, clicks, etc. switch(LOWORD(wParam)) //Controls switch { case IDC_AS_TX_WIDTH: case IDC_AS_TX_LENGTH: if(HIWORD(wParam)==EN_CHANGE) //The text in the textboxes has changed: let's validate it! { static UINT widthLastVal=MINARROWWL; static UINT lengthLastVal=MINARROWWL; if(ValidateUIntFieldChange(hwndDlg,LOWORD(wParam),((LOWORD(wParam)==IDC_AS_TX_WIDTH)?widthLastVal:lengthLastVal),MINARROWWL,MAXARROWWL)) InvalidateRect(GetDlgItem(hwndDlg,IDC_AS_PREVIEW),NULL,TRUE); //Repaint the preview frame } break; case IDC_AS_CH_FIRST: //The state of the checkboxes has changed case IDC_AS_CH_SECOND: case IDC_AS_CH_OPENHEAD: InvalidateRect(GetDlgItem(hwndDlg,IDC_AS_PREVIEW),NULL,TRUE); //Repaint the preview frame break; case IDOK: //The user pressed OK { //Get the ASDP ArrowSettingsDlgParam * asdp=(ArrowSettingsDlgParam *)(LONG_PTR)GetWindowLongPtr(hwndDlg,GWLP_USERDATA); //Assign to the given ArrowSettings the new values *(asdp->as)=ASFromCtrls(hwndDlg); //save the settings } case IDCANCEL: //The user pressed Cancel (note: there's no break) EndDialog(hwndDlg,NULL); break; } return FALSE; case WM_DRAWITEM: //the system asks to draw an owner-draw control { LPDRAWITEMSTRUCT dis=(LPDRAWITEMSTRUCT)lParam; switch(dis->CtlID) { case IDC_AS_PREVIEW: { HRGN paintRgn=CreateRectRgnIndirect(&dis->rcItem); POINT pt1, pt2; ArrowSettings tAS=ASFromCtrls(hwndDlg); pt1.x=10; pt2.x=dis->rcItem.right-10; pt1.y=pt2.y=dis->rcItem.top+(dis->rcItem.bottom-dis->rcItem.top)/2; FillRgn(dis->hDC,paintRgn,GetSysColorBrush(COLOR_WINDOW)); //fill the background DeleteObject(paintRgn); DrawArrow(dis->hDC,pt1,pt2, &tAS); //draw the arrow return FALSE; } } return FALSE; } } return FALSE; }
static LRESULT CALLBACK EventArea_WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_MEASUREITEM: { MEASUREITEMSTRUCT *lpi = (LPMEASUREITEMSTRUCT)lParam; MENUITEMINFOA mii = { 0 }; mii.cbSize = sizeof(mii); mii.fMask = MIIM_DATA | MIIM_ID; if (GetMenuItemInfoA(g_CluiData.hMenuNotify, lpi->itemID, FALSE, &mii) != 0) { if (mii.dwItemData == lpi->itemData) { lpi->itemWidth = 8 + 16; lpi->itemHeight = 0; return TRUE; } } } break; case WM_DRAWITEM: { LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam; if (dis->hwndItem == (HWND)g_CluiData.hMenuNotify) { MENUITEMINFOA mii = { 0 }; mii.cbSize = sizeof(mii); mii.fMask = MIIM_DATA; if (GetMenuItemInfoA(g_CluiData.hMenuNotify, (UINT)dis->itemID, FALSE, &mii) != 0) { NotifyMenuItemExData *nmi = (NotifyMenuItemExData *)mii.dwItemData; if (nmi) { int iIcon = Clist_GetContactIcon(nmi->hContact); ske_ImageList_DrawEx(g_himlCListClc, nmi->iIcon, dis->hDC, 2, (dis->rcItem.bottom + dis->rcItem.top - GetSystemMetrics(SM_CYSMICON)) / 2, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), CLR_NONE, CLR_NONE, ILD_NORMAL); ske_ImageList_DrawEx(g_himlCListClc, iIcon, dis->hDC, 2 + GetSystemMetrics(SM_CXSMICON) + 2, (dis->rcItem.bottom + dis->rcItem.top - GetSystemMetrics(SM_CYSMICON)) / 2, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), CLR_NONE, CLR_NONE, ILD_NORMAL); return TRUE; } } } } break; case WM_LBUTTONUP: if (g_CluiData.bEventAreaEnabled) SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDC_NOTIFYBUTTON, 0), 0); break; case WM_COMMAND: if (LOWORD(wParam) == IDC_NOTIFYBUTTON) { POINT pt; GetCursorPos(&pt); MENUITEMINFO mii = { 0 }; mii.cbSize = sizeof(mii); mii.fMask = MIIM_DATA; int iSelection; if (GetMenuItemCount(g_CluiData.hMenuNotify) > 1) iSelection = TrackPopupMenu(g_CluiData.hMenuNotify, TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, nullptr); else iSelection = GetMenuItemID(g_CluiData.hMenuNotify, 0); BOOL result = GetMenuItemInfo(g_CluiData.hMenuNotify, (UINT)iSelection, FALSE, &mii); if (result != 0) { NotifyMenuItemExData *nmi = (NotifyMenuItemExData*)mii.dwItemData; if (nmi) { CLISTEVENT *cle = MyGetEvent(iSelection); if (cle) { CLISTEVENT *cle1 = nullptr; CallService(cle->pszService, (WPARAM)nullptr, (LPARAM)cle); // re-obtain the pointer, it may already be invalid/point to another event if the // event we're interested in was removed by the service (nasty one...) cle1 = MyGetEvent(iSelection); if (cle1 != nullptr) g_clistApi.pfnRemoveEvent(cle->hContact, cle->hDbEvent); } } } break; } break; case WM_SIZE: if (!g_CluiData.fLayered) InvalidateRect(hwnd, nullptr, FALSE); return DefWindowProc(hwnd, msg, wParam, lParam); case WM_ERASEBKGND: return 1; case WM_PAINT: if (GetParent(hwnd) == g_clistApi.hwndContactList && g_CluiData.fLayered) CallService(MS_SKINENG_INVALIDATEFRAMEIMAGE, (WPARAM)hwnd, 0); else if (GetParent(hwnd) == g_clistApi.hwndContactList && !g_CluiData.fLayered) { RECT rc = { 0 }; GetClientRect(hwnd, &rc); rc.right++; rc.bottom++; HDC hdc = GetDC(hwnd); HDC hdc2 = CreateCompatibleDC(hdc); HBITMAP hbmp = ske_CreateDIB32(rc.right, rc.bottom); HBITMAP hbmpo = (HBITMAP)SelectObject(hdc2, hbmp); ske_BltBackImage(hwnd, hdc2, &rc); EventArea_DrawWorker(hwnd, hdc2); BitBlt(hdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, hdc2, rc.left, rc.top, SRCCOPY); SelectObject(hdc2, hbmpo); DeleteObject(hbmp); DeleteDC(hdc2); SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT)); ReleaseDC(hwnd, hdc); ValidateRect(hwnd, nullptr); } else { RECT rc; GetClientRect(hwnd, &rc); HBRUSH br = GetSysColorBrush(COLOR_3DFACE); PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); HDC hdc2 = CreateCompatibleDC(hdc); HBITMAP hbmp = ske_CreateDIB32(rc.right, rc.bottom); HBITMAP hbmpo = (HBITMAP)SelectObject(hdc2, hbmp); FillRect(hdc2, &ps.rcPaint, br); EventArea_DrawWorker(hwnd, hdc2); BitBlt(hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top, hdc2, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY); SelectObject(hdc2, hbmpo); DeleteObject(hbmp); DeleteDC(hdc2); ps.fErase = FALSE; EndPaint(hwnd, &ps); } default: return DefWindowProc(hwnd, msg, wParam, lParam); } return TRUE; }