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()

时间: 2024-10-24 01:15:41

MFC非模态窗口gdi+自绘图片的相关文章

mfc非模态对话框

按照我们的之前的做法,先新建工程. 把基本的内容都添加上. 形成这样一个样子: 并且进行试运行,让程序能够完成加法运算. 值的注意的是,静态文本那里要改一下名字,否则无法将成员变量进行添加. 前期准备: 然后就可以开始做我们的非模态对话框了. 一.创建这样一个对话框 到资源视图下面的,找到Dialog右击,出现下拉菜单.点击插入Dialog. 这步,应该都很熟练,先拖动两个按钮(否则可能会发生问题),然后稍微调整对话框的大小,最后添加一个静态文本.输入一些文字. 二.右键当前对话框,然后找到添加

MFC 模态、非模态窗口引发的系列事件及函数

标题一:创建模态窗口 CAdditionDlg dlg; // 定义对话框类CAdditionDlg的对象dlg INT_PTR nResponse = dlg.DoModal();//获取子窗口的结束方式 switch(nResponse) { case IDOK: case IDCANCEL: case IDDESTROY: } 标题二:创建非模态子窗口(完美解决非模态窗口单例问题) 步骤一:创建子窗口指针类型的公有成员 public: CMyTip* m_mytip; 步骤二:父类通过按钮

模态窗口和非模态窗口

对话框一般分为两种类型:模态类型(modal)与非模态类型(modeless).所谓模态对话框,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话框.非模态对话框则不会强制此种特性,用户可以在当前对话框以及其他窗口间进行切换.本文介绍如何使用JavaScript语言来创建这两种类型的对话框.控制其大小和位置.改变其外观以及在对话框间的数据传递.(引用) 一.创建模态和非模态对话框 创建模态对话框:(会缓存最近一次页面的值,通过一些设置可绕过系统的判断) vReturn

MFC非模态添加进程控件方法一(线程方法)

由于非模态对话框的自己没有消息循环,创建后无法进行消息处理.需要和父窗口共用消息循环.如果单独在子窗口进行控件由于自己没有单独的消息循环,更新是无法进行的. 如果在父窗口更新控件会造成程序假死.如以下代码在主窗口更新子窗口消息,界面进入假死状态.因为主界面对主进程进行了sleep(100),如下代码所示 void CModelessDlg::OnBnClickedOk() { DLGModeLess *pDlg = new DLGModeLess(); pDlg->Create(IDD_DG_M

统计图钻取的明细报表在非模态窗口中显示

润乾报表的统计图可以在图例 / 图形上设置超链接,从而实现钻取到明细报表的操作,钻取得到的报表可以在新窗口或者当前窗口中打开.关于如何在统计图的图形 / 图例上设置超链接,在用户手册中有常用示例的介绍.今天小编要给大家介绍的是如何在非模态窗口中打开图形超链接钻取得到的报表.首先创建一张带有统计图的报表,报表文件名为 planWorkView2.rpx.增加数据集 ds1, 下面是 ds1 的数据: 在 A2 单元格中增加一个柱形图,统计图的分类和系列值数据分别来源于数据集 ds1 的 ORG_N

模态对话框与非模态窗口

模态对话框就是在没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互,比如新建项目时弹出的对话框. #include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); QDialog dialog; dialog.setWindowTitle("模态

MFC 非模态对话框

MFC中对话框有两种形式,一个是模态对话框(model dialog box),一个是非模态对话框(modeless dialog box). 一.模态对话框(model dialog box) 在程序运行的过程中,若出现了模态对话框,那么主窗口将无法发送消息,直到模态对话框退出才可以发送. 点击模态对话框中的OK按钮,模态对话框会被销毁. 创建一个模态对话框的代码: [cpp] view plaincopy //创建一个模态对话框 CTestDialog td; td.DoModal(); 其

非模态窗口的创建方法

粘贴一些关键代码(IN  FILE_MYBOLE): CMyboleView窗口类中 void CMyboleView::OnMenuDialog() { // TODO: 在此添加命令处理程序代码 //非模态对话框的使用,要更改 OnOK 这个虚函数 if(m_pDlg) { m_pDlg->SetActiveWindow(); } else { m_pDlg = new CTestDlg(this); m_pDlg->Create(IDD_ONE_DLG, this); m_pDlg-&g

MFC编程 | 非模态对话框的定义

因为课程需要,会用到MFC编程,所以讲一些经验总结下,以便日后使用查询. // 非模态对话框的定义 // 通过单文档菜单调用一个非模态窗口 1.首先在工程里插入一个对话框(如:IDD_DLG_TEST),再添加对应的类(如:CdlgTest): 2.在类向导里添加"WM_DESTROY"消息响应函数“OnDestroy()”,并进行重载,用于关闭对话框时销毁对象. void CdlgTest::OnDestroy() {    CDialog::OnDestroy();