回答編集履歴

4

今度こそ大丈夫のはず

2019/06/13 02:02

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -16,7 +16,11 @@
16
16
 
17
17
  const int SB_VERT = 0x01;
18
18
 
19
- const int EM_LINESCROLL = 0x00B6;
19
+ const int WM_HSCROLL = 0x0114;
20
+
21
+ const int WM_VSCROLL = 0x0115;
22
+
23
+ const int SB_THUMBPOSITION = 4;
20
24
 
21
25
 
22
26
 
@@ -48,13 +52,9 @@
48
52
 
49
53
  {
50
54
 
51
- int x = GetScrollPos(textBox.Handle, SB_HORZ);
55
+ SendMessage(textBox.Handle, WM_HSCROLL, (newPos.X << 16) + SB_THUMBPOSITION, 0);
52
56
 
53
- int y = GetScrollPos(textBox.Handle, SB_VERT);
54
-
55
-
56
-
57
- SendMessage(textBox.Handle, EM_LINESCROLL, (newPos.X - x) / 7, newPos.Y - y);
57
+ SendMessage(textBox.Handle, WM_VSCROLL, (newPos.Y << 16) + SB_THUMBPOSITION, 0);
58
58
 
59
59
  }
60
60
 

3

暫定修正

2019/06/13 02:01

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -1,4 +1,4 @@
1
- 0x04DD([EM_GETSCROLLPOS](https://docs.microsoft.com/en-us/windows/desktop/controls/em-setscrollpos))や0x04DE([EM_SETSCROLLPOS](https://docs.microsoft.com/en-us/windows/desktop/controls/em-setscrollpos))はリッチエディット用のメッセージのようなので、他の方法でやる必要がありそうです。
1
+ 0x04DD([EM_GETSCROLLPOS](https://docs.microsoft.com/en-us/windows/desktop/controls/em-getscrollpos))や0x04DE([EM_SETSCROLLPOS](https://docs.microsoft.com/en-us/windows/desktop/controls/em-setscrollpos))はリッチエディット用のメッセージのようなので、他の方法でやる必要がありそうです。
2
2
 
3
3
 
4
4
 
@@ -54,7 +54,7 @@
54
54
 
55
55
 
56
56
 
57
- SendMessage(textBox.Handle, EM_LINESCROLL, newPos.X - x, newPos.Y - y);
57
+ SendMessage(textBox.Handle, EM_LINESCROLL, (newPos.X - x) / 7, newPos.Y - y);
58
58
 
59
59
  }
60
60
 

2

改善

2019/06/13 01:55

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -1,11 +1,61 @@
1
- 0x04DD([EM_GETSCROLLPOS](https://docs.microsoft.com/en-us/windows/desktop/controls/em-setscrollpos))や0x04DE([EM_SETSCROLLPOS](https://docs.microsoft.com/en-us/windows/desktop/controls/em-setscrollpos))はリッチエディット用のメッセージのようなので、
1
+ 0x04DD([EM_GETSCROLLPOS](https://docs.microsoft.com/en-us/windows/desktop/controls/em-setscrollpos))や0x04DE([EM_SETSCROLLPOS](https://docs.microsoft.com/en-us/windows/desktop/controls/em-setscrollpos))はリッチエディット用のメッセージのようなので、他の方法でやる必要がありそうです。
2
2
 
3
3
 
4
4
 
5
+ ちょっと作ってみたので試してみてください。
6
+
5
- [GetScrollPos API](https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getscrollpos)を使って取得してください
7
+ GetTextBoxScrollPosで取得、SetTextBoxScrollPosでセットができます
6
8
 
7
9
 
8
10
 
9
- C#での書き方などは以下を参考にしてください。
10
11
 
12
+
13
+ ```csharp
14
+
15
+ const int SB_HORZ = 0x00;
16
+
17
+ const int SB_VERT = 0x01;
18
+
19
+ const int EM_LINESCROLL = 0x00B6;
20
+
21
+
22
+
23
+ [DllImport("USER32.DLL", CharSet = CharSet.Auto)]
24
+
25
+ static extern int GetScrollPos(IntPtr hWnd, Int32 nBar);
26
+
27
+ [DllImport("user32.dll")]
28
+
29
+ static extern int SetScrollPos(IntPtr hWnd, Int32 nBar, int nPos, bool bRedraw);
30
+
31
+ [DllImport("user32.dll")]
32
+
33
+ static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);
34
+
35
+
36
+
37
+ public static Point GetTextBoxScrollPos(TextBox textBox)
38
+
39
+ {
40
+
11
- [TextBoxのスクロールバー位置(C#)](https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=27060)
41
+ return new Point(GetScrollPos(textBox.Handle, SB_HORZ), GetScrollPos(textBox.Handle, SB_VERT));
42
+
43
+ }
44
+
45
+
46
+
47
+ public static void SetTextBoxScrollPos(TextBox textBox, Point newPos)
48
+
49
+ {
50
+
51
+ int x = GetScrollPos(textBox.Handle, SB_HORZ);
52
+
53
+ int y = GetScrollPos(textBox.Handle, SB_VERT);
54
+
55
+
56
+
57
+ SendMessage(textBox.Handle, EM_LINESCROLL, newPos.X - x, newPos.Y - y);
58
+
59
+ }
60
+
61
+ ```

1

改善

2019/06/13 01:34

投稿

takabosoft
takabosoft

スコア8356

test CHANGED
@@ -1,11 +1,11 @@
1
- 0x04DE(EM_SETSCROLLPOS)はリッチエディット用のメッセージのようなので、
1
+ 0x04DD([EM_GETSCROLLPOS](https://docs.microsoft.com/en-us/windows/desktop/controls/em-setscrollpos))や0x04DE([EM_SETSCROLLPOS](https://docs.microsoft.com/en-us/windows/desktop/controls/em-setscrollpos))はリッチエディット用のメッセージのようなので、
2
2
 
3
3
 
4
4
 
5
- GetScrollPos APIを使って取得してください。
5
+ [GetScrollPos API](https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getscrollpos)を使って取得してください。
6
6
 
7
7
 
8
8
 
9
- 書き方などは以下を参考にしてください。
9
+ C#での書き方などは以下を参考にしてください。
10
10
 
11
11
  [TextBoxのスクロールバー位置(C#)](https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=27060)