求助:如何实现弹出新窗口后,后面的窗口变为灰色

TuLingABC 2017-10-30 02:55:17
项目是win32的,用Create()创建了一个新的小窗口,想把原来的窗口变为灰色。有没有简单的方法?
...全文
469 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2017-11-05
  • 打赏
  • 举报
回复
修改后代码:

// 如果在半透明窗口上 要弹出另一个窗口,那么这个弹出窗口必须在初始化中置顶
// 即 SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);	
// 如果这个弹出窗口,不能置顶, 如 AfxMessageBox(),
// 请加上 鼠标穿透属性  WS_EX_TRANSPARENT 。
// 如果要子类化:
//WNDPROC g_OldProc;
//LRESULT CALLBACK NewProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
//{
//    return CallWindowProc(g_OldProc, hwnd, message, wParam, lParam);
//} 
#define   WS_EX_LAYERED 0x00080000 
void CzzzzDlg::CreateHalfTransWindow()
{
	LPCTSTR m_lpszClassName=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,// IDC_ARROW
										(HBRUSH)::GetStockObject(BLACK_BRUSH),NULL);
	CRect rc;
	GetWindowRect(rc);
    int x_coord=rc.Width(); //::GetSystemMetrics(SM_CXSCREEN);//幕宽
    int y_coord=rc.Height();//::GetSystemMetrics(SM_CYSCREEN);//幕高
// mouse  penetrate : WS_EX_TRANSPARENT
    m_hwndF=::CreateWindowEx(WS_EX_TOPMOST | WS_EX_LAYERED ,m_lpszClassName,"",
								WS_VISIBLE | WS_POPUP ,
								rc.left,rc.top,x_coord,y_coord,0,0,NULL,NULL);
//	如果要子类化
//	g_OldProc = (WNDPROC)SetWindowLong(m_hwndF, GWL_WNDPROC, (LONG)NewProc); 
//
    HINSTANCE hInstTmp = LoadLibrary("User32.DLL"); 
    if(hInstTmp) 
    { 
        typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
        MYFUNC fun = NULL; 
//	get "SetLayeredWindowAttributes"函数
        fun=(MYFUNC)GetProcAddress(hInstTmp, "SetLayeredWindowAttributes"); 
#define LWA_ALPHA 0x00000002
        if(fun) fun(m_hwndF,RGB(0,0,0),30,LWA_ALPHA);//透明度1-30,透明方式2 
        FreeLibrary(hInstTmp); 
    } 
}
调用 void CzzzzDlg::OnButton3() { CreateHalfTransWindow(); CAboutDlg dlgAbout; dlgAbout.DoModal(); // DestroyHalfTransWindow(); } void CzzzzDlg::DestroyHalfTransWindow() { if(m_hwndF) { ::DestroyWindow(m_hwndF); m_hwndF=0; } } BOOL CAboutDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE); // return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
schlafenhamster 2017-11-03
  • 打赏
  • 举报
回复
原窗口上 画一个 半透明的 窗口 参考

#define   WS_EX_LAYERED 0x00080000 
void CCheckCursorDlg::cursorHide()
{
    LPCTSTR m_lpszClassName=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,::LoadCursorA(NULL,MAKEINTRESOURCE(IDC_CROSS)),
										(HBRUSH)::GetStockObject(BLACK_BRUSH),NULL);
	CRect rc;
	GetWindowRect(rc);
    int x_coord=rc.Width();//::GetSystemMetrics(SM_CXSCREEN);//获取屏幕的宽度
    int y_coord=rc.Height();//::GetSystemMetrics(SM_CYSCREEN);//获取屏幕的高度
//    HWND desk=::GetDesktopWindow();
// mouse  penetrate : |WS_EX_TRANSPARENT
    m_hwndF=::CreateWindowEx(WS_EX_TOPMOST|WS_EX_LAYERED,m_lpszClassName,"",
								WS_VISIBLE | WS_POPUP,
								rc.left,rc.top,x_coord,y_coord,0,0,NULL,NULL);
	g_OldProc = (WNDPROC)SetWindowLong(m_hwndF, GWL_WNDPROC, (LONG)NewProc); 
//
    HINSTANCE hInstTmp = LoadLibrary("User32.DLL"); 
    if(hInstTmp) 
    { 
        typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
        MYFUNC fun = NULL; 
//取得SetLayeredWindowAttributes函数指针 
        fun=(MYFUNC)GetProcAddress(hInstTmp, "SetLayeredWindowAttributes"); 
#define   LWA_ALPHA     0x00000002
        if(fun)
            fun(m_hwndF,RGB(0,0,0),30,LWA_ALPHA); //透明度1-30,透明方式2 
        FreeLibrary(hInstTmp); 
    } 
 	::SendMessage(m_hwndF,WM_CREATE,0,0);// create a button
   SetTimer(2,10000,0);
}
TuLingABC 2017-11-03
  • 打赏
  • 举报
回复
非常感谢jszj的耐心解答,不过如果能有代码最好
red-fly 2017-10-31
  • 打赏
  • 举报
回复
4楼是一个方法,在弹出新窗口时,获取原窗口的截图,方法大致: 1. 获取原窗口的DC:CDC *pDC = GetDC(); 2. 创建一个内存兼容DC 3. 把原窗口的DC拷贝到内存DC 4. 把内存DC亮度降低 5. 用内存DC的画面创建brush 然后在OnCtrlColor消息中返回创建的brush,如果弹出的窗口关闭,则按照正常的返回而不要返回创建的brush
red-fly 2017-10-31
  • 打赏
  • 举报
回复
估计处理ONCtrlColor可以达到一定效果,但想做好,应该还是要仔细研究一下 在这个消息里,把背景的颜色全部降低比如96个颜色值,如果本来的颜色值小于96就置为0
TuLingABC 2017-10-30
  • 打赏
  • 举报
回复
能否指点的详细点,大概代码是怎样的?
smwhotjay 2017-10-30
  • 打赏
  • 举报
回复
截图然后贴背景。调低亮度。。。。
TuLingABC 2017-10-30
  • 打赏
  • 举报
回复
就是在后面窗口上加上一层灰色,已经用了模态,后面的窗口已经不能再操作了,现在想把后面窗口的颜色也变灰。
类似这种:
赵4老师 2017-10-30
  • 打赏
  • 举报
回复
CreateDesktop ?
smwhotjay 2017-10-30
  • 打赏
  • 举报
回复
灰色什么意思,变灰了还可以获取焦点操作吗? 不能多窗口操作,就用模态对话框。

15,979

社区成员

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

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