Skip to content

Commit c6789b6

Browse files
Joker QyouJoker Qyou
authored andcommitted
Adjustable text transparency
1 parent 434b51d commit c6789b6

3 files changed

Lines changed: 113 additions & 10 deletions

File tree

counter.py

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import win32gui_struct
1111
import win32ui
1212

13+
from dialogs import slider
14+
1315

1416
class KeyCounter(object):
1517

@@ -28,9 +30,12 @@ def __init__(self):
2830
self.MENU = None
2931
self.MENU_ITEMS = (
3032
('Quit', self.stop),
33+
('Set transparency', self.set_transparency),
3134
('Reset', self.reset_count),
3235
)
3336
self.__last_text_extent = (0, 0)
37+
self.__transparency_setter = None
38+
self.transparency = 128
3439

3540
def reset_count(self):
3641
self.key_count = 0
@@ -47,6 +52,15 @@ def Key_handler(evt):
4752
self.hook.KeyDown = Key_handler
4853
self.hook.HookKeyboard()
4954

55+
def set_transparency(self):
56+
def on_value(value):
57+
self.update_window_transparency(value)
58+
59+
dialog = slider.TransparencySliderDialog(
60+
self.transparency, on_value=on_value
61+
)
62+
dialog.DoModal()
63+
5064
def init_font(self, hdc, paintStruct):
5165
# http://msdn.microsoft.com/en-us/library/windows/desktop/dd145037(v=vs.85).aspx
5266
lf = win32gui.LOGFONT()
@@ -97,6 +111,23 @@ def execute_menu_item(self, index):
97111
if callable(func):
98112
func()
99113

114+
def update_window_transparency(self, value=None):
115+
if value is not None:
116+
value = int(value)
117+
if value < 0:
118+
value = 0
119+
elif value > 255:
120+
value = 255
121+
self.transparency = value
122+
123+
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633540(v=vs.85).aspx
124+
win32gui.SetLayeredWindowAttributes(
125+
self.HWND,
126+
0x00ffffff,
127+
self.transparency, # foreground transparency, 255 means opaque
128+
win32con.LWA_COLORKEY | win32con.LWA_ALPHA
129+
)
130+
100131
def create_window(self):
101132
def wndProc(hWnd, message, wParam, lParam):
102133
if message == self.MESSAGE:
@@ -200,14 +231,8 @@ def wndProc(hWnd, message, wParam, lParam):
200231
hInstance,
201232
None # lpParam
202233
)
203-
204-
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633540(v=vs.85).aspx
205-
win32gui.SetLayeredWindowAttributes(
206-
hWindow,
207-
0x00ffffff,
208-
128, # foreground transparency, 255 means opaque
209-
win32con.LWA_COLORKEY | win32con.LWA_ALPHA
210-
)
234+
self.HWND = hWindow
235+
self.update_window_transparency()
211236
# Transparent background
212237
win32gui.SetBkMode(hWindow, win32con.TRANSPARENT)
213238

@@ -224,8 +249,6 @@ def wndProc(hWnd, message, wParam, lParam):
224249
# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx
225250
# win32gui.ShowWindow(hWindow, win32con.SW_SHOW)
226251

227-
self.HWND = hWindow
228-
229252
def update_tray_icon(self):
230253
try:
231254
hIcon = win32gui.LoadIcon(

dialogs/__init__.py

Whitespace-only changes.

dialogs/slider.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
from pywin.mfc import dialog
4+
import win32con
5+
import win32ui
6+
7+
8+
class TransparencySliderDialog(dialog.Dialog):
9+
'''Simple dialog with a single trackbar control inside'''
10+
_dialogstyle = (
11+
win32con.WS_DLGFRAME |
12+
win32con.DS_MODALFRAME | win32con.WS_POPUP | win32con.WS_VISIBLE |
13+
win32con.WS_CAPTION | win32con.WS_SYSMENU | win32con.DS_SETFONT
14+
)
15+
_buttonstyle = (
16+
win32con.BS_PUSHBUTTON | win32con.WS_TABSTOP |
17+
win32con.WS_CHILD | win32con.WS_VISIBLE
18+
)
19+
_labelStyle = win32con.WS_CHILD | win32con.WS_VISIBLE
20+
DIALOGTEMPLATE = [
21+
[
22+
'Transparency',
23+
(0, 0, 155, 40), # x, y, w, h
24+
_dialogstyle, None,
25+
(11, 'Microsoft YaHei')
26+
],
27+
[
28+
130, 'Transparent', -1, (5, 0, 60, 10),
29+
_labelStyle | win32con.SS_LEFT
30+
],
31+
[
32+
130, 'Opaque', -1, (125, 0, 60, 10),
33+
_labelStyle | win32con.SS_LEFT
34+
],
35+
[
36+
128, 'Ok', win32con.IDOK, (55, 20, 45, 14),
37+
_buttonstyle
38+
],
39+
]
40+
IDC_SLIDER = 9500
41+
42+
def __init__(self, init_value=0, on_value=None):
43+
dialog.Dialog.__init__(self, self.DIALOGTEMPLATE)
44+
self.init_value = init_value
45+
self.on_value = on_value
46+
47+
def OnInitDialog(self):
48+
rc = dialog.Dialog.OnInitDialog(self)
49+
win32ui.EnableControlContainer()
50+
self.slider = win32ui.CreateSliderCtrl()
51+
self.slider.CreateWindow(
52+
win32con.WS_TABSTOP | win32con.WS_VISIBLE,
53+
(105, 0, 280, 30),
54+
self._obj_,
55+
self.IDC_SLIDER
56+
)
57+
self.slider.SetRange(0, 255)
58+
self.slider.SetPos(self.init_value)
59+
self.slider.SetTic(self.init_value)
60+
self.HookMessage(self.OnSliderMove, win32con.WM_HSCROLL)
61+
return rc
62+
63+
def OnSliderMove(self, params):
64+
if callable(self.on_value):
65+
self.on_value(self.slider.GetPos())
66+
67+
def OnOK(self):
68+
if callable(self.on_value):
69+
self.on_value(self.slider.GetPos())
70+
self._obj_.OnOK()
71+
72+
def OnClose(self):
73+
if callable(self.on_value):
74+
self.on_value(self.slider.GetPos())
75+
self._obj_.OnClose()
76+
77+
78+
if __name__ == '__main__':
79+
tDialog = TransparencySliderDialog(128)
80+
tDialog.DoModal()

0 commit comments

Comments
 (0)