@@ -7,13 +7,13 @@ use widestring::U16CString;
7
7
use windows_sys:: Win32 :: UI :: {
8
8
Controls :: {
9
9
TOOLTIPS_CLASSW , TTF_IDISHWND , TTF_SUBCLASS , TTM_ADDTOOLW , TTM_DELTOOLW ,
10
- TTM_UPDATETIPTEXTW , TTS_ALWAYSTIP , TTS_NOPREFIX , TTTOOLINFOW ,
10
+ TTM_SETMAXTIPWIDTH , TTM_UPDATETIPTEXTW , TTS_ALWAYSTIP , TTS_NOPREFIX , TTTOOLINFOW ,
11
11
} ,
12
- WindowsAndMessaging :: { DestroyWindow , GetParent , WS_POPUP } ,
12
+ WindowsAndMessaging :: { DestroyWindow , GetParent , GetSystemMetrics , SM_CXMAXTRACK , WS_POPUP } ,
13
13
} ;
14
14
use winio_handle:: { AsRawWidget , AsWidget } ;
15
15
16
- use crate :: Widget ;
16
+ use crate :: { Widget , ui :: fix_crlf } ;
17
17
18
18
pub struct ToolTip < T : AsWidget > {
19
19
inner : T ,
@@ -31,6 +31,12 @@ impl<T: AsWidget> ToolTip<T> {
31
31
0 ,
32
32
parent,
33
33
) ;
34
+
35
+ // Enable support for multiline tooltips
36
+ // -1 doesn't work, we use SM_CXMAXTRACK like WinForms does
37
+ let max_width = unsafe { GetSystemMetrics ( SM_CXMAXTRACK ) } ;
38
+ handle. send_message ( TTM_SETMAXTIPWIDTH , 0 , max_width as isize ) ;
39
+
34
40
let mut info: TTTOOLINFOW = unsafe { std:: mem:: zeroed ( ) } ;
35
41
info. cbSize = std:: mem:: size_of :: < TTTOOLINFOW > ( ) as _ ;
36
42
info. uFlags = TTF_SUBCLASS | TTF_IDISHWND ;
@@ -44,7 +50,7 @@ impl<T: AsWidget> ToolTip<T> {
44
50
}
45
51
46
52
pub fn tooltip ( & self ) -> String {
47
- self . text . to_string_lossy ( )
53
+ self . text . to_string_lossy ( ) . replace ( " \r \n " , " \n " )
48
54
}
49
55
50
56
fn update_info ( & mut self , msg : u32 ) {
@@ -57,7 +63,7 @@ impl<T: AsWidget> ToolTip<T> {
57
63
58
64
pub fn set_tooltip ( & mut self , s : impl AsRef < str > ) {
59
65
let add_new = self . text . is_empty ( ) ;
60
- self . text = U16CString :: from_str_truncate ( s ) ;
66
+ self . text = U16CString :: from_str_truncate ( fix_crlf ( s . as_ref ( ) ) ) ;
61
67
if self . text . is_empty ( ) {
62
68
self . delete ( ) ;
63
69
} else {
0 commit comments