Sollyu

  • 捐赠
  • 关于
  1. 首页
  2. 原创文章
  3. 正文

MFC Aero窗口[一]

2014年5月30日 6243点热度 1人点赞 0条评论

预览

MFC Aero窗口[一]

新建工程

新建一个MFC工程,普通的Dialog程序

添加必要的函数库

#include <dwmapi.h>  
#pragma comment (lib, "dwmapi.lib")  
#pragma comment (lib, "UxTheme.lib")

在窗口初始函数中添加

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

    OSVERSIONINFO osvi;
    ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osvi);
    if(osvi.dwMajorVersion >= 6)
    {
        MARGINS m = {-1};
        DwmExtendFrameIntoClientArea(m_hWnd, &m);
    }
}

在OnPaint()中最后加入,记住,是加入:

CRect rect;
GetClientRect(&rect);
CBrush brush(RGB(0,0,0));
GetDC()->FillRect(&rect,&brush);

DTTOPTS dto = { sizeof(DTTOPTS) };
dto.dwFlags = DTT_COMPOSITED | DTT_GLOWSIZE;
dto.iGlowSize = 20;
HTHEME htheme = OpenThemeData(m_hWnd,L"globals");
if(htheme==NULL)    return;

这样就可以看到一个Aero的程序了.

MFC Aero窗口[一]

事例

下面是一个事例

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

    OSVERSIONINFO osvi;
    ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osvi);
    if(osvi.dwMajorVersion >= 6)
    {
        MARGINS m = {-1};
        DwmExtendFrameIntoClientArea(m_hWnd, &m);
    }

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);         // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码
    LOGFONT lf={0};
    GetFont()->GetLogFont(&lf);
    lf.lfHeight*=4;
    m_font.CreateFontIndirect(&lf);

    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CMy2AeroDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // 使图标在工作区矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }

    CRect rect;
    GetClientRect(&rect);
    CBrush brush(RGB(0,0,0));
    GetDC()->FillRect(&rect,&brush);

    DTTOPTS dto = { sizeof(DTTOPTS) };
    dto.dwFlags = DTT_COMPOSITED | DTT_GLOWSIZE;
    dto.iGlowSize = 20;
    HTHEME htheme = OpenThemeData(m_hWnd,L"globals");
    if(htheme==NULL)    return;

    OSVERSIONINFO osvi;
    ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osvi);
    if(osvi.dwMajorVersion < 6)
        return;

    CWindowDC dc(this);
    CRect rt;
    GetWindowRect(&rt);
    CFont* pOldFont=dc.SelectObject(&m_font);

    DrawThemeTextEx (htheme,
        dc.m_hDC,
        TEXT_CONTROLLABEL,
        0, 
        L"MFC is great with Aero",
        -1,
        DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_NOPREFIX,
        CRect(rect.left,rect.bottom-100,rect.right,rect.bottom-30), 
        &dto );
    dc.SelectObject(pOldFont);
}

里面的m_font是个全局的CFont变量

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: Aero MFC
最后更新:2014年5月30日

sollyu

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

COPYRIGHT © 2021 sollyu.com. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

苏ICP备15007531号