-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSubclassListBox.cpp
More file actions
101 lines (92 loc) · 2.91 KB
/
Copy pathSubclassListBox.cpp
File metadata and controls
101 lines (92 loc) · 2.91 KB
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
// SubclassListBox.cpp: implementation of the SubclassListBox class.
//
//////////////////////////////////////////////////////////////////////
#include "EnvVars.h"
#include "SubclassListBox.h"
#include "EnvVarsDlg.h"
#include "resource.h"
WNDPROC __wndprocSysVarsList = NULL;
WNDPROC __wndprocUsrVarsList = NULL;
LRESULT CALLBACK SysVarsListBoxWndProc( HWND hListBox, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch ( uMsg )
{
case WM_CONTEXTMENU:
{
HMENU hMenu;
int xPos, yPos;
xPos = LOWORD(lParam);
yPos = HIWORD(lParam);
POINT pt;
pt.x = xPos;
pt.y = yPos;
ScreenToClient( hListBox, &pt );
LRESULT l = SendMessage( hListBox, LB_ITEMFROMPOINT, 0, MAKELPARAM( pt.x, pt.y ) );
int iSel = LOWORD(l), fOutSide = HIWORD(l);
iSel = fOutSide ? -1 : iSel;
SendMessage( hListBox, LB_SETCURSEL, iSel, 0 );
hMenu = CreatePopupMenu();
AppendMenu( hMenu, MF_STRING, IDM_SYS_ADD_VAL, LoadStringRes(IDS_ADDMENU).c_str() );
if ( !fOutSide ) AppendMenu( hMenu, MF_STRING, IDM_SYS_MOD_VAL, LoadStringRes(IDS_MODMENU).c_str() );
TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, xPos, yPos, 0, GetParent(hListBox), NULL );
DestroyMenu(hMenu);
}
break;
}
return CallWindowProc( __wndprocSysVarsList, hListBox, uMsg, wParam, lParam );
}
LRESULT CALLBACK UsrVarsListBoxWndProc( HWND hListBox, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch ( uMsg )
{
case WM_CONTEXTMENU:
{
HMENU hMenu;
int xPos, yPos;
xPos = LOWORD(lParam);
yPos = HIWORD(lParam);
POINT pt;
pt.x = xPos;
pt.y = yPos;
ScreenToClient( hListBox, &pt );
LRESULT l = SendMessage( hListBox, LB_ITEMFROMPOINT, 0, MAKELPARAM( pt.x, pt.y ) );
int iSel = LOWORD(l), fOutSide = HIWORD(l);
iSel = fOutSide ? -1 : iSel;
SendMessage( hListBox, LB_SETCURSEL, iSel, 0 );
hMenu = CreatePopupMenu();
AppendMenu( hMenu, MF_STRING, IDM_USR_ADD_VAL, LoadStringRes(IDS_ADDMENU).c_str() );
if ( !fOutSide ) AppendMenu( hMenu, MF_STRING, IDM_USR_MOD_VAL, LoadStringRes(IDS_MODMENU).c_str() );
TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON, xPos, yPos, 0, GetParent(hListBox), NULL );
DestroyMenu(hMenu);
}
break;
}
return CallWindowProc( __wndprocUsrVarsList, hListBox, uMsg, wParam, lParam );
}
void SubclassWindow( HWND hWnd, bool bEnabled, WNDPROC wndproc, WNDPROC * pWndprocOld )
{
if ( bEnabled )
{
if ( *pWndprocOld == NULL )
{
*pWndprocOld = (WNDPROC)GetWindowLong( hWnd, GWL_WNDPROC );
SetWindowLong( hWnd, GWL_WNDPROC, (LONG)wndproc );
}
}
else
{
if ( *pWndprocOld != NULL )
{
SetWindowLong( hWnd, GWL_WNDPROC, (LONG)*pWndprocOld );
*pWndprocOld = NULL;
}
}
}
void SubclassSysVarsListBox( HWND hListBox, bool bEnabled )
{
SubclassWindow( hListBox, bEnabled, SysVarsListBoxWndProc, &__wndprocSysVarsList );
}
void SubclassUsrVarsListBox( HWND hListBox, bool bEnabled )
{
SubclassWindow( hListBox, bEnabled, UsrVarsListBoxWndProc, &__wndprocUsrVarsList );
}