📄 toolbar.c
字号:
/*** $Id: toolbar.c,v 1.25 2003/09/04 02:40:36 weiym Exp $**** toolbar.c: the toolbar control module.**** Copyright (C) 2003 Feynman Software.** Copyright (C) 1999 ~ 2002 Wei Yongming.**** NOTE: Originally by Xu Fanglong.**** Create date: 2000/9/20*//*** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU General Public License as published by** the Free Software Foundation; either version 2 of the License, or** (at your option) any later version.**** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the** GNU General Public License for more details.**** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*//*** TODO:*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include "common.h"#include "minigui.h"#include "gdi.h"#include "window.h"#include "control.h"#include "cliprect.h"#include "internals.h"#include "ctrlclass.h"#ifdef _CTRL_TOOLBAR#include "ctrlmisc.h"#include "toolbar.h"static int ToolbarCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam);BOOL RegisterToolbarControl (void){ WNDCLASS WndClass; WndClass.spClassName = CTRL_TOOLBAR; WndClass.dwStyle = WS_NONE; WndClass.dwExStyle = WS_EX_NONE; WndClass.hCursor = GetSystemCursor (IDC_ARROW); WndClass.iBkColor = GetWindowElementColor (BKC_CONTROL_DEF); WndClass.WinProc = ToolbarCtrlProc; return AddNewControlClass (&WndClass) == ERR_OK;}static void DrawToolBox (HDC hdc, PTOOLBARCTRL pdata){ TOOLBARITEMDATA* tmpdata; tmpdata = pdata->head; while (tmpdata != NULL) { FillBoxWithBitmap (hdc, tmpdata->RcTitle.left , tmpdata->RcTitle.top, 0, 0, tmpdata->NBmp); tmpdata = tmpdata->next; }}static TOOLBARITEMDATA* GetCurTag(int posx,int posy, PTOOLBARCTRL pdata){ TOOLBARITEMDATA* tmpdata; tmpdata = pdata->head; while (tmpdata != NULL) { if (PtInRect (&tmpdata->RcTitle, posx, posy)) { return tmpdata; } tmpdata = tmpdata->next; } return NULL; }static void HilightToolBox (HWND hWnd, TOOLBARITEMDATA* pItemdata){ HDC hdc; hdc = GetClientDC (hWnd); FillBoxWithBitmap (hdc, pItemdata->RcTitle.left, pItemdata->RcTitle.top, 0,0, pItemdata->HBmp); ReleaseDC (hdc);}static void UnhilightToolBox (HWND hWnd, TOOLBARITEMDATA* pItemdata){ HDC hdc; hdc = GetClientDC (hWnd); FillBoxWithBitmap (hdc, pItemdata->RcTitle.left, pItemdata->RcTitle.top, 0, 0, pItemdata->DBmp); ReleaseDC (hdc);}static int ToolbarCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam){ HDC hdc; PCONTROL pCtrl; DWORD dwStyle; PTOOLBARCTRL TbarData; PTOOLBARITEMDATA pTbid; pCtrl = Control (hWnd); dwStyle = pCtrl->dwStyle; switch (message) { case MSG_CREATE: { DWORD data; data = GetWindowAdditionalData (hWnd); TbarData = (TOOLBARCTRL*) calloc (1, sizeof (TOOLBARCTRL)); TbarData->nCount = 0; TbarData->head = TbarData->tail = NULL; TbarData->iLBDn = 0; TbarData->ItemWidth = HIWORD(data); TbarData->ItemHeight = LOWORD(data); SetWindowAdditionalData2 (hWnd,(DWORD)TbarData); } break; case MSG_DESTROY: { TOOLBARITEMDATA* unloaddata, *tmp; TbarData=(PTOOLBARCTRL) GetWindowAdditionalData2(hWnd); unloaddata = TbarData->head; while (unloaddata != NULL) { UnloadBitmap ((PBITMAP)(unloaddata->NBmp)); free ((PBITMAP)(unloaddata->NBmp)); if (unloaddata->HBmp != unloaddata->NBmp) { UnloadBitmap ((PBITMAP)(unloaddata->HBmp)); free ((PBITMAP)(unloaddata->HBmp)); } if (unloaddata->DBmp != unloaddata->NBmp) { UnloadBitmap ((PBITMAP)(unloaddata->DBmp)); free ((PBITMAP)(unloaddata->DBmp)); } tmp = unloaddata->next; free (unloaddata); unloaddata = tmp; } free (TbarData); break; } case MSG_PAINT: { TbarData = (PTOOLBARCTRL)GetWindowAdditionalData2(hWnd); hdc = BeginPaint (hWnd); DrawToolBox (hdc, TbarData); EndPaint (hWnd, hdc); return 0; } case TBM_ADDITEM: { TOOLBARITEMINFO* TbarInfo = NULL; TOOLBARITEMDATA* ptemp; RECT rc; TbarData=(PTOOLBARCTRL) GetWindowAdditionalData2(hWnd); TbarInfo = (TOOLBARITEMINFO*) lParam; GetClientRect (hWnd, &rc); ptemp = (TOOLBARITEMDATA*)malloc (sizeof (TOOLBARITEMDATA)); ptemp->id = TbarInfo->id; if (TbarData->tail == NULL) ptemp->RcTitle.left = 0; else ptemp->RcTitle.left = TbarData->tail->RcTitle.right; ptemp->RcTitle.right = ptemp->RcTitle.left + TbarData->ItemWidth; ptemp->RcTitle.top = 0; ptemp->RcTitle.bottom = ptemp->RcTitle.top + TbarData->ItemHeight; ptemp->NBmp = (BITMAP*)malloc (sizeof (BITMAP)); LoadBitmap (HDC_SCREEN, ptemp->NBmp, TbarInfo->NBmpPath); if (TbarInfo->HBmpPath [0]) { ptemp->HBmp = (BITMAP*)malloc (sizeof (BITMAP)); LoadBitmap (HDC_SCREEN, ptemp->HBmp, TbarInfo->HBmpPath); } else ptemp->HBmp = ptemp->NBmp; if (TbarInfo->DBmpPath [0]) { ptemp->DBmp = (BITMAP*)malloc (sizeof (BITMAP)); LoadBitmap (HDC_SCREEN, ptemp->DBmp, TbarInfo->DBmpPath); } else ptemp->DBmp = ptemp->NBmp; ptemp->next = NULL; if (TbarData->nCount == 0) TbarData->head = TbarData->tail = ptemp; else if (TbarData->nCount > 0) { TbarData->tail->next = ptemp; TbarData->tail = ptemp; } ptemp->insPos = TbarData->nCount; TbarData->nCount++; InvalidateRect (hWnd, NULL, FALSE); break; } case MSG_MOUSEMOVEIN: { TbarData = (PTOOLBARCTRL) GetWindowAdditionalData2(hWnd); if (!wParam) { hdc = GetClientDC (hWnd); DrawToolBox (hdc, TbarData); ReleaseDC (hdc); } break; } case MSG_LBUTTONDOWN: { int posx, posy; TbarData=(PTOOLBARCTRL) GetWindowAdditionalData2(hWnd); posx = LOSWORD (lParam); posy = HISWORD (lParam); if (GetCapture () == hWnd) break; SetCapture (hWnd); if ((pTbid = GetCurTag (posx,posy,TbarData)) == NULL) break; TbarData->iLBDn = 1; TbarData->iSel = pTbid->insPos; UnhilightToolBox (hWnd, GetCurTag (posx, posy, TbarData)); break; } case MSG_LBUTTONUP: { int x, y; TbarData=(PTOOLBARCTRL) GetWindowAdditionalData2(hWnd); x = LOSWORD(lParam); y = HISWORD(lParam); TbarData->iLBDn = 0; if (GetCapture() != hWnd) break; ReleaseCapture (); ScreenToClient (hWnd, &x, &y); if ((pTbid = GetCurTag(x, y, TbarData)) == NULL) { hdc = GetClientDC (hWnd); DrawToolBox (hdc, TbarData); ReleaseDC (hdc); break; } else HilightToolBox (hWnd, GetCurTag (x, y, TbarData)); InvalidateRect (hWnd, NULL, FALSE); if (TbarData->iSel == pTbid->insPos) NotifyParent (hWnd, pCtrl->id, pTbid->id); break; } case MSG_MOUSEMOVE: { int x, y; TbarData = (PTOOLBARCTRL) GetWindowAdditionalData2(hWnd); x = LOSWORD(lParam); y = HISWORD(lParam); if (TbarData->iLBDn == 1) ScreenToClient (hWnd, &x, &y); if (( pTbid = GetCurTag (x, y, TbarData)) == NULL) { hdc = GetClientDC (hWnd); DrawToolBox (hdc, TbarData); ReleaseDC (hdc); break; } if (TbarData->iMvOver != pTbid->insPos) { TbarData->iMvOver = pTbid->insPos; hdc = GetClientDC (hWnd); DrawToolBox (hdc, TbarData); ReleaseDC (hdc); } if (TbarData->iSel == pTbid->insPos && TbarData->iLBDn == 1) UnhilightToolBox (hWnd, GetCurTag (x, y, TbarData)); else if ( TbarData->iLBDn == 0 ) HilightToolBox (hWnd, GetCurTag(x, y, TbarData)); break; } } return DefaultControlProc (hWnd, message, wParam, lParam);}#endif /* _CTRL_TOOLBAR */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -