mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-02-07 19:37:00 +08:00
368 lines
12 KiB
C
368 lines
12 KiB
C
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IMPORTANT NOTICE
|
|
//
|
|
// The following open source license statement does not apply to any
|
|
// entity in the Exception List published by FMSoft.
|
|
//
|
|
// For more information, please visit:
|
|
//
|
|
// https://www.fmsoft.cn/exception-list
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/*
|
|
* This file is part of MiniGUI, a mature cross-platform windowing
|
|
* and Graphics User Interface (GUI) support system for embedded systems
|
|
* and smart IoT devices.
|
|
*
|
|
* Copyright (C) 2002~2018, Beijing FMSoft Technologies Co., Ltd.
|
|
* Copyright (C) 1998~2002, WEI Yongming
|
|
*
|
|
* 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 3 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, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Or,
|
|
*
|
|
* As this program is a library, any link to this program must follow
|
|
* GNU General Public License version 3 (GPLv3). If you cannot accept
|
|
* GPLv3, you need to be licensed from FMSoft.
|
|
*
|
|
* If you have got a commercial license of this program, please use it
|
|
* under the terms and conditions of the commercial license.
|
|
*
|
|
* For more information about the commercial license, please refer to
|
|
* <http://www.minigui.com/blog/minigui-licensing-policy/>.
|
|
*/
|
|
/*
|
|
** static.c: the Static Control module.
|
|
**
|
|
** Create date: 1999/5/22
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "common.h"
|
|
|
|
#ifdef _MGCTRL_STATIC
|
|
|
|
#include "minigui.h"
|
|
#include "gdi.h"
|
|
#include "window.h"
|
|
#include "ctrl/ctrlhelper.h"
|
|
#include "ctrl/static.h"
|
|
#include "cliprect.h"
|
|
#include "internals.h"
|
|
#include "ctrlclass.h"
|
|
|
|
#include "static_impl.h"
|
|
|
|
static LRESULT
|
|
StaticControlProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
RECT rcClient;
|
|
HDC hdc;
|
|
const char* spCaption;
|
|
PCONTROL pCtrl;
|
|
UINT uFormat = DT_TOP;
|
|
DWORD dwStyle;
|
|
BOOL needShowCaption = TRUE;
|
|
|
|
pCtrl = gui_Control (hwnd);
|
|
switch (message) {
|
|
case MSG_CREATE:
|
|
#ifdef __TARGET_MSTUDIO__
|
|
SetWindowBkColor (hwnd,
|
|
GetWindowElementPixelEx (hwnd,
|
|
HDC_INVALID, WE_MAINC_THREED_BODY));
|
|
#endif
|
|
|
|
pCtrl->dwAddData2 = pCtrl->dwAddData;
|
|
SetWindowBkColor (hwnd, GetWindowElementPixelEx (hwnd,
|
|
HDC_INVALID, WE_MAINC_THREED_BODY));
|
|
/* DK[01/11/10]: For bug 4336 */
|
|
switch (pCtrl->dwStyle & SS_TYPEMASK) {
|
|
case SS_GRAYRECT:
|
|
pCtrl->iBkColor = DWORD2PixelByWindow (hwnd, RGBA_lightgray);
|
|
break;
|
|
case SS_BLACKRECT:
|
|
pCtrl->iBkColor = DWORD2PixelByWindow (hwnd, RGBA_black);
|
|
break;
|
|
case SS_WHITERECT:
|
|
pCtrl->iBkColor = DWORD2PixelByWindow (hwnd, RGBA_lightwhite);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
|
|
case STM_GETIMAGE:
|
|
return (int)(pCtrl->dwAddData2);
|
|
|
|
case STM_SETIMAGE:
|
|
{
|
|
int pOldValue;
|
|
|
|
pOldValue = (int)(pCtrl->dwAddData2);
|
|
pCtrl->dwAddData2 = (DWORD)wParam;
|
|
InvalidateRect (hwnd, NULL,
|
|
(GetWindowStyle (hwnd) & SS_TYPEMASK) == SS_ICON);
|
|
return pOldValue;
|
|
}
|
|
|
|
case MSG_GETDLGCODE:
|
|
return DLGC_STATIC;
|
|
|
|
case MSG_PAINT:
|
|
hdc = BeginPaint (hwnd);
|
|
SelectFont (hdc, GetWindowFont(hwnd));
|
|
|
|
GetClientRect (hwnd, &rcClient);
|
|
dwStyle = GetWindowStyle (hwnd);
|
|
if (dwStyle & WS_DISABLED)
|
|
SetTextColor (hdc, GetWindowElementPixelEx (hwnd, hdc, WE_FGC_DISABLED_ITEM));
|
|
else
|
|
SetTextColor (hdc, GetWindowElementPixelEx (hwnd, hdc, WE_FGC_WINDOW));
|
|
|
|
// DK[11/01/2010]: For fix bug 4336
|
|
switch (dwStyle & SS_TYPEMASK)
|
|
{
|
|
case SS_SIMPLE:
|
|
spCaption = GetWindowCaption (hwnd);
|
|
if (spCaption && !(dwStyle & SS_ALIGNMASK)) {
|
|
SetBkMode (hdc, BM_TRANSPARENT);
|
|
TextOut (hdc, 0, 0, spCaption);
|
|
needShowCaption = FALSE;
|
|
}
|
|
break;
|
|
|
|
case SS_GRAYRECT:
|
|
SetBrushColor (hdc, PIXEL_lightgray);
|
|
FillBox (hdc, 0, 0, rcClient.right, rcClient.bottom);
|
|
break;
|
|
|
|
case SS_BLACKRECT:
|
|
SetBrushColor (hdc, PIXEL_black);
|
|
FillBox (hdc, 0, 0, rcClient.right, rcClient.bottom);
|
|
break;
|
|
|
|
case SS_WHITERECT:
|
|
SetBrushColor (hdc, PIXEL_lightwhite);
|
|
FillBox (hdc, 0, 0, rcClient.right, rcClient.bottom);
|
|
break;
|
|
|
|
case SS_BLACKFRAME:
|
|
SetPenColor (hdc, PIXEL_black);
|
|
Rectangle (hdc, 0, 0, rcClient.right - 1, rcClient.bottom - 1);
|
|
break;
|
|
|
|
case SS_GRAYFRAME:
|
|
SetPenColor (hdc, PIXEL_lightgray);
|
|
Rectangle (hdc, 0, 0, rcClient.right - 1, rcClient.bottom - 1);
|
|
break;
|
|
|
|
case SS_WHITEFRAME:
|
|
SetPenColor (hdc, PIXEL_lightwhite);
|
|
Rectangle (hdc, 0, 0, rcClient.right - 1, rcClient.bottom - 1);
|
|
break;
|
|
|
|
case SS_GROUPBOX:
|
|
{
|
|
WINDOWINFO *info;
|
|
DWORD color;
|
|
|
|
spCaption = GetWindowCaption (hwnd);
|
|
|
|
if (spCaption)
|
|
{
|
|
SIZE size;
|
|
RECT rect;
|
|
if (GetWindowExStyle (hwnd) & WS_EX_TRANSPARENT)
|
|
SetBkMode(hdc, BM_TRANSPARENT);
|
|
else
|
|
SetBkMode (hdc, BM_OPAQUE);
|
|
|
|
SetBkColor(hdc, GetWindowBkColor (hwnd));
|
|
|
|
TextOut (hdc, pCtrl->pLogFont->size, 2, spCaption);
|
|
|
|
GetTextExtent (hdc, spCaption, -1, &size);
|
|
rect.left = pCtrl->pLogFont->size - 1;
|
|
rect.right = rect.left + size.cx + 2;
|
|
rect.top = 0;
|
|
rect.bottom = size.cy;
|
|
ExcludeClipRect (hdc, &rect);
|
|
needShowCaption = FALSE;
|
|
}
|
|
|
|
info = (WINDOWINFO*)GetWindowInfo (hwnd);
|
|
color = GetWindowElementAttr (hwnd, WE_MAINC_THREED_BODY);
|
|
rcClient.top += (pCtrl->pLogFont->size >> 1);
|
|
info->we_rdr->draw_3dbox (hdc,
|
|
&rcClient, color, LFRDR_BTN_STATUS_NORMAL);
|
|
}
|
|
break;
|
|
|
|
case SS_BITMAP:
|
|
if (pCtrl->dwAddData2) {
|
|
int x = 0, y = 0, w, h;
|
|
PBITMAP bmp = (PBITMAP)(pCtrl->dwAddData2);
|
|
|
|
if (dwStyle & SS_REALSIZEIMAGE) {
|
|
w = bmp->bmWidth;
|
|
h = bmp->bmHeight;
|
|
if (dwStyle & SS_CENTERIMAGE) {
|
|
x = (rcClient.right - w) >> 1;
|
|
y = (rcClient.bottom - h) >> 1;
|
|
}
|
|
}
|
|
else {
|
|
x = y = 0;
|
|
w = RECTW (rcClient);
|
|
h = RECTH (rcClient);
|
|
}
|
|
|
|
FillBoxWithBitmap(hdc, x, y, w, h, bmp);
|
|
needShowCaption = FALSE;
|
|
}
|
|
break;
|
|
|
|
case SS_ICON:
|
|
if (pCtrl->dwAddData2) {
|
|
int x = 0, y = 0, w, h;
|
|
HICON hIcon = (HICON)(pCtrl->dwAddData2);
|
|
|
|
if (dwStyle & SS_REALSIZEIMAGE) {
|
|
GetIconSize (hIcon, &w, &h);
|
|
if (dwStyle & SS_CENTERIMAGE) {
|
|
x = (rcClient.right - w) >> 1;
|
|
y = (rcClient.bottom - h) >> 1;
|
|
}
|
|
}
|
|
else {
|
|
x = y = 0;
|
|
w = RECTW (rcClient);
|
|
h = RECTH (rcClient);
|
|
}
|
|
|
|
DrawIcon (hdc, x, y, w, h, hIcon);
|
|
needShowCaption = FALSE;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (needShowCaption) {
|
|
uFormat = DT_TOP;
|
|
switch (dwStyle & SS_ALIGNMASK) {
|
|
case SS_LEFT:
|
|
uFormat |= DT_LEFT;
|
|
break;
|
|
case SS_CENTER:
|
|
uFormat |= DT_CENTER;
|
|
break;
|
|
case SS_RIGHT:
|
|
uFormat |= DT_RIGHT;
|
|
break;
|
|
}
|
|
|
|
if (dwStyle & SS_LEFTNOWORDWRAP) {
|
|
uFormat |= DT_SINGLELINE | DT_EXPANDTABS;
|
|
}
|
|
else {
|
|
uFormat |= DT_WORDBREAK;
|
|
}
|
|
|
|
if (dwStyle & SS_NOPREFIX)
|
|
uFormat |= DT_NOPREFIX;
|
|
|
|
spCaption = GetWindowCaption (hwnd);
|
|
|
|
if (spCaption) {
|
|
SetBkMode (hdc, BM_TRANSPARENT);
|
|
DrawText (hdc, spCaption, -1, &rcClient, uFormat);
|
|
}
|
|
}
|
|
|
|
EndPaint (hwnd, hdc);
|
|
return 0;
|
|
|
|
case MSG_LBUTTONDBLCLK:
|
|
if (GetWindowStyle (hwnd) & SS_NOTIFY)
|
|
NotifyParent (hwnd, pCtrl->id, STN_DBLCLK);
|
|
break;
|
|
|
|
case MSG_LBUTTONDOWN:
|
|
if (GetWindowStyle (hwnd) & SS_NOTIFY)
|
|
NotifyParent (hwnd, pCtrl->id, STN_CLICKED);
|
|
break;
|
|
|
|
case MSG_NCLBUTTONDBLCLK:
|
|
break;
|
|
|
|
case MSG_NCLBUTTONDOWN:
|
|
break;
|
|
|
|
case MSG_HITTEST:
|
|
dwStyle = GetWindowStyle (hwnd);
|
|
if ((dwStyle & SS_TYPEMASK) == SS_GROUPBOX)
|
|
return HT_TRANSPARENT;
|
|
|
|
if (GetWindowStyle (hwnd) & SS_NOTIFY)
|
|
return HT_CLIENT;
|
|
else
|
|
return HT_OUT;
|
|
break;
|
|
|
|
case MSG_FONTCHANGED:
|
|
InvalidateRect (hwnd, NULL, TRUE);
|
|
return 0;
|
|
|
|
case MSG_SETTEXT:
|
|
SetWindowCaption (hwnd, (char*)lParam);
|
|
InvalidateRect (hwnd, NULL, TRUE);
|
|
return 0;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return DefaultControlProc (hwnd, message, wParam, lParam);
|
|
}
|
|
|
|
BOOL RegisterStaticControl (void)
|
|
{
|
|
WNDCLASS WndClass;
|
|
|
|
WndClass.spClassName = CTRL_STATIC;
|
|
WndClass.dwStyle = WS_NONE;
|
|
WndClass.dwExStyle = WS_EX_NONE;
|
|
WndClass.hCursor = GetSystemCursor (IDC_ARROW);
|
|
#ifdef _MGSCHEMA_COMPOSITING
|
|
WndClass.dwBkColor = GetWindowElementAttr (HWND_NULL,
|
|
WE_MAINC_THREED_BODY);
|
|
#else
|
|
WndClass.iBkColor = GetWindowElementPixelEx (HWND_NULL,
|
|
HDC_SCREEN, WE_MAINC_THREED_BODY);
|
|
#endif
|
|
WndClass.WinProc = StaticControlProc;
|
|
|
|
return gui_AddNewControlClass (&WndClass) == ERR_OK;
|
|
}
|
|
|
|
#endif /* _MGCTRL_STATIC */
|
|
|