• MFC非模态窗口gdi+自绘图片


    新建 Dialog based MFC项目DrawImage
    在资源中新添加一个Dialog,IDD_PICBOXDLG
    在此dialog上添加Pictre Contrl
    shift+ctrl+x 添加对应的类:CPicBoxDlg
    DrawImage.cpp中加入:
    CPicBoxDlg* g_Dlg=NULL;
    DrawImageDlg.cpp中:
    extern CPicBoxDlg* g_Dlg;
    在资源面板找到DrawImage窗口添加按钮,双击添加事件
    void CDrawImgDlg::OnBnClickedButton1()
    {
    // TODO: Add your control notification handler code here
    if(g_Dlg == NULL)
    {
    g_Dlg = new CPicBoxDlg;
    if(g_Dlg->Create(IDD_PICBOXDLG, this))
    g_Dlg->ShowPicBox(g_Dlg->GetSafeHwnd());
    g_Dlg->ShowWindow(SW_SHOWNORMAL);
    ::AnimateWindow(g_Dlg->GetSafeHwnd(), 300, AW_BLEND);
    ::SetForegroundWindow(g_Dlg->GetSafeHwnd());
    }
    //CPicBoxDlg dlg;
    //dlg.DoModal();
    }
    }
    项目添加BmpFram.h
    #pragma once
    #include <xstring>
    #include <GdiPlus.h>
    using namespace std;
    using namespace Gdiplus;
    // CBmpFrame
    class CBmpFrame : public CStatic {
    DECLARE_DYNAMIC(CBmpFrame)
    public:
    CBmpFrame(CWnd* m_pWnd, wstring wsImgPath, BOOL fIsTransparentBg = FALSE, COLORREF rgbColor = NULL);
    CBmpFrame(CWnd* m_pWnd, UINT uiBmpID, BOOL fIsTransparentBg = TRUE, COLORREF rgbColor = #ffffff);
    virtual ~CBmpFrame();
    private:
    GdiplusStartupInput m_gdiplusStartupInput;
    ULONG_PTR m_pGdiToken;
    CBitmap m_bmpSource;
    BITMAP m_bmSource;
    CWnd* m_pWnd;
    UINT m_uiBmpID;
    wstring m_wsImgPath;
    BOOL m_fIsTransparentBg;
    COLORREF m_rgbColor;
    BOOL m_fIsGdiplus;
    public:
    void Draw(CDC *pDC);
    protected:
    DECLARE_MESSAGE_MAP()
    public:
    afx_msg void OnPaint();
    };
    BmpFrame.cpp
    // BmpBox.cpp : implementation file
    //
    #include "stdafx.h"
    #include "BmpFrame.h"
    #ifndef ULONG_PTR
    #define ULONG_PTR unsigned long*
    #include <GdiPlus.h>
    using namespace Gdiplus;
    #endif
    #pragma comment(lib,"gdiplus.lib")
    // CBmpFrame
    IMPLEMENT_DYNAMIC(CBmpFrame, CStatic)
    CBmpFrame::CBmpFrame(CWnd* pWnd, wstring wsImgPath, BOOL fIsTransparentBg, COLORREF rgbColor)
    {
    GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
    m_pWnd = pWnd;
    m_wsImgPath = wsImgPath;
    m_fIsTransparentBg = fIsTransparentBg;
    m_fIsGdiplus = TRUE;
    }
    CBmpFrame::CBmpFrame(CWnd* pWnd, UINT uiBmpID, BOOL fIsTransparentBg, COLORREF rgbColor)
    {
    GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
    m_pWnd = pWnd;
    m_uiBmpID = uiBmpID;
    m_fIsTransparentBg = fIsTransparentBg;
    m_rgbColor = rgbColor;
    m_fIsGdiplus = FALSE;
    }
    CBmpFrame::~CBmpFrame() 
    {
    GdiplusShutdown(m_pGdiToken);
    }
    BEGIN_MESSAGE_MAP(CBmpFrame, CStatic)
    ON_WM_PAINT()
    END_MESSAGE_MAP()
    void CBmpFrame::Draw(CDC *pDC)
    {
    CRect rectWnd;
    GetClientRect(&rectWnd);
    CDC* pCDC = new CDC;
    //CPaintDC paintDC(m_pWnd);
    pCDC->CreateCompatibleDC(pDC);
    if(m_fIsGdiplus)
    {
    //使用gdi+绘图,并做平滑处理
    Graphics graphics(pDC->GetSafeHdc());
    graphics.SetSmoothingMode(SmoothingModeAntiAlias);
    graphics.SetInterpolationMode(InterpolationModeHighQuality);
    //InterpolationModeHighQualityBilinear
    //InterpolationModeHighQualityBicubic
    Gdiplus::Image* pImage = new Gdiplus::Image(m_wsImgPath.data(), FALSE);
    if(pImage == NULL)
    {
    MessageBox(L"Gdiplus::Image is NULL.");
    return;
    }
    if(m_fIsTransparentBg)
    {
    ImageAttributes imAtt;
    imAtt.SetColorKey(m_rgbColor, m_rgbColor, ColorAdjustTypeDefault);
    graphics.DrawImage(pImage, Rect(0, 0, rectWnd.Width(), rectWnd.Height()), 0, 0, pImage->GetWidth(), pImage->GetHeight(), UnitPixel, &imAtt);
    }
    else
    {
    graphics.DrawImage(pImage, Rect(0, 0, rectWnd.Width(), rectWnd.Height()), 0, 0, pImage->GetWidth(), pImage->GetHeight(), UnitPixel, NULL);
    }
    delete pImage;
    pImage = NULL;
    }
    else
    {
    //一般绘图
    m_bmpSource.DeleteObject();
    m_bmpSource.LoadBitmap(m_uiBmpID);
    m_bmpSource.GetObject(sizeof(BITMAP), &m_bmSource);
    if(m_fIsTransparentBg)
    {
    pDC->TransparentBlt(0,0,rectWnd.Width(), rectWnd.Height(), pCDC,0,0, m_bmSource.bmWidth, m_bmSource.bmWidth, m_rgbColor);
    }
    else
    {
    pDC->StretchBlt(0,0,rectWnd.Width(), rectWnd.Height(), pCDC,0,0, m_bmSource.bmWidth, m_bmSource.bmWidth, SRCCOPY);
    }
    }
    pCDC->DeleteDC();
    }
    void CBmpFrame::OnPaint()
    {
    CPaintDC dc(this); // device context for painting
    // TODO: Add your message handler code here
    // Do not call CStatic::OnPaint() for painting messages
    Draw(&dc);
    }
    PicBoxDlg.h
    #pragma once
    #include "BmpFrame.h"
    // CPicBoxDlg dialog
    class CPicBoxDlg : public CDialog
    {
    DECLARE_DYNAMIC(CPicBoxDlg)
    CBmpFrame m_bmpFrame;
    public:
    CPicBoxDlg(CWnd* pParent = NULL);   // standard constructor
    virtual ~CPicBoxDlg();
    // Dialog Data
    enum { IDD = IDD_PICBOXDLG };
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    DECLARE_MESSAGE_MAP()
    };
    PicBoxDlg.cpp
    // CPicBoxDlg.cpp : implementation file
    //
    #include "stdafx.h"
    #include "DrawImg.h"
    #include "PicBoxDlg.h"
    // CPicBoxDlg dialog
    IMPLEMENT_DYNAMIC(CPicBoxDlg, CDialog)
    CPicBoxDlg::CPicBoxDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CPicBoxDlg::IDD, pParent)
    , m_bmpFrame(NULL, L"./res/cross.png")
    {
    }
    CPicBoxDlg::~CPicBoxDlg()
    {
    }
    void CPicBoxDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_PICBOX, m_bmpFrame);
    }
    BEGIN_MESSAGE_MAP(CPicBoxDlg, CDialog)
    END_MESSAGE_MAP()
  • 相关阅读:
    Oracle:PL/SQL--流程控制——作业练习:向表中循环插入ID编号
    Oracle:PL/SQL--流程控制(三)——循环结构:loop、while-loop、for-loop
    Oracle:PL/SQL--流程控制(三)——循环结构:loop、while-loop、for-loop
    Oracle:PL/SQL--打开控制台or关闭控制台
    Win10远程桌面及防火墙配置
    H3C-Telnet
    网络工程师(软考)心得
    《网络工程师 考前冲刺100题》思维导图
    《2019上半年网络工程师考试大纲》
    网络设计:搭建校园网(组网工程课设)【译】
  • 原文地址:https://www.cnblogs.com/freemindblog/p/5783261.html
Copyright © 2020-2023  润新知