NSIS源码AdvSplash学习笔记

// 系统版本
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745(v=vs.85).aspx
// Windows Server 2003 with SP1, Windows XP with SP2_WIN32_WINNT_WS03 (0x0502)
#define _WIN32_WINNT 0x0502
// VC6.0可能会要加的宏名
#define WS_EX_LAYERED 0x80000
#define LWA_ALPHA 0x2
#define LWA_COLORKEY 0x1
// 字符转整数
int myatoi(char *s)
// 调用Show方法
void __declspec(dllexport) show(HWND hwndParent, int string_size, char *variables, stack_t **stacktop)
// 可在DLL中调用的变量,寄存器变量初始化
EXDLL_INIT();
// 获得系统版本,Windows 2000 or Windows XP 的版本是 5
GetVersion()
// 有关设备初始化信息,dmBitsPerPel 指定了显示设备的颜色分辨率,以像素的位数为单位。
DEVMODE
//在VC6中调用SetLayeredWindowAttributes时,要先定义_WIN32_WINNT这个宏的值,用于确定操作系统。如:
//当 _WIN32_WINNT >= 0x0500时,才能连接得到SetLayeredWindowAttributes函数。
//需要定义在windows.h的前面
#define _WIN32_WINNT 0x0500
#include "windows.h"
// 设置窗口的透明度
/*
dwFlags :
当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效。
当取值为LWA_COLORKEY时,窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。
也可以取两个值的组合:LWA_ALPHA | LWA_COLORKEY。这样crKey的地方将变为全透明,而其它地方根据bAlpha参数确定透明度。
*/
BOOL SetLayeredWindowAttributes(
 HWND hwnd, // 透明窗体的句柄
 COLORREF crKey, // 掩码的颜色
 BYTE bAlpha, // 不透明度
 DWORD dwFlags // 透明方式
 );
/*窗口透明度实例 begin*/
#include<windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
const int X0 = 120;
const int Y0 = 50;
const int WIDTH = 800;
const int HEIGHT = 600;
int WINAPI WinMain(HINSTANCE hInstance,
 HINSTANCE hPrevInstance,
 LPSTR lpCmdLine,
 int nShowCmd)
{
 HWND hWnd;
 MSG msg;
 TCHAR lpszClassName[] = TEXT("窗口");
 WNDCLASS wc;
 wc.style = CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc = WndProc;
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hInstance = hInstance;
 wc.hIcon = ::LoadIcon(NULL,IDI_APPLICATION);
 wc.hCursor = ::LoadCursor(NULL,IDC_ARROW);
 wc.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
 wc.lpszMenuName = NULL;
 wc.lpszClassName = lpszClassName;
 RegisterClass(&wc);
 hWnd = CreateWindow(lpszClassName,
 TEXT("Windows"),
 WS_OVERLAPPEDWINDOW,
 X0, Y0, WIDTH, HEIGHT,
 NULL,
 NULL,
 hInstance,
 NULL);
 ::ShowWindow(hWnd, SW_SHOWNORMAL);
 ::UpdateWindow(hWnd);
 // 实现透明必须设置WS_EX_LAYERED标志
 LONG nRet = ::GetWindowLong(hWnd, GWL_EXSTYLE);
 nRet = nRet | WS_EX_LAYERED;
 ::SetWindowLong(hWnd, GWL_EXSTYLE, nRet);
 while(::GetMessage(&msg, NULL, 0, 0))
 {
 ::TranslateMessage(&msg);
 ::DispatchMessage(&msg);
 }
 return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,
 UINT msg,
 WPARAM wParam,
 LPARAM lParam)
{
 switch(msg)
 {
 case WM_LBUTTONDOWN:
 {
 ::MessageBeep(0);
 ::SetLayeredWindowAttributes(hWnd, 0, 123, LWA_ALPHA); // 设置半透明
 }
 break;
 case WM_RBUTTONDOWN:
 {
 ::MessageBeep(0);
 ::SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA); // 设置不透明
 }
 break;
 case WM_DESTROY:
 ::PostQuitMessage(0);
 break;
 default:
 return ::DefWindowProc(hWnd, msg, wParam, lParam);
 }
 return 0;
}
/*窗口透明度实例 end*/
© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容