Java call native methods in a DLL without JNI (Call PageSetupDlg function in comdlg32.dll)
最近由于項目的要求, 需要在SWT程序中打印自定義的表格, 并能設置頁面和頁面空白的大小。
再查看了SWT的文檔后發現, SWT只封裝了PrintDLG打印對話框,可以設置頁面的大小,但不能設置頁面空白的大小。
由于本人以前是VB程序員,本能的就想到了comdlg32.dll
中的PageSetupDlg對話框。 如果可以直接調用這個對話框, 省掉了多少麻煩事啊。
但是用JNI調用dll中的函數也很麻煩, 還不如自己做一個頁面設置對話框來的方便。 于是查了一下sourceforge, 發現了JNative這個類庫。 在稍稍看了JNative的源碼之后覺得這個庫寫的真是不錯。 封裝了許多Win32 api中的類型(HWND,DWORD, LPARAM 等等) 方便使用, 并且直接wrapper了不少dll (比如 Gdi32, Kernel32, Shell32, User32等dll), 其中居然也包括ComDlg32 (可惜只封裝了ChooseColor 顏色選擇對話框)。
不過不要緊, 既然有了ChooseColor的例子,那我們就自己動手調用PageSetupDlg吧。
先查一下msdn, 看一看PageSetupDlg函數的用法
PAGESETUPDLG Structure:
其中有兩個結構RECT, 和 POINT是Jnative 沒有封裝的, 我們先封裝這兩個結構:
POINT.java
RECT.java
然后封裝PAGESETDLG結構
PAGESETUPDLG.java
我們所希望的返回值是頁面大小和頁面空白大小:
PageSetupResult.java
萬事俱備,現在就可以點用PageSetupDlg函數了
ComDlg32Ex.java
有空的話我盡量把ComDlg32中的對話框補全, 有什么問題大家可以一起探討一下。
源碼下載
再查看了SWT的文檔后發現, SWT只封裝了PrintDLG打印對話框,
由于本人以前是VB程序員,本能的就想到了comdlg32.
但是用JNI調用dll中的函數也很麻煩, 還不如自己做一個頁面設置對話框來的方便。 于是查了一下sourceforge, 發現了JNative這個類庫。 在稍稍看了JNative的源碼之后覺得這個庫寫的真是不錯。 封裝了許多Win32 api中的類型(HWND,DWORD, LPARAM 等等) 方便使用, 并且直接wrapper了不少dll (比如 Gdi32, Kernel32, Shell32, User32等dll), 其中居然也包括ComDlg32 (可惜只封裝了ChooseColor 顏色選擇對話框)。
不過不要緊, 既然有了ChooseColor的例子,那我們就自己動手調用PageSetupDlg吧。
先查一下msdn, 看一看PageSetupDlg函數的用法
BOOL PageSetupDlg(
LPPAGESETUPDLG lppsd
);
LPPAGESETUPDLG lppsd
);
PAGESETUPDLG Structure:
typedef struct tagPSD {
DWORD lStructSize;
HWND hwndOwner;
HGLOBAL hDevMode;
HGLOBAL hDevNames;
DWORD Flags;
POINT ptPaperSize;
RECT rtMinMargin;
RECT rtMargin;
HINSTANCE hInstance;
LPARAM lCustData;
LPPAGESETUPHOOK lpfnPageSetupHook;
LPPAGEPAINTHOOK lpfnPagePaintHook;
LPCTSTR lpPageSetupTemplateName;
HGLOBAL hPageSetupTemplate;
} PAGESETUPDLG, *LPPAGESETUPDLG;
DWORD lStructSize;
HWND hwndOwner;
HGLOBAL hDevMode;
HGLOBAL hDevNames;
DWORD Flags;
POINT ptPaperSize;
RECT rtMinMargin;
RECT rtMargin;
HINSTANCE hInstance;
LPARAM lCustData;
LPPAGESETUPHOOK lpfnPageSetupHook;
LPPAGEPAINTHOOK lpfnPagePaintHook;
LPCTSTR lpPageSetupTemplateName;
HGLOBAL hPageSetupTemplate;
} PAGESETUPDLG, *LPPAGESETUPDLG;
其中有兩個結構RECT, 和 POINT是Jnative 沒有封裝的, 我們先封裝這兩個結構:
POINT.java
1 package de.ikoffice.ktableextension.printer;
2
3 import org.xvolks.jnative.exceptions.NativeException;
4 import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
5 import org.xvolks.jnative.misc.basicStructures.LONG;
6 import org.xvolks.jnative.pointers.Pointer;
7 import org.xvolks.jnative.pointers.memory.GlobalMemoryBlock;
8
9 /**
10 * @author Jun Huang
11 *
12 * The Gosurf Development Team
13 *
14 */
15 public class POINT extends AbstractBasicData<POINT> {
16 LONG x;
17 LONG y;
18
19 public POINT() throws NativeException {
20 super(null);
21 mValue = this;
22 createPointer();
23 }
24
25 /*
26 * (non-Javadoc)
27 *
28 * @see org.xvolks.jnative.misc.basicStructures.BasicData#createPointer()
29 */
30 public Pointer createPointer() throws NativeException {
31 pointer = new Pointer(new GlobalMemoryBlock(getSizeOf()));
32 return pointer;
33 }
34
35 /*
36 * (non-Javadoc)
37 *
38 * @see org.xvolks.jnative.misc.basicStructures.BasicData#getSizeOf()
39 */
40 public int getSizeOf() {
41 return 8;
42 }
43
44 /*
45 * (non-Javadoc)
46 *
47 * @see org.xvolks.jnative.misc.basicStructures.BasicData#getValueFromPointer()
48 */
49 public POINT getValueFromPointer() throws NativeException {
50 offset = 0;
51 x = new LONG(getNextInt());
52 y = new LONG(getNextInt());
53
54 return getValue();
55 }
56
57 public void setX(LONG x) throws NativeException {
58 this.x = x;
59 pointer.setIntAt(0, x.getValue());
60 }
61
62 public void setY(LONG y) throws NativeException {
63 this.y = y;
64 pointer.setIntAt(4, y.getValue());
65 }
66
67 }
2
3 import org.xvolks.jnative.exceptions.NativeException;
4 import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
5 import org.xvolks.jnative.misc.basicStructures.LONG;
6 import org.xvolks.jnative.pointers.Pointer;
7 import org.xvolks.jnative.pointers.memory.GlobalMemoryBlock;
8
9 /**
10 * @author Jun Huang
11 *
12 * The Gosurf Development Team
13 *
14 */
15 public class POINT extends AbstractBasicData<POINT> {
16 LONG x;
17 LONG y;
18
19 public POINT() throws NativeException {
20 super(null);
21 mValue = this;
22 createPointer();
23 }
24
25 /*
26 * (non-Javadoc)
27 *
28 * @see org.xvolks.jnative.misc.basicStructures.BasicData#createPointer()
29 */
30 public Pointer createPointer() throws NativeException {
31 pointer = new Pointer(new GlobalMemoryBlock(getSizeOf()));
32 return pointer;
33 }
34
35 /*
36 * (non-Javadoc)
37 *
38 * @see org.xvolks.jnative.misc.basicStructures.BasicData#getSizeOf()
39 */
40 public int getSizeOf() {
41 return 8;
42 }
43
44 /*
45 * (non-Javadoc)
46 *
47 * @see org.xvolks.jnative.misc.basicStructures.BasicData#getValueFromPointer()
48 */
49 public POINT getValueFromPointer() throws NativeException {
50 offset = 0;
51 x = new LONG(getNextInt());
52 y = new LONG(getNextInt());
53
54 return getValue();
55 }
56
57 public void setX(LONG x) throws NativeException {
58 this.x = x;
59 pointer.setIntAt(0, x.getValue());
60 }
61
62 public void setY(LONG y) throws NativeException {
63 this.y = y;
64 pointer.setIntAt(4, y.getValue());
65 }
66
67 }
RECT.java
1 /**
2 *
3 */
4 package de.ikoffice.ktableextension.printer;
5
6 import org.xvolks.jnative.exceptions.NativeException;
7 import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
8 import org.xvolks.jnative.misc.basicStructures.LONG;
9 import org.xvolks.jnative.pointers.Pointer;
10 import org.xvolks.jnative.pointers.memory.GlobalMemoryBlock;
11
12 /**
13 * @author Jun Huang
14 *
15 * The Gosurf Development Team
16 */
17 public class RECT extends AbstractBasicData<RECT> {
18 LONG left;
19 LONG top;
20 LONG right;
21 LONG bottom;
22
23
24 protected RECT() throws NativeException {
25 super(null);
26 mValue = this;
27 createPointer();
28 }
29
30 /* (non-Javadoc)
31 * @see org.xvolks.jnative.misc.basicStructures.BasicData#createPointer()
32 */
33 public Pointer createPointer() throws NativeException {
34 pointer = new Pointer(new GlobalMemoryBlock(getSizeOf()));
35 return pointer;
36 }
37
38 /* (non-Javadoc)
39 * @see org.xvolks.jnative.misc.basicStructures.BasicData#getSizeOf()
40 */
41 public int getSizeOf() {
42 return 16;
43 }
44
45 /* (non-Javadoc)
46 * @see org.xvolks.jnative.misc.basicStructures.BasicData#getValueFromPointer()
47 */
48 public RECT getValueFromPointer() throws NativeException {
49 offset = 0;
50 left = new LONG(getNextInt());
51 top = new LONG(getNextInt());
52 right = new LONG(getNextInt());
53 bottom = new LONG(getNextInt());
54
55 return getValue();
56 }
57
58 public void setLeft(LONG left) throws NativeException {
59 this.left = left;
60 pointer.setIntAt(0, left.getValue());
61 }
62
63 public void setTop(LONG top) throws NativeException {
64 this.top = top;
65 pointer.setIntAt(4, top.getValue());
66 }
67
68 public void setRight(LONG right) throws NativeException {
69 this.right = right;
70 pointer.setIntAt(8, right.getValue());
71 }
72
73 public void setBottom(LONG bottom) throws NativeException {
74 pointer.setIntAt(12, bottom.getValue());
75 }
76
77
78
79 }
80
2 *
3 */
4 package de.ikoffice.ktableextension.printer;
5
6 import org.xvolks.jnative.exceptions.NativeException;
7 import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
8 import org.xvolks.jnative.misc.basicStructures.LONG;
9 import org.xvolks.jnative.pointers.Pointer;
10 import org.xvolks.jnative.pointers.memory.GlobalMemoryBlock;
11
12 /**
13 * @author Jun Huang
14 *
15 * The Gosurf Development Team
16 */
17 public class RECT extends AbstractBasicData<RECT> {
18 LONG left;
19 LONG top;
20 LONG right;
21 LONG bottom;
22
23
24 protected RECT() throws NativeException {
25 super(null);
26 mValue = this;
27 createPointer();
28 }
29
30 /* (non-Javadoc)
31 * @see org.xvolks.jnative.misc.basicStructures.BasicData#createPointer()
32 */
33 public Pointer createPointer() throws NativeException {
34 pointer = new Pointer(new GlobalMemoryBlock(getSizeOf()));
35 return pointer;
36 }
37
38 /* (non-Javadoc)
39 * @see org.xvolks.jnative.misc.basicStructures.BasicData#getSizeOf()
40 */
41 public int getSizeOf() {
42 return 16;
43 }
44
45 /* (non-Javadoc)
46 * @see org.xvolks.jnative.misc.basicStructures.BasicData#getValueFromPointer()
47 */
48 public RECT getValueFromPointer() throws NativeException {
49 offset = 0;
50 left = new LONG(getNextInt());
51 top = new LONG(getNextInt());
52 right = new LONG(getNextInt());
53 bottom = new LONG(getNextInt());
54
55 return getValue();
56 }
57
58 public void setLeft(LONG left) throws NativeException {
59 this.left = left;
60 pointer.setIntAt(0, left.getValue());
61 }
62
63 public void setTop(LONG top) throws NativeException {
64 this.top = top;
65 pointer.setIntAt(4, top.getValue());
66 }
67
68 public void setRight(LONG right) throws NativeException {
69 this.right = right;
70 pointer.setIntAt(8, right.getValue());
71 }
72
73 public void setBottom(LONG bottom) throws NativeException {
74 pointer.setIntAt(12, bottom.getValue());
75 }
76
77
78
79 }
80
然后封裝PAGESETDLG結構
PAGESETUPDLG.java
1 package de.ikoffice.ktableextension.printer;
2
3 import org.xvolks.jnative.exceptions.NativeException;
4 import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
5 import org.xvolks.jnative.misc.basicStructures.HWND;
6 import org.xvolks.jnative.misc.basicStructures.LONG;
7 import org.xvolks.jnative.misc.basicStructures.LPARAM;
8 import org.xvolks.jnative.pointers.NullPointer;
9 import org.xvolks.jnative.pointers.Pointer;
10 import org.xvolks.jnative.pointers.memory.GlobalMemoryBlock;
11 import org.xvolks.jnative.util.Callback;
12
13 /**
14 * @author Jun Huang
15 *
16 * The Gosurf Development Team
17 *
18 */
19 public class PAGESETUPDLG extends AbstractBasicData<PAGESETUPDLG> {
20
21 LONG lStrurtSize;
22 HWND hwndOwner;
23 static Pointer hDevMode = new NullPointer();
24 static Pointer hDevNames = new NullPointer();
25 LONG flags;
26 POINT ptPaperSize;
27 RECT rtMinMargin;
28 RECT rtMargin;
29 HWND hInstance;
30 LPARAM lCustData;
31 Callback lpfnPageSetupHook;
32 Callback lpfnPagePaintHook;
33 Pointer lpPageSetupTemplateName;
34 static Pointer hPageSetupTemplate = new NullPointer();
35
36
37 public PAGESETUPDLG() throws NativeException {
38 super(null);
39 mValue = this;
40 createPointer();
41 }
42
43 public void removeCallback() throws NativeException {
44 //TODO
45 }
46
47 public void addCallback(Callback lCallback) throws NativeException {
48 removeCallback();
49
50 //TODO
51 }
52
53 public void setHwndOwner(HWND hwndOwner) throws NativeException {
54 this.hwndOwner = hwndOwner;
55 pointer.setIntAt(4, hwndOwner.getValue());
56 }
57
58 public void setFlags(LONG flags) throws NativeException {
59 this.flags = flags;
60 pointer.setIntAt(16, flags.getValue());
61 }
62
63 public void setHInstance(HWND instance) throws NativeException {
64 hInstance = instance;
65 pointer.setIntAt(60, instance.getValue());
66 }
67
68 public void setLCustData(LPARAM custData) throws NativeException {
69 lCustData = custData;
70 pointer.setIntAt(64, lCustData.getValue());
71 }
72
73 public void setLpPageSetupTemplateName(String lpPageSetupTemplateName) {
74
75 this.lpPageSetupTemplateName = new NullPointer();
76
77 }
78
79 /* (non-Javadoc)
80 * @see org.xvolks.jnative.misc.basicStructures.BasicData#createPointer()
81 */
82 public Pointer createPointer() throws NativeException {
83 pointer = new Pointer(new GlobalMemoryBlock(getSizeOf()));
84 pointer.setIntAt(0, getSizeOf());
85 pointer.setIntAt(8, hDevMode.getPointer());
86 pointer.setIntAt(12, hDevNames.getPointer());
87 return pointer;
88 }
89
90 /* (non-Javadoc)
91 * @see org.xvolks.jnative.misc.basicStructures.BasicData#getSizeOf()
92 */
93 public int getSizeOf() {
94
95 return 84;
96 }
97
98 /* (non-Javadoc)
99 * @see org.xvolks.jnative.misc.basicStructures.BasicData#getValueFromPointer()
100 */
101 public PAGESETUPDLG getValueFromPointer() throws NativeException {
102 offset = 0;
103 lStrurtSize = new LONG(getNextInt()); // 0
104 hwndOwner = new HWND(getNextInt()); // 4
105
106 //Skip hDevMode
107 offset += 4; // 8
108
109 //Skip hDevNames
110 offset += 4; // 12
111
112 flags = new LONG(getNextInt()); // 16
113
114 //ptPaperSize
115 ptPaperSize = new POINT(); // 20
116 ptPaperSize.setX(new LONG(getNextInt()));
117 ptPaperSize.setY(new LONG(getNextInt()));
118
119 //rtMinMargin // 28
120 rtMinMargin = new RECT();
121 rtMinMargin.setLeft(new LONG(getNextInt()));
122 rtMinMargin.setTop(new LONG(getNextInt()));
123 rtMinMargin.setRight(new LONG(getNextInt()));
124 rtMinMargin.setBottom(new LONG(getNextInt()));
125
126 //rtMargin // 44
127 rtMargin = new RECT();
128 rtMargin.setLeft(new LONG(getNextInt()));
129 rtMargin.setTop(new LONG(getNextInt()));
130 rtMargin.setRight(new LONG(getNextInt()));
131 rtMargin.setBottom(new LONG(getNextInt()));
132
133 hInstance = new HWND(getNextInt()); // 60
134
135 lCustData = new LPARAM(getNextInt()); // 64
136
137 //Skip lpfnPageSetupHook; // 68
138 offset += 4;
139
140 //Skip lpfnPagePaintHook; // 72;
141 offset += 4;
142
143 //Skip lpPageSetupTemplateName; // 76;
144 offset += 4;
145
146 //Skip hPageSetupTemplate; // 80;
147 offset += 4;
148
149 // 84
150
151 return getValue();
152
153 }
154
155 }
2
3 import org.xvolks.jnative.exceptions.NativeException;
4 import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
5 import org.xvolks.jnative.misc.basicStructures.HWND;
6 import org.xvolks.jnative.misc.basicStructures.LONG;
7 import org.xvolks.jnative.misc.basicStructures.LPARAM;
8 import org.xvolks.jnative.pointers.NullPointer;
9 import org.xvolks.jnative.pointers.Pointer;
10 import org.xvolks.jnative.pointers.memory.GlobalMemoryBlock;
11 import org.xvolks.jnative.util.Callback;
12
13 /**
14 * @author Jun Huang
15 *
16 * The Gosurf Development Team
17 *
18 */
19 public class PAGESETUPDLG extends AbstractBasicData<PAGESETUPDLG> {
20
21 LONG lStrurtSize;
22 HWND hwndOwner;
23 static Pointer hDevMode = new NullPointer();
24 static Pointer hDevNames = new NullPointer();
25 LONG flags;
26 POINT ptPaperSize;
27 RECT rtMinMargin;
28 RECT rtMargin;
29 HWND hInstance;
30 LPARAM lCustData;
31 Callback lpfnPageSetupHook;
32 Callback lpfnPagePaintHook;
33 Pointer lpPageSetupTemplateName;
34 static Pointer hPageSetupTemplate = new NullPointer();
35
36
37 public PAGESETUPDLG() throws NativeException {
38 super(null);
39 mValue = this;
40 createPointer();
41 }
42
43 public void removeCallback() throws NativeException {
44 //TODO
45 }
46
47 public void addCallback(Callback lCallback) throws NativeException {
48 removeCallback();
49
50 //TODO
51 }
52
53 public void setHwndOwner(HWND hwndOwner) throws NativeException {
54 this.hwndOwner = hwndOwner;
55 pointer.setIntAt(4, hwndOwner.getValue());
56 }
57
58 public void setFlags(LONG flags) throws NativeException {
59 this.flags = flags;
60 pointer.setIntAt(16, flags.getValue());
61 }
62
63 public void setHInstance(HWND instance) throws NativeException {
64 hInstance = instance;
65 pointer.setIntAt(60, instance.getValue());
66 }
67
68 public void setLCustData(LPARAM custData) throws NativeException {
69 lCustData = custData;
70 pointer.setIntAt(64, lCustData.getValue());
71 }
72
73 public void setLpPageSetupTemplateName(String lpPageSetupTemplateName) {
74
75 this.lpPageSetupTemplateName = new NullPointer();
76
77 }
78
79 /* (non-Javadoc)
80 * @see org.xvolks.jnative.misc.basicStructures.BasicData#createPointer()
81 */
82 public Pointer createPointer() throws NativeException {
83 pointer = new Pointer(new GlobalMemoryBlock(getSizeOf()));
84 pointer.setIntAt(0, getSizeOf());
85 pointer.setIntAt(8, hDevMode.getPointer());
86 pointer.setIntAt(12, hDevNames.getPointer());
87 return pointer;
88 }
89
90 /* (non-Javadoc)
91 * @see org.xvolks.jnative.misc.basicStructures.BasicData#getSizeOf()
92 */
93 public int getSizeOf() {
94
95 return 84;
96 }
97
98 /* (non-Javadoc)
99 * @see org.xvolks.jnative.misc.basicStructures.BasicData#getValueFromPointer()
100 */
101 public PAGESETUPDLG getValueFromPointer() throws NativeException {
102 offset = 0;
103 lStrurtSize = new LONG(getNextInt()); // 0
104 hwndOwner = new HWND(getNextInt()); // 4
105
106 //Skip hDevMode
107 offset += 4; // 8
108
109 //Skip hDevNames
110 offset += 4; // 12
111
112 flags = new LONG(getNextInt()); // 16
113
114 //ptPaperSize
115 ptPaperSize = new POINT(); // 20
116 ptPaperSize.setX(new LONG(getNextInt()));
117 ptPaperSize.setY(new LONG(getNextInt()));
118
119 //rtMinMargin // 28
120 rtMinMargin = new RECT();
121 rtMinMargin.setLeft(new LONG(getNextInt()));
122 rtMinMargin.setTop(new LONG(getNextInt()));
123 rtMinMargin.setRight(new LONG(getNextInt()));
124 rtMinMargin.setBottom(new LONG(getNextInt()));
125
126 //rtMargin // 44
127 rtMargin = new RECT();
128 rtMargin.setLeft(new LONG(getNextInt()));
129 rtMargin.setTop(new LONG(getNextInt()));
130 rtMargin.setRight(new LONG(getNextInt()));
131 rtMargin.setBottom(new LONG(getNextInt()));
132
133 hInstance = new HWND(getNextInt()); // 60
134
135 lCustData = new LPARAM(getNextInt()); // 64
136
137 //Skip lpfnPageSetupHook; // 68
138 offset += 4;
139
140 //Skip lpfnPagePaintHook; // 72;
141 offset += 4;
142
143 //Skip lpPageSetupTemplateName; // 76;
144 offset += 4;
145
146 //Skip hPageSetupTemplate; // 80;
147 offset += 4;
148
149 // 84
150
151 return getValue();
152
153 }
154
155 }
我們所希望的返回值是頁面大小和頁面空白大小:
PageSetupResult.java
1 /**
2 *
3 */
4 package de.ikoffice.ktableextension.printer;
5
6 /**
7 * @author Jun Huang
8 *
9 * The Gosurf Development Team
10 *
11 */
12 public class PageSetupResult {
13
14 public final static int LEFT = 0;
15 public final static int TOP = 1;
16 public final static int RIGHT = 2;
17 public final static int BOTTOM = 3;
18
19 private boolean ret = false;
20 private int[] margins = new int[4];
21 private int pageWidth = 0;
22 private int pageHeight = 0;
23
24 public PageSetupResult() {
25 ret = false;
26 for (int i=0; i<=BOTTOM; i++) {
27 margins[i] = 2500;
28 }
29 }
30
31 public boolean isRet() {
32 return ret;
33 }
34
35 public int[] getMargins() {
36 return margins;
37 }
38
39 public void setRet(boolean ret) {
40 this.ret = ret;
41 }
42
43 public void setMargins(int[] margins) {
44 this.margins = margins;
45 }
46
47 public void setMargin(int position, int mm) {
48 this.margins[position] = mm;
49 }
50
51 public int getMargin(int position) {
52 return margins[position];
53 }
54
55 public int getPageWidth() {
56 return pageWidth;
57 }
58
59 public int getPageHeight() {
60 return pageHeight;
61 }
62
63 public void setPageWidth(int pageWidth) {
64 this.pageWidth = pageWidth;
65 }
66
67 public void setPageHeight(int pageHeight) {
68 this.pageHeight = pageHeight;
69 }
70
71 }
72
2 *
3 */
4 package de.ikoffice.ktableextension.printer;
5
6 /**
7 * @author Jun Huang
8 *
9 * The Gosurf Development Team
10 *
11 */
12 public class PageSetupResult {
13
14 public final static int LEFT = 0;
15 public final static int TOP = 1;
16 public final static int RIGHT = 2;
17 public final static int BOTTOM = 3;
18
19 private boolean ret = false;
20 private int[] margins = new int[4];
21 private int pageWidth = 0;
22 private int pageHeight = 0;
23
24 public PageSetupResult() {
25 ret = false;
26 for (int i=0; i<=BOTTOM; i++) {
27 margins[i] = 2500;
28 }
29 }
30
31 public boolean isRet() {
32 return ret;
33 }
34
35 public int[] getMargins() {
36 return margins;
37 }
38
39 public void setRet(boolean ret) {
40 this.ret = ret;
41 }
42
43 public void setMargins(int[] margins) {
44 this.margins = margins;
45 }
46
47 public void setMargin(int position, int mm) {
48 this.margins[position] = mm;
49 }
50
51 public int getMargin(int position) {
52 return margins[position];
53 }
54
55 public int getPageWidth() {
56 return pageWidth;
57 }
58
59 public int getPageHeight() {
60 return pageHeight;
61 }
62
63 public void setPageWidth(int pageWidth) {
64 this.pageWidth = pageWidth;
65 }
66
67 public void setPageHeight(int pageHeight) {
68 this.pageHeight = pageHeight;
69 }
70
71 }
72
萬事俱備,現在就可以點用PageSetupDlg函數了
ComDlg32Ex.java
1 package de.ikoffice.ktableextension.printer;
2
3 import org.xvolks.jnative.JNative;
4 import org.xvolks.jnative.Type;
5 import org.xvolks.jnative.exceptions.NativeException;
6 import org.xvolks.jnative.misc.basicStructures.HWND;
7 import org.xvolks.jnative.misc.basicStructures.LONG;
8 import org.xvolks.jnative.misc.basicStructures.LPARAM;
9 import org.xvolks.jnative.util.ComDlg32;
10
11 /**
12 * @author Jun Huang
13 *
14 * The Gosurf Development Team
15 */
16 public class ComDlg32Ex extends ComDlg32 {
17 //Cache the JNative object between calls.
18 private static JNative nPageSetupDlg;
19 public final static int PSD_MINMARGINS = 0x1;
20 public final static int PSD_MARGINS = 0x2;
21 public final static int PSD_INTHOUSANDTHSOFINCHES = 0x4;
22 public final static int PSD_INHUNDREDTHSOFMILLIMETERS = 0x8;
23
24
25 public static PageSetupResult PageSetupDlg(HWND lOwner, HWND hInstance, LONG Flags, LPARAM lCustData) throws NativeException, IllegalAccessException {
26 PageSetupResult ret = new PageSetupResult();
27
28 if(nPageSetupDlg == null) {
29 //JNative uses ANSI version ChooseColorA vs ChooseColorW
30 nPageSetupDlg = new JNative(DLL_NAME, "PageSetupDlgA");
31 //BOOL is in fact an INT
32 nPageSetupDlg.setRetVal(Type.INT);
33 }
34 PAGESETUPDLG nPageSetupDlgStruct = new PAGESETUPDLG();
35 nPageSetupDlgStruct.setHwndOwner(lOwner);
36 nPageSetupDlgStruct.setHInstance(hInstance);
37 nPageSetupDlgStruct.setFlags(Flags);
38 nPageSetupDlgStruct.setLCustData(lCustData);
39
40 nPageSetupDlg.setParameter(0, nPageSetupDlgStruct.getPointer());
41 nPageSetupDlg.invoke();
42
43 if("0".equals(nPageSetupDlg.getRetVal())) {
44 ret.setRet(false);
45 return ret;
46 }
47
48 ret.setRet(true);
49 ret.setMargin(PageSetupResult.LEFT, nPageSetupDlgStruct.getValueFromPointer().rtMargin.getValueFromPointer().left.getValue());
50 ret.setMargin(PageSetupResult.TOP, nPageSetupDlgStruct.getValueFromPointer().rtMargin.getValueFromPointer().top.getValue());
51 ret.setMargin(PageSetupResult.RIGHT, nPageSetupDlgStruct.getValueFromPointer().rtMargin.getValueFromPointer().right.getValue());
52 ret.setMargin(PageSetupResult.BOTTOM, nPageSetupDlgStruct.getValueFromPointer().rtMargin.getValueFromPointer().bottom.getValue());
53 ret.setPageWidth(nPageSetupDlgStruct.getValueFromPointer().ptPaperSize.getValueFromPointer().x.getValue());
54 ret.setPageHeight(nPageSetupDlgStruct.getValueFromPointer().ptPaperSize.getValueFromPointer().y.getValue());
55
56 return ret;
57 }
58
59 public static void main(String[] args) throws NativeException, IllegalAccessException {
60 PageSetupResult result = ComDlg32Ex.PageSetupDlg(new HWND(0), new HWND(0), new LONG(ComDlg32Ex.PSD_INHUNDREDTHSOFMILLIMETERS), new LPARAM(0));
61 System.out.println("The width of page: " + result.getPageWidth()+" mm");
62 System.out.println("The height of page: " + result.getPageHeight()+" mm");
63 System.out.println("The left margin of page: " + result.getMargin(PageSetupResult.LEFT) +" mm");
64 System.out.println("The top margin of page: " + result.getMargin(PageSetupResult.TOP) + " mm");
65 System.out.println("The right margin of page: " + result.getMargin(PageSetupResult.RIGHT) + " mm");
66 System.out.println("The bottom margin of page: " + result.getMargin(PageSetupResult.BOTTOM) + " mm");
67 }
68
69
70 }
71
2
3 import org.xvolks.jnative.JNative;
4 import org.xvolks.jnative.Type;
5 import org.xvolks.jnative.exceptions.NativeException;
6 import org.xvolks.jnative.misc.basicStructures.HWND;
7 import org.xvolks.jnative.misc.basicStructures.LONG;
8 import org.xvolks.jnative.misc.basicStructures.LPARAM;
9 import org.xvolks.jnative.util.ComDlg32;
10
11 /**
12 * @author Jun Huang
13 *
14 * The Gosurf Development Team
15 */
16 public class ComDlg32Ex extends ComDlg32 {
17 //Cache the JNative object between calls.
18 private static JNative nPageSetupDlg;
19 public final static int PSD_MINMARGINS = 0x1;
20 public final static int PSD_MARGINS = 0x2;
21 public final static int PSD_INTHOUSANDTHSOFINCHES = 0x4;
22 public final static int PSD_INHUNDREDTHSOFMILLIMETERS = 0x8;
23
24
25 public static PageSetupResult PageSetupDlg(HWND lOwner, HWND hInstance, LONG Flags, LPARAM lCustData) throws NativeException, IllegalAccessException {
26 PageSetupResult ret = new PageSetupResult();
27
28 if(nPageSetupDlg == null) {
29 //JNative uses ANSI version ChooseColorA vs ChooseColorW
30 nPageSetupDlg = new JNative(DLL_NAME, "PageSetupDlgA");
31 //BOOL is in fact an INT
32 nPageSetupDlg.setRetVal(Type.INT);
33 }
34 PAGESETUPDLG nPageSetupDlgStruct = new PAGESETUPDLG();
35 nPageSetupDlgStruct.setHwndOwner(lOwner);
36 nPageSetupDlgStruct.setHInstance(hInstance);
37 nPageSetupDlgStruct.setFlags(Flags);
38 nPageSetupDlgStruct.setLCustData(lCustData);
39
40 nPageSetupDlg.setParameter(0, nPageSetupDlgStruct.getPointer());
41 nPageSetupDlg.invoke();
42
43 if("0".equals(nPageSetupDlg.getRetVal())) {
44 ret.setRet(false);
45 return ret;
46 }
47
48 ret.setRet(true);
49 ret.setMargin(PageSetupResult.LEFT, nPageSetupDlgStruct.getValueFromPointer().rtMargin.getValueFromPointer().left.getValue());
50 ret.setMargin(PageSetupResult.TOP, nPageSetupDlgStruct.getValueFromPointer().rtMargin.getValueFromPointer().top.getValue());
51 ret.setMargin(PageSetupResult.RIGHT, nPageSetupDlgStruct.getValueFromPointer().rtMargin.getValueFromPointer().right.getValue());
52 ret.setMargin(PageSetupResult.BOTTOM, nPageSetupDlgStruct.getValueFromPointer().rtMargin.getValueFromPointer().bottom.getValue());
53 ret.setPageWidth(nPageSetupDlgStruct.getValueFromPointer().ptPaperSize.getValueFromPointer().x.getValue());
54 ret.setPageHeight(nPageSetupDlgStruct.getValueFromPointer().ptPaperSize.getValueFromPointer().y.getValue());
55
56 return ret;
57 }
58
59 public static void main(String[] args) throws NativeException, IllegalAccessException {
60 PageSetupResult result = ComDlg32Ex.PageSetupDlg(new HWND(0), new HWND(0), new LONG(ComDlg32Ex.PSD_INHUNDREDTHSOFMILLIMETERS), new LPARAM(0));
61 System.out.println("The width of page: " + result.getPageWidth()+" mm");
62 System.out.println("The height of page: " + result.getPageHeight()+" mm");
63 System.out.println("The left margin of page: " + result.getMargin(PageSetupResult.LEFT) +" mm");
64 System.out.println("The top margin of page: " + result.getMargin(PageSetupResult.TOP) + " mm");
65 System.out.println("The right margin of page: " + result.getMargin(PageSetupResult.RIGHT) + " mm");
66 System.out.println("The bottom margin of page: " + result.getMargin(PageSetupResult.BOTTOM) + " mm");
67 }
68
69
70 }
71
有空的話我盡量把ComDlg32中的對話框補全, 有什么問題大家可以一起探討一下。
源碼下載