VC自绘窗口WIN7中边框异常问题的解决方案

需要分两步操作

第一步:在窗口的OnCreate中添加以下代码

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    // 下面一段代码就是用来去掉WIN7或者WIN8旁边的透明边框
    HINSTANCE hInst = LoadLibrary(_T("UxTheme.dll"));
    if (hInst)
    {
        typedef HRESULT (WINAPI *PFUN_SetWindowTheme)(HWND, LPCTSTR, LPCTSTR);
        PFUN_SetWindowTheme pFun = (PFUN_SetWindowTheme)GetProcAddress(hInst, "SetWindowTheme");
        if (pFun)
        {
            pFun(m_hWnd, _T(""), _T("")); //去掉xp主题
        }
        FreeLibrary(hInst);
    }

    hInst = LoadLibrary(_T("dwmapi.dll"));
    if (hInst)
    {
        typedef HRESULT (WINAPI * TmpFun)(HWND,DWORD,LPCVOID,DWORD);
        TmpFun DwmSetWindowAttributeEX = (TmpFun)::GetProcAddress(hInst, "DwmSetWindowAttribute");
        if (DwmSetWindowAttributeEX)
        {
            DWORD dwAttr = 1;
            DwmSetWindowAttributeEX(GetSafeHwnd(), 2, &dwAttr, 4); //去掉vista或win7特效
        }
        FreeLibrary(hInst);
    }

    return 0;
}

第二步:响应WM_NCACTIVATE消息

BOOL CMainFrame::OnNcActivate(BOOL bActive)
{
    // 这里直接返回TRUE,避免每次激活时重画边框
    return TRUE;
}

 

posted @ 2013-08-26 10:04  幸福之圣  阅读(755)  评论(0)    收藏  举报