MFC 创建透明的窗体

wade008 2012-08-30 02:19:18
有一个程序,界面有时没有InvalidateRect,使画面卡住

如果弹出MessageBox,然后点掉,界面就更新出来

已经有调用InvalidateRect函数

可能是机器的问题

现在想做的是,我创建个透明的窗体,然后发CLOSE消息,把透明窗体关掉,这样用户不会感觉到。

这要如何做?
...全文
111 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dickbarry 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
不是,我只是要显示透明窗体,然后让透明窗体关掉
[/Quote]
设置透明...

#define WS_EX_LAYERED 0x00080000
#define LWA_ALPHA 0x00000002

typedef BOOL (WINAPI *LPFNSETLAYEREDWINDOWATTRIBUTES)
(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags) ;

//设置窗口的透明度 hwnd是被设置的窗口 byAlpha是指示了透明度(0完全透明 255完全不透明)
BOOL TransparentWnd(HWND hwnd, BYTE byAlpha)
{
long lStyle;
HMODULE hModule;
BOOL bRet;
LPFNSETLAYEREDWINDOWATTRIBUTES lpSetLayeredWindowAttributes;
if(FALSE == IsWindow(hwnd))
{
MessageBox(NULL, TEXT("窗口句柄无效!"), NULL, 0) ;
return FALSE ;
}
hModule = (HMODULE)LoadLibrary(TEXT("user32.dll")) ;
if(hModule)
{
lpSetLayeredWindowAttributes = (LPFNSETLAYEREDWINDOWATTRIBUTES)
GetProcAddress(hModule, TEXT("SetLayeredWindowAttributes")) ;
if(!lpSetLayeredWindowAttributes)
{
MessageBox(hwnd, TEXT("未找到API SetLayeredWindowAttributes的地址!"),
NULL, MB_OK) ;
return FALSE ;
}
}
lStyle = GetWindowLong(hwnd, GWL_EXSTYLE) ;
if(!lStyle)
{
MessageBox(hwnd, TEXT("获取窗口扩展样式失败!"), NULL, MB_OK) ;
return FALSE ;
}
lStyle = lStyle | WS_EX_LAYERED ;
bRet = SetWindowLong(hwnd, GWL_EXSTYLE, lStyle) ;
if(!bRet)
{
MessageBox(hwnd, TEXT("设置窗口扩展样式失败!"), NULL, MB_OK) ;
return FALSE ;
}
bRet = lpSetLayeredWindowAttributes(hwnd, 0, byAlpha, LWA_ALPHA) ;
if(!bRet)
{
MessageBox(hwnd, TEXT("设置窗口透明度失败!"), NULL, MB_OK) ;
return FALSE ;
}
RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN) ;
FreeLibrary(hModule) ;
return TRUE ;
}

wade008 2012-08-30
  • 打赏
  • 举报
回复
不是,我只是要显示透明窗体,然后让透明窗体关掉
dickbarry 2012-08-30
  • 打赏
  • 举报
回复
说实在话,我读了两遍也还没太搞明白你到底想表达的意思...

SendMessage(m_hWnd, WM_CLOSE,。。。)
关闭不可以么?

还是类似于慢慢退出的那种感觉...?
wade008 2012-08-30
  • 打赏
  • 举报
回复
也可以弹出一动态的MM秀一下正忙,延时退出。

这什么意思,我要让用户感觉不到的
qlizhang 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]

现在想做的是,我创建个透明的窗体,然后发CLOSE消息,把透明窗体关掉,这样用户不会感觉到。

这要如何做?
[/Quote]
也可以弹出一动态的MM秀一下正忙,延时退出。
qlizhang 2012-08-30
  • 打赏
  • 举报
回复

BOOL CPartTransparentDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
//加入WS_EX_LAYERED扩展属性
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0xfffff);//可调透明度
// GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
//取得SetLayeredWindowAttributes函数指针
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),0,128,2);
FreeLibrary(hInst);
}
return TRUE; // return TRUE unless you set the focus to a control
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧