QuakeGod
2024-12-24 61deef5cdf96cbfdd6ad45be49e80d597c00ca65
提交 | 用户 | age
418cb3 1 
Q 2 // LCDDisplayDlg.cpp: 实现文件
3 //
4
5 #include "pch.h"
6 #include "framework.h"
7 #include "LCDDisplayTest.h"
8 #include "LCDDisplayTestDlg.h"
9 #include "afxdialogex.h"
10 #include "../MyLib/Functions.hpp"
11 #ifdef _DEBUG
12 #define new DEBUG_NEW
13 #endif
14
15
16 // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
17
18 class CAboutDlg : public CDialogEx
19 {
20 public:
21     CAboutDlg();
22
23 // 对话框数据
24 #ifdef AFX_DESIGN_TIME
25     enum { IDD = IDD_ABOUTBOX };
26 #endif
27
28     protected:
29     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
30
31 // 实现
32 protected:
33     DECLARE_MESSAGE_MAP()
34 };
35
36 CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
37 {
38 }
39
40 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
41 {
42     CDialogEx::DoDataExchange(pDX);
43 }
44
45 BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
46 END_MESSAGE_MAP()
47
48
49 // CLCDDisplayTestDlg 对话框
50
51
52
53 CLCDDisplayTestDlg::CLCDDisplayTestDlg(CWnd* pParent /*=nullptr*/)
54     : CDialogEx(IDD_LCDDISPLAY_DIALOG, pParent)
55 {
56     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
57 }
58
59 void CLCDDisplayTestDlg::DoDataExchange(CDataExchange* pDX)
60 {
61     CDialogEx::DoDataExchange(pDX);
62     DDX_Control(pDX, IDC_STATIC_DISPLAY, m_lcd_display);
63     DDX_Control(pDX, IDC_MFCCOLORBUTTON1, m_color_button1);
64     DDX_Control(pDX, IDC_MFCCOLORBUTTON2, m_color_button2);
65 }
66
67 BEGIN_MESSAGE_MAP(CLCDDisplayTestDlg, CDialogEx)
68     ON_WM_SYSCOMMAND()
69     ON_WM_PAINT()
70     ON_WM_QUERYDRAGICON()
71     ON_BN_CLICKED(IDC_BUTTON1, &CLCDDisplayTestDlg::OnBnClickedButton1)
72     ON_BN_CLICKED(IDC_BUTTON2, &CLCDDisplayTestDlg::OnBnClickedButton2)
73     ON_BN_CLICKED(IDC_BUTTON3, &CLCDDisplayTestDlg::OnBnClickedButton3)
74     ON_BN_CLICKED(IDC_BUTTON4, &CLCDDisplayTestDlg::OnBnClickedButton4)
75     ON_BN_CLICKED(IDC_BUTTON5, &CLCDDisplayTestDlg::OnBnClickedButton5)
76     ON_BN_CLICKED(IDC_BUTTON6, &CLCDDisplayTestDlg::OnBnClickedButton6)
77     ON_BN_CLICKED(IDC_BUTTON_CONVERT, &CLCDDisplayTestDlg::OnBnClickedButtonConvert)
78     ON_BN_CLICKED(IDC_BUTTON_CLEAR, &CLCDDisplayTestDlg::OnBnClickedButtonClear)
79     ON_WM_TIMER()
80     ON_BN_CLICKED(IDC_BUTTON7, &CLCDDisplayTestDlg::OnBnClickedButton7)
81     ON_BN_CLICKED(IDC_BUTTON8, &CLCDDisplayTestDlg::OnBnClickedButton8)
82 END_MESSAGE_MAP()
83
84
85 // CLCDDisplayTestDlg 消息处理程序
86
87 BOOL CLCDDisplayTestDlg::OnInitDialog()
88 {
89     CDialogEx::OnInitDialog();
90
91     // 将“关于...”菜单项添加到系统菜单中。
92
93     // IDM_ABOUTBOX 必须在系统命令范围内。
94     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
95     ASSERT(IDM_ABOUTBOX < 0xF000);
96
97     CMenu* pSysMenu = GetSystemMenu(FALSE);
98     if (pSysMenu != nullptr)
99     {
100         BOOL bNameValid;
101         CString strAboutMenu;
102         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
103         ASSERT(bNameValid);
104         if (!strAboutMenu.IsEmpty())
105         {
106             pSysMenu->AppendMenu(MF_SEPARATOR);
107             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
108         }
109     }
110
111     // 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
112     //  执行此操作
113     SetIcon(m_hIcon, TRUE);            // 设置大图标
114     SetIcon(m_hIcon, FALSE);        // 设置小图标
115
116     // TODO: 在此添加额外的初始化代码
117     SetTimer(0, 20, NULL);
118     SetTimer(1, 100, NULL);
119
120     m_lcd_display.displayarray[1][2] = 1;
121     return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
122 }
123
124 void CLCDDisplayTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
125 {
126     if ((nID & 0xFFF0) == IDM_ABOUTBOX)
127     {
128         CAboutDlg dlgAbout;
129         dlgAbout.DoModal();
130     }
131     else
132     {
133         CDialogEx::OnSysCommand(nID, lParam);
134     }
135 }
136
137 // 如果向对话框添加最小化按钮,则需要下面的代码
138 //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
139 //  这将由框架自动完成。
140
141 void CLCDDisplayTestDlg::OnPaint()
142 {
143     if (IsIconic())
144     {
145         CPaintDC dc(this); // 用于绘制的设备上下文
146
147         SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
148
149         // 使图标在工作区矩形中居中
150         int cxIcon = GetSystemMetrics(SM_CXICON);
151         int cyIcon = GetSystemMetrics(SM_CYICON);
152         CRect rect;
153         GetClientRect(&rect);
154         int x = (rect.Width() - cxIcon + 1) / 2;
155         int y = (rect.Height() - cyIcon + 1) / 2;
156
157         // 绘制图标
158         dc.DrawIcon(x, y, m_hIcon);
159     }
160     else
161     {
162         CDialogEx::OnPaint();
163     }
164 }
165
166 //当用户拖动最小化窗口时系统调用此函数取得光标
167 //显示。
168 HCURSOR CLCDDisplayTestDlg::OnQueryDragIcon()
169 {
170     return static_cast<HCURSOR>(m_hIcon);
171 }
172
6ff05a 173 void CLCDDisplayTestDlg::DbgLog(CString s1)
Q 174 {
175     ((CEdit*)GetDlgItem(IDC_EDIT_LOG))->ReplaceSel(s1);
176 }
418cb3 177
Q 178 void CLCDDisplayTestDlg::OnBnClickedButton1()
179 {
180
181     // TODO: 在此添加控件通知处理程序代码
182     m_lcd_display.Clear();
183 }
184 char str1[] = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
185
186 unsigned int font3_5[128] =
187 {
188     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
189     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
190     0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x007720,0x002770, //             ▲▼  
191
192     0x000000,0x020222,0x000055,0x017574,0x036736,0x051245,0x053730,0x000122, //   ! " # $ % & '
193     0x021112,0x024442,0x052725,0x022722,0x012200,0x000700,0x020000,0x012244, // ( ) * + , - . /
194     0x075557,0x022222,0x071747,0x074747,0x044755,0x074717,0x075717,0x044557, // 0 1 2 3 4 5 6 7 
195     0x075757,0x074757,0x002020,0x012020,0x042124,0x007070,0x012421,0x020452, // 8 9 : ; < = > ?
196     0x025752,0x055752,0x035353,0x071117,0x035553,0x071717,0x011717,0x075517, // @ A B C D E F G 
197     0x055755,0x072227,0x032227,0x055355,0x071111,0x055575,0x055535,0x025552, // H I J K L M N O
198     0x011353,0x065552,0x055353,0x034216,0x022227,0x075555,0x025555,0x057555, // P Q R S T U V W
199     0x055255,0x022255,0x071247,0x071117,0x042211,0x074447,0x000052,0x070000, // X Y Z [ \ ] ^ _
200     0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,
201     0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,
202     0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,
203     0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,
204 };
205
206 unsigned long long font5_7[128] =
207 {
208     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
209     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
210     0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000,0x000000, //             ▲▼
211
212     0x000000000000,0x00400410e384,0x00000000a6db,0x00015f29f500, //   ! " # 
213     0x0043d4385784,0x0186421084c3,0x016255085080,0x00000000430c, // $ % & '
214     0x004081041084,0x004210410204,0x0112847c4291,0x0001047c4100, // ( ) * +
215     0x00230c000000,0x0000007c0000,0x00c300000000,0x000042108400, // , - . /
216     
217 //            ,
218     0x00e45355944e,0x00e104104184,0x01f08421044e,0x00e45039044e, // 0 1 2 3
219     0x01e21f24a308,0x00e45040f05f,0x00e4513c108c,0x00410410841f, // 4 5 6 7
220     0x00e45139144e,0x00e41079144e,0x00030c00c300,0x00330c00c300, // 8 9 : ;
221     0x008102042108,0x00001f01f000,0x002108408102,0x00400421044e, // < = > ?
222     0x01e04d55544e,0x01145f451284,0x00f4513d144f,0x00e44104144e, // @ A B C
223     0x00f45145144f,0x01f0413c105f,0x0010413c105f,0x00e45174144e, // D E F G 
224     0x0114517d1451,0x00e10410410e,0x00614410410e,0x0112450c5251, // H I J K
225     0x01f041041041,0x0114555556d1,0x011459553451,0x00e45145144e, // L M N O
226     0x0010413d144f,0x01625545144e,0x0112453d144f,0x00e45038144e, // P Q R S
227     0x00410410411f,0x00e451451451,0x004291451451,0x00a555551451, // T U V W
228     0x01144a10a451,0x00410410a451,0x01f04210841f,0x00e08208208e, // X Y Z [
229     0x000408102040,0x00e20820820e,0x000000011284,0x01f000000000, // \ ] ^ _
230     0x000000204082,0x00058924e000,0x0003d144f041,0x00038104e000, // ` a b c
231     0x00079145e410,0x0003817d1380,0x00208208f08c,0x00620e249380, // d e f g 
232     0x000249247041,0x000384106004,0x00614410e004,0x0002450c5241, // h i j k
233     0x000382082082,0x000451555280,0x0002492491c0,0x000391451380, // l m n o
234     0x0010472491c0,0x00820e249380,0x000082092340,0x000390302700, // p q r s
235     0x00070411e100,0x000389249000,0x000085249000,0x000295551000, // t u v w
236     0x00024a1c9000,0x00620e28a000,0x0003c210f000,0x008104084108, // x y z {
237     0x004104004104,0x002104204102,0x000000000352,0x000000000000, // | } ~
238 };
239
240 char str2[] = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
241
242 void CLCDDisplayTestDlg::OnBnClickedButton2()
243 {
244     // TODO: 在此添加控件通知处理程序代码
245     //m_lcd_display.displayarray[3][4] = 1;
246     //5*3   (6*4)
247     m_lcd_display.Clear();
248     int l = strlen(str1);
249     for (int i = 0; i < 10; i++)
250     {
251         for (int j = 0; j < 32; j++)
252         {
253             int index = (i * 32 + j) % l;
254
255             char ch = str1[index];
256             int dots = font3_5[ch];
257
258             for (int m = 0; m < 5; m++)
259             {
260                 int line = dots & 0xf;
261                 int mask = 1;
262                 for (int n = 0; n < 3; n++)
263                 {
264                     if (line&mask)
265                     {
266                         m_lcd_display.displayarray[i * 6 + m][j * 4 + n] = 1;
267                     } 
268                     mask <<= 1;
269
270                 }
271                 dots >>= 4;
272             }
273         }
274     }
275     m_lcd_display.RedrawWindow();
276
277 }
278
279
280 void CLCDDisplayTestDlg::OnBnClickedButton3()
281 {
282     // TODO: 在此添加控件通知处理程序代码
283     //7*5   (8*6)
284     m_lcd_display.Clear();
285     int l = strlen(str2);
286     for (int i = 0; i < 8; i++)
287     {
288         for (int j = 0; j < 21; j++)
289         {
290             int index = (i * 21 + j) % l;
291
292             char ch = str2[index];
293             long long dots = font5_7[ch];
294
295             for (int m = 0; m < 7; m++)
296             {    
297                 int line = dots & 0x3f;
298                 int mask = 1;
299                 for (int n = 0; n < 5; n++)
300                 {
301                     if (line&mask)
302                     {
303                         m_lcd_display.displayarray[i * 8 + m][j * 6 + n] = 1;
304                     }
305                     mask <<= 1;
306                 }
307                 dots >>= 6;
308             }
309         }
310     }
311     m_lcd_display.RedrawWindow();
312
6ff05a 313
Q 314     CString s1;
315     CString s2;
316     unsigned char pixels[8][8] = { 0 };
317
318     for (int ch = 0; ch < 128; ch++)
319     {
320         long long dots = font5_7[ch];
321         s1.Format(_T("{"));
322         for (int m = 0; m < 7; m++) {
323             int line = dots & 0x3f;
324             int mask = 1;
325             for (int n = 0; n < 5; n++)
326             {
327                 if (line & mask)
328                 {
329                     pixels[m][n] = 1;
330                 } else pixels[m][n] = 0;
331                 mask <<= 1;
332             }
333             dots >>= 6;
334         }
335
336         for (int m = 0; m < 5; m++) {
337             int line = 0;
338             int mask = 1;
339             for (int n = 0; n < 7; n++)
340             {
341                 if (pixels[n][m])
342                 {
343                     line |= mask;
344                 }
345                 mask <<= 1;
346             }
347             s2.Format(_T("0x%02X"), line);
348             s1 += s2 ;
349             if (m < 4) { s1 += _T(","); }
350         }
351         s1.AppendFormat(_T("}, // %c \r\n"),ch);
352         DbgLog(s1);
353     }
418cb3 354 }
Q 355
356
357 void CLCDDisplayTestDlg::OnBnClickedButton4()
358 {
359     // TODO: 在此添加控件通知处理程序代码
360     //12*7   (13*8)
361     m_lcd_display.Clear();
362     for (int i = 0; i < 5; i++)
363     {
364         for (int j = 0; j < 16; j++)
365         {
366             for (int m = 0; m < 12; m++)
367             {
368                 for (int n = 0; n < 7; n++)
369                 {
370                     m_lcd_display.displayarray[i * 13 + m][j * 8 + n] = 1;
371
372                 }
373             }
374         }
375     }
376     m_lcd_display.RedrawWindow();
377 }
378
379
380 void CLCDDisplayTestDlg::OnBnClickedButton5()
381 {
382     // TODO: 在此添加控件通知处理程序代码
383     //15*7   (16*8)
384     m_lcd_display.Clear();
385     for (int i = 0; i < 4; i++)
386     {
387         for (int j = 0; j < 16; j++)
388         {
389             for (int m = 0; m < 15; m++)
390             {
391                 for (int n = 0; n < 7; n++)
392                 {
393                     m_lcd_display.displayarray[i * 16 + m][j * 8 + n] = 1;
394
395                 }
396             }
397         }
398     }
399     m_lcd_display.RedrawWindow();
400 }
401
402
403 void CLCDDisplayTestDlg::OnBnClickedButton6()
404 {
405     char aa[] = "12";
406     m_lcd_display.SetTextMode(LCDDisplay1::TextMode5_7);
407     m_lcd_display.putText(aa);
408     m_lcd_display.putText(str2);
409
410     m_lcd_display.RedrawWindow();
411     // TODO: 在此添加控件通知处理程序代码
412 }
413
414 DWORD dlgitemIDs[48] = {
415     IDC_CHECK1,IDC_CHECK2,IDC_CHECK3,IDC_CHECK4,IDC_CHECK5,IDC_CHECK6,
416     IDC_CHECK7,IDC_CHECK8,IDC_CHECK9,IDC_CHECK10,IDC_CHECK11,IDC_CHECK12,
417     IDC_CHECK13,IDC_CHECK14,IDC_CHECK15,IDC_CHECK16,IDC_CHECK17,IDC_CHECK18,
418     IDC_CHECK19,IDC_CHECK20,IDC_CHECK21,IDC_CHECK22,IDC_CHECK23,IDC_CHECK24,
419     IDC_CHECK25,IDC_CHECK26,IDC_CHECK27,IDC_CHECK28,IDC_CHECK29,IDC_CHECK30,
420     IDC_CHECK31,IDC_CHECK32,IDC_CHECK33,IDC_CHECK34,IDC_CHECK35,IDC_CHECK36,
421     IDC_CHECK37,IDC_CHECK38,IDC_CHECK39,IDC_CHECK40,IDC_CHECK41,IDC_CHECK42,
422     IDC_CHECK43,IDC_CHECK44,IDC_CHECK45,IDC_CHECK46,IDC_CHECK47,IDC_CHECK48
423 };
424
425 static int xtoi(const char * hexstr, int len)
426 {
427     int len1 = len;
428     if (len <= 0) len1 = (int)strlen(hexstr);
429     int j = 0;
430     for (int i = 0; i < len1; i++)
431     {
432         unsigned char ch = hexstr[i];
433         if (ch >= '0'&&ch <= '9') { int k = ch - '0';    j = j * 16 + k;     continue; }
434         if (ch >= 'A'&&ch <= 'F') { int k = ch - 'A' + 10;    j = j * 16 + k;    continue; }
435         if (ch >= 'a'&&ch <= 'f') { int k = ch - 'a' + 10;    j = j * 16 + k;    continue; }
436         if (ch == ' ' || ch == '    ') { continue; }
437         break;
438     }
439     return j;
440 }
441
442 static unsigned char reversebyte(unsigned char b) {
443     b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
444     b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
445     b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
446     return b;
447 }
448 void CLCDDisplayTestDlg::OnBnClickedButtonConvert()
449 {
450     // TODO: 在此添加控件通知处理程序代码
451     long long fontdots = 0;
452     unsigned char dots[48];
453     for (int i = 0; i < 48; i++)
454     {
455         fontdots <<= 1;
456         dots[i]= ((CButton *)GetDlgItem(dlgitemIDs[47-i]))->GetCheck();
457         if (dots[i]) fontdots|= 1;
458     }
459     CString s1;
460     s1.Format(_T("0x%04x%08x"), fontdots>>32, fontdots);
461     GetDlgItem(IDC_EDIT_HEX)->SetWindowText(s1);
462 }
463
464
465 void CLCDDisplayTestDlg::OnBnClickedButtonClear()
466 {
467     // TODO: 在此添加控件通知处理程序代码
468     for (int i = 0; i < 48; i++)
469     {
470         ((CButton *)GetDlgItem(dlgitemIDs[i]))->SetCheck(0);
471     }
472
473 }
474
475
476 void CLCDDisplayTestDlg::OnTimer(UINT_PTR nIDEvent)
477 {
478     // TODO: 在此添加消息处理程序代码和/或调用默认值
479     if (nIDEvent == 0)
480     {
481         KillTimer(0);
482         DelayInit();
483     }
484     else if (nIDEvent == 1)
485     {
486         UpdateDisplay();
487     }
488     else
489     {
490
491     }
492     CDialogEx::OnTimer(nIDEvent);
493 }
494
495
496 int CLCDDisplayTestDlg::DelayInit()
497 {
498     // TODO: 在此处添加实现代码.
499     return 0;
500 }
501 char str3[] = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ";
502 char str4[] = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~_";
503
504 int CLCDDisplayTestDlg::UpdateDisplay()
505 {
506     // TODO: 在此处添加实现代码.
507     static int nCount = 0;
508     CStringA sa;
509     CStringA sb;
510     CTime time1;
511     time1 = time1.GetTickCount();
512     
513     int hour=0, min=0, sec=0;
514     hour=time1.GetHour(), min=time1.GetMinute(), sec=time1.GetSecond();
515     char aa[] = "12";
516     char bb[] = "        ";
517
518 //    m_lcd_display.Clear(false);
519 //    m_lcd_display.SetTextMode(LCDDisplay1::TextMode5_7);
520
521     nCount += 1;
522     static int lastsec = 0;
523
524     if (sec != lastsec) {
525         sa.Format("%02d:%02d:%02d", hour,min,sec);
526         m_lcd_display.putTextXY(13,4, sa);
527     //    m_lcd_display.putText(str3);
528         m_lcd_display.RedrawWindow();
529         lastsec = sec;
530     }
531
532     return 0;
533 }
534
535
536 void CLCDDisplayTestDlg::OnBnClickedButton7()
537 {
538     // TODO: 在此添加控件通知处理程序代码
539     CString s1,s2;
540     GetDlgItemText(IDC_EDIT3, s1);
541     CStringA s1A;
542     s1A = s1;
543     CStringA resstrs[100];
544     int j = Split(s1A, " ", resstrs);
545     s1.Empty();
546     for (int i = 0; i < j; i++)
547     {
548         int k = xtoi(resstrs[i], 2);
549         k = reversebyte(k);
550         s1.AppendFormat(_T("%02x "), k);
551     }
552     s2 = s1;
553     SetDlgItemText(IDC_EDIT4, s2);
554 }
555
556
557 void CLCDDisplayTestDlg::OnBnClickedButton8()
558 {
559     // TODO: 在此添加控件通知处理程序代码
560     COLORREF bkcolor, fntcolor;
561     bkcolor=m_color_button1.GetColor();
562     fntcolor = m_color_button2.GetColor();
563     m_lcd_display.SetBkColor(bkcolor);
564     m_lcd_display.SetFontColor(fntcolor);
565
566 }