-
Notifications
You must be signed in to change notification settings - Fork 0
/
ui_calculator.h
195 lines (182 loc) · 4.51 KB
/
ui_calculator.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#pragma once
// include the MZFC library header file
#include <mzfc_inc.h>
#include <list>
#include "calcore.h"
class UiNumericDisplay : public UiWin
{
public:
UiNumericDisplay(){
_dotPos = 0;
_isEmpty = true;
}
void setText1(LPCTSTR text) { _l1str = text; }
void setText2(LPCTSTR text) { _l2str = text; }
void removeChar1();
void addChar1(wchar_t ch);
void addChar2(wchar_t ch){ addChar(ch,_l2str); }
void addString1(LPCTSTR str){ addString(str,_l1str); }
void addString2(LPCTSTR str){ addString(str,_l2str); }
CMzString getText1() { return _l1str; }
CMzString getText2() { return _l2str; }
bool isNonInput(){
return _isEmpty;
}
void setNonInput(){
_isEmpty = true;
_dotPos = 0;
}
void initNum(wchar_t ch){
_isEmpty = false;
wchar_t s[2] = {ch,0};
_l1str = s;
}
void initVal(double val){
wchar_t strval[64];
wsprintf(strval,L"%.2f",val);
_isEmpty = false;
_l1str = strval;
}
void clearNum();
double getInputval();
private:
void addChar(wchar_t ch,CMzString& s){
wchar_t tch[2];
tch[0] = ch;
tch[1] = 0;
s = s + tch;
}
void addString(LPCTSTR str,CMzString& s){
s = s + str;
}
protected:
void PaintWin(HDC hdcDst, RECT* prcWin, RECT* prcUpdate){
//draw background
MzDrawSelectedBg_NoLine(hdcDst,prcWin);
COLORREF cr;
HFONT hf;
RECT rect;
rect.left = prcWin->left + 5;
rect.right = prcWin->right - 5;
LONG height = prcWin->bottom - prcWin->top;
SetBkMode(hdcDst,TRANSPARENT);
if(!_l1str.IsEmpty()){ //draw text of line 1
cr = RGB(0,0,0);
hf = FontHelper::GetFont( 25 );
SelectObject( hdcDst , hf );
rect.top = prcWin->top + height / 3;
rect.bottom = rect.top + height * 2 / 3;
MzDrawText( hdcDst, _l1str.C_Str(), &rect, DT_RIGHT|DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS );
DeleteObject( hf );
}
if(!_l2str.IsEmpty()){ //draw text of line2
cr = RGB(128,128,128);
hf = FontHelper::GetFont( 17 );
SelectObject( hdcDst , hf );
rect.top = prcWin->top;
rect.bottom = rect.top + height / 3;
MzDrawText( hdcDst, _l2str.C_Str(), &rect, DT_RIGHT|DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS );
DeleteObject( hf );
}
}
private:
CMzString _l1str;
CMzString _l2str;
int _dotPos;
bool _isEmpty; //never input
};
typedef enum CALCBTNTYPE{
CALBTN_NONE,
CALBTN_NUM,
CALBTN_OP,
CALBTN_FUNC,
}CALCBTNTYPE_t;
typedef struct CALCBTNINFO{
int ID;
LPCTSTR text;
CALCBTNTYPE_t atype; //action type
int hsize; //blocks
int vsize; //blocks
}CALCBTNINFO_t;
#define MZ_MW_BTN_NUMERIC MZFC_WM_MESSAGE+0x80
#define MZ_MW_BTN_OPERATOR MZFC_WM_MESSAGE+0x81
#define MZ_MW_BTN_FUNCTION MZFC_WM_MESSAGE+0x82
class UiCalButton : public UiButton
{
public:
UiCalButton(int ID = -1, LPCTSTR text = 0, CALCBTNTYPE_t t = CALBTN_NONE){
if(ID > 0){
SetID(ID);
}
if(text){
SetText(text);
}
SetTextColor(RGB(0,0,0));
_t = t;
}
void setActType(CALCBTNTYPE_t t){
_t = t;
}
CALCBTNTYPE_t getActType(){
return _t;
}
virtual int OnLButtonUp(UINT fwKeys, int xPos, int yPos){
switch(_t){
case CALBTN_NUM:
PostMessageW(MZ_MW_BTN_NUMERIC,GetID(),0);
break;
case CALBTN_OP:
PostMessageW(MZ_MW_BTN_OPERATOR,GetID(),0);
break;
case CALBTN_FUNC:
PostMessageW(MZ_MW_BTN_FUNCTION,GetID(),0);
break;
default:
break;
}
return UiButton::OnLButtonUp(fwKeys,xPos,yPos);
}
private:
CALCBTNTYPE_t _t;
};
class UiControlBG : public UiWin
{
public:
UiControlBG(void){}
~UiControlBG(void) {}
protected:
virtual void PaintWin(HDC hdcDst, RECT* prcWin, RECT* prcUpdate){
UiWin::PaintWin(hdcDst, prcWin, prcUpdate);
MzDrawGridPopupMenuBG_480(hdcDst,prcWin);
}
};
class Ui_CalculatorWnd : public CMzWndEx
{
MZ_DECLARE_DYNAMIC(Ui_CalculatorWnd);
public:
Ui_CalculatorWnd(void);
~Ui_CalculatorWnd(void);
public:
UiControlBG m_bg;
UiNumericDisplay m_Display;
UiCalButton *pm_Buttons[20];
public:
double getResult() { return _result; };
void setInitOprand(double val){
_opndInput = false;
m_Display.initVal(val);
m_Display.setNonInput();
}
protected:
// Initialization of the window (dialog)
virtual BOOL OnInitDialog();
// override the MZFC window messages handler
virtual LRESULT MzDefWndProc(UINT message, WPARAM wParam, LPARAM lParam);
// override the MZFC command handler
virtual void OnMzCommand(WPARAM wParam, LPARAM lParam);
private:
double _result;
CalcCore calc;
bool _opPressed;
bool _opndInput;
};