📄 babygrid.cpp
字号:
//extend this column
RECT trect;
GetClientRect(hWnd,&trect);
rect.right = offset + (trect.right - rect.left);
}
}
else
{
if(!GetNextColWithWidth(SI,c,1))
{
//repaint right side of grid
RECT trect;
HBRUSH holdbrush;
HPEN holdpen;
GetClientRect(hWnd,&trect);
trect.left=offset+(rect.right-rect.left);
holdbrush=(HBRUSH)SelectObject(gdc,GetStockObject(GRAY_BRUSH));
holdpen=(HPEN)SelectObject(gdc,GetStockObject(NULL_PEN));
Rectangle(gdc,trect.left,trect.top+BGHS[SI].titleheight,trect.right+1,trect.bottom+1);
SelectObject(gdc,holdbrush);
SelectObject(gdc,holdpen);
}
}
SetCell(&BGcell,r,c);
strcpy(buffer,"");
SendMessage(hWnd,BGM_GETCELLDATA,(UINT)&BGcell,(long)buffer);
if(BGHS[SI].COLUMNSNUMBERED)
{
if(c>0)
{
int high,low;
high = ((c-1)/26);
low = c % 26;
if(high == 0){high = 32;}else{high+=64;}
if(low == 0){low=26;}
low += 64;
wsprintf(buffer,"%c%c",high,low);
}
}
rectsave=rect;
DrawEdge(gdc,&rect,EDGE_ETCHED,BF_MIDDLE|BF_RECT|BF_ADJUST);
DrawTextEx(gdc,buffer,-1,&rect,DT_END_ELLIPSIS|DT_CENTER|DT_WORDBREAK|DT_NOPREFIX,NULL);
rect=rectsave;
r=BGHS[SI].topvisiblerow;
//set font for grid body
SelectObject(gdc,hfont);
while(r<=BGHS[SI].bottomvisiblerow)
{
//try to set cursor row to different display color
if((r==BGHS[SI].cursorrow)&&(c>0)&&(BGHS[SI].DRAWHIGHLIGHT))
{
if(BGHS[SI].GRIDHASFOCUS)
{
SetTextColor(gdc,BGHS[SI].highlighttextcolor);
}
else
{
SetTextColor(gdc,RGB(0,0,0));//set black text for nonfocus grid hilight
}
}
else
{
SetTextColor(gdc,RGB(0,0,0));
}
rect.top = rect.bottom;
rect.bottom = rect.top + BGHS[SI].rowheight;
rectsave=rect;
SetCell(&BGcell,r,c);
strcpy(buffer,"");
SendMessage(hWnd,BGM_GETCELLDATA,(UINT)&BGcell,(long)buffer);
if((c==0)&&(BGHS[SI].ROWSNUMBERED))
{
wsprintf(buffer,"%d",r);
}
if(c==0)
{
DrawEdge(gdc,&rect,EDGE_ETCHED,BF_MIDDLE|BF_RECT|BF_ADJUST);
}
else
{
HBRUSH hbrush,holdbrush;
HPEN hpen,holdpen;
iProtection=SendMessage(hWnd,BGM_GETPROTECTION,(UINT)&BGcell,0);
if(BGHS[SI].DRAWHIGHLIGHT)//highlight on
{
if(r==BGHS[SI].cursorrow)
{
if(BGHS[SI].GRIDHASFOCUS)
{
hbrush=CreateSolidBrush(BGHS[SI].highlightcolor);
}
else
{
hbrush=CreateSolidBrush(RGB(200,200,200));
}
}
else
{
if(iProtection == 1)
{
hbrush=CreateSolidBrush(BGHS[SI].protectcolor);
}
else
{
hbrush=CreateSolidBrush(BGHS[SI].unprotectcolor);
}
}
}
else
{
if(iProtection == 1)
{
hbrush=CreateSolidBrush(BGHS[SI].protectcolor);
}
else
{
hbrush=CreateSolidBrush(BGHS[SI].unprotectcolor);
}
}
hpen=CreatePen(PS_SOLID,1,BGHS[SI].gridlinecolor);
holdbrush=(HBRUSH)SelectObject(gdc,hbrush);
holdpen=(HPEN)SelectObject(gdc,hpen);
Rectangle(gdc,rect.left,rect.top,rect.right,rect.bottom);
SelectObject(gdc,holdbrush);
SelectObject(gdc,holdpen);
DeleteObject(hbrush);
DeleteObject(hpen);
}
rect.right -= 2;
rect.left += 2;
iDataType=SendMessage(hWnd,BGM_GETTYPE,(UINT)&BGcell,0);
if((iDataType < 1)||(iDataType > 5))
{
iDataType = 1;//default to alphanumeric data type.. can't happen
}
if(c==0){iDataType = 2;}
if(iDataType == 1)//ALPHA
{
if(BGHS[SI].ELLIPSIS)
{
DrawTextEx(gdc,buffer,-1,&rect,DT_END_ELLIPSIS|DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX,NULL);
}
else
{
DrawTextEx(gdc,buffer,-1,&rect,DT_LEFT|DT_WORDBREAK|DT_EDITCONTROL|DT_NOPREFIX,NULL);
}
}
if(iDataType == 2)//NUMERIC
{
DrawTextEx(gdc,buffer,-1,&rect,DT_END_ELLIPSIS|DT_RIGHT|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX,NULL);
}
if(iDataType == 3)//BOOLEAN TRUE
{
int k,excess;
k=2;
rect.top +=k;
rect.bottom -=k;
rect.left +=0;
rect.right -=0;
if((rect.bottom - rect.top)>24)
{
excess=(rect.bottom - rect.top)-16;
rect.top += (int)(excess/2);
rect.bottom -= (int)(excess/2);
}
DrawFrameControl(gdc,&rect,DFC_BUTTON,DFCS_BUTTONCHECK|DFCS_CHECKED);
}
if(iDataType == 4)//BOOLEAN FALSE
{
int k,excess;
k=2;
rect.top +=k;
rect.bottom -=k;
rect.left +=0;
rect.right -=0;
if((rect.bottom - rect.top)>24)
{
excess=(rect.bottom - rect.top)-16;
rect.top += (int)(excess/2);
rect.bottom -= (int)(excess/2);
}
DrawFrameControl(gdc,&rect,DFC_BUTTON,DFCS_BUTTONCHECK);
}
if(iDataType == 5) //user drawn graphic
{
WPARAM wParam;
buffer[0]=0x20;
BGHS[SI].ownerdrawitem = atoi(buffer);
wParam=MAKEWPARAM((UINT)GetMenu(hWnd),BGN_OWNERDRAW);
SendMessage(GetParent(hWnd),WM_COMMAND,wParam,(long)&rect);
}
if(BGHS[SI].EDITING)
{
DisplayEditString(hWnd,SI,"");
}
rect=rectsave;
r++;
}//end while r<=bottomvisiblerow
{
//repaint bottom of grid
RECT trect;
HBRUSH holdbrush;
HPEN holdpen;
GetClientRect(hWnd,&trect);
trect.top = rect.bottom;
trect.left = rect.left;
trect.right = rect.right;
holdbrush=(HBRUSH)SelectObject(gdc,GetStockObject(GRAY_BRUSH));
holdpen=(HPEN)SelectObject(gdc,GetStockObject(NULL_PEN));
Rectangle(gdc,trect.left,trect.top,trect.right+1,trect.bottom+1);
SelectObject(gdc,holdbrush);
SelectObject(gdc,holdpen);
}
SelectObject(gdc,holdfont);
DeleteObject(holdfont);
ReleaseDC(hWnd,gdc);
}
void DrawCursor(HWND hWnd,int SI)
{
RECT rect,rectwhole;
HDC gdc;
HPEN hpen,holdpen;
int rop;
if(BGHS[SI].rows == 0){return;}
GetClientRect(hWnd,&rect);
//if active cell has scrolled off the top, don't draw a focus rectangle
if(BGHS[SI].cursorrow < BGHS[SI].homerow){return;}
//if active cell has scrolled off to the left, don't draw a focus rectangle
if(BGHS[SI].cursorcol < BGHS[SI].homecol){return;}
rect = GetCellRect(hWnd,SI,BGHS[SI].cursorrow,BGHS[SI].cursorcol);
rectwhole=rect;
gdc=GetDC(hWnd);
BGHS[SI].activecellrect = rect;
rop=GetROP2(gdc);
SetROP2(gdc,R2_XORPEN);
SelectObject(gdc,(HBRUSH)GetStockObject(NULL_BRUSH));
hpen=CreatePen(PS_SOLID,3,BGHS[SI].cursorcolor); //width of 3
holdpen=(HPEN)SelectObject(gdc,hpen);
Rectangle(gdc,rect.left,rect.top,rect.right,rect.bottom);
SelectObject(gdc,holdpen);
DeleteObject(hpen);
SetROP2(gdc,rop);
ReleaseDC(hWnd,gdc);
}
void SetCurrentCellStatus(HWND hWnd,int SelfIndex)
{
SetCell(&BGcell,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol);
if(SendMessage(hWnd,BGM_GETPROTECTION,(UINT)&BGcell,0))
{
BGHS[SelfIndex].CURRENTCELLPROTECTED = TRUE;
}
else
{
BGHS[SelfIndex].CURRENTCELLPROTECTED = FALSE;
}
}
char GetASCII(WPARAM wParam, LPARAM lParam)
{
int returnvalue;
char mbuffer[100];
int result;
BYTE keys[256];
WORD dwReturnedValue;
GetKeyboardState(keys);
result=ToAscii(wParam,(lParam >> 16) && 0xff,keys,&dwReturnedValue,0);
returnvalue = (char) dwReturnedValue;
if(returnvalue < 0){returnvalue = 0;}
wsprintf(mbuffer,"return value = %d",returnvalue);
if(result!=1){returnvalue = 0;}
return (char)returnvalue;
}
void SetHomeRow(HWND hWnd,int SI,int row,int col)
{
RECT gridrect,cellrect;
//get rect of grid window
GetClientRect(hWnd,&gridrect);
//get rect of current cell
cellrect=GetCellRect(hWnd,SI,row,col);
if((cellrect.bottom > gridrect.bottom)&&((cellrect.bottom - cellrect.top)<(gridrect.bottom-(BGHS[SI].headerrowheight+BGHS[SI].titleheight))))
{
while(cellrect.bottom > gridrect.bottom)
{
BGHS[SI].homerow ++;
if(row==BGHS[SI].rows)
{
gridrect.top = gridrect.bottom - (BGHS[SI].rowheight);
InvalidateRect(hWnd,&gridrect,TRUE);
}
else
{
InvalidateRect(hWnd,&gridrect,FALSE);
}
cellrect=GetCellRect(hWnd,SI,row,col);
}
}
else
{
if((cellrect.bottom - cellrect.top)>=(gridrect.bottom - (BGHS[SI].headerrowheight+BGHS[SI].titleheight)))
{
BGHS[SI].homerow++;
}
}
cellrect=GetCellRect(hWnd,SI,row,col);
{
while((row < BGHS[SI].homerow))
{
BGHS[SI].homerow --;
InvalidateRect(hWnd,&gridrect,FALSE);
cellrect=GetCellRect(hWnd,SI,row,col);
}
}
//set the vertical scrollbar position
SetScrollPos(hWnd,SB_VERT,BGHS[SI].homerow,TRUE);
}
void SetHomeCol(HWND hWnd,int SI,int row,int col)
{
RECT gridrect,cellrect;
BOOL LASTCOLVISIBLE;
//get rect of grid window
GetClientRect(hWnd,&gridrect);
//get rect of current cell
cellrect = GetCellRect(hWnd,SI,row,col);
//determine if scroll left or right is needed
while((cellrect.right > gridrect.right)&&(cellrect.left != BGHS[SI].columnwidths[0]))
{
//scroll right is needed
BGHS[SI].homecol++;
//see if last column is visible
cellrect = GetCellRect(hWnd,SI,row,BGHS[SI].cols);
if(cellrect.right <= gridrect.right)
{
LASTCOLVISIBLE=TRUE;
}
else
{
LASTCOLVISIBLE=FALSE;
}
cellrect = GetCellRect(hWnd,SI,row,col);
InvalidateRect(hWnd,&gridrect,FALSE);
}
cellrect = GetCellRect(hWnd,SI,row,col);
while((BGHS[SI].cursorcol < BGHS[SI].homecol)&&(BGHS[SI].homecol > 1))
{
//scroll left is needed
BGHS[SI].homecol--;
//see if last column is visible
cellrect = GetCellRect(hWnd,SI,row,BGHS[SI].cols);
if(cellrect.right <= gridrect.right)
{
LASTCOLVISIBLE=TRUE;
}
else
{
LASTCOLVISIBLE=FALSE;
}
cellrect = GetCellRect(hWnd,SI,row,col);
InvalidateRect(hWnd,&gridrect,FALSE);
}
{
int k;
k=HomeColumnNthVisible(SI);
SetScrollPos(hWnd,SB_HORZ,k,TRUE);
}
}
void ShowVscroll(HWND hWnd,int SI)
{
//if more rows than can be visible on grid, display vertical scrollbar
//otherwise, hide it.
RECT gridrect;
int totalpixels;
int rowsvisibleonscreen;
GetClientRect(hWnd,&gridrect);
totalpixels = gridrect.bottom;
totalpixels -= BGHS[SI].titleheight;
totalpixels -= BGHS[SI].headerrowheight;
totalpixels -= (BGHS[SI].rowheight * BGHS[SI].rows);
rowsvisibleonscreen = (gridrect.bottom - (BGHS[SI].headerrowheight+BGHS[SI].titleheight)) / BGHS[SI].rowheight;
if(totalpixels < 0)
{
//show vscrollbar
ShowScrollBar(hWnd,SB_VERT,TRUE);
SetScrollRange(hWnd,SB_VERT,1,(BGHS[SI].rows-rowsvisibleonscreen)+1,TRUE);
BGHS[SI].VSCROLL = TRUE;
}
else
{
//hide vscrollbar
ShowScrollBar(hWnd,SB_VERT,FALSE);
BGHS[SI].VSCROLL = FALSE;
}
}
void ShowHscroll(HWND hWnd,int SI)
{
//if more rows than can be visible on grid, display vertical scrollbar
//otherwise, hide it.
RECT gridrect;
int totalpixels;
int colswithwidth;
int j;
GetClientRect(hWnd,&gridrect);
totalpixels = gridrect.right;
totalpixels -= BGHS[SI].columnwidths[0];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -