LAPTOP-SNT8I5JK\Boounion
2025-07-28 bfe14e41fa5b07771d78af4511ba18d706bc23cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// HmVerticalTab.h: interface for the CHmTab class.
//
//////////////////////////////////////////////////////////////////////
 
#if !defined(AFX_HMVERTICALTAB_H__FBB8916A_DE77_4EA3_9C21_E51E6B06194C__INCLUDED_)
#define AFX_HMVERTICALTAB_H__FBB8916A_DE77_4EA3_9C21_E51E6B06194C__INCLUDED_
 
 
#pragma comment(lib, "Msimg32.lib")            // TransparentBlt
#include <vector>
 
 
 
//====== HmTab =====================================================
 
#ifndef NOHMVERTICALTAB
 
#ifdef _WIN32
 
#define HMVERTICALTAB_CLASSA       "HmVerticalTab"
#define HMVERTICALTAB_CLASSW       L"HmVerticalTab"
 
#ifdef UNICODE
#define  HMVERTICALTAB_CLASS       HMVERTICALTAB_CLASSW
#else
#define  HMVERTICALTAB_CLASS       HMVERTICALTAB_CLASSA
#endif
 
#else
#define HMVERTICALTAB_CLASS        "HmVerticalTab"
#endif
 
 
#define TAG_HMVERTICALTAB         _T("IsHmVerticalTab")
 
 
//====== WM_NOTIFY codes (NMHDR.code values) ==================================
#define HMVERTICALTAB_FIRST            (0U-3370U)       //
#define HMVERTICALTAB_LAST            (0U-3350U)
#define HMVERTICALTAB_SEL_CHANGED    (HMVERTICALTAB_FIRST - 1)
 
 
 
typedef struct tagHMVERTICALTAB_NMHDR
{
    NMHDR        nmhdr;
    DWORD_PTR    dwData;
    DWORD_PTR    dwData1;
    DWORD_PTR    dwData2;
} HMVERTICALTAB_NMHDR;
 
#define HMVERTICALTAB_ITEM_TEXT_MAX        64
 
typedef struct tagHMVERTICALTABITEM
{
    int id;
    char szText[HMVERTICALTAB_ITEM_TEXT_MAX];
    RECT rect;
    void* context;
} HMVERTICALTABITEM;
 
#define HMTAB_HITCODETEST            _T("HitCode")
#define HMTAB_HT_NOWHERE            0x1
#define HMTAB_HT_ITEM                0x2
#define HMTAB_HT_HIGT_ITEM            0x4
 
 
#endif
 
 
 
 
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
 
 
class CHmVerticalTab
{
public:
    CHmVerticalTab();
    virtual ~CHmVerticalTab();
 
public:
    static BOOL RegisterWndClass();
    static CHmVerticalTab* Hook(HWND hWnd);
    void Notify(int nCode, DWORD_PTR dwData, DWORD_PTR dwData1 = 0, DWORD_PTR dwData2 = 0);
    void Release();
    void SetBkgndColor(COLORREF cr);
    static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    static LRESULT OnNcCreate(HWND hWnd, WPARAM wParam, LPARAM lParam);
    LRESULT OnDestroy(WPARAM wParam, LPARAM lParam);
    LRESULT OnTimer(WPARAM wParam, LPARAM lParam);
    LRESULT OnPaint(WPARAM wParam, LPARAM lParam);
    LRESULT OnSetCursor(WPARAM wParam, LPARAM lParam);
    LRESULT OnSize(WPARAM wParam, LPARAM lParam);
    LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam);
    LRESULT OnMouseMove(WPARAM wParam, LPARAM lParam);
 
 
public:
    void SetPaddingTop(int value);
    void SetItemMarginTop(int value);
    void SetTextColor(COLORREF color1, COLORREF color2);
    void SetItemBkgndColor(COLORREF color1, COLORREF color2);
    void SetHightLineVisible(BOOL bVisible);
    int AddItem(const char* pszText, void* pContext = nullptr, BOOL bUpdate = TRUE);
    int DeleteItem(const char* pszText, BOOL bUpdate = TRUE);
    void* GetContext(unsigned int index);
    int HighTest(POINT pt, OUT HMVERTICALTABITEM*& pItem, int* pnIndex);
    int GetCurSel();
    void SetCurSel(int index);
    int GetItemCount();
 
 
private:
    HWND        m_hWnd;
    COLORREF m_crBkgnd;
 
private:
    int m_nCurSel;
    int m_nItemHeight;
    std::vector< HMVERTICALTABITEM > m_items;
    HMVERTICALTABITEM* m_pHighItem;
    HMVERTICALTABITEM* m_pPressItem;
    int m_nPaddingTop;
    int m_nItemMarginTop;
    COLORREF m_crText[2];
    COLORREF m_crItemBkgnd[2];        // ×ÓÏî±³¾°É«£¬0£ºÑ¡ÖУ¬1£º¸ßÁÁ
    HBRUSH m_hbrItemBkgnd[2];        // ÉÏÊöÁ½ÏîÔ¤´´½¨
    HPEN m_hPenUnder[2];
    HPEN m_hPenUnderWnd;
    BOOL m_bShowHightLine;
};
 
#endif // !defined(AFX_HMVERTICALTAB_H__FBB8916A_DE77_4EA3_9C21_E51E6B06194C__INCLUDED_)