#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE HeaderWnd;
FARPROC wpOrigEditProc = NULL;
LRESULT APIENTRY NewProc(HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool CALLBACK EnumChildWinProc(HWND hwnd, LPARAM lParam)
{
char* buf;
bool Result = true;
buf = (char*)malloc(255);
//memset(buf, 0x00, 255);
ZeroMemory(buf, 255);
GetClassName(hwnd, buf, 255);
if(AnsiString(buf) == "SysHeader32") {
HeaderWnd = hwnd;
Result = false; //如果不返回false,EnumChildWindows将一直枚举下去
}
free(buf);
return Result;
}
//----------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//ListView是2个子控件组成的,通过枚举来取SysHeader32句柄,比单子控件多这个步骤
EnumChildWindows(ListView1->Handle, (WNDENUMPROC)EnumChildWinProc, 0);
wpOrigEditProc = (FARPROC)SetWindowLong(HeaderWnd, GWL_WNDPROC, (long)NewProc);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
SetWindowLong(HeaderWnd, GWL_WNDPROC, (LONG)wpOrigEditProc);
}
//---------------------------------------------------------------------------
LRESULT APIENTRY NewProc(HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
//RECT rc;
HDC orihdc, newhdc;
HGDIOBJ oriobj, oriobj1, newobj;
HBRUSH hbrush;
//Graphics::TBitmap *Pic = new Graphics::TBitmap();
//Pic->LoadFromFile("main.bmp");
HBITMAP hbmp;
BITMAP bmp;
PAINTSTRUCT ps;
switch (uMsg) {
//case WM_ERASEBKGND:
//return true;
case WM_PAINT:
//::SetRect(&rc, 0, 0, Form1->ListView1->Columns->Items[0]->Width, 20);
orihdc = BeginPaint(hwndDlg, &ps);
//orihdc = GetDC(hwndDlg);
newhdc = CreateCompatibleDC(orihdc); //内存DC,避免闪烁
hbmp = CreateCompatibleBitmap(orihdc,
Form1->ListView1->Columns->Items[0]->Width,
20); //彩色模式由orihdc提供
oriobj1 = SelectObject(newhdc, hbmp);
hbrush = CreateSolidBrush(RGB(255, 0, 0));
oriobj = SelectObject(newhdc, hbrush);
FillRect(newhdc,
&TRect(0, 0, Form1->ListView1->Columns->Items[0]->Width, 20),
hbrush);
SetBkColor(newhdc, RGB(255, 0, 0));
TextOut(newhdc, 2, 0, "hehe", 4);
GetObject(hbmp, sizeof(BITMAP), &bmp);
BitBlt(orihdc,
0,
0,
bmp.bmWidth,
bmp.bmHeight,
newhdc,
0,
0,
SRCCOPY);
SelectObject(newhdc, oriobj1); //恢复原DC中的object
SelectObject(newhdc, oriobj);
DeleteObject(hbmp); //释放资源
DeleteObject(hbrush);
DeleteDC(newhdc);
//ReleaseDC(hwndDlg, orihdc); //配合GetDC
EndPaint(hwndDlg, &ps); //配合BeginPaint
return false;
default:
return ::CallWindowProc(wpOrigEditProc, hwndDlg, uMsg, wParam, lParam);
}
//delete Pic;
}
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE HeaderWnd;
FARPROC wpOrigEditProc = NULL;
LRESULT APIENTRY NewProc(HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool CALLBACK EnumChildWinProc(HWND hwnd, LPARAM lParam)
{
char* buf;
bool Result = true;
buf = (char*)malloc(255);
//memset(buf, 0x00, 255);
ZeroMemory(buf, 255);
GetClassName(hwnd, buf, 255);
if(AnsiString(buf) == "SysHeader32") {
HeaderWnd = hwnd;
Result = false; //如果不返回false,EnumChildWindows将一直枚举下去
}
free(buf);
return Result;
}
//----------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//ListView是2个子控件组成的,通过枚举来取SysHeader32句柄,比单子控件多这个步骤
EnumChildWindows(ListView1->Handle, (WNDENUMPROC)EnumChildWinProc, 0);
wpOrigEditProc = (FARPROC)SetWindowLong(HeaderWnd, GWL_WNDPROC, (long)NewProc);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
SetWindowLong(HeaderWnd, GWL_WNDPROC, (LONG)wpOrigEditProc);
}
//---------------------------------------------------------------------------
LRESULT APIENTRY NewProc(HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
//RECT rc;
HDC orihdc, newhdc;
HGDIOBJ oriobj, oriobj1, newobj;
HBRUSH hbrush;
//Graphics::TBitmap *Pic = new Graphics::TBitmap();
//Pic->LoadFromFile("main.bmp");
HBITMAP hbmp;
BITMAP bmp;
PAINTSTRUCT ps;
switch (uMsg) {
//case WM_ERASEBKGND:
//return true;
case WM_PAINT:
//::SetRect(&rc, 0, 0, Form1->ListView1->Columns->Items[0]->Width, 20);
orihdc = BeginPaint(hwndDlg, &ps);
//orihdc = GetDC(hwndDlg);
newhdc = CreateCompatibleDC(orihdc); //内存DC,避免闪烁
hbmp = CreateCompatibleBitmap(orihdc,
Form1->ListView1->Columns->Items[0]->Width,
20); //彩色模式由orihdc提供
oriobj1 = SelectObject(newhdc, hbmp);
hbrush = CreateSolidBrush(RGB(255, 0, 0));
oriobj = SelectObject(newhdc, hbrush);
FillRect(newhdc,
&TRect(0, 0, Form1->ListView1->Columns->Items[0]->Width, 20),
hbrush);
SetBkColor(newhdc, RGB(255, 0, 0));
TextOut(newhdc, 2, 0, "hehe", 4);
GetObject(hbmp, sizeof(BITMAP), &bmp);
BitBlt(orihdc,
0,
0,
bmp.bmWidth,
bmp.bmHeight,
newhdc,
0,
0,
SRCCOPY);
SelectObject(newhdc, oriobj1); //恢复原DC中的object
SelectObject(newhdc, oriobj);
DeleteObject(hbmp); //释放资源
DeleteObject(hbrush);
DeleteDC(newhdc);
//ReleaseDC(hwndDlg, orihdc); //配合GetDC
EndPaint(hwndDlg, &ps); //配合BeginPaint
return false;
default:
return ::CallWindowProc(wpOrigEditProc, hwndDlg, uMsg, wParam, lParam);
}
//delete Pic;
}