• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision8097 (tree)
Time2019-09-08 23:32:30
Authoryutakapon

Log Message

TipWinCreate()を元(v4.103)の仕様に戻した。
r8095でVS2005でビルドが通らなくなっていたため、仮処置を追加した。

Change Summary

Incremental Difference

--- trunk/teraterm/common/tipwin.cpp (revision 8096)
+++ trunk/teraterm/common/tipwin.cpp (revision 8097)
@@ -64,8 +64,6 @@
6464
6565 #include "tipwin.h"
6666
67-#define FRAME_WIDTH 6
68-
6967 static ATOM tip_class = 0;
7068
7169 typedef struct tagTipWinData {
@@ -84,61 +82,6 @@
8482 BOOL auto_destroy;
8583 } TipWin;
8684
87-/**
88- * point を
89- * スクリーンからはみ出している場合、入るように補正する
90- * NearestMonitor が TRUE のとき、最も近いモニタ
91- * FALSEのとき、マウスのあるモニタに移動させる
92- * ディスプレイの端から FrameWidth(pixel) より離れるようにする
93- */
94-static void FixPosFromFrame(POINT *point, int FrameWidth, BOOL NearestMonitor)
95-{
96- if (HasMultiMonitorSupport()) {
97- // マルチモニタがサポートされている場合
98- HMONITOR hm;
99- MONITORINFO mi;
100- int ix, iy;
101-
102- // 元の座標を保存しておく
103- ix = point->x;
104- iy = point->y;
105-
106- hm = MonitorFromPoint(*point, MONITOR_DEFAULTTONULL);
107- if (hm == NULL) {
108- if (NearestMonitor) {
109- // 最も近いモニタに表示する
110- hm = MonitorFromPoint(*point, MONITOR_DEFAULTTONEAREST);
111- } else {
112- // スクリーンからはみ出している場合はマウスのあるモニタに表示する
113- GetCursorPos(point);
114- hm = MonitorFromPoint(*point, MONITOR_DEFAULTTONEAREST);
115- }
116- }
117-
118- mi.cbSize = sizeof(MONITORINFO);
119- GetMonitorInfo(hm, &mi);
120- if (ix < mi.rcMonitor.left + FrameWidth) {
121- ix = mi.rcMonitor.left + FrameWidth;
122- }
123- if (iy < mi.rcMonitor.top + FrameWidth) {
124- iy = mi.rcMonitor.top + FrameWidth;
125- }
126-
127- point->x = ix;
128- point->y = iy;
129- }
130- else
131- {
132- // マルチモニタがサポートされていない場合
133- if (point->x < FrameWidth) {
134- point->x = FrameWidth;
135- }
136- if (point->y < FrameWidth) {
137- point->y = FrameWidth;
138- }
139- }
140-}
141-
14285 static void CalcStrRect(TipWin *pTipWin)
14386 {
14487 HDC hdc = CreateCompatibleDC(NULL);
@@ -287,14 +230,12 @@
287230 */
288231 }
289232
290-TipWin *TipWinCreate(HWND src, int cx, int cy, const TCHAR *str, BOOL resizing_tips)
233+TipWin *TipWinCreate(HWND src, int cx, int cy, const TCHAR *str)
291234 {
292235 TipWin *pTipWin;
293236 const HINSTANCE hInst = (HINSTANCE)GetWindowLongPtr(src, GWLP_HINSTANCE);
294237 LOGFONTA logfont;
295238 const UINT uDpi = GetMonitorDpiFromWindow(src);
296- int height;
297- POINT point;
298239
299240 register_class(hInst);
300241 pTipWin = (TipWin *)malloc(sizeof(TipWin));
@@ -311,17 +252,6 @@
311252 pTipWin->tip_font = CreateFontIndirect(&logfont);
312253 CalcStrRect(pTipWin);
313254 pTipWin->hParentWnd = src;
314-
315- // 文字列の高さから表示位置を調整する。
316- if (resizing_tips) {
317- height = pTipWin->str_rect.bottom - pTipWin->str_rect.top;
318- point.x = cx;
319- point.y = cy - (height + FRAME_WIDTH * 2);
320- FixPosFromFrame(&point, 16, FALSE);
321- cx = point.x;
322- cy = point.y;
323- }
324-
325255 create_tipwin(pTipWin, hInst, cx, cy);
326256
327257 pTipWin->hParentWnd = src;
@@ -330,6 +260,51 @@
330260 return pTipWin;
331261 }
332262
263+/*
264+ * 文字列をツールチップに描画した時の横と縦のサイズを取得する。
265+ *
266+ * [in]
267+ * src
268+ * str
269+ * [out]
270+ * width
271+ * height
272+ */
273+void TipWinGetTextWidthHeight(HWND src, const TCHAR *str, int *width, int *height)
274+{
275+ LOGFONTA logfont;
276+ HFONT tip_font;
277+ UINT uDpi;
278+ HDC hdc;
279+ RECT str_rect;
280+ size_t str_len;
281+
282+ /* 文字列の長さを計算する */
283+ str_len = _tcslen(str);
284+
285+ /* DPIを取得する */
286+ uDpi = GetMonitorDpiFromWindow(src);
287+
288+ /* フォントを生成する */
289+ GetMessageboxFont(&logfont);
290+ logfont.lfWidth = MulDiv(logfont.lfWidth, uDpi, 96);
291+ logfont.lfHeight = MulDiv(logfont.lfHeight, uDpi, 96);
292+ tip_font = CreateFontIndirect(&logfont);
293+
294+ /* 文字列を描画してサイズを求める */
295+ hdc = CreateCompatibleDC(NULL);
296+ SelectObject(hdc, tip_font);
297+ str_rect.top = 0;
298+ str_rect.left = 0;
299+ DrawText(hdc, str, str_len, &str_rect, DT_LEFT|DT_CALCRECT);
300+ *width = str_rect.right - str_rect.left;
301+ *height = str_rect.bottom - str_rect.top;
302+ DeleteDC(hdc);
303+
304+ /* フォントを破棄する */
305+ DeleteObject(tip_font);
306+}
307+
333308 void TipWinSetPos(int x, int y)
334309 {
335310 }
--- trunk/teraterm/common/tipwin.h (revision 8096)
+++ trunk/teraterm/common/tipwin.h (revision 8097)
@@ -6,11 +6,14 @@
66 extern "C" {
77 #endif
88
9+#define FRAME_WIDTH 6
10+
911 typedef struct tagTipWinData TipWin;
1012
11-TipWin *TipWinCreate(HWND src, int cx, int cy, const TCHAR *str, BOOL resizing_tips);
13+TipWin *TipWinCreate(HWND src, int cx, int cy, const TCHAR *str);
1214 void TipWinSetText(TipWin *tWin, TCHAR *text);
1315 void TipWinDestroy(TipWin *tWin);
16+void TipWinGetTextWidthHeight(HWND src, const TCHAR *str, int *width, int *height);
1417
1518 #ifdef __cplusplus
1619 }
--- trunk/teraterm/teraterm/addsetting.cpp (revision 8096)
+++ trunk/teraterm/teraterm/addsetting.cpp (revision 8097)
@@ -71,6 +71,8 @@
7171 };
7272 #define MOUSE_CURSOR_MAX (sizeof(MouseCursor)/sizeof(MouseCursor[0]) - 1)
7373
74+#define round(n) ((LONG)n)
75+
7476 void CVisualPropPageDlg::SetupRGBbox(int index)
7577 {
7678 BYTE c;
--- trunk/teraterm/teraterm/sizetip.c (revision 8096)
+++ trunk/teraterm/teraterm/sizetip.c (revision 8097)
@@ -41,6 +41,61 @@
4141 static TipWin *SizeTip;
4242 static int tip_enabled = 0;
4343
44+/**
45+ * point を
46+ * スクリーンからはみ出している場合、入るように補正する
47+ * NearestMonitor が TRUE のとき、最も近いモニタ
48+ * FALSEのとき、マウスのあるモニタに移動させる
49+ * ディスプレイの端から FrameWidth(pixel) より離れるようにする
50+ */
51+static void FixPosFromFrame(POINT *point, int FrameWidth, BOOL NearestMonitor)
52+{
53+ if (HasMultiMonitorSupport()) {
54+ // マルチモニタがサポートされている場合
55+ HMONITOR hm;
56+ MONITORINFO mi;
57+ int ix, iy;
58+
59+ // 元の座標を保存しておく
60+ ix = point->x;
61+ iy = point->y;
62+
63+ hm = MonitorFromPoint(*point, MONITOR_DEFAULTTONULL);
64+ if (hm == NULL) {
65+ if (NearestMonitor) {
66+ // 最も近いモニタに表示する
67+ hm = MonitorFromPoint(*point, MONITOR_DEFAULTTONEAREST);
68+ } else {
69+ // スクリーンからはみ出している場合はマウスのあるモニタに表示する
70+ GetCursorPos(point);
71+ hm = MonitorFromPoint(*point, MONITOR_DEFAULTTONEAREST);
72+ }
73+ }
74+
75+ mi.cbSize = sizeof(MONITORINFO);
76+ GetMonitorInfo(hm, &mi);
77+ if (ix < mi.rcMonitor.left + FrameWidth) {
78+ ix = mi.rcMonitor.left + FrameWidth;
79+ }
80+ if (iy < mi.rcMonitor.top + FrameWidth) {
81+ iy = mi.rcMonitor.top + FrameWidth;
82+ }
83+
84+ point->x = ix;
85+ point->y = iy;
86+ }
87+ else
88+ {
89+ // マルチモニタがサポートされていない場合
90+ if (point->x < FrameWidth) {
91+ point->x = FrameWidth;
92+ }
93+ if (point->y < FrameWidth) {
94+ point->y = FrameWidth;
95+ }
96+ }
97+}
98+
4499 void UpdateSizeTip(HWND src, int cx, int cy)
45100 {
46101 TCHAR str[32];
@@ -54,11 +109,23 @@
54109
55110 if (SizeTip == NULL) {
56111 RECT wr;
112+ POINT point;
113+ int w, h;
114+
115+ // 文字列の縦横サイズを取得する
116+ TipWinGetTextWidthHeight(src, str, &w, &h);
117+
57118 // ウィンドウの位置を取得
58119 GetWindowRect(src, &wr);
59- cx = wr.left;
60- cy = wr.top;
61- SizeTip = TipWinCreate(src, cx, cy, str, TRUE);
120+ // sizetipを出す位置は、ウィンドウ左上(X, Y)に対して、
121+ // (X, Y - 文字列の高さ - FRAME_WIDTH * 2) とする。
122+ point.x = wr.left;
123+ point.y = wr.top - (h + FRAME_WIDTH * 2);
124+ FixPosFromFrame(&point, 16, FALSE);
125+ cx = point.x;
126+ cy = point.y;
127+
128+ SizeTip = TipWinCreate(src, cx, cy, str);
62129 } else {
63130 /* Tip already exists, just set the text */
64131 TipWinSetText(SizeTip, str);
--- trunk/teraterm/teraterm/vtwin.cpp (revision 8096)
+++ trunk/teraterm/teraterm/vtwin.cpp (revision 8097)
@@ -2468,7 +2468,7 @@
24682468 }
24692469
24702470 if (OpacityTip == NULL) {
2471- OpacityTip = TipWinCreate(HVTWin, pt.x, pt.y, tipbuf, TRUE);
2471+ OpacityTip = TipWinCreate(HVTWin, pt.x, pt.y, tipbuf);
24722472 OpacityTipPtsX = pt.x;
24732473 OpacityTipPtsY = pt.y;
24742474 } else {
--- trunk/ttssh2/ttxssh/auth.c (revision 8096)
+++ trunk/ttssh2/ttxssh/auth.c (revision 8097)
@@ -122,7 +122,7 @@
122122 _tcscat_s(uimsg, _countof(uimsg), pvar->ts->UIMsg);
123123 }
124124 GetWindowRect(control, &rect);
125- data->tipwin = TipWinCreate(control, rect.left, rect.bottom, uimsg, FALSE);
125+ data->tipwin = TipWinCreate(control, rect.left, rect.bottom, uimsg);
126126 }
127127
128128 return 0;
Show on old repository browser