visual c++学习笔记(二)

原创 2008年10月01日 16:51:00

 1、实现从硬盘加载位图到HBitmap的转化

   CBITMAP   myBitmap.LoadBitmap(IDB_BITMAP1); 
  HBITMAP myBitmap = (HBITMAP)LoadImage(NULL,"E://Ask361//ASK361Client//LobbySkin//Default//LobbyLT.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

    HBITMAP m_pbmpPattern=CBitmap::FromHandle((HBITMAP)::LoadImage(AfxGetResourceHandle(), "E://Ask361//ASK361Client//LobbySkin//Default//LobbyLT.bmp", IMAGE_BITMAP, 0,0, LR_LOADFROMFILE));

 

   HBITMAP  m_pbmpPattern=CBitmap::FromHandle((HBITMAP)::LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0,0, LR_SHARED));

 

 

 

2对话框中也可以贴图   用MFC对话框做无闪烁图片重绘

用应用程序向导生成一个基于对话框的应用程序

把对话框Styles里的Border设置为Resizing,并把Minimize box跟Maximize box复选按钮都勾上

现在我们为资源导入一张位图然后我们为程序添加四个私有变量private:
int height;
int width;
CBitmap myBitmap;
BITMAP bm;

然后用类向导添加WM SIZE消息输入下列代码: width = cx;
height = cy;
Invalidate();

然后在添加WM_PAINT消息在函数里添加以下代码: CDC *pDC=new CDC;
CPaintDC dc(this);
//CClientDC dc(NULL);
pDC->CreateCompatibleDC(&dc);
pDC->SelectObject(myBitmap);
//将图片伸缩成我们设定的大小。
dc.StretchBlt(0,0,width,height,pDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
//如果不准备进行缩放可以用BITBLT。
//dc.BitBlt(0,0,bm.bmWidth,bm.bmHeight,pDC,0,0,SRCCOPY);

delete pDC;

然后做最后一步在程序初始化时候导入我们的图片并让对话大小跟图片一样

在 OnInitDialog函数最里添加如下代码:

// TODO: Add extra initialization here
myBitmap.LoadBitmap(IDB_BITMAP1);
myBitmap.GetObject(sizeof(BITMAP),&bm);

好了我们现在就做了一个可以显示图片的对话框并且对话改变大小的时候图片大小也会改变,不过这个程序有一个缺点,就是重绘的时候有闪烁,性能不怎么好,

现在我们按上面的步骤在做一个对话框,导入位图,

添加以下变量:public:
CSize m_sizeBuffer;
CBitmap m_bmpBackBuffer;
CBitmap* m_pbmpPattern;

在OnInitDialog函数里添加以下代码

m_pbmpPattern=CBitmap::FromHandle((HBITMAP)::LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BACKGROUND), IMAGE_BITMAP, 0,0, LR_SHARED));

重写OnPaint函数

if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
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;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CPaintDC dc(this);
CDC dcBackBuffer;
dcBackBuffer.CreateCompatibleDC(&dc);
//重新计算区域面积
CRect rectClient;
GetClientRect(rectClient);
if ( m_sizeBuffer != rectClient.Size() )
{
m_sizeBuffer = rectClient.Size();
if ( m_bmpBackBuffer.GetSafeHandle() != NULL )
m_bmpBackBuffer.DeleteObject();
m_bmpBackBuffer.CreateCompatibleBitmap(&dc, m_sizeBuffer.cx, m_sizeBuffer.cy);
}
CBitmap* pOldBmp = dcBackBuffer.SelectObject(&m_bmpBackBuffer);

//画背景
if ( NULL == m_pbmpPattern )
{
dcBackBuffer.FillSolidRect(rectClient, RGB(255,0,255));
}
else
{
CDC dcPat;
dcPat.CreateCompatibleDC(&dcBackBuffer);
CBitmap* pbmpOld = dcPat.SelectObject(m_pbmpPattern);
BITMAP bitmap;
if ( m_pbmpPattern->GetBitmap(&bitmap) && bitmap.bmWidth > 0 && bitmap.bmHeight > 0 )
{
BOOL m_bTilePattern ;
m_bTilePattern =TRUE;
if ( m_bTilePattern )
{
for (int y=0; y<rectClient.bottom+bitmap.bmHeight; y += bitmap.bmHeight)
{
for (int x=0; x<rectClient.right+bitmap.bmWidth; x += bitmap.bmWidth)
{
dcBackBuffer.BitBlt(x,y, bitmap.bmWidth, bitmap.bmHeight, &dcPat, 0,0, SRCCOPY);
}
}
}
else
{
dcBackBuffer.FillSolidRect(rectClient, RGB(255,0,255));
dcBackBuffer.BitBlt((m_sizeBuffer.cx-bitmap.bmWidth)/2,(m_sizeBuffer.cy-bitmap.bmHeight)/2, bitmap.bmWidth, bitmap.bmHeight, &dcPat, 0,0, SRCCOPY);
}
}
dcPat.SelectObject(pbmpOld);
}
dc.BitBlt(0,0,m_sizeBuffer.cx,m_sizeBuffer.cy,&dcBackBuffer,0,0,SRCCOPY);
dcBackBuffer.SelectObject(pOldBmp);
CDialog::OnPaint();
}

现在我们的对话框就是真正利用了双缓冲来绘图性能比起第一个要好,而且还解决了闪烁问题

 

 

2、 获取可执行文件的路径

 

TCHAR szFilePath[MAX_PATH + 1];
 GetModuleFileName(NULL, szFilePath, MAX_PATH);
 (_tcsrchr(szFilePath, '//'))[1] = '/0'; //删除文件名,只获得路径

 

3、非常注意:

C++是与C#不同的语言,我这样写代码

if(a=4)

{}

c++是不会报编译错误的,但是在C#中是要报错的,但是呢,我的a的值却被修改成了4导致了我的错误,

遇到这样的错误,没有什么,但是却导致难以发现,其实我在写的时候是知道,而且我有意识要修改的,后来一岔就错过了,导致后来难以发现,白白的流失时间!

《Visual C# 2005入门经典》学习总结

        经过将近半个月的时间把James Foxall的 《Visual C# 2005入门经典》读了一遍,智者总归是智者,能够让读者这么容易去接受一门语言。现在我我从书中看到的一些东西总结一...
  • rocket5725
  • rocket5725
  • 2008年01月13日 20:38
  • 846

机器视觉学习笔记(一)

来秦皇岛快一周了,跟导师、学长聊了聊,觉得自己还是想做机器视觉,毕竟做一个智能机器人或者做智能家居一直是我的兴趣所在。这两天学了opencv,进度很慢,有待提高效率。在csdn上发现了很多有用的资料,...
  • sunlightli1216
  • sunlightli1216
  • 2015年01月16日 11:19
  • 258

c++学习笔记(1)——环境搭建、经典教程推荐及 Visual Studio 2005/2008中如何编译和运行C++程序

之前一直用C编程可是对C++并不了解,决定学习C++,今天是入门第一天:搭建了编译环境和写了第一个helloworld的程序 (1)使用的软件:Visual Studio 2008(中文版)。    ...
  • zhenzhen90
  • zhenzhen90
  • 2013年08月16日 17:21
  • 1452

机器学习笔记(二)(Draft Version)

摘要 笔记(一)中讨论的情况显示,模型越复杂并不一定error越小。那所以这些error到底来自什么地方呢? 1. bias 2. variance 在具体训练过程中,如果可以诊断error的...
  • yucicheung
  • yucicheung
  • 2017年09月18日 15:12
  • 306

node.js学习笔记(2)---Nodejs开发框架Express3.0开发手记–从零开始

目录 此文重点介绍Express3.0的开发框架,其中还会涉及到Mongoose,Ejs,Bootstrap等相关内容。   项目源码下载地址:http://download.csdn.net/det...
  • liuwu0720
  • liuwu0720
  • 2014年03月15日 10:59
  • 1597

西瓜书学习笔记(二)

啊啊啊啊啊,昨天本来第二章写了不少内容,但是不知道CSDN的Markdown编辑器是不会自动保存的,中途发别的博客会把之前编辑的也给覆盖掉,这一章就简单写点吧。第二章 模型评估与选择2.1 经验误差与...
  • Cyril__Li
  • Cyril__Li
  • 2017年04月25日 18:49
  • 383

GLSL学习笔记2

现在开始第四章的学习 4.The OpenGL Programmable Pipeline(opengl可编程管线) 顶点着色器课代替的固定功能有: 1.用模型矩阵变换顶点坐...
  • hippig
  • hippig
  • 2012年04月14日 11:26
  • 908

CMAKE学习笔记(二)

声明:本文为转载博客(感谢网友dbzhang800),转载链接在博客末尾 在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式。 这次应该简单看看语法和常用的命令了。 ...
  • u012700322
  • u012700322
  • 2016年12月23日 14:26
  • 248

网络编程学习笔记整理(二)

摘录笔记 《TCP/IP高效编程 改善网络程序的44个技巧》socket的创建函数int socket (int domain,int type, int protocol)参数说明protocol需...
  • stecdeng
  • stecdeng
  • 2017年02月23日 14:47
  • 243

XSL学习笔记(二)

  第一部分学了7个元素,还有24个,一个一个学吧。  1、、、元素  与相比,两者都须是的子结点,但前者定义的模板规则优先级比较低,且必须为第一个子结点。两者的功能是相同的,都是将另一个定义好的XS...
  • Borenbao
  • Borenbao
  • 2006年04月14日 09:25
  • 1674
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:visual c++学习笔记(二)
举报原因:
原因补充:

(最多只允许输入30个字)