不用自绘(owner draw)就改变TListView header的字体

To change a font for TListView header

 

Today I want to show how to use the API calls and change a font for ListView header without any extended programming and custom drawing.

For example, you have the ListView1 instance and want to set a bold font for header.
This task must be solved so:

  1. to retrieve a handle of header for list view
  2. to get a font object by header handle
  3. to define our font object with any custom attributes
  4. to set our new font for header

The code below will do it:

const
  LVM_GETHEADER = LVM_FIRST + 31;
var
  LF: TLogFont;
  hHeader, hCurrFont, hOldFont, hHeaderFont: THandle;
begin
  {to get the windows handle for header}
  hHeader := SendMessage(ListView1.Handle, LVM_GETHEADER, 0, 0);

  {to get the handle for header font}
  hCurrFont := SendMessage(hHeader, WM_GETFONT, 0, 0);

  {to get the LOGFONT with font details}
  if GetObject(hCurrFont, SizeOf(LF), Addr(LF)) > 0 then
  begin
    {set our custom attributes. I set a bold and underlined font style}
    LF.lfWeight := FW_BOLD;
    LF.lfUnderline := 1;

    {create a new font for the header control to use.
     This font must NOT be deleted until it is no
     longer required by the control, typically when
     the application will be closed or when a new font
     will be applied to header}
    hHeaderFont := CreateFontIndirect(LF);

    {to select the new font}
    hOldFont := SelectObject(hHeader, hHeaderFont);

    {to notify the listview header about changes}
    SendMessage(hHeader, WM_SETFONT, hHeaderFont, 1);
  end;
end;

Note that somewhere in OnFormClose event you must also to release a memory for hHeaderFont variable:

if hHeaderFont > 0 then
  DeleteObject(hHeaderFont)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Delphi或C++ Builder编程中,BeginThread是一个函数,用于创建一个新的线程并开始执行指定的函数。TListView是一个控件,用于显示和管理列表数据。 使用BeginThread tlistview时,可以在程序中创建一个新的线程,并在该线程中实现TListView的相关操作。新线程的主要作用是在后台执行耗时的任务,以保持主线程的响应性。 例如,我们可以使用BeginThread tlistview来实现在后台加载和更新TListView中的数据,从而提高程序的用户体验。具体的步骤如下: 1. 创建新的线程:使用BeginThread函数创建一个新的线程。该函数接受一个线程函数作为参数,该函数将在新线程中执行。 2. 在线程函数中对TListView进行操作:在新线程的线程函数中,可以通过TListView控件的相关方法和属性来加载、更新、删除和显示列表数据。这些操作可以根据具体需求进行编写,例如从数据库中加载数据,更新列表项的内容等。 3. 保证线程的安全性:由于多线程同时操作TListView可能会导致冲突和错误,需要使用线程同步机制来保证线程的安全性。可以使用一些工具类如TCriticalSection、TMonitor或者使用Windows API的同步对象来实现线程同步。 4. 启动线程和等待线程结束:在主线程中,调用BeginThread函数启动新线程的执行。然后使用WaitForSingleObject等方法来等待新线程的执行完成,以确保线程的顺序和程序的正确性。 总之,通过使用BeginThread tlistview,我们可以在新的线程中对TListView进行相关操作,以提高程序的性能和用户体验。但需要注意线程的安全性和正确的线程同步机制,以避免出现冲突和错误。 ### 回答2: BeginThread是Delphi编程语言中的一个函数,用于创建一个新的线程来执行指定的代码。 TListView是Delphi中的一个控件,用于显示数据列表。 BeginThread TListView的意思是在TListView控件中使用BeginThread函数来创建一个新的线程。 使用BeginThread TListView可以实现在一个单独的线程中加载和更新TListView控件的数据,从而提高程序的运行效率和用户体验。 具体的步骤如下: 1. 创建一个新的线程,并将要执行的代码传递给BeginThread函数。 2. 在新线程中,使用相应的代码来加载和更新TListView控件的数据。可以通过访问数据库或其他数据源来获取数据,并将其填充到TListView控件中。 3. 在代码执行完毕后,结束线程。 使用BeginThread TListView需要注意以下几点: 1. 在访问TListView控件时,需要进行线程同步。因为TListView控件是在主线程中创建的,所以在新线程中访问TListView控件时,需要使用Synchronize或Queue方法来保证线程安全。 2. 在处理大量数据时,要考虑数据的处理效率和内存占用情况,避免因为数据量过大导致程序崩溃或响应变慢。 总之,使用BeginThread TListView可以实现在一个单独的线程中加载和更新TListView控件的数据,从而提高程序的运行效率和用户体验。 ### 回答3: beginthread是一个用于创建线程的函数,可以在C/C++中使用。tlistview是一个表示线程执行过程中生成的数据的对象,通常用于在多线程程序中共享数据。 在使用beginthread函数创建线程时,需要指定一个线程函数作为参数。该函数将在新创建的线程中执行。线程函数可以通过参数传递额外的数据,在不同的线程中共享或操作该数据。 tlistview对象可以用于存储线程执行期间产生的数据。例如,如果我们有一个需要在主线程和子线程之间共享数据的GUI应用程序,可以使用tlistview对象来存储子线程生成的数据,并在主线程中显示这些数据。这样可以避免多线程访问同一数据时的竞态条件问题。 在使用beginthread函数创建线程后,我们可以通过线程函数处理程序对tlistview对象进行读写操作。这样,子线程就可以将数据写入tlistview对象,并由主线程读取和显示这些数据。这使得多线程编程更加容易和安全。 总的来说,beginthread函数用于创建线程,而tlistview对象用于在多线程程序中共享数据。通过使用这两者,我们可以更轻松地实现多线程程序,并确保数据的正确读写和同步。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值