注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

gvim 窗体透明度插件  

2014-08-18 17:18:06|  分类: 电脑常识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一个日本人写过一个简单的插件
https://github.com/mattn/vimtweak
在vimrc里面加上

autocmd BufReadPost * call libcallnr("vimtweak.dll", "SetAlpha", 220)

就可以指定窗体初始化的透明度了,0到255 直接。

vim里面调用c语言的dll插件很简单啊, 
call libcallnr("vimtweak.dll", "SetAlpha", 220)就是调用vimtweak.dll的导出函数SetAlpha。 libcallnr  和libcall类似,不过libcallnr的函数返回整型值,libcall返回字符串而已。

这样很多依赖windows API的特殊的窗体特性功能就可以用c来写扩展了。比如窗体全屏,删掉窗体标题栏,等等。 

/*
cl /LD vimtweak.c user32.lib
gcc -shared -o vimtweak.dll vimtweak.c
------------------------------
:call libcallnr("vimtweak.dll", "SetAlpha", 200)
:call libcallnr("vimtweak.dll", "EnableMaximize", 1)
:call libcallnr("vimtweak.dll", "EnableTopMost", 1)
*/
#include <windows.h>

#ifndef LWA_ALPHA
#define LWA_ALPHA 2
#endif

#ifndef WS_EX_LAYERED
#define WS_EX_LAYERED 0x00080000
#endif

static HWND hTopWindow = NULL;

BOOL CALLBACK
FindWindowProc(HWND hwnd, LPARAM lParam) {
HWND* pphWnd = (HWND*)lParam;

if (GetParent(hwnd)) {
*pphWnd = NULL;
return TRUE;
}
*pphWnd = hwnd;
return FALSE;
}

static HWND
GetVimWindow() {
if (hTopWindow) {
return hTopWindow;
}

HMODULE hDllKernel32 = LoadLibrary("kernel32");
if (hDllKernel32) {
HWND (WINAPI *pfnGetConsoleWindow)();
pfnGetConsoleWindow
= (HWND (WINAPI *)())
GetProcAddress(hDllKernel32, "GetConsoleWindow");
if (pfnGetConsoleWindow && (hTopWindow = (HWND) pfnGetConsoleWindow())) {
ShowWindow(hTopWindow, SW_SHOW);
return hTopWindow;
}
}
DWORD dwThreadID = GetCurrentThreadId();
EnumThreadWindows(dwThreadID, FindWindowProc, (LPARAM)&hTopWindow);
return hTopWindow;
}

LONG _declspec(dllexport)
SetAlpha(LONG nTrans) {
HMODULE hDllUser32 = LoadLibrary("user32");
if (hDllUser32) {
BOOL (WINAPI *pfnSetLayeredWindowAttributes)(HWND,DWORD,BYTE,DWORD);

pfnSetLayeredWindowAttributes
= (BOOL (WINAPI *)(HWND,DWORD,BYTE,DWORD))
GetProcAddress(hDllUser32, "SetLayeredWindowAttributes");

if (pfnSetLayeredWindowAttributes) {
HWND hTop = GetVimWindow();
if (hTop) {
if (nTrans == 255) {
SetWindowLong(hTop, GWL_EXSTYLE,
GetWindowLong(hTop, GWL_EXSTYLE) & ~WS_EX_LAYERED);
} else {
SetWindowLong(hTop, GWL_EXSTYLE,
GetWindowLong(hTop, GWL_EXSTYLE) | WS_EX_LAYERED);
pfnSetLayeredWindowAttributes(hTop, 0, (BYTE)nTrans, LWA_ALPHA);
}
}
}
FreeLibrary(hDllUser32);
}
return GetLastError();
}



  评论这张
 
阅读(534)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017