Java Windows窗体程序有标题栏情况下实现Aero 透明玻璃效果原理 :在 Java 中调用 C++ Dll,本质上来说是调 Windows API。
编译环境 :cmd、VisualStudio 2010.(Eclipse无法通过编译)。
平台 :Windows7 32位 & 64位
参考 :http://blog.sina.com.cn/s/blog_5e8036f80100w0cn.html
CSDN博客:http://blog.csdn.net/eyrefree/article/details/8729746
CSDN论坛:http://bbs.csdn.net/topics/390406882?page=1具体步骤如下:(1)编写Java代码:
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class EyreFree extends JFrame {
private static final long serialVersionUID = 1L;
public native void AeroShow();
static {
System.loadLibrary("EyreFree"); //该处"EyreFree"为Dll名
}
JPanel Panel = new JPanel();
public EyreFree() {
Panel.setBackground(Color.red); //Dll中AeroShow()函数将窗体红色区域变为Aero效果
this.setSize(800, 500);
this.getContentPane().add(Panel);
this.setVisible(true);
}
public static void main(String[] args) {
EyreFree AeMain = new EyreFree();
AeMain.AeroShow();
}
}
(2)到 cmd 下进行编译,即 javac EyreFree.java (以具体路径为准,下同)。(3)编译完后用javah 编译成.h文件,也就是在cmd下执行 javah EyreFree ,此时在你类的目录下会多出一个 EyreFree .h 文件。(4)用VS2010建立DLL工程,具体如下: 1、打开VS2010 -> 新建 -> 项目 -> 左边选择Win32 -> Win32项目 -> 输入Dll名例如:EyreFree -> 下一步,选择DLL -> 完成。
2、将上面用 cmd 生成的 EyreFree .h 文件放到上一步Dll工程的目录下。
3、在解决方案的资源管理器中右键你的EyreFree.cpp文件 -> 属性 -> 找到预编译头 -> 在预编译头中选择不适用预编译头。同时去 stdafx.h 头文件中将【#define WIN32_LEAN_AND_MEAN】该句代码注释掉或删掉。
4、将 C:\Program Files (x86)\Java\jdk1.7.0_17\include (JDK安装目录,请根据你自己的具体安装情况判断)目录下的【 jni.h 头文件 】和C:\Program Files (x86)\Java\jdk1.7.0_17\include\win32(JDK安装目录,同上)目录下的【 jni_md.h 头文件】复制到本Dll工程的目录下。(5)编写C++代码,注意,此代码应放入EyreFree.cpp里:
#include <jni.h>
#include "EyreFree.h"
#include <stdio.h>
#include <iostream>
#include <Windows.h>
#include <WinUser.h>
#include <Uxtheme.h>
#include <dwmapi.h>
#pragma comment (lib, "Uxtheme.lib")
#pragma comment (lib, "dwmapi.lib")
using namespace std;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD dwCurProcessId = *((DWORD*)lParam);
DWORD dwProcessId = 0;
GetWindowThreadProcessId(hwnd, &dwProcessId);
if(dwProcessId == dwCurProcessId && GetParent(hwnd) == NULL)
{
*((HWND *)lParam) = hwnd;
return FALSE;
}
return TRUE;
}
HWND GetMainWindow() //获取调用者窗口句柄
{
DWORD dwCurrentProcessId = GetCurrentProcessId();
if(!EnumWindows(EnumWindowsProc, (LPARAM)&dwCurrentProcessId))
{
return (HWND)dwCurrentProcessId;
}
return NULL;
}
JNIEXPORT void JNICALL Java_EyreFree_AeroShow(JNIEnv *env,jobject obj)
{
HWND hwnd = GetMainWindow(); //查找对话框
if(NULL != hwnd)
{
SetWindowLong(hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
SetLayeredWindowAttributes(hwnd,0x0000ff, 255, LWA_ALPHA | LWA_COLORKEY); //设置透明
MARGINS mar={-1};
DwmExtendFrameIntoClientArea(hwnd, &mar); //毛玻璃范围
}
return;
}
(6)编译 Dll 工程生成 EyreFree.dll ,将生成的 Dll 放到 EyreFree.clas 所在目录。(7)cmd 下运行 EyreFree ,即 java EyreFree 。具体效果如下:javadllc++Aero透明玻璃
编译环境 :cmd、VisualStudio 2010.(Eclipse无法通过编译)。
平台 :Windows7 32位 & 64位
参考 :http://blog.sina.com.cn/s/blog_5e8036f80100w0cn.html
CSDN博客:http://blog.csdn.net/eyrefree/article/details/8729746
CSDN论坛:http://bbs.csdn.net/topics/390406882?page=1具体步骤如下:(1)编写Java代码:
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class EyreFree extends JFrame {
private static final long serialVersionUID = 1L;
public native void AeroShow();
static {
System.loadLibrary("EyreFree"); //该处"EyreFree"为Dll名
}
JPanel Panel = new JPanel();
public EyreFree() {
Panel.setBackground(Color.red); //Dll中AeroShow()函数将窗体红色区域变为Aero效果
this.setSize(800, 500);
this.getContentPane().add(Panel);
this.setVisible(true);
}
public static void main(String[] args) {
EyreFree AeMain = new EyreFree();
AeMain.AeroShow();
}
}
(2)到 cmd 下进行编译,即 javac EyreFree.java (以具体路径为准,下同)。(3)编译完后用javah 编译成.h文件,也就是在cmd下执行 javah EyreFree ,此时在你类的目录下会多出一个 EyreFree .h 文件。(4)用VS2010建立DLL工程,具体如下: 1、打开VS2010 -> 新建 -> 项目 -> 左边选择Win32 -> Win32项目 -> 输入Dll名例如:EyreFree -> 下一步,选择DLL -> 完成。
2、将上面用 cmd 生成的 EyreFree .h 文件放到上一步Dll工程的目录下。
3、在解决方案的资源管理器中右键你的EyreFree.cpp文件 -> 属性 -> 找到预编译头 -> 在预编译头中选择不适用预编译头。同时去 stdafx.h 头文件中将【#define WIN32_LEAN_AND_MEAN】该句代码注释掉或删掉。
4、将 C:\Program Files (x86)\Java\jdk1.7.0_17\include (JDK安装目录,请根据你自己的具体安装情况判断)目录下的【 jni.h 头文件 】和C:\Program Files (x86)\Java\jdk1.7.0_17\include\win32(JDK安装目录,同上)目录下的【 jni_md.h 头文件】复制到本Dll工程的目录下。(5)编写C++代码,注意,此代码应放入EyreFree.cpp里:
#include <jni.h>
#include "EyreFree.h"
#include <stdio.h>
#include <iostream>
#include <Windows.h>
#include <WinUser.h>
#include <Uxtheme.h>
#include <dwmapi.h>
#pragma comment (lib, "Uxtheme.lib")
#pragma comment (lib, "dwmapi.lib")
using namespace std;
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD dwCurProcessId = *((DWORD*)lParam);
DWORD dwProcessId = 0;
GetWindowThreadProcessId(hwnd, &dwProcessId);
if(dwProcessId == dwCurProcessId && GetParent(hwnd) == NULL)
{
*((HWND *)lParam) = hwnd;
return FALSE;
}
return TRUE;
}
HWND GetMainWindow() //获取调用者窗口句柄
{
DWORD dwCurrentProcessId = GetCurrentProcessId();
if(!EnumWindows(EnumWindowsProc, (LPARAM)&dwCurrentProcessId))
{
return (HWND)dwCurrentProcessId;
}
return NULL;
}
JNIEXPORT void JNICALL Java_EyreFree_AeroShow(JNIEnv *env,jobject obj)
{
HWND hwnd = GetMainWindow(); //查找对话框
if(NULL != hwnd)
{
SetWindowLong(hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE)^0x80000);
SetLayeredWindowAttributes(hwnd,0x0000ff, 255, LWA_ALPHA | LWA_COLORKEY); //设置透明
MARGINS mar={-1};
DwmExtendFrameIntoClientArea(hwnd, &mar); //毛玻璃范围
}
return;
}
(6)编译 Dll 工程生成 EyreFree.dll ,将生成的 Dll 放到 EyreFree.clas 所在目录。(7)cmd 下运行 EyreFree ,即 java EyreFree 。具体效果如下:javadllc++Aero透明玻璃
有点神奇 的样子
到 cmd 下进行编译,即 javac EyreFree.java (以具体路径为准,下同)。Java不是用VS 编译的,是cmdc++ 的 DLL才是 VS 编译的