| 510 | // Checkmark button |
| 511 | |
| 512 | class CPropertyCheckButtonItem : public CProperty |
| 513 | { |
| 514 | protected: |
| 515 | bool m_bValue; |
| 516 | |
| 517 | public: |
| 518 | CPropertyCheckButtonItem(LPCTSTR pstrName, LPARAM lParam) : |
| 519 | CProperty(pstrName, lParam), |
| 520 | m_bValue(false) |
| 521 | { |
| 522 | } |
| 523 | |
| 524 | CPropertyCheckButtonItem(LPCTSTR pstrName, bool bValue, LPARAM lParam) : |
| 525 | CProperty(pstrName, lParam), |
| 526 | m_bValue(bValue) |
| 527 | { |
| 528 | } |
| 529 | |
| 530 | BYTE GetKind() const |
| 531 | { |
| 532 | return PROPKIND_CHECK; |
| 533 | } |
| 534 | |
| 535 | BOOL GetValue(VARIANT* pVal) const |
| 536 | { |
| 537 | return SUCCEEDED( CComVariant(m_bValue).Detach(pVal) ); |
| 538 | } |
| 539 | |
| 540 | BOOL SetValue(const VARIANT& value) |
| 541 | { |
| 542 | // Set a new value |
| 543 | switch( value.vt ) { |
| 544 | case VT_BOOL: |
| 545 | m_bValue = (value.boolVal != VARIANT_FALSE); |
| 546 | return TRUE; |
| 547 | default: |
| 548 | ATLASSERT(false); |
| 549 | return FALSE; |
| 550 | } |
| 551 | } |
| 552 | |
| 553 | void DrawValue(PROPERTYDRAWINFO& di) |
| 554 | { |
| 555 | int cxThumb = ::GetSystemMetrics(SM_CXMENUCHECK); |
| 556 | int cyThumb = ::GetSystemMetrics(SM_CYMENUCHECK); |
| 557 | RECT rcMark = di.rcItem; |
| 558 | rcMark.left += 3; |
| 559 | rcMark.right = rcMark.left + cxThumb; |
| 560 | rcMark.top += 2; |
| 561 | if( rcMark.top + cyThumb >= rcMark.bottom ) rcMark.top -= rcMark.top + cyThumb - rcMark.bottom + 1; |
| 562 | rcMark.bottom = rcMark.top + cyThumb; |
| 563 | UINT uState = DFCS_BUTTONCHECK | DFCS_FLAT; |
| 564 | if( m_bValue ) uState |= DFCS_CHECKED; |
| 565 | if( (di.state & ODS_DISABLED) != 0 ) uState |= DFCS_INACTIVE; |
| 566 | ::DrawFrameControl(di.hDC, &rcMark, DFC_BUTTON, uState); |
| 567 | } |
| 568 | |
| 569 | BOOL Activate(UINT action, LPARAM /*lParam*/) |
nothing calls this directly
no outgoing calls
no test coverage detected