📄 eblistview.c
字号:
FillBoxWithBitmap(hdc,rcClient.left-pLVInternalData->nOriginalX,
(rows - 1) * pLVInternalData->nItemHeight + off +
pLVInternalData->nHeadHeight-pLVInternalData->nOriginalY, 0, 0, &bmp);
UnloadBitmap(&bmp);
}
}
}
}
//获得
int lvGetRowsChecked(HWND hWnd, int iRows)
{
PEBLSTVWDATA pLVInternalData = (PEBLSTVWDATA) GetWindowAdditionalData2 (hWnd);
PEBITEMDATA pitem;
int nPosition= iRows;
if (iRows > pLVInternalData->nRows)
return 0;
if (nPosition == 1)
pitem = pLVInternalData->pItemHead;
else
{
pitem = pLVInternalData->pItemHead;
while (nPosition != 1)
{
nPosition = nPosition - 1;
pitem = pitem->pNext;
}
}
if (pitem->bChecked)
{
return 1;
}
return 0;
}
static lvFillRectWithBitmap(HDC hdc,RECT * rect,PBITMAP pbmp)
{
int x,y;
int xend=0,yend=0;
if(RECTW((*rect)) < pbmp->bmWidth || RECTH((*rect)) < pbmp->bmHeight)
{
FillBoxWithBitmap(hdc,0,
0,RECTW((*rect)),RECTH((*rect)),pbmp);
return;
}
for(y = rect->top; y < rect->bottom;)
{
if(y + pbmp->bmHeight > rect->bottom)
{
y = rect->bottom - pbmp->bmHeight;
}
for(x = rect->left; x < rect->right; )
{
if(x + pbmp->bmWidth > rect->right)
{
x = rect->right-pbmp->bmWidth;
}
FillBoxWithBitmap(hdc,x,
y,0,0,pbmp);
x+=pbmp->bmWidth;
}
y += pbmp->bmHeight;
}
}
static void lvDrawBKBitmap(HWND hwnd,HDC hdc,PBITMAP pbmp)
{
RECT rcClient;
DWORD dwStyle = GetWindowStyle (hwnd);
PEBLSTVWDATA pLVInternalData = (PEBLSTVWDATA) GetWindowAdditionalData2 (hwnd);
if(!pbmp)
return;
GetClientRect (hwnd, &rcClient);
if(dwStyle &ELVS_BKALPHA)
{
unsigned char r,g,b,a;
Pixel2RGBA(HDC_SCREEN,GetWindowBkColor(hwnd),&r,&g,&b,&a);
pbmp->bmType |= BMP_TYPE_ALPHACHANNEL;
pbmp->bmAlpha = a;
}
switch(dwStyle & ELVS_BKIMAGEALIGNMASK)
{
case ELVS_BKIMAGEFLAT:
{
lvFillRectWithBitmap(hdc,&rcClient,pbmp);
/*FillBoxWithBitmap(hdc,0,
0,RECTW(rcClient),RECTH(rcClient),pbmp);
*/
}
break;
case ELVS_BKIMAGECENTER:
{
int x0,y0;
x0 = rcClient.left + (rcClient.right-rcClient.left-pbmp->bmWidth)/2;
y0 = rcClient.top + (rcClient.bottom-rcClient.top-pbmp->bmHeight)/2;
SetBkColor (hdc, GetWindowBkColor(hwnd));
SetBrushColor (hdc, GetWindowBkColor(hwnd));
FillBox (hdc, rcClient.left, rcClient.top, rcClient.right - rcClient.left,
rcClient.bottom - rcClient.top);
FillBoxWithBitmap(hdc, x0, y0, 0, 0,pbmp);
}
break;
case ELVS_BKIMAGELEFTTOP:
{
SetBkColor (hdc, GetWindowBkColor(hwnd));
SetBrushColor (hdc, GetWindowBkColor(hwnd));
FillBox (hdc, rcClient.left, rcClient.top, rcClient.right - rcClient.left,
rcClient.bottom - rcClient.top);
FillBoxWithBitmap(hdc, 0,
0, 0, 0,pbmp);
}
break;
default:
break;
}
}
static void lvDrawGlobalBK(HWND hwnd,HDC hdc)
{
RECT rcClient;
DWORD dwStyle = GetWindowStyle (hwnd);
PEBLSTVWDATA pLVInternalData = (PEBLSTVWDATA) GetWindowAdditionalData2 (hwnd);
GetClientRect (hwnd, &rcClient);
switch(dwStyle & ELVS_BKMASK)
{
case ELVS_BKBRUSH:
{
SetBkColor (hdc, GetWindowBkColor(hwnd));
SetBrushColor (hdc, GetWindowBkColor(hwnd));
FillBox (hdc, rcClient.left, rcClient.top, rcClient.right - rcClient.left,
rcClient.bottom - rcClient.top);
}
break;
case ELVS_BKBITMAP:
{
lvDrawBKBitmap(hwnd,hdc,(PBITMAP)(pLVInternalData->nBKImage));
}
break;
case ELVS_BKBMPFILE:
{
BITMAP bmp;
memset(&bmp,0,sizeof(BITMAP));
if(pLVInternalData->nBKImage &&
(!LoadBitmap( HDC_SCREEN, &bmp, (char*)(pLVInternalData->nBKImage))))
{
lvDrawBKBitmap(hwnd,hdc,&bmp);
UnloadBitmap(&bmp);
}
else
{
SetBkColor (hdc, GetWindowBkColor(hwnd));
SetBrushColor (hdc, GetWindowBkColor(hwnd));
FillBox (hdc, rcClient.left, rcClient.top,rcClient.right - rcClient.left,
rcClient.bottom - rcClient.top);
}
}
break;
case ELVS_BKNONE:
break;
default:
break;
}
}
//edit by tjb 2005-6-29
static void SetItemSelected(WORD dwStyle, int nItem, PEBLSTVWDATA pLVInternalData)
{
int i;
PEBITEMDATA p2 = NULL;
if(pLVInternalData->nRows <=0)
return ;
p2= pLVInternalData->pItemHead;
if(pLVInternalData->pItemSelected != NULL && pLVInternalData->nItemSelected !=nItem)
{
pLVInternalData->pItemSelected->bSelected = FALSE;
pLVInternalData->pItemSelected = NULL;
pLVInternalData->nItemSelected =0;
}
if(nItem == 1)
{
p2->bSelected = TRUE;
}
else if(nItem == 0)
{
if(pLVInternalData->pItemSelected != NULL)
{
pLVInternalData->pItemSelected->bSelected = FALSE;
pLVInternalData->pItemSelected = NULL;
pLVInternalData->nItemSelected =0;
}
p2 = NULL;
}
for(i=2;(i<=nItem && p2 != NULL);i++)
{
p2 = p2->pNext;
}
if(p2 != NULL)
{
if (dwStyle & ELVS_USECHECKBOX)//edit by tjb 2005-6-29
{
if (p2->bChecked)
p2->bChecked = FALSE;
else
p2->bChecked = TRUE;
}
p2->bSelected = TRUE;
pLVInternalData->pItemSelected = p2;
pLVInternalData->nItemSelected = nItem;
p2 = NULL;
}
}
static void SetItemMouseOver(int nItem, PEBLSTVWDATA pLVInternalData)
{
int i;
PEBITEMDATA p2 = NULL;
if(nItem >pLVInternalData->nRows || pLVInternalData->nRows <=0)
return ;
p2= pLVInternalData->pItemHead;
if(pLVInternalData->pItemMouseOver != NULL && pLVInternalData->nItemMouseOver !=nItem)
{
pLVInternalData->pItemMouseOver->bMouseOver = FALSE;
pLVInternalData->pItemMouseOver = NULL;
pLVInternalData->nItemMouseOver =0;
}
if(nItem == 1)
{
p2->bMouseOver = TRUE;
}
else if(nItem == 0)
{
if(pLVInternalData->pItemMouseOver != NULL)
{
pLVInternalData->pItemMouseOver->bMouseOver = FALSE;
pLVInternalData->pItemMouseOver = NULL;
pLVInternalData->nItemMouseOver =0;
}
p2 = NULL;
}
for(i=2;(i<=nItem && p2 != NULL);i++)
{
p2 = p2->pNext;
}
if(p2 != NULL)
{
p2->bMouseOver = TRUE;
pLVInternalData->pItemMouseOver = p2;
pLVInternalData->nItemMouseOver = nItem;
p2 = NULL;
}
}
//为了能快速处理状态改变(如鼠标移动、选中)而创建的函数
//itemnum1,itemnum2:要处理的行编号,一个是失去焦点的行,一个是获得焦点的行,当然,两者都可能为0
//创建于:2004-07-13 创建者:何剑
static void lvStatusChangeProcess(HWND hwnd, HDC hdc, int itemnum1, int itemnum2)
{
RECT rcClient;
PEBLSTHDR p1 = NULL;
PEBSUBITEMDATA p2 = NULL;
PEBITEMDATA p3 = NULL;
int i, j;
int nOldBkColor, nOldBrushColor;
int temp;
unsigned char red,green,blue,alpha;
BITMAP bmp[3],*pbmp[3];
BITMAP twobmp[2],*ptwobmp[2];//add by tjb
DWORD pbitmap = 0;
DWORD dwStyle;
PEBLSTVWDATA pLVInternalData;
PLOGFONT pfont = GetWindowFont(hwnd);
GetClientRect (hwnd, &rcClient);
pLVInternalData = (PEBLSTVWDATA) GetWindowAdditionalData2 (hwnd);
dwStyle = GetWindowStyle(hwnd);
//画全局背景;
//lvDrawGlobalBK(hwnd,hdc);
p3 = pLVInternalData->pItemHead;
//装载条目背景位图;
memset(&bmp,0,sizeof(BITMAP)*3);
memset(&pbmp,0,sizeof(BITMAP*)*3);
Pixel2RGBA(HDC_SCREEN,GetWindowBkColor(hwnd),&red,&green,&blue,&alpha);
switch(dwStyle & ELVS_ITEMBKMASK)
{
case ELVS_ITEMBKICON:
{
pbitmap = pLVInternalData->nItemBKImage;
}
break;
case ELVS_ITEMBKBITMAP:
{
pbitmap = pLVInternalData->nItemBKImage;
}
break;
case ELVS_ITEMBKBMPFILE:
{
if(dwStyle & ELVS_TYPE3STATE)
{
char * tmpfile,*str1;
char bmpfile1[MAX_PATH+1],bmpfile2[MAX_PATH+1],bmpfile3[MAX_PATH+1];
tmpfile = (char *)(pLVInternalData->nItemBKImage);
str1 = rindex(tmpfile,'/');
if(str1)
{
int rpath;
rpath = (int)(str1-tmpfile)+1;
strncpy(bmpfile1,tmpfile,MAX_PATH);
bmpfile1[rpath] = 0;
strncpy(bmpfile2,bmpfile1,MAX_PATH);
strncpy(bmpfile3,bmpfile1,MAX_PATH);
strncat(bmpfile1,"nm",MAX_PATH);
strncat(bmpfile2,"ov",MAX_PATH);
strncat(bmpfile3,"st",MAX_PATH);
strncat(bmpfile1,str1+1,MAX_PATH);
strncat(bmpfile2,str1+1,MAX_PATH);
strncat(bmpfile3,str1+1,MAX_PATH);
}
else
{
strncpy(bmpfile1,"nm",MAX_PATH);
strncpy(bmpfile2,"ov",MAX_PATH);
strncpy(bmpfile3,"st",MAX_PATH);
strncat(bmpfile1,tmpfile,MAX_PATH);
strncat(bmpfile2,tmpfile,MAX_PATH);
strncat(bmpfile3,tmpfile,MAX_PATH);
}
if(!LoadBitmap( HDC_SCREEN, &bmp[0], bmpfile1))
{
alpha =(unsigned char)((pLVInternalData->nItemBKColor >>24) &0xff);
bmp[0].bmType |= BMP_TYPE_ALPHAVALUE; //BMP_TYPE_ALPHACHANNEL;
bmp[0].bmAlpha = alpha;
pbmp[0] = &bmp[0];
}
if(!LoadBitmap( HDC_SCREEN, &bmp[1], bmpfile2))
{
alpha =(unsigned char)((pLVInternalData->nMouseOverBkColor >>24) &0xff);
bmp[1].bmType |= BMP_TYPE_ALPHAVALUE; //BMP_TYPE_ALPHACHANNEL;
bmp[1].bmAlpha = alpha;
pbmp[1] = &bmp[1];
}
if(!LoadBitmap( HDC_SCREEN, &bmp[2], bmpfile3))
{
alpha =(unsigned char)((pLVInternalData->nSelectBKColor >>24) &0xff);
bmp[2].bmType |= BMP_TYPE_ALPHAVALUE; //BMP_TYPE_ALPHACHANNEL;
bmp[2].bmAlpha = alpha;
pbmp[2] = &bmp[2];
}
pbitmap = (DWORD)&pbmp;
}
else if (dwStyle & ELVS_TYPE2STATE)//??
{
//edit by tjb 2004-3-11
//修改原因:若不是ELVS_TYPE3STATE,则没有获得焦点一态
char * twotmpfile,*twostr1;
char twobmpfile1[MAX_PATH+1],twobmpfile2[MAX_PATH+1];
twotmpfile = (char *)(pLVInternalData->nItemBKImage);
PrefixFileName(twotmpfile, "nm", twobmpfile1, MAX_PATH);
PrefixFileName(twotmpfile, "ov", twobmpfile2, MAX_PATH);
if(!LoadBitmap( HDC_SCREEN, &twobmp[0], twobmpfile1))
{
alpha =(unsigned char)((pLVInternalData->nItemBKColor >>24) &0xff);
twobmp[0].bmType |= BMP_TYPE_ALPHAVALUE; //BMP_TYPE_ALPHACHANNEL;
twobmp[0].bmAlpha = alpha;
ptwobmp[0] = &twobmp[0];
}
if(!LoadBitmap( HDC_SCREEN, &twobmp[1], twobmpfile2))
{
alpha =(unsigned char)((pLVInternalData->nMouseOverBkColor >>24) &0xff);
twobmp[1].bmType |= BMP_TYPE_ALPHAVALUE; //BMP_TYPE_ALPHACHANNEL;
twobmp[1].bmAlpha = alpha;
ptwobmp[1] = &twobmp[1];
}
pbitmap = (DWORD)&ptwobmp;
}
else if(dwStyle & ELVS_SPECIAL2STATE)//????
{
char * twotmpfile,*twostr1;
char twobmpfile1[MAX_PATH+1],twobmpfile2[MAX_PATH+1];
twotmpfile = (char *)(pLVInternalData->nItemBKImage);
twostr1 = rindex(twotmpfile,'/');
if(twostr1)
{
int rpath;
rpath = (int)(twostr1-twotmpfile)+1;
strncpy(twobmpfile1,twotmpfile,MAX_PATH);
twobmpfile1[rpath] = 0;
strncpy(twobmpfile2,twobmpfile1,MAX_PATH);
strncat(twobmpfile1,"ov",MAX_PATH);
strncat(twobmpfile2,"st",MAX_PATH);
strncat(twobmpfile1,twostr1+1,MAX_PATH);
strncat(twobmpfile2,twostr1+1,MAX_PATH);
}
else
{
strncpy(twobmpfile1,"ov",MAX_PATH);
strncpy(twobmpfile2,"st",MAX_PATH);
strncat(twobmpfile1,twotmpfile,MAX_PATH);
strncat(twobmpfile2,twotmpfile,MAX_PATH);
}
if(!LoadBitmap( HDC_SCREEN, &twobmp[0], twobmpfile1))
{
alpha =(unsigned char)((pLVInternalData->nMouseOverBkColor >>24) &0xff);
twobmp[0].bmType
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -