📄 ebcheckbox.c
字号:
// button.c: the Button Control module.
//
// Copyright (C) 2004 TCL Multimedia Electronics Research & Development Center
//
// Current maintainer: Tang jianbin.
/*
** 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: 2004/1/6
//
// Modify records:
//
// Who When Where For What Status
//-----------------------------------------------------------------------------
//
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>
#include <minigui/mywindows.h>
#include "ebcontrol.h"
#include "ebcheckbox.h"
static int EbCheckboxCtrlProc (HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam);
BOOL RegisterEBCheckBoxControl (void)
{
WNDCLASS WndClass;
WndClass.spClassName = "ebcheckbox";
WndClass.dwStyle = WS_NONE;
WndClass.dwExStyle = WS_EX_NONE;
WndClass.hCursor = GetSystemCursor (IDC_ARROW);
WndClass.iBkColor = PIXEL_yellow;
WndClass.WinProc = EbCheckboxCtrlProc;
return AddNewControlClass (&WndClass) == ERR_OK;
}
void EBCheckboxControlCleanup (void)
{
UnregisterWindowClass (CTRL_EBCHECKBOX);
}
static void PaintContent (HWND hWnd, HDC hdc, DWORD dwStyle, RECT* prcText)
{
UINT uFormat = DT_SINGLELINE | DT_VCENTER| DT_LEFT;
PEBCHECKBOXDATA pData = (PEBCHECKBOXDATA)GetWindowAdditionalData2(hWnd);
SetBkColor (hdc, GetWindowBkColor (hWnd));
SetBrushColor (hdc, GetWindowBkColor(hWnd));
SetBkMode (hdc, BM_TRANSPARENT);
if (dwStyle & WS_DISABLED)
{
RECT rc;
CopyRect(&rc, prcText);
SetTextColor (hdc, PIXEL_lightwhite);
OffsetRect (prcText, 1, 1);
DrawText (hdc, GetWindowCaption(hWnd), -1, prcText, uFormat);
SetTextColor (hdc, PIXEL_darkgray);
DrawText (hdc, GetWindowCaption(hWnd), -1, &rc, uFormat);
}
else
{
if (pData->textcolor)
SetTextColor (hdc, pData->textcolor);
else
SetTextColor (hdc, PIXEL_black);
DrawText (hdc, GetWindowCaption(hWnd), -1, prcText, uFormat);
}
}
static int EbCheckboxCtrlProc (HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam)
{
DWORD dwStyle = GetWindowStyle(hWnd);
PEBCHECKBOXDATA adddata2 = (PEBCHECKBOXDATA)GetWindowAdditionalData2(hWnd);
switch(uMsg)
{
case MSG_NCCREATE:
break;
case MSG_CREATE:
{
PEBCHECKBOXDATA pData;
pData = (EBCHECKBOXDATA*) calloc (1, sizeof(EBCHECKBOXDATA));
if (pData == NULL)
return -1;
SetWindowAdditionalData2(hWnd, pData);
pData->status = 0;
pData->textcolor = PIXEL_invalid;
break;
}
case MSG_DESTROY:
if (adddata2 != 0)
{
free ((void*) adddata2);
}
break;
case ECBM_CLICK:
{
DWORD dwState;
switch (dwStyle & ECBS_TYPEMASK)
{
case ECBS_RADIOBOX:
if (!(adddata2->status & ECBT_CHECKED))
SendMessage (hWnd, ECBM_SETCHECK, ECBT_CHECKED, 0);
break;
case ECBS_CHECKBOX:
if (adddata2->status & ECBT_CHECKED)
dwState = ECBT_UNCHECKED;
else
dwState = ECBT_CHECKED;
SendMessage (hWnd, ECBM_SETCHECK, (WPARAM)dwState, 0);
break;
default:
break;
}
InvalidateRect (hWnd, NULL, FALSE);
NotifyParent (hWnd, GetDlgCtrlID(hWnd), ECBN_CLICKED);
}
break;
case ECBM_GETCHECK:
return (adddata2->status & ECBT_CHECKED);
break;
case ECBM_GETSTATE:
return (int)(adddata2->status);
break;
case ECBM_SETTEXTCOLOR:
{
DWORD oldcolor;
if (wParam)
{
oldcolor =adddata2->textcolor;
adddata2->textcolor = wParam;
}
return oldcolor;
}
case ECBM_GETTEXTCOLOR:
return adddata2->textcolor;
case MSG_SETTEXT:
{
SetWindowCaption(hWnd, (const char *) lParam);
InvalidateRect (hWnd, NULL, TRUE);
break;
}
//因为在SetWinUncheckOthers函数里不认ECBM_SETCHECK 消息,所以用BM_SETCHECK替代它
case ECBM_SETCHECK:
{
DWORD dwOldState= adddata2->status;
switch (dwStyle & ECBS_TYPEMASK)
{
case ECBS_CHECKBOX:
if (wParam & ECBT_CHECKED)
adddata2->status |= ECBT_CHECKED;
else
adddata2->status &= ~ECBT_CHECKED;
break;
case ECBS_RADIOBOX:
if ( ((adddata2->status & ECBT_CHECKED) == 0)
&& (wParam & ECBT_CHECKED) )
{
adddata2->status |= ECBT_CHECKED;
SetWinUncheckOthers(hWnd);
}
else if ( (adddata2->status & ECBT_CHECKED)
&& (!(wParam & ECBT_CHECKED)) )
{
adddata2->status &= ~ECBT_CHECKED;
}
break;
}
if (dwOldState != adddata2->status)
InvalidateRect (hWnd, NULL, TRUE);
}
break;
case ECBM_SETSTATE:
{
DWORD dwOldState = adddata2->status & ECBT_CHECKED;
if (wParam)
adddata2->status |= ECBT_CHECKED;
else
adddata2->status &= ~ECBT_CHECKED;
if (dwOldState != (adddata2->status & ECBT_CHECKED))
InvalidateRect (hWnd, NULL, TRUE);
}
break;
case MSG_CHAR:
if (HIBYTE(wParam) == 0 && ((dwStyle & ECBS_TYPEMASK) == ECBS_CHECKBOX))
{
DWORD dwOldState = adddata2->status;
if (LOBYTE(wParam) == '+' || LOBYTE(wParam) == '=')
adddata2->status |= ECBT_CHECKED;
else if (LOBYTE(wParam) == '-')
adddata2->status &= ~ECBT_CHECKED;
if (dwOldState != adddata2->status)
InvalidateRect (hWnd, NULL, TRUE);
}
break;
case MSG_ENABLE:
if (wParam && (dwStyle & WS_DISABLED))
ExcludeWindowStyle(hWnd, WS_DISABLED);
else if (!wParam && !(dwStyle & WS_DISABLED))
IncludeWindowStyle(hWnd, WS_DISABLED);
else
return 0;
InvalidateRect (hWnd, NULL, TRUE);
return 0;
case MSG_GETDLGCODE:
switch (dwStyle & ECBS_TYPEMASK)
{
case ECBS_CHECKBOX:
return DLGC_WANTCHARS | DLGC_BUTTON;
case ECBS_RADIOBOX:
return DLGC_RADIOBUTTON | DLGC_BUTTON;
default:
return 0;
}
break;
case MSG_NCHITTEST:
{
int x, y;
RECT clientrect;
x = (int)wParam;
y = (int)lParam;
GetWindowRect(hWnd, &clientrect);
if (PtInRect (&clientrect, x, y))
return HT_CLIENT;
else
return HT_OUT;
}
break;
case MSG_KEYDOWN:
{
int id = LOWORD (wParam);
if (wParam != SCANCODE_SPACE && wParam != SCANCODE_ENTER)
break;
if (GetCapture () == hWnd)
break;
SetCapture (hWnd);
NotifyParent (hWnd, GetDlgCtrlID(hWnd), ECBN_CLICKED);
}
break;
case MSG_KEYUP:
{
DWORD dwState;
if (wParam != SCANCODE_SPACE && wParam != SCANCODE_ENTER)
break;
if (GetCapture () != hWnd)
break;
ReleaseCapture ();
InvalidateRect (hWnd, NULL, TRUE);
switch (dwStyle & ECBS_TYPEMASK)
{
case ECBS_RADIOBOX:
if (!(adddata2->status & ECBT_CHECKED))
SendMessage (hWnd, ECBM_SETCHECK, ECBT_CHECKED, 0);
break;
case ECBS_CHECKBOX:
if (adddata2->status & ECBT_CHECKED)
dwState = ECBT_UNCHECKED;
else
dwState = ECBT_CHECKED;
SendMessage (hWnd, ECBM_SETCHECK, (WPARAM)dwState, 0);
break;
default:
break;
}
NotifyParent (hWnd, GetDlgCtrlID(hWnd), ECBN_CLICKED);
}
break;
case MSG_LBUTTONDBLCLK:
if ( (dwStyle & ECBS_TYPEMASK) == ECBS_RADIOBOX)
NotifyParent (hWnd, GetDlgCtrlID(hWnd), ECBN_DBLCLK);
break;
case MSG_LBUTTONDOWN:
if (GetCapture () == hWnd)
break;
SetCapture (hWnd);
break;
case MSG_LBUTTONUP:
{
int x, y;
DWORD dwState;
RECT winrect;
if (GetCapture() != hWnd)
break;
ReleaseCapture ();
x = LOSWORD(lParam);
y = HISWORD(lParam);
ScreenToClient (GetParent (hWnd), &x, &y);
GetWindowRect (hWnd, &winrect);
if (PtInRect (&winrect, x, y))
{
switch (dwStyle & ECBS_TYPEMASK)
{
case ECBS_RADIOBOX:
if (!(adddata2->status & ECBT_CHECKED))
{
SendMessage (hWnd, ECBM_SETCHECK, ECBT_CHECKED, 0);
}
break;
case ECBS_CHECKBOX:
if (adddata2->status & ECBT_CHECKED)
dwState = ECBT_UNCHECKED;
else
dwState = ECBT_CHECKED;
SendMessage (hWnd, ECBM_SETCHECK, (WPARAM)dwState, 0);
break;
default:
break;
}
InvalidateRect (hWnd, NULL, TRUE);
NotifyParent(hWnd, GetDlgCtrlID(hWnd), ECBN_CLICKED);
}
}
return 0;
case MSG_FONTCHANGED:
{
InvalidateRect (hWnd, NULL, FALSE);
return 0;
}
break;
//case MSG_FONTCHANGING:
// return -1;
case MSG_NCPAINT:
case MSG_ERASEBKGND:
return 0;
case MSG_PAINT:
{
char* spCaption;
RECT rect;
BITMAP bmp;
char bmpfile[MAX_PATH + 1];
PLOGFONT pfont = GetWindowFont(hWnd);
DWORD adddata=GetWindowAdditionalData(hWnd);//为图片文件名
HDC hdc=BeginPaint (hWnd);;
GetClientRect(hWnd, &rect);
//edit by tjb 2004-4-21
//修改原因:当设置了用户自定义的字体后,会不能正常显示
if (pfont)
SelectFont(hdc, pfont);
//end edit
if (adddata != 0 && (dwStyle & ECBS_BMPFILE))
{
memset(&bmp,0,sizeof(BITMAP));
if (adddata2->status & ECBT_CHECKED)
PrefixFileName((char*)adddata, "ck", bmpfile, MAX_PATH);
else
PrefixFileName((char*)adddata, "nm", bmpfile, MAX_PATH);
if(!LoadBitmap( HDC_SCREEN, &bmp, bmpfile))
{
if(dwStyle & ECBS_BKALPHA)
{
unsigned char r,g,b,a;
Pixel2RGBA(HDC_SCREEN,GetWindowBkColor(hWnd),&r,&g,&b,&a);
bmp.bmType |= BMP_TYPE_ALPHACHANNEL;
bmp.bmAlpha = a;
}
//add by tjb 2004-4-21
//当位图的高度不与控件高度一样时,需要把位图居中显示
if (RECTH(rect) > bmp.bmHeight)
{
int y1;
y1 = (RECTH(rect)-bmp.bmHeight)/2;
FillBoxWithBitmap(hdc, 0, y1, 0, 0,&bmp);
}
else
{
FillBoxWithBitmap(hdc, 0, 0, 0, 0,&bmp);
}
SetBkMode(hdc,BM_TRANSPARENT);
UnloadBitmap(&bmp);
}
}
spCaption = GetWindowCaption (hWnd);
if(spCaption)
{
rect.left += bmp.bmWidth + 2;
rect.top += 1;
rect.right -= 1;
rect.bottom -= 1;
PaintContent(hWnd, hdc, dwStyle, &rect);
}
EndPaint (hWnd, hdc);
break;
}
default:
break;
}
return DefaultControlProc (hWnd, uMsg, wParam, lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -