zoukankan      html  css  js  c++  java
  • C++重绘CPropertySheet

    CWizard类继承自CPropertySheet,左边的按钮使用重绘的CListBox(CSideNav)。CPropertySheet原有的CTabCtrl被隐藏了,窗口中的按钮使用重绘的CButton(CLexyButton)。以下代码中OnNcPaint中的代码是重绘非客户区,可以不要。

    1 //CWizard头文件
    2  #pragma once
    3 #include "LexyButton.h"
    4 #include "SideNav.h"
    5
    6
    7  // CWizard
    8  
    9 class CWizard : public CPropertySheet
    10 {
    11 DECLARE_DYNAMIC(CWizard)
    12
    13 public:
    14 CWizard(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
    15 CWizard(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
    16 virtual ~CWizard();
    17 private:
    18 CLexyButton mOK;
    19 CLexyButton mCancel;
    20 CLexyButton mApply;
    21 CSideNav mTabCtrl;
    22 std::vector<int> poslist;
    23 int _sys_btn_idx;
    24 BOOL inited;
    25 void FixLocation(BOOL MovePageOnly=FALSE);
    26 protected:
    27 DECLARE_MESSAGE_MAP()
    28 public:
    29 virtual BOOL OnInitDialog();
    30 virtual BOOL DestroyWindow();
    31 afx_msg void OnNcPaint();
    32 afx_msg BOOL OnNcActivate(BOOL bActive);
    33 afx_msg void OnNcMouseMove(UINT nHitTest, CPoint point);
    34 afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);
    35 afx_msg void OnTabChange();
    36 afx_msg void OnPaint();
    37 };
    38
    39
    40
    41 //CWizard的cpp
    42 // Wizard.cpp : 实现文件
    43 //
    44
    45 #include "stdafx.h"
    46 #include "MyPIM.h"
    47 #include "Wizard.h"
    48 #include "LexySkin.h"
    49
    50 // CWizard
    51
    52 IMPLEMENT_DYNAMIC(CWizard, CPropertySheet)
    53
    54 CWizard::CWizard(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
    55 :CPropertySheet(nIDCaption, pParentWnd, iSelectPage){
    56 m_psh.dwFlags |= PSH_NOAPPLYNOW;
    57 _sys_btn_idx=-1;
    58 inited=FALSE;
    59 }
    60
    61 CWizard::CWizard(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
    62 :CPropertySheet(pszCaption, pParentWnd, iSelectPage){
    63 m_psh.dwFlags |= PSH_NOAPPLYNOW;
    64 _sys_btn_idx=-1;
    65 inited=FALSE;
    66 }
    67 CWizard::~CWizard(){}
    68
    69
    70 BEGIN_MESSAGE_MAP(CWizard, CPropertySheet)
    71 ON_WM_NCPAINT()
    72 ON_WM_NCACTIVATE()
    73 ON_WM_NCMOUSEMOVE()
    74 ON_WM_NCLBUTTONDOWN()
    75 ON_LBN_SELCHANGE(13579,OnTabChange)
    76 ON_WM_PAINT()
    77 END_MESSAGE_MAP()
    78
    79
    80 // CWizard 消息处理程序
    81
    82 void CWizard::OnNcMouseMove(UINT nHitTest, CPoint point)
    83 {
    84 // TODO: 在此添加消息处理程序代码和/或调用默认值
    85 CRect rc;
    86 GetWindowRect(rc);
    87 CPoint pt(point.x-rc.left,point.y-rc.top);
    88
    89 if((poslist.size()==2)&&(pt.y<GetSystemMetrics(SM_CYCAPTION))){
    90 int pos=-1;
    91 if(pt.x>poslist.at(0)) pos=0;
    92 if(pt.x>poslist.at(1)) pos=1;
    93
    94 if(pos!=_sys_btn_idx){
    95 _sys_btn_idx=pos;
    96 LexySkin::GetSkin()->DrawDialogNCButton(this,_sys_btn_idx);
    97 //CString msg;
    98 //msg.Format(L"0:%d--1:%d |pos:%d\r\n",poslist.at(0),poslist.at(1) ,pt.x);
    99 //OutputDebugStringW(msg);
    100 }
    101 }else{
    102 if(_sys_btn_idx!=-1){
    103 _sys_btn_idx=-1;
    104 LexySkin::GetSkin()->DrawDialogNCButton(this,_sys_btn_idx);
    105 }
    106 }
    107 CPropertySheet::OnNcMouseMove(nHitTest, point);
    108 }
    109
    110 void CWizard::OnNcLButtonDown(UINT nHitTest, CPoint point)
    111 {
    112 // TODO: 在此添加消息处理程序代码和/或调用默认值
    113 CRect rc;
    114 GetWindowRect(rc);
    115 CPoint pt(point.x-rc.left,point.y-rc.top);
    116 if((poslist.size()==2)&&(pt.y<GetSystemMetrics(SM_CYCAPTION))){
    117 int pos=-1;
    118 if(pt.x>poslist.at(0)) pos=0;
    119 if(pt.x>poslist.at(1)) pos=1;
    120 LPARAM lp=MAKELPARAM(point.x, point.y);
    121 switch(pos){
    122 case 0:
    123 SendMessage(WM_SYSCOMMAND, SC_MINIMIZE,lp );
    124 break;
    125 case 1:
    126 PostMessage(WM_SYSCOMMAND,SC_CLOSE);
    127 return;
    128 default:
    129 break;
    130 }
    131 }
    132 CPropertySheet::OnNcLButtonDown(nHitTest, point);
    133 }
    134
    135
    136 BOOL CWizard::OnInitDialog()
    137 {
    138 BOOL bResult = CPropertySheet::OnInitDialog();
    139 // TODO: 在此添加您的专用代码
    140 CTabCtrl* tab=this->GetTabControl();
    141 tab->ShowWindow(SW_HIDE);
    142 //子类化对话框按钮
    143 mCancel.SubclassDlgItem(IDCANCEL,this);
    144 mOK.SubclassDlgItem(IDOK,this);
    145 //初始化导航
    146 mTabCtrl.Create(LBS_STANDARD|WS_CHILD|WS_VISIBLE, CRect(0,0,90,100),this,13579);
    147 mTabCtrl.SetItemIcon(IDI_LI_DEF,IDI_LI_SEL);
    148 for(int i=0;i<GetPageCount();i++){
    149 TCITEM tcItem;
    150 TCHAR buffer[256] = {0};
    151 tcItem.pszText = buffer;
    152 tcItem.cchTextMax = 256;
    153 tcItem.mask = TCIF_TEXT;
    154 tab->GetItem(i, &tcItem);
    155
    156 mTabCtrl.AddString(tcItem.pszText);
    157 }
    158
    159 inited=TRUE;
    160 FixLocation();
    161
    162 LexySkin::FixRoundWindow(this);
    163 return bResult;
    164 }
    165
    166
    167 BOOL CWizard::DestroyWindow()
    168 {
    169 // TODO: 在此添加专用代码和/或调用基类
    170 return CPropertySheet::DestroyWindow();
    171 }
    172
    173
    174 void CWizard::OnNcPaint()
    175 {
    176 // TODO: 在此处添加消息处理程序代码
    177 // 不为绘图消息调用 CPropertySheet::OnNcPaint()
    178 LexySkin::GetSkin()->DrawNC(this);
    179 poslist=LexySkin::GetSkin()->DrawDialogNCButton(this,_sys_btn_idx);
    180 }
    181
    182
    183 BOOL CWizard::OnNcActivate(BOOL bActive)
    184 {
    185 // TODO: 在此添加消息处理程序代码和/或调用默认值
    186 OnNcPaint();
    187 return TRUE;
    188 //return CPropertySheet::OnNcActivate(bActive);
    189 }
    190
    191
    192
    193
    194 void CWizard::FixLocation(BOOL MovePageOnly){
    195 if(!inited) return;
    196 CRect rect;
    197 //整体窗体调整
    198 const int addw=100;
    199 if(!MovePageOnly){
    200 GetWindowRect(rect);
    201 this->MoveWindow(rect.left,rect.top,rect.Width()+addw,rect.Height());
    202 }
    203 //客户区域调整
    204 GetClientRect(rect);
    205 //调整属性页
    206 for(int i=0;i<m_pages.GetCount();i++){
    207 CPropertyPage* pg=this->GetPage(i);
    208 if(IsWindow(pg->m_hWnd)){
    209 pg->MoveWindow(10+addw+1,11,rect.Width()-addw-20-2,rect.Height()-50-2);
    210 }
    211 }
    212 //调整按钮
    213 mCancel.MoveWindow(rect.Width()-100,rect.Height()-30,90,24);
    214 mOK.MoveWindow(rect.Width()-192,rect.Height()-30,90,24);
    215 //CTabCtrl
    216 mTabCtrl.MoveWindow(10,10,96,rect.Height()-50);
    217 //画边框
    218 this->InvalidateRect(rect);
    219 }
    220
    221 void CWizard::OnTabChange(){
    222 //AfxMessageBox(L"TEST");
    223 int n=mTabCtrl.GetCurSel();
    224 if((n>=0)&(n<mTabCtrl.GetCount())){
    225 SetActivePage(mTabCtrl.GetCurSel());
    226 FixLocation(TRUE);
    227
    228 }
    229 }
    230
    231
    232 void CWizard::OnPaint()
    233 {
    234 CPaintDC dc(this); // device context for painting
    235 // TODO: 在此处添加消息处理程序代码
    236 // 不为绘图消息调用 CPropertySheet::OnPaint()
    237 const int addw=100;
    238 Graphics g(dc.m_hDC);
    239 CRect rect;
    240 GetClientRect(rect);
    241 Gdiplus::Pen pen(Gdiplus::Color(183,194,214));
    242 g.DrawRectangle(&pen,10+addw,10,rect.Width()-addw-20,rect.Height()-50-1);
    243 g.ReleaseHDC(dc.m_hDC);
    244 }
  • 相关阅读:
    laravel 1对多,主键不是整型的坑
    laravel 修改默认Eloquent 映射 表名加s复数的方式
    linux开启与关闭防火墙
    laravel 队列使用(发邮件、短信等)
    linux下隐藏nginx版本及php版本信息
    laravel API开发,使用dingo/api
    80端口被占用
    中国大陆地区数据库-(省市县)总表
    未定义“RunCommand”属性
    按键精灵手机端代码通
  • 原文地址:https://www.cnblogs.com/Lexy/p/2035541.html
Copyright © 2011-2022 走看看