📄 static.c
字号:
/*
* Copyright (C) 1999, 2000, Wei Yongming.
* Portions Copyright (c) 2000 Greg Haerr <greg@censoft.com>
*
* Static control for Microwindows win32 api.
*/
/*
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Library General Public
** License as published by the Free Software Foundation; either
** version 2 of the License, or (at your option) any later version.
**
** This library 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
** Library General Public License for more details.
**
** You should have received a copy of the GNU Library General Public
** License along with this library; if not, write to the Free
** Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
** MA 02111-1307, USA
*/
/*
** Alternatively, the contents of this file may be used under the terms
** of the Mozilla Public License (the "MPL License") in which case the
** provisions of the MPL License are applicable instead of those above.
*/
/* Create date: 1999/5/22
**
** Modify records:
**
** Who When Where For What Status
**-----------------------------------------------------------------------------
** WEI Yongming 1999/8/21 Tsinghua Rearrangment Finished
** WEI Yongming 1999/10/27 Tsinghua SETTEXT bug Finished
** WEI Yongming 1999/10/27 Tsinghua SETTEXT bug Finished
** WEI Yongming 2000/02/24 Tsinghua Add MPL License Finished
** Kevin Tseng 2000/06/26 gv port to microwin ported
** Greg Haerr 2000/07/05 Utah bug fixes Finished
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MWINCLUDECOLORS
#include "windows.h" /* windef.h, winuser.h */
#include "wintools.h"
#include "device.h" /* GdGetTextSize */
/* jmt: should be SYSTEM_FIXED_FONT because of minigui's GetSysCharXXX() */
#define FONT_NAME SYSTEM_FIXED_FONT /* was DEFAULT_GUI_FONT*/
static LRESULT CALLBACK
StaticControlProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI MwRegisterStaticControl(HINSTANCE hInstance)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_GLOBALCLASS;
wc.lpfnWndProc = (WNDPROC)StaticControlProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = 0; /*LoadCursor(NULL, IDC_ARROW);*/
wc.hbrBackground= GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName= "STATIC";
return RegisterClass(&wc);
}
#if 1
#define RECTW(rc) (rc.right-rc.left)
#define RECTH(rc) (rc.bottom-rc.top)
static DWORD GetWindowStyle (HWND hwnd)
{
return hwnd->style;
}
static COLORREF GetWindowBkColor (HWND hwnd)
{
MWBRUSHOBJ *hbr;
hbr=(MWBRUSHOBJ *)hwnd->pClass->hbrBackground;
return hbr->color;
}
static char *GetWindowCaption (HWND hwnd)
{
return hwnd->szTitle;
}
static void SetWindowCaption (HWND hwnd,char *caption)
{
if (strlen(caption)<=63) /* mw: szTitle[64] */
strcpy(hwnd->szTitle,caption);
else
{
strncpy(hwnd->szTitle,caption,63);
hwnd->szTitle[63]='\0';
}
}
static int GetSysCharHeight (HWND hwnd)
{
HDC hdc;
int xw, xh, xb;
hdc = GetDC(hwnd);
SelectObject(hdc, GetStockObject(FONT_NAME));
#if MWCLIENT /* nanox client */
GrGetGCTextSize(hdc->gc, "X", 1, MWTF_ASCII, &xw, &xh, &xb);
#else
GdGetTextSize(hdc->font->pfont,"X",1, &xw,&xh,&xb,MWTF_ASCII);
#endif
ReleaseDC(hwnd,hdc);
return xh;
}
static int GetSysCharWidth (HWND hwnd)
{
HDC hdc;
int xw, xh, xb;
hdc = GetDC(hwnd);
SelectObject(hdc, GetStockObject(FONT_NAME));
#if MWCLIENT /* nanox client */
GrGetGCTextSize(hdc->gc, "X", 1, MWTF_ASCII, &xw, &xh, &xb);
#else
GdGetTextSize(hdc->font->pfont,"X",1, &xw,&xh,&xb,MWTF_ASCII);
#endif
ReleaseDC(hwnd,hdc);
return xw;
}
#endif
static LRESULT CALLBACK
StaticControlProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
RECT rcClient;
HDC hdc;
char* spCaption;
HWND pCtrl;
UINT uFormat;
DWORD dwStyle;
pCtrl = hwnd;
switch (message) {
case WM_CREATE:
return 0;
case WM_DESTROY:
break;
case STM_GETIMAGE:
return (int)(pCtrl->userdata);
case STM_SETIMAGE:
{
int pOldValue;
pOldValue = (int)(pCtrl->userdata);
pCtrl->userdata = (DWORD)wParam;
InvalidateRect (hwnd, NULL, FALSE);
return pOldValue;
}
case WM_GETDLGCODE:
return DLGC_STATIC;
case WM_PAINT:
{
PAINTSTRUCT ps;
RECT rc;
HBRUSH hbr;
hdc = BeginPaint (hwnd,&ps);
GetClientRect (hwnd, &rcClient);
FastFillRect(hdc, &rcClient, GetSysColor(COLOR_BTNFACE));
dwStyle = GetWindowStyle (hwnd);
switch (dwStyle & SS_TYPEMASK)
{
case SS_GRAYRECT:
#if 0
SetBrushColor (hdc, LTGRAY);
FillBox(hdc, 0, 0, RECTW(rcClient), RECTH(rcClient));
#else
rc.left=0; rc.top=0; rc.bottom=RECTH(rcClient); rc.right=RECTW(rcClient);
FillRect(hdc,&rc,GetStockObject(LTGRAY_BRUSH));
#endif
break;
case SS_GRAYFRAME:
#if 0
Draw3DDownFrame (hdc,
0, 0, rcClient.right, rcClient.bottom,
DKGRAY);
#else
Draw3dInset(hdc, 0, 0,
rcClient.right, rcClient.bottom);
#endif
break;
case SS_BITMAP:
#if 0 /* jmt: fix: no FillBoxWithBitmap() */
FillBoxWithBitmap(hdc, 0, 0, 0, 0,
(PBITMAP)(pCtrl->userdata));
#endif
break;
case SS_ICON:
#if 0 /* jmt: fix: no DrawIcon */
hIcon = (HICON)(pCtrl->userdata);
DrawIcon (hdc, 0, 0, 0, 0, hIcon);
#endif
break;
case SS_SIMPLE:
#if 0
SetBrushColor (hdc, GetWindowBkColor (hwnd));
FillBox (hdc, 0, 0, rcClient.right, rcClient.bottom);
#else
hbr=CreateSolidBrush(GetWindowBkColor(hwnd));
rc.left=0; rc.top=0; rc.bottom=rcClient.bottom; rc.right=rcClient.right;
FillRect(hdc,&rc,hbr);
DeleteObject(hbr);
#endif
if (dwStyle & WS_DISABLED)
SetTextColor (hdc, DKGRAY);
else
SetTextColor (hdc, BLACK);
SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));
spCaption = GetWindowCaption (hwnd);
if (spCaption)
{
SelectObject(hdc, GetStockObject(FONT_NAME));
TextOut (hdc, 0, 0, spCaption, -1);
}
break;
case SS_LEFT:
case SS_CENTER:
case SS_RIGHT:
case SS_LEFTNOWORDWRAP:
uFormat = DT_TOP;
if ( (dwStyle & SS_TYPEMASK) == SS_LEFT)
uFormat |= DT_LEFT | DT_WORDBREAK;
else if ( (dwStyle & SS_TYPEMASK) == SS_CENTER)
uFormat |= DT_CENTER | DT_WORDBREAK;
else if ( (dwStyle & SS_TYPEMASK) == SS_RIGHT)
uFormat |= DT_RIGHT | DT_WORDBREAK;
else if ( (dwStyle & SS_TYPEMASK) == SS_LEFTNOWORDWRAP)
uFormat |= DT_LEFT | DT_SINGLELINE | DT_EXPANDTABS;
if (dwStyle & WS_DISABLED)
SetTextColor (hdc, DKGRAY);
else
SetTextColor (hdc, BLACK);
#if 0
SetBkColor (hdc, GetWindowBkColor (hwnd));
#endif
SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));
spCaption = GetWindowCaption (hwnd);
if (dwStyle & SS_NOPREFIX)
uFormat |= DT_NOPREFIX;
if (spCaption)
{
SelectObject(hdc, GetStockObject(FONT_NAME));
DrawText (hdc, spCaption, -1, &rcClient, uFormat);
}
break;
case SS_GROUPBOX:
#if 0
Draw3DBorder (hdc, rcClient.left,
rcClient.top + (GetSysCharHeight(hwnd) >> 1),
rcClient.right, rcClient.bottom);
#else
Draw3dInset(hdc, rcClient.left,
rcClient.top+(GetSysCharHeight(hwnd) >> 1),
rcClient.right-rcClient.left,
rcClient.bottom-rcClient.top);
#endif
if (dwStyle & WS_DISABLED)
SetTextColor (hdc, DKGRAY);
else
SetTextColor (hdc, BLACK);
#if 0
SetBkColor(hdc, GetWindowBkColor (GetParent (hwnd)));
#endif
SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));
spCaption = GetWindowCaption (hwnd);
if (spCaption)
{
SelectObject(hdc, GetStockObject(FONT_NAME));
TextOut (hdc, GetSysCharWidth (hwnd), 2, spCaption, -1);
}
break;
}
EndPaint (hwnd, &ps);
}
break;
#if 0 /* jmt: SS_NOTIFY isn't standard in win32 */
case WM_LBUTTONDBLCLK:
if (GetWindowStyle (hwnd) & SS_NOTIFY)
SendMessage (GetParent(hwnd), WM_COMMAND,
(WPARAM)MAKELONG(pCtrl->id, STN_DBLCLK),
(LPARAM)hwnd);
break;
#endif
case WM_LBUTTONDOWN:
break;
case WM_NCLBUTTONDBLCLK:
break;
case WM_NCLBUTTONDOWN:
break;
case WM_NCHITTEST:
dwStyle = GetWindowStyle (hwnd);
if ((dwStyle & SS_TYPEMASK) == SS_GROUPBOX)
return HTTRANSPARENT;
#if 0 /* jmt: SS_NOTIFY isn't standard in win32 */
if (GetWindowStyle (hwnd) & SS_NOTIFY)
return HTCLIENT;
else
#endif
return HTNOWHERE;
break;
#if 0 /* jmt: fix: no WM_GETFONT/WM_SETFONT */
case WM_GETFONT:
break;
case WM_SETFONT:
break;
#endif
case WM_SETTEXT:
SetWindowCaption (hwnd, (char*)lParam);
InvalidateRect (hwnd, NULL, TRUE);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -