void CGfxPopupMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { if (lpDrawItemStruct->CtlType == ODT_MENU) { UINT id = lpDrawItemStruct->itemID; UINT state = lpDrawItemStruct->itemState; bool bEnab = !(state & ODS_DISABLED); bool bSelect = (state & ODS_SELECTED) ? true : false; bool bChecked = (state & ODS_CHECKED) ? true : false; bool bBold = (state & ODS_DEFAULT) ? true : false; SpawnItem * pItem = (SpawnItem *) lpDrawItemStruct->itemData; if (pItem) { CDC * pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CFont * pft; if (!bBold) pft = CFont::FromHandle((HFONT) hMenuFont ? hMenuFont : hGuiFont); else pft = CFont::FromHandle((HFONT) hMenuBoldFont ? hMenuBoldFont : hGuiFont); CFont * of = pDC->SelectObject(pft); CRect rc(lpDrawItemStruct->rcItem); CRect rcImage(rc), rcText(rc); rcImage.right = rcImage.left + rc.Height(); rcImage.bottom = rc.bottom; if (pItem->iCmd == -3) // is a separator { CPen pnDk(PS_SOLID,1,cr3dShadow); CPen pnLt(PS_SOLID,1,cr3dHilight); CPen * opn = pDC->SelectObject(&pnDk); pDC->MoveTo(rc.left + 2, rc.top + 2); pDC->LineTo(rc.right - 2, rc.top + 2); pDC->SelectObject(&pnLt); pDC->MoveTo(rc.left + 2, rc.top + 3); pDC->LineTo(rc.right - 2, rc.top + 3); pDC->SelectObject(opn); } else if (pItem->iCmd == -4) // is a title item { CString cs(pItem->cText), cs1; CRect rcBdr(rcText); if (bSelect && bEnab) { rcText.top ++; rcText.left += 2; } pDC->FillSolidRect(rcText, crMenu); pDC->DrawText(cs, rcText, DT_VCENTER|DT_CENTER|DT_SINGLELINE); if (bSelect && bEnab) pDC->Draw3dRect(rcBdr,cr3dShadow,cr3dHilight); } else { rcText.left += rcImage.right + 1; int obk = pDC->SetBkMode(TRANSPARENT); COLORREF ocr; if (bSelect) { if (pItem->iImageIdx >= 0 || (state & ODS_CHECKED)) pDC->FillSolidRect(rcText, crHighlight); else pDC->FillSolidRect(rc, crHighlight); ocr = pDC->SetTextColor(crMenuTextSel); } else { if (pItem->iImageIdx >= 0 || (state & ODS_CHECKED)) pDC->FillSolidRect(rcText, crMenu); else pDC->FillSolidRect(rc/*rcText*/, crMenu); ocr = pDC->SetTextColor(crMenuText); } if (pItem->iImageIdx >= 0) { int ay = (rcImage.Height() - szImage.cy) / 2; int ax = (rcImage.Width() - szImage.cx) / 2; if (bSelect && bEnab) pDC->Draw3dRect(rcImage,cr3dHilight,cr3dShadow); else { pDC->Draw3dRect(rcImage,crMenu,crMenu); } if (bEnab) { ilList.Draw(pDC, pItem->iImageIdx, CPoint(rcImage.left + ax, rcImage.top +ay), ILD_NORMAL); } else { HICON hIcon = ilList.ExtractIcon( pItem->iImageIdx ); pDC->DrawState( CPoint(rcImage.left + ax, rcImage.top + ay ), szImage, (HICON)hIcon, DST_ICON | DSS_DISABLED, (CBrush *)NULL ); } } else { if (bChecked) { int ay = (rcImage.Height() - szImage.cy) / 2; int ax = (rcImage.Width() - szImage.cx) / 2; ilOther.Draw(pDC, 0, CPoint(rcImage.left + ax, rcImage.top + ay - 2), ILD_NORMAL); } } CString cs(pItem->cText), cs1; CSize sz; sz = pDC->GetTextExtent(cs); int ay1 = (rcText.Height() - sz.cy) / 2; rcText.top += ay1; rcText.left += 2; rcText.right -= 15; int tf = cs.Find('\t'); if (tf >= 0) { cs1 = cs.Right(cs.GetLength() - tf - 1); cs = cs.Left(tf); if (!bEnab) { if (!bSelect) { CRect rcText1(rcText); rcText1.InflateRect(-1,-1); pDC->SetTextColor(cr3dHilight); pDC->DrawText(cs, rcText1, DT_VCENTER|DT_LEFT); pDC->DrawText(cs1, rcText1, DT_VCENTER|DT_RIGHT); pDC->SetTextColor(crGrayText); pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT); pDC->DrawText(cs1, rcText, DT_VCENTER|DT_RIGHT); } else { pDC->SetTextColor(crMenu); pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT); pDC->DrawText(cs1, rcText, DT_VCENTER|DT_RIGHT); } } else { pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT); pDC->DrawText(cs1, rcText, DT_VCENTER|DT_RIGHT); } } else { if (!bEnab) { if (!bSelect) { CRect rcText1(rcText); rcText1.InflateRect(-1,-1); pDC->SetTextColor(cr3dHilight); pDC->DrawText(cs, rcText1, DT_VCENTER|DT_LEFT|DT_EXPANDTABS); pDC->SetTextColor(crGrayText); pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT|DT_EXPANDTABS); } else { pDC->SetTextColor(crMenu); pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT|DT_EXPANDTABS); } } else pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT|DT_EXPANDTABS); } pDC->SetTextColor(ocr); pDC->SetBkMode(obk); } pDC->SelectObject(of); } } }
// 拍子記号・調性記号の描画 void CMusicalScoreTrackScaleView::DrawTimeAndKeySignature (CDC* pDC, long lTrackIndex, long lTime) { CMusicalScoreFrame* pMusicalScoreFrame = (CMusicalScoreFrame*)GetParent (); CSekaijuDoc* pSekaijuDoc = GetDocument (); MIDIData* pMIDIData = pSekaijuDoc->m_pMIDIData; MusicalScoreTrackInfo* pTrackInfo = NULL; VERIFY (pTrackInfo = pMusicalScoreFrame->GetTrackInfo (lTrackIndex)); long lTrackFlags = pTrackInfo->m_lFlags; long x = 40; long y = 0; long rx = 4; long ry = 4; long lGCrefSharpLineNo[7] = {45, 42, 46, 43, 40, 44, 41}; long lFCrefSharpLineNo[7] = {31, 28, 32, 29, 33, 30, 34}; long lGCrefFlatLineNo[7] = {41, 44, 40, 43, 39, 42, 38}; long lFCrefFlatLineNo[7] = {27, 30, 26, 29, 25, 28, 24}; long lsf, lmi; MIDIData_FindKeySignature (pMIDIData, lTime, &lsf, &lmi); long lnn, ldd, lcc, lbb; MIDIData_FindTimeSignature (pMIDIData, lTime, &lnn, &ldd, &lcc, &lbb); CString strText1; CString strText2; strText1.Format (_T("%d"), lnn); strText2.Format (_T("%d"), (1 << ldd)); CRect rcText1 (x + rx * 10 + rx * 2 * abs(lsf), 0, x + rx * 10 + rx * 2 * abs(lsf) + 24, 0); CRect rcText2 (x + rx * 10 + rx * 2 * abs(lsf), 0, x + rx * 10 + rx * 2 * abs(lsf) + 24, 0); long j; switch (lTrackFlags & 0x0000000F) { case 1: // ト音記号 y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, 39); DrawGClef (pDC, x + rx * 4, y, rx, ry); if (lsf > 0) { for (j = 1; j <= lsf; j++) { y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, lGCrefSharpLineNo[j - 1]); DrawSharp (pDC, x + rx * 8 + rx * 2 * j, y, rx, ry); } } else if (lsf < 0) { for (j = 1; j <= -lsf; j++) { y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, lGCrefFlatLineNo[j - 1]); DrawFlat (pDC, x + rx * 8 + rx * 2 * j, y, rx, ry); } } y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, 41); rcText1.top = y - ry * 4; rcText1.bottom = y; pDC->DrawText (strText1, &rcText1, DT_SINGLELINE | DT_CENTER | DT_VCENTER); rcText2.top = y; rcText2.bottom = y + ry * 4; pDC->DrawText (strText2, &rcText2, DT_SINGLELINE | DT_CENTER | DT_VCENTER); break; case 2: // ヘ音記号 y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, 31); DrawFClef (pDC, x + rx * 4, y, rx, ry); if (lsf > 0) { for (j = 1; j <= lsf; j++) { y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, lFCrefSharpLineNo[j - 1]); DrawSharp (pDC, x + rx * 8 + rx * 2 * j, y, rx, ry); } } else if (lsf < 0) { for (j = 1; j <= -lsf; j++) { y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, lFCrefFlatLineNo[j - 1]); DrawFlat (pDC, x + rx * 8 + rx * 2 * j, y, rx, ry); } } y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, 29); rcText1.top = y - ry * 4; rcText1.bottom = y; pDC->DrawText (strText1, &rcText1, DT_SINGLELINE | DT_CENTER | DT_VCENTER); rcText2.top = y; rcText2.bottom = y + ry * 4; pDC->DrawText (strText2, &rcText2, DT_SINGLELINE | DT_CENTER | DT_VCENTER); break; case 3: // 大譜表 y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, 39); DrawGClef (pDC, x + rx * 4, y, rx, ry); if (lsf > 0) { for (j = 1; j <= lsf; j++) { y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, lGCrefSharpLineNo[j - 1]); DrawSharp (pDC, x + rx * 8 + rx * 2 * j, y, rx, ry); } } else if (lsf < 0) { for (j = 1; j <= -lsf; j++) { y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, lGCrefFlatLineNo[j - 1]); DrawFlat (pDC, x + rx * 8 + rx * 2 * j, y, rx, ry); } } y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, 41); rcText1.top = y - ry * 4; rcText1.bottom = y; pDC->DrawText (strText1, &rcText1, DT_SINGLELINE | DT_CENTER | DT_VCENTER); rcText2.top = y; rcText2.bottom = y + ry * 4; pDC->DrawText (strText2, &rcText2, DT_SINGLELINE | DT_CENTER | DT_VCENTER); y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, 31); DrawFClef (pDC, x + rx * 4, y, rx, ry); if (lsf > 0) { for (j = 1; j <= lsf; j++) { y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, lFCrefSharpLineNo[j - 1]); DrawSharp (pDC, x + rx * 8 + rx * 2 * j, y, rx, ry); } } else if (lsf < 0) { for (j = 1; j <= -lsf; j++) { y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, lFCrefFlatLineNo[j - 1]); DrawFlat (pDC, x + rx * 8 + rx * 2 * j, y, rx, ry); } } y = pMusicalScoreFrame->TrackIndexLineNotoY (lTrackIndex, 29); rcText1.top = y - ry * 4; rcText1.bottom = y; pDC->DrawText (strText1, &rcText1, DT_SINGLELINE | DT_CENTER | DT_VCENTER); rcText2.top = y; rcText2.bottom = y + ry * 4; pDC->DrawText (strText2, &rcText2, DT_SINGLELINE | DT_CENTER | DT_VCENTER); break; } }