lsctrl.c
来自「CC386 is a general-purpose 32-bit C comp」· C语言 代码 · 共 564 行 · 第 1/2 页
C
564 行
}
else if (RANGE(temppt.y, r.top))
{
cursor = SetCursor(rcurs);
oncursor = HTTOPRIGHT;
}
else if (!oldCursor)
{
cursor = SetCursor(hcurs);
oncursor = HTRIGHT;
}
}
else if (RANGE(temppt.y, r.bottom - 1))
{
if (temppt.x == r.left)
{
cursor = SetCursor(rcurs);
oncursor = HTBOTTOMLEFT;
}
else
{
cursor = SetCursor(vcurs);
oncursor = HTBOTTOM;
}
}
else if (RANGE(temppt.x, r.left))
{
if (RANGE(temppt.y, r.top))
{
cursor = SetCursor(lcurs);
oncursor = HTTOPLEFT;
}
else
{
cursor = SetCursor(hcurs);
oncursor = HTLEFT;
}
}
else if (RANGE(temppt.y, r.top))
{
cursor = SetCursor(vcurs);
oncursor = HTTOP;
}
else if (oldCursor)
{
ReleaseCapture();
SetCursor(oldCursor);
oldCursor = 0;
oncursor = 0;
}
if (cursor && !oldCursor)
{
SetCapture(hwnd);
oldCursor = cursor;
}
}
break;
case WM_PAINT:
ptr = (CCW_params*)GetWindowLong(hwnd, 0);
dc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &r);
DrawBorder(dc, &r, ptr->vertical, TRUE);
if (!ptr->container)
{
DrawTitle(dc, &r, ptr->vertical);
}
EndPaint(hwnd, &ps);
break;
case WM_CREATE:
ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof
(CCW_params));
SetWindowLong(hwnd, 0, (DWORD)ptr);
*ptr = *(CCW_params*)(((LPCREATESTRUCT)lParam)->lpCreateParams);
ptr->self = hwnd;
ptr->type = LSCONTROL;
ptr->container = 0;
ptr->active = 0;
dmgrAddClient(ptr);
GetClientRect(hwnd, &r);
ptr->u.cw.closebutton = CreateWindow("BUTTON", "", WS_VISIBLE |
WS_CHILD | BS_PUSHBUTTON | BS_BITMAP, (!ptr->vertical ? r.right
- BUTTONCORNER - BUTTONWIDTH: BUTTONCORNER), BUTTONCORNER,
BUTTONWIDTH, BUTTONWIDTH, hwnd, (HMENU)64371, (HINSTANCE)
GetWindowLong(hwnd, GWL_HINSTANCE), 0);
ptr->u.cw.flexbutton = CreateWindow("BUTTON", "", WS_VISIBLE |
WS_CHILD | BS_PUSHBUTTON | BS_BITMAP, (!ptr->vertical ? r.right
- BUTTONCORNER - 2 * BUTTONWIDTH - 2: BUTTONCORNER), (!ptr
->vertical ? BUTTONCORNER : r.top + BUTTONCORNER + 2+2 *
BUTTONWIDTH), BUTTONWIDTH, BUTTONWIDTH, hwnd, (HMENU)64372,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 0);
ptr->u.cw.disabled = TRUE;
SetFlexBmp(ptr);
SendMessage(ptr->u.cw.closebutton, BM_SETIMAGE, IMAGE_BITMAP,
(LPARAM)closebitmap);
return 0;
case WM_DESTROY:
ptr = (CCW_params*)GetWindowLong(hwnd, 0);
dmgrRemoveClient(ptr);
DestroyWindow(ptr->u.cw.closebutton);
DestroyWindow(ptr->u.cw.flexbutton);
HeapFree(GetProcessHeap(), 0, ptr);
break;
case WM_CLOSE:
SendMessage(ptr->parent, WM_SYSCOMMAND, SC_CLOSE, 0);
return 0;
case LCF_CONTAINER:
ptr = (CCW_params*)GetWindowLong(hwnd, 0);
if (lParam == ptr->container)
return 0;
ptr->container = lParam;
if (ptr->container)
{
ShowWindow(ptr->u.cw.closebutton, SW_HIDE);
ShowWindow(ptr->u.cw.flexbutton, SW_HIDE);
}
else
{
ShowWindow(ptr->u.cw.closebutton, SW_SHOW);
ShowWindow(ptr->u.cw.flexbutton, SW_SHOW);
}
break;
case LCF_ADJUSTRECT:
ptr = (CCW_params*)GetWindowLong(hwnd, 0);
pr = (RECT*)lParam;
if (ptr->container)
{
pr->right -= EDGEWIDTH;
pr->left += EDGEWIDTH;
pr->top += EDGEWIDTH;
pr->bottom -= EDGEWIDTH;
}
else if (ptr->vertical)
{
pr->right -= EDGEWIDTH;
pr->left += TITLEWIDTH;
pr->top += EDGEWIDTH;
pr->bottom -= EDGEWIDTH;
}
else
{
pr->bottom -= EDGEWIDTH;
pr->top += TITLEWIDTH;
pr->left += EDGEWIDTH;
pr->right -= EDGEWIDTH;
}
return 0;
case LCF_SETFLEX:
ptr = (CCW_params*)GetWindowLong(hwnd, 0);
ptr->u.cw.disabled = !(int)lParam;
ptr->u.cw.flexed = (int)wParam;
SetFlexBmp(ptr);
return 0;
case LCF_SETVERTICAL:
ptr = (CCW_params*)GetWindowLong(hwnd, 0);
ptr->vertical = (int)lParam;
InvalidateRect(hwnd, 0, 1);
return 0;
case LCF_SETACTIVE:
#ifdef XXXXX
ptr = (CCW_params*)GetWindowLong(hwnd, 0);
if (ptr->active != !!lParam)
{
ptr->active = !!lParam;
InvalidateRect(hwnd, 0, 0);
}
#endif
return TRUE;
case WM_CTLCOLORBTN:
case WM_CTLCOLORDLG:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORLISTBOX:
case WM_CTLCOLORMSGBOX:
case WM_CTLCOLORSCROLLBAR:
case WM_CTLCOLORSTATIC:
ptr = (CCW_params*)GetWindowLong(hwnd, 0);
return SendMessage(ptr->parent, iMessage, wParam, lParam);
case WM_SIZE:
ptr = (CCW_params*)GetWindowLong(hwnd, 0);
SetFlexBmp(ptr);
if (ptr->vertical)
{
MoveWindow(ptr->u.cw.closebutton, BUTTONCORNER, BUTTONCORNER,
BUTTONWIDTH, BUTTONWIDTH, 0);
MoveWindow(ptr->u.cw.flexbutton, BUTTONCORNER, BUTTONCORNER +
BUTTONWIDTH + 2, BUTTONWIDTH, BUTTONWIDTH, 0);
}
else
{
MoveWindow(ptr->u.cw.closebutton, LOWORD(lParam) - BUTTONCORNER
- BUTTONWIDTH, BUTTONCORNER, BUTTONWIDTH, BUTTONWIDTH, 1);
MoveWindow(ptr->u.cw.flexbutton, LOWORD(lParam) - BUTTONCORNER
- 2 * BUTTONWIDTH - 2, BUTTONCORNER, BUTTONWIDTH,
BUTTONWIDTH, 1);
}
return 0;
case WM_DRAWITEM:
return SendMessage(GetParent(hwnd), iMessage, wParam, lParam);
}
return DefWindowProc(hwnd, iMessage, wParam, lParam);
}
//-------------------------------------------------------------------------
void RegisterControlWindow(HINSTANCE hInstance)
{
WNDCLASS wc;
memset(&wc, 0, sizeof(wc));
wc.style = 0;
wc.lpfnWndProc = &ControlWindWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(LPVOID);
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_INACTIVEBORDER));
wc.lpszMenuName = 0;
wc.lpszClassName = szControlWindClassName;
RegisterClass(&wc);
closebitmap = LoadBitmap(hInstance, "ID_CLOSEBMP");
ChangeBitmapColor(closebitmap, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
uparr = LoadBitmap(hInstance, "ID_UPARR");
ChangeBitmapColor(uparr, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
downarr = LoadBitmap(hInstance, "ID_DOWNARR");
ChangeBitmapColor(downarr, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
leftarr = LoadBitmap(hInstance, "ID_LEFTARR");
ChangeBitmapColor(leftarr, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
rightarr = LoadBitmap(hInstance, "ID_RIGHTARR");
ChangeBitmapColor(rightarr, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
uparrdis = LoadBitmap(hInstance, "ID_UPARRDIS");
ChangeBitmapColor(uparrdis, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
leftarrdis = LoadBitmap(hInstance, "ID_LEFTARRDIS");
ChangeBitmapColor(leftarrdis, 0xc0c0c0, GetSysColor(COLOR_INACTIVEBORDER));
hcurs = LoadCursor(NULL, IDC_SIZENS);
vcurs = LoadCursor(NULL, IDC_SIZENS);
lcurs = LoadCursor(NULL, IDC_SIZEWE);
rcurs = LoadCursor(NULL, IDC_SIZEWE);
mcurs = LoadCursor(NULL, IDC_SIZEALL);
}
//-------------------------------------------------------------------------
HWND CreateControlWindow(int id, HWND parent, RECT *r, int vertical, char
*title)
{
CCW_params p;
HWND hwnd;
RECT r1, r2;
char buf[256];
GetWindowText(parent, buf, 256);
memset(&p, 0, sizeof(p));
p.vertical = vertical;
p.parent = parent;
p.id = id;
p.title = title;
hwnd = CreateWindow(szControlWindClassName, buf, WS_CLIPSIBLINGS |
WS_VISIBLE | WS_CHILD, r->left, r->top, r->right - r->left, r->bottom -
r->top, parent, (HMENU)0, (HINSTANCE)GetWindowLong(parent,
GWL_HINSTANCE), &p);
return hwnd;
#ifdef XXXXX
GetWindowRect(hwnd, &r1);
GetRelativeRect(hwndClient, hwnd, &r1);
r2 = r1;
r2.left = r2.right = r2.right + GetSystemMetrics(SM_CXDLGFRAME);
r2.top -= GetSystemMetrics(SM_CYDLGFRAME);
r2.bottom += GetSystemMetrics(SM_CYDLGFRAME);
CreateFrameWindow(hwndClient, &r2, 1);
GetClientRect(hwndClient, &r2);
r1.left = 0;
r1.right = r2.right;
r1.top = r1.bottom = r1.bottom + GetSystemMetrics(SM_CYDLGFRAME);
CreateFrameWindow(hwndClient, &r1, 0);
return hwnd;
#endif
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?