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透明玻璃

解决方案 »

  1.   

    大神  ,请问你是怎么让vs  编译java 的?
    有点神奇 的样子
      

  2.   


    到 cmd 下进行编译,即 javac EyreFree.java (以具体路径为准,下同)。Java不是用VS 编译的,是cmdc++ 的 DLL才是 VS 编译的
      

  3.   

    无标题栏,无边框的窗口比较特殊(如不能改变大小,不能拖动等)不支持Aero效果,可能是系统在实现这类窗口时进行了特殊处理,在系统层面上如果要使此类窗口支持Aero效果会有问题(如窗口假死等)。
      

  4.   

    用DwmEnableBlurBehindWindow函数