MFC文本框数据跟新闪烁严重,求方法。怎么做到双缓冲文本文字

嘻嘻666 2017-02-07 05:28:19
...全文
1369 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wulaike 2019-05-28
  • 打赏
  • 举报
回复
myErrorStr = _T(" "); UpdateData(false); myErrorStr = CurrentErrorTmp; UpdateData(false); 用了一个非常恶心的方法消除闪烁
qq_26868981 2017-08-21
  • 打赏
  • 举报
回复
你的问题解决了吗
走好每一步 2017-02-13
  • 打赏
  • 举报
回复
不要在界面外直接调界面的函数,使用自定义消息去调! 如果大量刷的话,除了自绘控件,别无他法,MFC本身控件就是会闪的。
worldy 2017-02-10
  • 打赏
  • 举报
回复
lz不知道你为何会闪烁,我在View里创建,然后拖拽改变窗口尺寸,不会任何闪烁
int CAESView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	CRect Rt(10,10,280,30);
	EdPassword.Create(WS_CHILD|WS_VISIBLE|WS_BORDER,Rt,this,10082);
	Rt.MoveToY(Rt.top+25);
	EdSource.Create(WS_CHILD|WS_VISIBLE|WS_BORDER,Rt,this,10083);
	Rt.MoveToY(Rt.top+25);
	EdEncrypt.Create(WS_CHILD|WS_VISIBLE|WS_BORDER,Rt,this,10084);
	Rt.MoveToY(Rt.top+25);
	EdDecrypt.Create(WS_CHILD|WS_VISIBLE|WS_BORDER,Rt,this,10085);

	return 0;
}
用户 昵称 2017-02-10
  • 打赏
  • 举报
回复
直接找现成的类或控件是正道。
sxxny 2017-02-10
  • 打赏
  • 举报
回复
变通的办法是,你收到数据不是直接显示到界面上,而是自己缓存在内存中。 然后用定时显示的方式刷新显示界面,就不会至于太频繁的刷新界面了。
赵4老师 2017-02-10
  • 打赏
  • 举报
回复
必要时得上Spy++
boylafong 2017-02-09
  • 打赏
  • 举报
回复
文本框数据怎么会闪烁?你是自绘的? 如果只是图上显示,可以用static,
向立天 2017-02-09
  • 打赏
  • 举报
回复
引用 12 楼 qq_33179570 的回复:
[quote=引用 11 楼 xianglitian 的回复:] 重绘edit非常复杂,主要是涉及的文字处理和光标处理,可以考虑用static控件不
用static控件不好看吧
void CXMSoftwareDlg::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
    {
 
        if (BST_CHECKED != IsDlgButtonChecked(IDC_CHECK1))
        {
 
 
            CBitmap bitmap;  // CBitmap对象,用于加载位图   
            HBITMAP hBmp;    // 保存CBitmap加载的位图的句柄   
            bitmap.LoadBitmap(IDB_BITMAP2);  // 将位图IDB_BITMAP1加载到bitmap   
            hBmp = (HBITMAP)bitmap.GetSafeHandle();  // 获取bitmap加载位图的句柄   
            Port_picture1.SetBitmap(hBmp);    // 设置图片控件m_jzmPicture的位图图片为IDB_BITMAP1   
 
 
        }
        if (BST_CHECKED == IsDlgButtonChecked(IDC_CHECK1))
        {
            CBitmap bitmap;  // CBitmap对象,用于加载位图   
            HBITMAP hBmp;    // 保存CBitmap加载的位图的句柄   
            bitmap.LoadBitmap(IDB_BITMAP1);  // 将位图IDB_BITMAP1加载到bitmap   
            hBmp = (HBITMAP)bitmap.GetSafeHandle();  // 获取bitmap加载位图的句柄   
            Port_picture1.SetBitmap(hBmp);    // 设置图片控件m_jzmPicture的位图图片为IDB_BITMAP1   
 
 
        }
    }
我想在OnPaint() 用picture 控件显示位图 大神给看看 上面我的方法能用 ,但是 设置 对话框复合属性 就出错[/quote] 想好看你可以用自定义控件画成自己想要的样子,比edit的重绘复杂度要低很多,而且效果自行可控
走好每一步 2017-02-09
  • 打赏
  • 举报
回复
有名的MFC自绘控件CButtonST_demo,在codeproject可以搜得到。 里面有个CMemDC类,用起来非常方便,完美解决双缓冲绘图。 需要自绘控件,MFC本身控件更新快了就会闪烁的! OnPaint里不要再调用会触发WM_PAINT消息的函数,也不要做过长时间的计算之类的。
sxxny 2017-02-09
  • 打赏
  • 举报
回复
应该是你自绘制背景出了问题吧,只修改数据应该不会闪吧。是不是哪里频繁调用了刷新窗口的函数。
嘻嘻666 2017-02-09
  • 打赏
  • 举报
回复
引用 17 楼 boylafong 的回复:
文本框数据怎么会闪烁?你是自绘的? 如果只是图上显示,可以用static,
引用 17 楼 boylafong 的回复:
文本框数据怎么会闪烁?你是自绘的? 如果只是图上显示,可以用static,
用static也闪
嘻嘻666 2017-02-08
  • 打赏
  • 举报
回复
引用 11 楼 xianglitian 的回复:
重绘edit非常复杂,主要是涉及的文字处理和光标处理,可以考虑用static控件不
用static控件不好看吧
void CXMSoftwareDlg::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
    {
 
        if (BST_CHECKED != IsDlgButtonChecked(IDC_CHECK1))
        {
 
 
            CBitmap bitmap;  // CBitmap对象,用于加载位图   
            HBITMAP hBmp;    // 保存CBitmap加载的位图的句柄   
            bitmap.LoadBitmap(IDB_BITMAP2);  // 将位图IDB_BITMAP1加载到bitmap   
            hBmp = (HBITMAP)bitmap.GetSafeHandle();  // 获取bitmap加载位图的句柄   
            Port_picture1.SetBitmap(hBmp);    // 设置图片控件m_jzmPicture的位图图片为IDB_BITMAP1   
 
 
        }
        if (BST_CHECKED == IsDlgButtonChecked(IDC_CHECK1))
        {
            CBitmap bitmap;  // CBitmap对象,用于加载位图   
            HBITMAP hBmp;    // 保存CBitmap加载的位图的句柄   
            bitmap.LoadBitmap(IDB_BITMAP1);  // 将位图IDB_BITMAP1加载到bitmap   
            hBmp = (HBITMAP)bitmap.GetSafeHandle();  // 获取bitmap加载位图的句柄   
            Port_picture1.SetBitmap(hBmp);    // 设置图片控件m_jzmPicture的位图图片为IDB_BITMAP1   
 
 
        }
    }
我想在OnPaint() 用picture 控件显示位图 大神给看看 上面我的方法能用 ,但是 设置 对话框复合属性 就出错
向立天 2017-02-08
  • 打赏
  • 举报
回复
重绘edit非常复杂,主要是涉及的文字处理和光标处理,可以考虑用static控件不
嘻嘻666 2017-02-08
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
弄两个位置重叠的文本框,交替显示?


试了不行,
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。

void CXMSoftwareDlg::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
{

if (BST_CHECKED != IsDlgButtonChecked(IDC_CHECK1))
{


CBitmap bitmap; // CBitmap对象,用于加载位图
HBITMAP hBmp; // 保存CBitmap加载的位图的句柄
bitmap.LoadBitmap(IDB_BITMAP2); // 将位图IDB_BITMAP1加载到bitmap
hBmp = (HBITMAP)bitmap.GetSafeHandle(); // 获取bitmap加载位图的句柄
Port_picture1.SetBitmap(hBmp); // 设置图片控件m_jzmPicture的位图图片为IDB_BITMAP1


}
if (BST_CHECKED == IsDlgButtonChecked(IDC_CHECK1))
{
CBitmap bitmap; // CBitmap对象,用于加载位图
HBITMAP hBmp; // 保存CBitmap加载的位图的句柄
bitmap.LoadBitmap(IDB_BITMAP1); // 将位图IDB_BITMAP1加载到bitmap
hBmp = (HBITMAP)bitmap.GetSafeHandle(); // 获取bitmap加载位图的句柄
Port_picture1.SetBitmap(hBmp); // 设置图片控件m_jzmPicture的位图图片为IDB_BITMAP1


}
}

帮看看有没有错大神
Vs有自带的对话框双缓冲属性 是用来解决闪屏的 但是我只要在OnPaint()绘制位图 程序就运行中断 ,双缓存属性就用不了,所以我想自己写双缓存代码 ,可是不知道怎么写 编辑框双缓存。


设置属性后 运行程序中断


赵4老师 2017-02-08
  • 打赏
  • 举报
回复
弄两个位置重叠的文本框,交替显示?
嘻嘻666 2017-02-08
  • 打赏
  • 举报
回复
引用 7 楼 xiaohuh421 的回复:
MFC的控件, 只要更新非常快, 任然会闪烁的, 这是MFC本身的问题. 原就是MFC绘制窗口和控件时, 都会先绘制背景, 再绘制内容, 两个过程不是同时完成的, 这样就会闪烁了. 解决办法就是尽量不要去 刷新, 而是直接覆盖绘制. 如果你没有自绘控件, 那么在界面更新非常快的情况下, 你就只能忍受它的闪烁了
大神有没有双缓存的 代码 ,我看您以前的回帖 说有 但是我找不到。。
xiaohuh421 2017-02-08
  • 打赏
  • 举报
回复
MFC的控件, 只要更新非常快, 任然会闪烁的, 这是MFC本身的问题. 原就是MFC绘制窗口和控件时, 都会先绘制背景, 再绘制内容, 两个过程不是同时完成的, 这样就会闪烁了. 解决办法就是尽量不要去 刷新, 而是直接覆盖绘制. 如果你没有自绘控件, 那么在界面更新非常快的情况下, 你就只能忍受它的闪烁了
嘻嘻666 2017-02-08
  • 打赏
  • 举报
回复
引用 5 楼 worldy 的回复:
对话框窗口,clip children和clip sinlings属性设置为true 普通窗口创建风格加入 ws_clipchildren 和ws_clipsiblings属性
设置后还是会闪 用双缓存方法最好,但是不知道双缓存文本改怎么弄
worldy 2017-02-08
  • 打赏
  • 举报
回复
对话框窗口,clip children和clip sinlings属性设置为true 普通窗口创建风格加入 ws_clipchildren 和ws_clipsiblings属性
加载更多回复(6)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧