MFC随笔记录——1

  这段时间用MFC做完了项目里的一个对图像处理(字迹匹配)的软件,通过项目的具体要求的一步一步的实现,我也学习到了很多以前困惑很久的问题,算是对自己的一个提高吧,把一些有技巧性的操作记在这里,给以后的自己留一份存档也是不错的。

一、关于窗口绘制

1.添加窗口背景图片

MFC创建的窗口的确有点丑,如果不做美化的话做出来的软件也会看着都没有想用的欲望。闲话不多说,直接开始添加背景图片的步骤吧

(1)找到自己想作为背景的图片,并转换为bmp格式,复制到当前项目的资源文件夹res下

(2)对于对话框:

  在XXXDlg.cpp的OnPaint()中把else中的语句改为:

else{
        //CDialogEx::OnPaint();
        CBitmap   bmpBackground;
        bmpBackground.LoadBitmap(IDB_BITMAP1);//IDB_BITMAP是自己的图对应的ID
        CRect rc;//表示对话框的大小尺寸
        GetClientRect(&rc);
        CPaintDC dc(this);
        BITMAP bm;
        bmpBackground.GetBitmap(&bm);
        int width = bm.bmWidth, height = bm.bmHeight;
        for(int y=0;y < rc.Height();y += height)
        {
            for(int x=0;x < rc.Width();x += width)
            {
                CDC memDC;
                CBitmap *oldMemBitmap;

                memDC.CreateCompatibleDC(&dc);
                oldMemBitmap=memDC.SelectObject(&bmpBackground);

                dc.StretchBlt( x, y, width, height, &memDC, 0, 0, width, height, SRCCOPY );
                memDC.SelectObject(oldMemBitmap);
            }
        }
    }

对于单文档:
<1>在XXXView.h中添加定义:

afx_msg BOOL OnEraseBkgnd(CDC* pDC);
DECLARE_MESSAGE_MAP()

<2>在XXXView.cpp中的BEGIN_MESSAGE_MAP(...)与END_MESSAGE_MAP()之间添加ON_WM_ERASEBKGND(),即:

BEGIN_MESSAGE_MAP(...)
  ON_WM_ERASEBKGND()
END_MESSAGE_MAP()

<3>在XXXView类的构造函数中载入位图资源:LoadBitmap(IDB_BITMAP);

<4>实现函数BOOL XXXView::OnEraseBkgnd(CDC* pDC);

{
    CBitmap   bmpBackground;
    bmpBackground.LoadBitmap(IDB_BITMAP1);//IDB_BITMAP是自己的图对应的ID    //载入位图如果放在这里也可以,不过会重复载入,影响效率
    CRect rc;//表示对话框的大小尺寸
    GetClientRect(&rc);
    CPaintDC dc(this);
    BITMAP bm;
    bmpBackground.GetBitmap(&bm);
    int width = bm.bmWidth, height = bm.bmHeight;
    for(int y=0;y < rc.Height();y += height)
    {
        for(int x=0;x < rc.Width();x += width)
        {
            CDC memDC;
            CBitmap *oldMemBitmap;
            memDC.CreateCompatibleDC(&dc);
            oldMemBitmap=memDC.SelectObject(&bmpBackground);
            dc.StretchBlt( x, y, width, height, &memDC, 0, 0, width, height, SRCCOPY );
            memDC.SelectObject(oldMemBitmap);
        }
    }
}        

背景图片现在就可以正常显示了,但是可能会出现按钮被图片覆盖的情况,如果发生了也不要急,只要进行一点小小的操作就可以解决:

在对话框点击右键->属性,将WS_CLIPCHILDREN(裁剪子窗口)设为True,这样子窗口区域(按钮部分)就不会被背景的绘制而覆盖

  回头来看时发现这个有点复杂了,多说一句,其实这个OnEraseBkgnd(...)消息响应函数也可以根据下面的类向导那样直接添加响应函数,而不需要手工添加。

2.更改静态文本框背景

从上个图片中也可以看到,中间那一行静态文本很扎眼,因为在绘制时字本身有背景颜色(单一颜色)把图片的那一块给挡住了。我们为了能让字只显示它本身的部分,而不绘制字的背景色则需要进行下面的一些操作:

<1>在主窗口点击右键->类向导,在“消息”下面找到“WM_CTLCOLOR”,然后选择“添加处理程序”->“编辑代码”:

HBRUSH C常用操作Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    // 对特定的控件做修改
    if (nCtlColor == CTLCOLOR_STATIC)    //修改静态文本框
    {
        pDC->SetTextColor(RGB(0,0,255)); //设置字体颜色
        pDC->SetBkMode(TRANSPARENT);//设置背景为透明
        static HBRUSH B = (HBRUSH)GetStockObject(NULL_BRUSH);//获取画笔颜色混合后的画笔,完成透明
        return B; //返回画刷句柄
    }
    return CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
}

<2>到对话框中,点击对应的静态文本框,在属性中把“透明”调为True,好了,大功告成!

3.重绘窗口(防止重影)——此节将在下面细细道来...

二、编辑框部分

1.让编辑框自动滚动显示

  当一个编辑框中需要显示的数据较多时,我们需要设置多行属性:把对应编辑框的Multiline和Verticle scroll属性均设置为True,如果不允许被修改,可以把Read only属性也设置为True。

  在处理完编辑框IDC_value1对应的变量value1之后再使用以下代码即可实现自动向下滚动显示:

SetDlgItemText(IDC_value1,value1);//分别为编辑框的ID和对应的变量
CEdit* pEdit = ((CEdit*)GetDlgItem(IDC_value1));
pEdit->LineScroll(pEdit->GetLineCount());//设置完成后不需要调用UpdateData(0)

很明显,滚动条可以自动向下滚动了,但是仔细的朋友会看到,编辑框内却出现了重影现象(这就是上一节提到的却还没解决的问题)

2.处理重影现象

重影现象其实也不是很好解决的说,很惭愧,我在做项目期间,这个重影问题困扰了我的软件好几个版本,直到最后几个快要终结的版本才基本上处理掉了这个麻头的问题

时间: 2024-11-25 10:43:12

MFC随笔记录——1的相关文章

关于网上商城开发的随笔记录2

继续前一篇文章关于网上商城开发的随笔记录1,原文地址:http://www.cnblogs.com/zhankui/p/4580414.html 夏天长沙的天气十分闷热,又十分多变,所以忙了一下午,效率不高,只是对文档进行大篇幅的修改,参考大量购物网站,设计出了数据库模型,(看到这里是不是以为我要分享数据库了?不好意思,你又想多了),这里主要是讲用例图,老师说开发的时候客户是看不懂我们的专业术语的(简单来说就是学微软,吧所有的客户当白痴,简单化,当然这是很必要的),所以要让对方知道我们做出来过后

MySQL简单操作随笔记录

create database golden; create table golden.users(usersId int unsigned not null auto_increment primary key,userName char(20) not null,passWord int unsigned not null); create table golden.u like golden.users ; -- 复制表结构insert into golden.u select * fro

关于网上商城开发的随笔记录3

提示一下手机党慎入,多图! 关于网上商城开发的随笔记录1,原文地址:http://www.cnblogs.com/zhankui/p/4580414.html 关于网上商城开发的随笔记录2,原文地址:http://www.cnblogs.com/zhankui/p/4582046.html 因为使用的是oracle的数据库,所以需要新建一个,但是今天突然发现班上很多人都不会,所以,就写一写好了,与人方便,也是自己方便嘛,这个比较简单,但是还是有几点要注意的,请仔细看哦,走你┏ (゜ω゜)=? 桌

开发随笔记录

昨天别人给了同事一个简单的demo,问题是UITableViewController上有内有textfield的cell,在textfield被选中,弹出键盘,界面会自动滚动,就和我们平时做textfield输入时不要被键盘挡住那样的滚动.对方是想要不要这个自动滚动,因为那个demo滚动的位置不对,查了一下,发现不知道什么时候起,UITableViewController自动适配了这个需求,完成不滚动的要求只有两个做法:(1)把UITableViewController换成UIViewContr

【随笔记录】python 处理中文时出现的错误&#39;ascii&#39; codec can&#39;t decode byte 0xe9 in position 0: ordinal not in range(128)&quot; 解决方法

python xml处理中文时出现的错误,记录一下,以免忘记 "UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)" 解决办法,在该python文件的前面加上如下几句,问题得到解决. import sys default_encoding = 'utf-8' if sys.getdefaultencoding() != default_enco

软件测试技术第一周课堂随笔记录

写在前,这是软件测试技术的课堂随笔,记录了一些在课上所阐述的内容. 一.由于是第一周课,免不了讲起软件测试的定义:什么是软件测试. 软件测试是软件开发过程中的一个重要组成部分,是贯穿整个软件开发生命周期.对软件产品(包括阶段性产品)进行验证和确认的活动过程,其目的是尽快尽早地发现在软件产品中所存在的各种问题——与用户需求.预先定义的不一致性.-----------------百度百科. 个人的理解暂时就是:1.找bug.2.找出需求与实际的差别. 二.软件测试常见测试方法: 从测试是否针对软件结

MFC学习记录1

一.MFC六大关键技术 1.MFC初始化----寻找main函数 C++规定,全局对象的构造将比main或WinMain函数更早. 首先是全局构造 CObject构造函数 -> CCmdTarget -> CWinThread -> CWinApp -> theApp构造函数 然后进入WinMain函数 WinMain -> AfxWinMain -> AfxWinInit -> theApp.InitApplication -> theApp.InitIn

自己初学时的随笔记录

如果富文本编辑器 jsp....文件可以找到但是就是显示不出来,可能是Controller控制器中@RequestMapping后边没有写路径 ---------------------------------------------------------------------------------------------------------------------------- iframe框架内的页面如果要想不覆盖或者成为一个有机整体,需要在<a></a>连接到的js

【随笔记录】MYSQL ERROR CODE 错误编号的意义

mysql error code(备忘) 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据库失败 1010:不能删除数据目录导致删除数据库失败 1011:删除数据库文件失败 1012:不能读取系统表中的记录 1020:记录已被其他用户修改 1021:硬盘剩余空间不足,请加大硬盘可用空间 1022:关键字重复,更改记录失败 1023:关闭时发生错误 1024:读文件错误 1025