📄 haictrl.c
字号:
}
else if (y < pCtrl->y+BS_SCRLBAR_WIDTH+pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW)
{
if (pCtrl->ScrlBarData.ClickArea != 3)
{
hai_VScrlBarCtrlProc(hCtrl, EVT_MOUSEUP, wParam, lParam);
}
else
// if (pCtrl->ScrlBarData.ClickArea == 3)
{
pCtrl->ScrlBarData.PriorMouseY -= y;
if (pCtrl->ScrlBarData.PriorMouseY && pCtrl->ScrlBarData.TotalLine > pCtrl->ScrlBarData.LinePerPage)
{
if (pCtrl->ScrlBarData.PriorMouseY < 0 && pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW < pCtrl->h-BS_SCRLBAR_WIDTH*2)
{//the thumb down
pCtrl->ScrlBarData.ThumbPos += -pCtrl->ScrlBarData.PriorMouseY;
if (pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW > pCtrl->h-BS_SCRLBAR_WIDTH*2)
pCtrl->ScrlBarData.ThumbPos = (pCtrl->h-BS_SCRLBAR_WIDTH*2)-pCtrl->ScrlBarData.ThumbW;
}
else if (pCtrl->ScrlBarData.PriorMouseY > 0 && pCtrl->ScrlBarData.ThumbPos > 0)
{//the thumb up
if (pCtrl->ScrlBarData.ThumbPos > pCtrl->ScrlBarData.PriorMouseY)
pCtrl->ScrlBarData.ThumbPos -= pCtrl->ScrlBarData.PriorMouseY;
else
pCtrl->ScrlBarData.ThumbPos = 0;
}
hai_VScrlBarCtrlProc(hCtrl, EVT_RESTORE, 0, 0);
PreStart = 0;
if (pCtrl->ScrlBarData.TotalLine && pCtrl->ScrlBarData.TotalLine > pCtrl->ScrlBarData.LinePerPage)
{
PreStart = (pCtrl->ScrlBarData.ThumbPos + pCtrl->ScrlBarData.ThumbW) * pCtrl->ScrlBarData.TotalLine;
PreStart = PreStart / (pCtrl->h - BS_SCRLBAR_WIDTH*2);
if (PreStart > pCtrl->ScrlBarData.LinePerPage)
PreStart = PreStart - pCtrl->ScrlBarData.LinePerPage;
else
PreStart = 0;
if (pCtrl->ScrlBarData.PriorMouseY > 0)//the thumb up
{
PreStart += 1;
if (pCtrl->ScrlBarData.ThumbPos == 0)
PreStart = 0;
}
}
if (PreStart != pCtrl->ScrlBarData.CurStart)
hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_THUMBTRACK, pCtrl->CtrlID), PreStart);
}
pCtrl->ScrlBarData.PriorMouseY = y;
}
}
else if (y < pCtrl->y+pCtrl->h-BS_SCRLBAR_WIDTH)
{
if (pCtrl->ScrlBarData.ClickArea != 4)
{
hai_VScrlBarCtrlProc(hCtrl, EVT_MOUSEUP, wParam, lParam);
}
}
else
{
if (pCtrl->ScrlBarData.ClickArea != 5)
{
hai_VScrlBarCtrlProc(hCtrl, EVT_MOUSEUP, wParam, lParam);
}
}
}
_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
}
else
{
if (pCtrl->ScrlBarData.ClickArea == 3)
{
pCtrl->ScrlBarData.PriorMouseY -= y;
if (pCtrl->ScrlBarData.PriorMouseY && pCtrl->ScrlBarData.TotalLine > pCtrl->ScrlBarData.LinePerPage)
{
if (pCtrl->ScrlBarData.PriorMouseY < 0 && pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW < pCtrl->h-BS_SCRLBAR_WIDTH*2)
{
pCtrl->ScrlBarData.ThumbPos += -pCtrl->ScrlBarData.PriorMouseY;
if (pCtrl->ScrlBarData.ThumbPos+pCtrl->ScrlBarData.ThumbW > pCtrl->h-BS_SCRLBAR_WIDTH*2)
pCtrl->ScrlBarData.ThumbPos = (pCtrl->h-BS_SCRLBAR_WIDTH*2)-pCtrl->ScrlBarData.ThumbW;
}
else if (pCtrl->ScrlBarData.PriorMouseY > 0 && pCtrl->ScrlBarData.ThumbPos > 0)
{
if (pCtrl->ScrlBarData.ThumbPos > pCtrl->ScrlBarData.PriorMouseY)
pCtrl->ScrlBarData.ThumbPos -= pCtrl->ScrlBarData.PriorMouseY;
else
pCtrl->ScrlBarData.ThumbPos = 0;
}
hai_VScrlBarCtrlProc(hCtrl, EVT_RESTORE, 0, 0);
PreStart = 0;
if (pCtrl->ScrlBarData.TotalLine && pCtrl->ScrlBarData.TotalLine > pCtrl->ScrlBarData.LinePerPage)
{
PreStart = (pCtrl->ScrlBarData.ThumbPos + pCtrl->ScrlBarData.ThumbW) * pCtrl->ScrlBarData.TotalLine;
PreStart = PreStart / (pCtrl->h - BS_SCRLBAR_WIDTH*2);
if (PreStart > pCtrl->ScrlBarData.LinePerPage)
PreStart = PreStart - pCtrl->ScrlBarData.LinePerPage;
else
PreStart = 0;
if (pCtrl->ScrlBarData.PriorMouseY > 0)//the thumb up
{
PreStart += 1;
if (pCtrl->ScrlBarData.ThumbPos == 0)
PreStart = 0;
}
}
if (PreStart != pCtrl->ScrlBarData.CurStart)
hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_THUMBTRACK, pCtrl->CtrlID), PreStart);
}
pCtrl->ScrlBarData.PriorMouseY = y;
}
else
hai_VScrlBarCtrlProc(hCtrl, EVT_MOUSEUP, 0, 0);
}
hai_ReleaseDC(hDC);
break;
case EVT_RESTORE:
{
SH_DC hDC;
SH_BRUSH hBrush;
if (!pCtrl->visible)
break;
hDC = hai_GetSceneDC();
hBrush = (SH_BRUSH)hai_GetStockObject(LTGRAY_BRUSH);
hBrush = (SH_BRUSH)hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
hai_BitBlt(hDC, pCtrl->x, (S_SHORT)(pCtrl->y+BS_SCRLBAR_WIDTH), BS_SCRLBAR_WIDTH, (S_SHORT)(pCtrl->h-BS_SCRLBAR_WIDTH*2), S_NULL, 0, 0, PATCOPY);
hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
hai_Draw3DBlock(hDC, pCtrl->x, (S_SHORT)(pCtrl->y+pCtrl->ScrlBarData.ThumbPos+BS_SCRLBAR_WIDTH), BS_SCRLBAR_WIDTH, pCtrl->ScrlBarData.ThumbW, BLOCK_3D_UP, GRAY_BRUSH);
if (pCtrl->focus)
hai_DrawBoxByDashed(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y+pCtrl->ScrlBarData.ThumbPos+BS_SCRLBAR_WIDTH+2), (S_SHORT)(BS_SCRLBAR_WIDTH-5), (S_SHORT)(pCtrl->ScrlBarData.ThumbW-5), COLOR_BLACK);
hai_ReleaseDC(hDC);
_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
}
break;
case EVT_COMMAND:
break;
default:
break;
}
return 0;
}
S_DWORD hai_HScrlBarCtrlProc(SH_CTRL hCtrl, S_BYTE event, WPARAM wParam, LPARAM lParam)
{
SP_CTRL pCtrl = (SP_CTRL)hCtrl;
S_SHORT x, y, i;
switch (event)
{
case EVT_CREAT:
break;
case EVT_PAINT:
{
SH_DC hDC;
SH_BRUSH hBrush;
if (!pCtrl->visible)
break;
hDC = hai_GetSceneDC();
x = pCtrl->x;
y = pCtrl->y;
hai_Draw3DBlock(hDC, x, y, BS_SCRLBAR_WIDTH, BS_SCRLBAR_WIDTH, BLOCK_3D_UP, GRAY_BRUSH);
x += pCtrl->w - BS_SCRLBAR_WIDTH;
hai_Draw3DBlock(hDC, x, y, BS_SCRLBAR_WIDTH, BS_SCRLBAR_WIDTH, BLOCK_3D_UP, GRAY_BRUSH);
y = pCtrl->y + BS_SCRLBAR_WIDTH/2;
x = pCtrl->x+(BS_SCRLBAR_WIDTH-(BS_SCRLBAR_WIDTH+3)/4)/2-1;
for(i=0 ; i < (BS_SCRLBAR_WIDTH+3)/4+1; ++i)
_hai_DrawVLine(hDC, x++, (S_SHORT)(y-i), (S_SHORT)(y+i), COLOR_BLACK);
x = pCtrl->x+pCtrl->w-1-(BS_SCRLBAR_WIDTH-(BS_SCRLBAR_WIDTH+3)/4)/2+1;
for(i=0 ; i < (BS_SCRLBAR_WIDTH+3)/4+1; ++i)
_hai_DrawVLine(hDC, x--, (S_SHORT)(y-i), (S_SHORT)(y+i), COLOR_BLACK);
hBrush = (SH_BRUSH)hai_GetStockObject(LTGRAY_BRUSH);
hBrush = (SH_BRUSH)hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
hai_BitBlt(hDC, (S_SHORT)(pCtrl->x+BS_SCRLBAR_WIDTH), pCtrl->y, (S_SHORT)(pCtrl->w-BS_SCRLBAR_WIDTH*2), BS_SCRLBAR_WIDTH, S_NULL, 0, 0, PATCOPY);
hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
hai_Draw3DBlock(hDC, (S_SHORT)(pCtrl->x+pCtrl->ScrlBarData.ThumbPos+BS_SCRLBAR_WIDTH), pCtrl->y, pCtrl->ScrlBarData.ThumbW, BS_SCRLBAR_WIDTH, BLOCK_3D_UP, GRAY_BRUSH);
if (pCtrl->focus)
hai_DrawBoxByDashed(hDC, (S_SHORT)(pCtrl->x+pCtrl->ScrlBarData.ThumbPos+BS_SCRLBAR_WIDTH+2), (S_SHORT)(pCtrl->y+2), (S_SHORT)(pCtrl->ScrlBarData.ThumbW-5), BS_SCRLBAR_WIDTH-5, COLOR_BLACK);
hai_ReleaseDC(hDC);
_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
}
break;
case EVT_TIMER:
break;
case EVT_KEYDN:
switch (wParam)
{
case VK_END:
hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_BOTTOM,pCtrl->CtrlID), 0);
break;
case VK_HOME:
hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_TOP,pCtrl->CtrlID), 0);
break;
case VK_LEFT:
hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_LINEUP,pCtrl->CtrlID), 0);
break;
case VK_RIGHT:
hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(SB_LINEDOWN,pCtrl->CtrlID), 0);
break;
default:
hai_SendEvent(EVT_KEYDN, wParam, lParam);
break;
}
break;
case EVT_KEYUP:
switch (wParam)
{
case VK_END:
case VK_HOME:
case VK_LEFT:
case VK_RIGHT:
break;
default:
hai_SendEvent(EVT_KEYUP, wParam, lParam);
break;
}
break;
case EVT_CHAR:
break;
case EVT_SYSKEY:
break;
case EVT_DESTROY:
break;
case EVT_MOUSEDN:
break;
case EVT_MOUSEUP:
break;
case EVT_MOUSEDB:
break;
case EVT_MOUSEMV:
break;
case EVT_RESTORE:
{
SH_DC hDC;
SH_BRUSH hBrush;
if (!pCtrl->visible)
break;
hDC = hai_GetSceneDC();
hBrush = (SH_BRUSH)hai_GetStockObject(LTGRAY_BRUSH);
hBrush = (SH_BRUSH)hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
hai_BitBlt(hDC, (S_SHORT)(pCtrl->x+BS_SCRLBAR_WIDTH), pCtrl->y, (S_SHORT)(pCtrl->w-BS_SCRLBAR_WIDTH*2), BS_SCRLBAR_WIDTH, S_NULL, 0, 0, PATCOPY);
hai_SelectObject(hDC, (SH_GDIOBJ)hBrush);
hai_Draw3DBlock(hDC, (S_SHORT)(pCtrl->x+pCtrl->ScrlBarData.ThumbPos+BS_SCRLBAR_WIDTH), pCtrl->y, pCtrl->ScrlBarData.ThumbW, BS_SCRLBAR_WIDTH, BLOCK_3D_UP, GRAY_BRUSH);
if (pCtrl->focus)
hai_DrawBoxByDashed(hDC, (S_SHORT)(pCtrl->x+pCtrl->ScrlBarData.ThumbPos+BS_SCRLBAR_WIDTH+2), (S_SHORT)(pCtrl->y+2), (S_SHORT)(pCtrl->ScrlBarData.ThumbW-5), (S_SHORT)(BS_SCRLBAR_WIDTH-5), COLOR_BLACK);
hai_ReleaseDC(hDC);
_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
}
break;
case EVT_COMMAND:
break;
default:
break;
}
return 0;
}
S_DWORD hai_ScrlBarCtrlProc(SH_CTRL hCtrl, S_BYTE event, WPARAM wParam, LPARAM lParam)
{
if ((((SP_CTRL)hCtrl)->style&BS_SCRLBAR_VH_MASK) == BS_VSCRLBAR)
return hai_VScrlBarCtrlProc(hCtrl, event, wParam, lParam);
else
return hai_HScrlBarCtrlProc(hCtrl, event, wParam, lParam);
}
//static
//
S_BOOL hai_SetStaticCtrlInfo(SH_CTRL hCtrl, S_BYTE *pText, S_BYTE *PicID)
{
SP_CTRL pCtrl = (SP_CTRL)hCtrl;
if (!pCtrl || pCtrl->CtrlType != CT_STATIC)
return S_FALSE;
pCtrl->grayed = !!CS_GRAYED;
if (pCtrl->StaticData.pText)
hai_MemFree(pCtrl->StaticData.pText);
pCtrl->StaticData.pText = pText;
if (pText)
{
pCtrl->StaticData.pText = hai_MemAlloc(hai_strlen(pText)+1);
if (!pCtrl->StaticData.pText)
return S_FALSE;
hai_strcpy(pCtrl->StaticData.pText, pText);
}
pCtrl->StaticData.PicID = PicID;
return S_TRUE;
}
SH_CTRL hai_CreateStatic(S_DWORD style, S_BYTE CtrlID, S_SHORT x, S_SHORT y, S_SHORT w, S_SHORT h, S_BYTE *pText, S_BYTE *PicID)
{
S_BOOL ok;
SH_CTRL hCtrl;
hCtrl = hai_CreateCtrl(CT_STATIC, CtrlID, style, x, y, w, h);
if (hCtrl)
ok = hai_SetStaticCtrlInfo(hCtrl, pText, PicID);
if (hCtrl && !ok)
{
_hai_DestroyCtrl(hCtrl, S_FALSE);
hCtrl = S_NULL;
}
return hCtrl;
}
S_DWORD hai_StaticCtrlProc(SH_CTRL hCtrl, S_BYTE event, WPARAM wParam, LPARAM lParam)
{
SP_CTRL pCtrl = (SP_CTRL)hCtrl;
switch (event)
{
case EVT_CREAT:
break;
case EVT_PAINT:
{
SH_DC hDC;
if (!pCtrl->visible)
break;
hDC = hai_GetSceneDC();
hai_SendEvent(EVT_CTRLCOLOR, (WPARAM)(pCtrl->CtrlID), (LPARAM)hDC);
if (pCtrl->StaticData.PicID)
{
}
else
{
hai_BitBlt(hDC, pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h, S_NULL, 0, 0, PATCOPY);
}
if (pCtrl->StaticData.pText)
hai_CtrlDrawText(hCtrl, hDC);
hai_ReleaseDC(hDC);
_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
}
break;
case EVT_TIMER:
break;
case EVT_KEYDN:
break;
case EVT_KEYUP:
break;
case EVT_CHAR:
break;
case EVT_SYSKEY:
break;
case EVT_DESTROY:
break;
case EVT_MOUSEDN:
break;
case EVT_MOUSEUP:
break;
case EVT_MOUSEDB:
break;
case EVT_MOUSEMV:
break;
case EVT_RESTORE:
break;
case EVT_COMMAND:
break;
default:
break;
}
return 0;
}
//progress bar
//
#define PROGRESS_WH_OFFSET 3
S_BOOL hai_SetProgressCtrlInfo(SH_CTRL hCtrl, S_SHORT total, S_SHORT MinPos, S_SHORT CurPos, S_SHORT MaxPos, S_BYTE *BGPicID, S_BYTE *FGPicID)
{
SP_CTRL pCtrl = (SP_CTRL)hCtrl;
if (!pCtrl || pCtrl->CtrlType != CT_PROGRESS)
return S_FALSE;
if (total<2||MinPos<0||CurPos<0||MaxPos<0)
return S_FALSE;
if (total <= MaxPos ||MinPos >= MaxPos)
return S_FALSE;
if (pCtrl->w <= PROGRESS_WH_OFFSET<<1 || pCtrl->h <= PROGRESS_WH_OFFSET<<1)
return S_FALSE;
if ((pCtrl->style&BS_PROGRESS_VHMASK) == PBS_HPROGRESS)
{
if (pCtrl->w-(PROGRESS_WH_OFFSET<<1) < total)
return S_FALSE;
}
else //PBS_VPROGRESS
{
if (pCtrl->h-(PROGRESS_WH_OFFSET<<1) < total)
return S_FALSE;
}
if (CurPos < MinPos || CurPos > MaxPos)
CurPos = MinPos;
pCtrl->ProgressData.BGPicID = BGPicID;
pCtrl->ProgressData.FGPicID = FGPicID;
pCtrl->ProgressData.total = total;
pCtrl->ProgressData.MinPos = MinPos;
pCtrl->ProgressData.CurPos = CurPos;
pCtrl->ProgressData.MaxPos = MaxPos;
return S_TRUE;
}
SH_CTRL hai_CreateProgress(S_DWORD style, S_BYTE CtrlID, S_SHORT x, S_SHORT y, S_SHORT w, S_SHORT h, S_SHORT total, S_SHORT MinPos, S_SHORT CurPos, S_SHORT MaxPos, S_BYTE *BGPicID, S_BYTE *FGPicID)
{
S_BOOL ok;
SH_CTRL hCtrl;
hCtrl = hai_CreateCtrl(CT_PROGRESS, CtrlID, style, x, y, w, h);
if (hCtrl)
ok = hai_SetProgressCtrlInfo(hCtrl, total, MinPos, CurPos, MaxPos, BGPicID, FGPicID);
if (hCtrl && !ok)
{
_hai_DestroyCtrl(hCtrl, S_FALSE);
hCtrl = S_NULL;
}
return hCtrl;
}
S_SHORT hai_GetProgressCurPos(SH_CTRL hCtrl)
{
SP_CTRL pCtrl = (SP_CTRL)hCtrl;
if (!pCtrl || pCtrl->CtrlType != CT_PROGRESS)
return -1;
return pCtrl->ProgressData.CurPos;
}
S_BOOL hai_SetProgressCurPos(SH_CTRL hCtrl, S_SHORT CurPos)
{
SP_CTRL pCtrl = (SP_CTRL)hCtrl;
if (!pCtrl || pCtrl->CtrlType != CT_PROGRESS)
return S_FALSE;
if (CurPos < pCtrl->ProgressData.MinPos ||
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -