📄 haictrl.c
字号:
return S_TRUE;
}
S_BOOL hai_SetFocusCtrl(SH_CTRL hCtrl)
{
return _hai_SetFocusCtrl(hCtrl, 1);
}
S_DWORD hai_SendCtrlEvt(SH_CTRL hCtrl, S_BYTE EventType, WPARAM wParam, LPARAM lParam)
{
return (((SP_CTRL)hCtrl)->CtrlProc(hCtrl, EventType, wParam, lParam));
}
#define CTRL_TEXT_DISPLAY_OFFSET 2
S_VOID hai_CtrlDrawText(SH_CTRL hCtrl, SH_DC hDC)
{
S_BYTE *pText, bkmode = BKM_TRANSPARENT;
S_WORD w, h;
S_SHORT x, y;
SP_CTRL pCtrl = (SP_CTRL)hCtrl;
S_COLOR textcolor = ((SP_DC)hDC)->TextColor;
if (!hCtrl || !hDC)
return;
if (pCtrl->CtrlType == CT_BUTTON)
{
if (!(pCtrl->ButtonData.pText))
return;
pText = pCtrl->ButtonData.pText;
hai_GetStringExtent(hDC, pCtrl->ButtonData.pText, &w, &h);
switch (pCtrl->style & BS_BTN_TYPE_MASK)
{
case BS_PUSHBTN:
case BS_SELECTBTN:
if ((pCtrl->style & BS_BTN_TYPE_MASK) == BS_PUSHBTN)
textcolor = (pCtrl->grayed? COLOR_GRAY15:COLOR_GRAY00);
if (h > pCtrl->h)
y = pCtrl->y;
else
{
if ((pCtrl->style & CS_TEXT_TB_MASK) == CS_TEXT_TOP)
y = pCtrl->y;
else if ((pCtrl->style & CS_TEXT_TB_MASK) == CS_TEXT_BUTTOM)
y = (pCtrl->y + pCtrl->h) - h;
else
y = pCtrl->y + (pCtrl->h - h)/2;
}
if (w > pCtrl->w)
x = pCtrl->x;
else
{
if ((pCtrl->style & CS_TEXT_LF_MASK) == CS_TEXT_LEFT)
x = pCtrl->x;
else if ((pCtrl->style & CS_TEXT_LF_MASK) == CS_TEXT_RIGHT)
x = (pCtrl->x + pCtrl->w) - w;
else
x = pCtrl->x + (pCtrl->w - w)/2;
}
break;
case BS_CHECKBTN:
case BS_RADIOBTN:
if (h > pCtrl->h)
y = pCtrl->y;
else
y = pCtrl->y + (pCtrl->h - h)/2;
if (w > pCtrl->w)
x = pCtrl->x;
else
x = pCtrl->x + CTRL_CHECKBTN_FLAG_W+6;
break;
default:
break;
}
}
else if (pCtrl->CtrlType == CT_STATIC)
{
if (!(pCtrl->StaticData.pText))
return;
pText = pCtrl->StaticData.pText;
hai_GetStringExtent(hDC, pText, &w, &h);
textcolor = ((SP_DC)hDC)->TextColor;
bkmode = ((SP_DC)hDC)->BkMode;
if (h > pCtrl->h)
y = pCtrl->y;
else
{
if ((pCtrl->style & CS_TEXT_TB_MASK) == CS_TEXT_TOP)
y = pCtrl->y;
else if ((pCtrl->style & CS_TEXT_TB_MASK) == CS_TEXT_BUTTOM)
y = (pCtrl->y + pCtrl->h) - h;
else
y = pCtrl->y + (pCtrl->h - h)/2;
}
if (w > pCtrl->w)
x = pCtrl->x;
else
{
if ((pCtrl->style & CS_TEXT_LF_MASK) == CS_TEXT_LEFT)
x = pCtrl->x;
else if ((pCtrl->style & CS_TEXT_LF_MASK) == CS_TEXT_RIGHT)
x = (pCtrl->x + pCtrl->w) - w;
else
x = pCtrl->x + (pCtrl->w - w)/2;
}
}
else if (pCtrl->CtrlType == CT_EDITBOX)
{
if (!(pCtrl->EditBoxData.pText))
return;
pText = pCtrl->EditBoxData.pText;
hai_GetStringExtent(hDC, pText, &w, &h);
textcolor = ((SP_DC)hDC)->TextColor;
bkmode = ((SP_DC)hDC)->BkMode;
if (h > pCtrl->h)
y = pCtrl->y;
else
{
// if ((pCtrl->style & CS_TEXT_TB_MASK) == CS_TEXT_TOP)
// y = pCtrl->y + CTRL_TEXT_DISPLAY_OFFSET;
// else if ((pCtrl->style & CS_TEXT_TB_MASK) == CS_TEXT_BUTTOM)
// y = (pCtrl->y + pCtrl->h) - h - CTRL_TEXT_DISPLAY_OFFSET;
// else
y = pCtrl->y + (pCtrl->h - h)/2;
}
if (w > pCtrl->w)
x = pCtrl->x;
else
{
// if ((pCtrl->style & CS_TEXT_LF_MASK) == CS_TEXT_LEFT)
x = pCtrl->x + CTRL_TEXT_DISPLAY_OFFSET;
// else if ((pCtrl->style & CS_TEXT_LF_MASK) == CS_TEXT_RIGHT)
// x = (pCtrl->x + pCtrl->w) - w - CTRL_TEXT_DISPLAY_OFFSET;
// else
// x = pCtrl->x + (pCtrl->w - w)/2;
}
}
else
return;
bkmode = hai_SetBkMode(hDC, bkmode);
textcolor = hai_SetTextColor(hDC, textcolor);
hai_TextOut(hDC, x, y, pText, 0);
hai_SetTextColor(hDC, textcolor);
hai_SetBkMode(hDC, bkmode);
}
//button
//
S_BOOL hai_SetButtonCtrlInfo(SH_CTRL hCtrl, S_BYTE *pText, S_BYTE *UpPicID, S_BYTE *DownPicID, S_BYTE *GrayPicID)
{
SP_CTRL pCtrl = (SP_CTRL)hCtrl;
if (!pCtrl || pCtrl->CtrlType != CT_BUTTON)
return S_FALSE;
if (pCtrl->ButtonData.pText)
hai_MemFree(pCtrl->ButtonData.pText);
pCtrl->ButtonData.pText = pText;
if (pText)
{
pCtrl->ButtonData.pText = hai_MemAlloc(hai_strlen(pText)+1);
if (!pCtrl->ButtonData.pText)
return S_FALSE;
hai_strcpy(pCtrl->ButtonData.pText, pText);
}
pCtrl->ButtonData.UpPicID = UpPicID;
pCtrl->ButtonData.DownPicID = DownPicID;
pCtrl->ButtonData.GrayPicID = GrayPicID;
return S_TRUE;
}
SH_CTRL hai_CreateButton(S_DWORD style, S_BYTE CtrlID, S_SHORT x, S_SHORT y, S_SHORT w, S_SHORT h, S_BYTE *pText, S_BYTE *UpPicID, S_BYTE *DownPicID, S_BYTE *GrayPicID)
{
S_BOOL ok;
SH_CTRL hCtrl;
hCtrl = hai_CreateCtrl(CT_BUTTON, CtrlID, style, x, y, w, h);
if (hCtrl)
ok = hai_SetButtonCtrlInfo(hCtrl, pText, UpPicID, DownPicID, GrayPicID);
if (hCtrl && !ok)
{
_hai_DestroyCtrl(hCtrl, S_FALSE);
hCtrl = S_NULL;
}
return hCtrl;
}
S_DWORD hai_PushBtnCtrlProc(SH_CTRL hCtrl, S_BYTE event, WPARAM wParam, LPARAM lParam)
{
SP_CTRL pCtrl = (SP_CTRL)hCtrl;
S_SHORT x, y;
switch (event)
{
case EVT_CREAT:
break;
case EVT_PAINT:
{
SH_DC hDC;
SH_BITMAP hTemp, hbitmap;
if (!pCtrl->visible)
break;
hDC = hai_GetSceneDC();
hai_SendEvent(EVT_CTRLCOLOR, (WPARAM)(pCtrl->CtrlID), (LPARAM)hDC);
if (pCtrl->grayed)
{
if (pCtrl->ButtonData.GrayPicID)
{
hTemp = hai_LoadBitmap((S_BYTE *)(pCtrl->ButtonData.GrayPicID));
hbitmap = hai_CreateFormatBitmap(hDC, hTemp);
hai_DeleteObject((SH_GDIOBJ)hTemp);
hai_DrawIcon(hDC, pCtrl->x, pCtrl->y, (SH_ICON)hbitmap);
hai_DeleteObject((SH_GDIOBJ)hbitmap);
}
else
hai_Draw3DBlock(hDC, pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h, BLOCK_3D_UP, DKGRAY_BRUSH);
}
else
{
if (pCtrl->state == BS_PUSHBTN_UP)
if (pCtrl->ButtonData.UpPicID)
{
hTemp = hai_LoadBitmap((S_BYTE *)(pCtrl->ButtonData.UpPicID));
hbitmap = hai_CreateFormatBitmap(hDC, hTemp);
hai_DeleteObject((SH_GDIOBJ)hTemp);
hai_DrawIcon(hDC, pCtrl->x, pCtrl->y, (SH_ICON)hbitmap);
hai_DeleteObject((SH_GDIOBJ)hbitmap);
}
else
{
hai_Draw3DBlock(hDC, pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h, BLOCK_3D_UP, GRAY_BRUSH);
}
else if (pCtrl->state == BS_PUSHBTN_DN)
if (pCtrl->ButtonData.DownPicID)
{
hTemp = hai_LoadBitmap((S_BYTE *)(pCtrl->ButtonData.DownPicID));
hbitmap = hai_CreateFormatBitmap(hDC, hTemp);
hai_DeleteObject((SH_GDIOBJ)hTemp);
hai_DrawIcon(hDC, pCtrl->x, pCtrl->y, (SH_ICON)hbitmap);
hai_DeleteObject((SH_GDIOBJ)hbitmap);
}
else
{
hai_Draw3DBlock(hDC, pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h, BLOCK_3D_DN, GRAY_BRUSH);
}
}
if (pCtrl->ButtonData.pText)
hai_CtrlDrawText(hCtrl, hDC);
if (!pCtrl->grayed && pCtrl->state == BS_PUSHBTN_UP && pCtrl->focus)
hai_DrawBoxByDashed(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y+2), (S_SHORT)(pCtrl->w-5), (S_SHORT)(pCtrl->h-5), COLOR_BLACK);
hai_ReleaseDC(hDC);
_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
}
break;
case EVT_TIMER:
break;
case EVT_KEYDN:
if (wParam == ' ' || wParam == VK_RETURN)
{
pCtrl->state = BS_PUSHBTN_DN;
_hai_SetFocusCtrl(hCtrl, S_FALSE);
hai_PushBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(BS_PUSHBTN_DN,pCtrl->CtrlID), 0);
}
else
hai_SendEvent(EVT_KEYDN, wParam, lParam);
break;
case EVT_KEYUP:
if (wParam == ' ' || wParam == VK_RETURN)
{
pCtrl->state = BS_PUSHBTN_UP;
hai_PushBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(BS_PUSHBTN_UP,pCtrl->CtrlID), 0);
}
else
hai_SendEvent(EVT_KEYUP, wParam, lParam);
break;
case EVT_CHAR:
break;
case EVT_SYSKEY:
break;
case EVT_DESTROY:
break;
case EVT_MOUSEDN:
hai_SetCapture(hCtrl);
pCtrl->state = BS_PUSHBTN_DN;
_hai_SetFocusCtrl(hCtrl, S_FALSE);
hai_PushBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(BS_PUSHBTN_DN,pCtrl->CtrlID), 0);
break;
case EVT_MOUSEUP:
pCtrl->state = BS_PUSHBTN_UP;
hai_PushBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(BS_PUSHBTN_UP,pCtrl->CtrlID), 0);
hai_ReleaseCapture();
break;
case EVT_MOUSEDB:
hai_ReleaseCapture();
break;
case EVT_MOUSEMV:
x = HAI_GETLOWORD(lParam);
y = HAI_GETHIWORD(lParam);
if (x>pCtrl->x && x<pCtrl->x+pCtrl->w && y>pCtrl->y && y<pCtrl->y+pCtrl->h)
{
if (pCtrl->state == BS_PUSHBTN_UP)
{
hai_SetCapture(hCtrl);
pCtrl->state = BS_PUSHBTN_DN;
_hai_SetFocusCtrl(hCtrl, S_FALSE);
hai_PushBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
}
}
else
{
((SP_CTRL)hCtrl)->state = BS_PUSHBTN_UP;
hai_PushBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
hai_ReleaseCapture();
}
break;
case EVT_RESTORE:
break;
case EVT_COMMAND:
break;
default:
break;
}
return 0;
}
S_VOID hai_DrawRight(SH_DC hDC, S_SHORT x, S_SHORT y)
{
hai_MoveTo(hDC, (S_SHORT)(x+1), (S_SHORT)(y+5), S_NULL);
hai_LineTo(hDC, (S_SHORT)(x+2), (S_SHORT)(y+5));
hai_MoveTo(hDC, (S_SHORT)(x+2), (S_SHORT)(y+6), S_NULL);
hai_LineTo(hDC, (S_SHORT)(x+3), (S_SHORT)(y+6));
hai_MoveTo(hDC, (S_SHORT)(x+3), (S_SHORT)(y+7), S_NULL);
hai_LineTo(hDC, (S_SHORT)(x+6), (S_SHORT)(y+7));
hai_MoveTo(hDC, (S_SHORT)(x+4), (S_SHORT)(y+8), S_NULL);
hai_LineTo(hDC, (S_SHORT)(x+5), (S_SHORT)(y+8));
hai_MoveTo(hDC, (S_SHORT)(x+6), (S_SHORT)(y+6), S_NULL);
hai_LineTo(hDC, (S_SHORT)(x+7), (S_SHORT)(y+6));
hai_MoveTo(hDC, (S_SHORT)(x+7), (S_SHORT)(y+5), S_NULL);
hai_LineTo(hDC, (S_SHORT)(x+8), (S_SHORT)(y+5));
hai_MoveTo(hDC, (S_SHORT)(x+8), (S_SHORT)(y+4), S_NULL);
hai_LineTo(hDC, (S_SHORT)(x+9), (S_SHORT)(y+4));
hai_MoveTo(hDC, (S_SHORT)(x+9), (S_SHORT)(y+3), S_NULL);
hai_LineTo(hDC, (S_SHORT)(x+10), (S_SHORT)(y+3));
}
S_DWORD hai_CheckBtnCtrlProc(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;
SH_BITMAP hTemp, hbitmap;
if (!pCtrl->visible)
break;
if (pCtrl->h < CTRL_CHECKBTN_FLAG_W)
pCtrl->h = CTRL_CHECKBTN_FLAG_W;
hDC = hai_GetSceneDC();
hai_SendEvent(EVT_CTRLCOLOR, (WPARAM)(pCtrl->CtrlID), (LPARAM)hDC);
hai_BitBlt(hDC, pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h, S_NULL, 0, 0, PATCOPY);
if (pCtrl->grayed)
{
if (pCtrl->ButtonData.GrayPicID)
{
hTemp = hai_LoadBitmap((S_BYTE *)(pCtrl->ButtonData.GrayPicID));
hbitmap = hai_CreateFormatBitmap(hDC, hTemp);
hai_DeleteObject((SH_GDIOBJ)hTemp);
hai_DrawIcon(hDC, pCtrl->x, pCtrl->y, (SH_ICON)hbitmap);
hai_DeleteObject((SH_GDIOBJ)hbitmap);
}
else
hai_Draw3DBlock(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y + (pCtrl->h-CTRL_CHECKBTN_FLAG_W)/2), CTRL_CHECKBTN_FLAG_W, CTRL_CHECKBTN_FLAG_W, BLOCK_3D_DN, GRAY_BRUSH);
}
else
{
if (pCtrl->state == BS_CHECKBTN_CHECKED)
if (pCtrl->ButtonData.UpPicID)
{
hTemp = hai_LoadBitmap((S_BYTE *)(pCtrl->ButtonData.UpPicID));
hbitmap = hai_CreateFormatBitmap(hDC, hTemp);
hai_DeleteObject((SH_GDIOBJ)hTemp);
hai_DrawIcon(hDC, pCtrl->x, pCtrl->y, (SH_ICON)hbitmap);
hai_DeleteObject((SH_GDIOBJ)hbitmap);
}
else
{
hai_Draw3DBlock(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y + (pCtrl->h-CTRL_CHECKBTN_FLAG_W)/2), CTRL_CHECKBTN_FLAG_W, CTRL_CHECKBTN_FLAG_W, BLOCK_3D_DN, WHITE_BRUSH);
hai_DrawRight(hDC, (S_SHORT)(pCtrl->x + 2), (S_SHORT)(pCtrl->y + (pCtrl->h-CTRL_CHECKBTN_FLAG_W)/2));
}
else if (pCtrl->state == BS_CHECKBTN_NOCHECK)
if (pCtrl->ButtonData.DownPicID)
{
hTemp = hai_LoadBitmap((S_BYTE *)(pCtrl->ButtonData.DownPicID));
hbitmap = hai_CreateFormatBitmap(hDC, hTemp);
hai_DeleteObject((SH_GDIOBJ)hTemp);
hai_DrawIcon(hDC, pCtrl->x, pCtrl->y, (SH_ICON)hbitmap);
hai_DeleteObject((SH_GDIOBJ)hbitmap);
}
else
{
hai_Draw3DBlock(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y + (pCtrl->h-CTRL_CHECKBTN_FLAG_W)/2), CTRL_CHECKBTN_FLAG_W, CTRL_CHECKBTN_FLAG_W, BLOCK_3D_DN, WHITE_BRUSH);
}
}
if (pCtrl->ButtonData.pText)
hai_CtrlDrawText(hCtrl, hDC);
if (!pCtrl->grayed && pCtrl->focus)
hai_DrawBoxByDashed(hDC, (S_SHORT)(pCtrl->x+2), (S_SHORT)(pCtrl->y+2), (S_SHORT)(pCtrl->w-5), (S_SHORT)(pCtrl->h-5), COLOR_BLACK);
hai_ReleaseDC(hDC);
_hai_ObjectUpdateRect(pCtrl->x, pCtrl->y, pCtrl->w, pCtrl->h);
}
break;
case EVT_TIMER:
break;
case EVT_SYSKEY:
break;
case EVT_DESTROY:
break;
case EVT_CHAR:
break;
case EVT_KEYUP:
if (wParam != ' ' && wParam != VK_RETURN)
hai_SendEvent(EVT_KEYUP, wParam, lParam);
break;
case EVT_KEYDN:
if (wParam != ' ' && wParam != VK_RETURN)
{
hai_SendEvent(EVT_KEYDN, wParam, lParam);
break;
}
case EVT_MOUSEDN:
pCtrl->state = !pCtrl->state;
_hai_SetFocusCtrl(hCtrl, S_FALSE);
hai_CheckBtnCtrlProc(hCtrl, EVT_PAINT, 0, 0);
hai_SendEvent(EVT_COMMAND, (WPARAM)HAI_COMBWORD(pCtrl->state,pCtrl->CtrlID), 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -