CListCtrl改变数据和插入数据避免闪烁的方法

(1)CListCtrl改变数据避免闪烁:

法一:直接设置LVS_EX_DOUBLEBUFFER扩展属性。

法二:使用双缓冲。

自定义一个类CMyListCtrl继承CListCtrl,重写OnPaint和OnEraseBkgnd方法

void CMyListCtrl::OnPaint()
{
	//使用双缓冲的方法绘制背景  
	CPaintDC dc(this); // device context for painting  
	CRect rect;
	CRect headerRect;
	CDC MenDC;      //内存DC     
	CBitmap MemMap;

	GetClientRect(&rect);
	//GetDlgItem(0)->GetWindowRect(&headerRect);
	this->GetHeaderCtrl()->GetWindowRect(&headerRect);
	MenDC.CreateCompatibleDC(&dc);
	MemMap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
	MenDC.SelectObject(&MemMap);
	MenDC.FillSolidRect(&rect, RGB(255, 255, 255));

	//调用默认的OnPaint(),把图形画在内存DC表上     
	DefWindowProc(WM_PAINT, (WPARAM)MenDC.m_hDC, (LPARAM)0);

	//输出到显示设备  
	dc.BitBlt(0,
		headerRect.Height(),
		rect.Width(),
		rect.Height(),
		&MenDC,
		0,
		headerRect.Height(),
		SRCCOPY);
	MenDC.DeleteDC();
	MemMap.DeleteObject();
}

BOOL CMyListCtrl::OnEraseBkgnd(CDC* pDC)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值
	return FALSE;
}

(2)CListCtrl插入数据避免闪烁:

在(1)的基础上加上下面代码

CString str;
	str.Format(L"%d", nItem);

//	plist->LockWindowUpdate();
	//	plist->SetRedraw(FALSE);
	plist->InsertItem(nItem, str);
	plist->SetItemText(nItem, 0, str);
	plist->SetItemText(nItem, 1, L"地方司法");
//	plist->UnlockWindowUpdate();
//	plist->SetRedraw(TRUE);
	plist->Invalidate(); //很重要,没有这个,有一点点闪
	plist->SetScrollPos(SB_VERT, nItem, TRUE); //如果不加这句,滚动条会稍微上下跳动
	plist->EnsureVisible(nItem, FALSE);
时间: 2024-10-10 23:35:56

CListCtrl改变数据和插入数据避免闪烁的方法的相关文章

JS 向web sql数据表插入数据

var strSQL = "insert into tableName values (?,?,?)"; var info=[1,1,1]; //向web sql数据表插入数据. function insertInfo(strSQL,info){ //连接数据库(http://www.cnblogs.com/nb08611033/p/8227560.html) db = openDB(); if (db) { db.transaction(function(tr) { tr.execu

[转]mysql 从一个表中查数据并插入另一个表实现方法

不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL或MS SQLServer某个表的数据批量导入到另一个表的情况,甚至有时还需要指定导入字段. 本文就将以MySQL数据库为例,介绍如何通过SQL命令行将某个表的所有数据或指定字段的数据,导入到目标表 中.此方法对于SQLServer数据库,也就是T-SQL来说,同样适用 . 类别一. 如果两张张表(导出表和目标表)的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO 目标表 SELECT * FROM 来源

mysql用视图和事件实现数据间隔插入数据到表

创建视图 CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`192.168.*.*` SQL SECURITY DEFINER VIEW `perfdata` AS SELECT `nagios_hosts`.`display_name` AS `hostname`, `nagios_services`.`display_name` AS `servicename`, `nagios_servicechecks`.`end_time` AS `time

MySQL数据表插入数据及增加语句

每个数据库都有增删改查功能,下面简单说说MySQL INSERT语句用法. 1,MySQL INSERT语句允许您将一行或多行插入到表中 INSERT INTO table(column1,column2...) VALUES (value1,value2,...); 首先,在INSERT INTO子句之后,在括号内指定表名和逗号分隔列的列表. 然后,将括号内的相应列的逗号分隔值放在VALUES关键字之后. 2,MySQL INSERT - 插入多行 INSERT INTO tasks(subj

MySQL创建数据库并插入数据

启动MySql 启动服务:sudo service mysql start 登陆:mysql -u root 新建数据库 CREATE DATABASE <数据库名>; 在大多数SQL系统中,并不区分大小写,但是习惯上:保留字大写,变量和数据小写 连接数据库 use <数据库名> 显示:Database changed,表示连接成功 数据表 数据表是数据库的重要组成部分,是数据在数据库中具体存放的位置 新建数据表:CREATE TABLE <表名> (< 列名1&

sqlite学习笔记9:C语言中使用sqlite之插入数据

前面创建了一张表,现在给他插入一些数据,插入数据跟创建表差不多,仅仅是SQL语言不一样而已,完整代码如下: #include <stdio.h> #include <stdlib.h> #include "sqlite/sqlite3.h" #define DB_NANE "sqlite/test.db" sqlite3 *db = NULL; char* sql = NULL; char *zErrMsg = NULL; int ret =

oracle插入数据

插入数据的方法有多种,这里简单介绍三种 1.常规插入数据 select * from emp;---已scott.emp表为例 ----按照values插入数据insert into emp (empno,ename ,job,mgr, hiredate , sal ,comm, deptno) values (1122,'steve','工人',2233,to_date('2017-01-03','YYYY-MM-DD'),3000,500,20); ----当插入表中所有的列时,列名可以不写

Android 根据sql文件创建数据库并插入数据

因为在开发客户端的时候,服务器端的有写数据是重复的,不需要再去访问服务器的,然后服务器端提供的是一个sql文件,里面包含了数据库和数据,我们这些开发客户端的不可能一行一行的进行手动入库吧?所以我就想到了直接读取sql文件进行创建数据并插入数据好了. 创建DBHelp并继承SQLiteOpenHelper public class DBHelper extends SQLiteOpenHelper { private Context mContext; public DBHelper(Contex

Windows Phone本地数据库(SQLCE):12、插入数据(翻译)

这是“windows phone mango本地数据库(sqlce)”系列短片文章的第十二篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需要知道的知识点.我将谈谈在windows phone mango本地数据库里怎么插入数据. 插入数据到数据库是一个两个步骤的过程.首先使用InsertOnSubmit 方法添加一个对象到DataContext,然后调用DataContext的SubmitChanges 方法来将保存数据作为数据库中的行. 注