📄 transparencybaseonwinapi.java
字号:
package com.jixy.baseOnSWT;
import org.eclipse.swt.SWT;
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.internal.win32.TCHAR;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class TransparencyBaseOnWinAPI {
public static void main(String[] args) {
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setLayout(new FillLayout());
shell.setText("SWT Application");
shell.setMaximized(false);
shell.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
shell.setBounds(0, 0, 1024, 100);
// 始终最前
OS.SetWindowPos(shell.handle, OS.HWND_TOPMOST, 0, 0, 1024, 100,
SWT.NULL);
// 透明窗体
OS.SetWindowLong(shell.handle, OS.GWL_EXSTYLE, OS.GetWindowLong(
shell.handle, OS.GWL_EXSTYLE) ^ 0x80000);
TCHAR lpLibFileName = new TCHAR(0, "User32.dll", true);
int hInst = OS.LoadLibrary(lpLibFileName);
if (hInst != 0) {
String name = "SetLayeredWindowAttributes\0";
byte[] lpProcName = new byte[name.length()];
for (int i = 0; i < lpProcName.length; i++) {
lpProcName[i] = (byte) name.charAt(i);
}
int fun = OS.GetProcAddress(hInst, lpProcName);
if (fun != 0) {
OS.CallWindowProc(fun, shell.handle, 0x02FFFFFF, 50, 1);
// arg0--SetLayeredWindowAttributes函数
// arg1--hwnd是透明窗体的句柄
// arg2--crKey为颜色值
// ----COLORREF crKey型值的最高位字节的含义取值 含义
// --------0x00 指定RGB引用。此时三个低位字节含有红、绿、蓝色的强度,Windows将抖动20种保留的颜色来匹配指定的颜色,而不管程序是否实现了自己的调色板。
// --------0x01 指定调色板索引引用。此时最低位字节含有逻辑调色板的索引,Windows根据该索引在逻辑调色板中找到所需的颜色。
// --------0x02 指定调色板RGB引用。此时三个低位字节含有红、绿、蓝色的强度,Windows会在逻辑调色板中找到最匹配的颜色。
// arg3--bAlpha是透明度,取值范围是[0,255]
// arg4--dwFlags是透明方式,可以取两个值:
// ------当取值为LWA_ALPHA(0x2)时,crKey参数无效,bAlpha参数有效;
// ------当取值为LWA_COLORKEY(0x1)时,bAlpha参数无效而窗体中的所有颜色为crKey的地方将变为透明。
}
OS.FreeLibrary(hInst);
}
// ------------------END---------------------------------------------
shell.layout();
shell.open();
// Label label=new Label(shell,SWT.NONE);
// label.setText("jixiaoyu");
// label.getText().setFont(new Font());
Text text = new Text(shell, SWT.WRAP);
text.setText("平台是一个辅助系统,必须在提供帮助和服务的同时不能干扰用户正常使用微机上的其他软件"
+ "。“平台”与用户的交互必须是在用户需要时出现,用户不需要时消失,以免干扰用户使用别的软件"
+ "所以需要采用一种特定的、方便的、符合人们工作和生活习惯的人机交互方式。“平台”在屏幕上的"
+ "显示方式将类似于“金山词霸”在屏幕上出现的解释窗口,该窗口应该简单没有边框并略透明(以不"
// + "显眼但能阅读为原则,即“辅窗口” )。用户在使用微机时,阅读远远多于写作,阅读速度远远大于"
// + "写作,阅读时用户不希望将要阅读的内容被覆盖,所以“辅窗口” 应出现在“关注点”的左上方,尽量"
// + "少地干扰用户的阅读;写作时,用户经常要参考刚刚写好的内容,所以“辅窗口”最好出现于“关注点”"
// + "的右下方空白处。由于鼠标的常规使用方式(按一次左键代表光标定位,按住左键移动代表对象选择,"
// + "连按两次左键代表执行,按一次右键代表调用快捷功能等)已被主要工作软件占用,所以需要为同时运"
// + "行的“平台”寻找新的鼠标交互模式,即“鼠标轨迹识别与屏幕抓词”模式,指导思想是:当用户确实把注"
// + "意的焦点放在某个词或字上,而不是偶然将光标移至这个词上时,“辅窗口”才能出现。一种初步的设计为"
// + ",用户将光标短暂停留(比如0.1秒)在某个词上然后在该词或句子周围徘徊,即在该词上左右来回的移"
// + "动或者上下来回移动或者围绕该词画圈,然后停在徘徊或者画圈的起始处,这时就可以认定用户的“关注"
// + "点”被明确表达,即用户在明确地在召唤“平台”的帮助了,并且用户还选定了被关注的词或句子。对于“关"
// + "注点”的认定可以分级,人为设定或根据用户的使用频度智能化地调整都行。高频度使用“平台”的用户,"
// + "可以类似于“金山词霸”根据光标的停留认定,一般用户通过一次徘徊或画一圈认定,低频度的用户通过两"
+ "次徘徊或画两圈来认定。通过画圈,用户可以准确地选定对象,在文档中主要是主题词,在GIS和CAD等图"
+ "形软件中,可以选定图形对象。");
shell.layout();
shell.redraw();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -