Воспоминание Embedded ч2 27.11.2024
Всем привет!
Тут писал про Embedded см. https://groups.germany.ru/12994140000001/f/41025455.html?C...
Но сначало оффтоп. Вчера, сегодня я ел и пил вот это:
Завтра будет это:
Сегодня пойдёт речь о Microsoft Smartphone 2002.
Короче был прототип такой у Microsoft, назывался Stinger:
Вот так выглядел смартфон 2003 версии:
Вот так выглядет Microsoft eMbedded Visual C++ 3.0:
1. Нажмём File->New.., и выберем во вкладке Projects, выберем масте WCE Smartphone 2002 Application:
2. Появится диалоговое окно "WCE Smartphone 2002 Application", выберим "A typical "Hello World" application":
Создастся такой код test_sp2002.cpp:
#include <windows.h> #include <aygshell.h> #include "resource.h" HINSTANCE g_hInst = NULL; HWND hwndMain = NULL; TCHAR szAppName[] = TEXT("Smartphone 2002 Application"); TCHAR szTitle[] = TEXT("Smartphone 2002"); TCHAR szMessage[] = TEXT("Hello Smartphone 2002!"); //FUNCTION: WndProc(HWND, unsigned, WORD, LONG) //PURPOSE: Processes messages for the main window. //WM_COMMAND - process the application menu //WM_PAINT - Paint the main window //WM_DESTROY - post a quit message and return LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { LRESULT lResult = TRUE; HDC hdc; PAINTSTRUCT ps; RECT rect; switch(msg) { case WM_CREATE: SHMENUBARINFO mbi; ZeroMemory(&mbi, sizeof(SHMENUBARINFO)); mbi.cbSize = sizeof(SHMENUBARINFO); mbi.hwndParent = hwnd; mbi.nToolBarId = IDR_HELLO_MENUBAR; mbi.hInstRes = g_hInst; if(!SHCreateMenuBar(&mbi)) { PostQuitMessage(0); } break; case WM_COMMAND: switch(wp) { case IDOK: SendMessage(hwnd, WM_CLOSE, 0, 0); break; default: return DefWindowProc(hwnd, msg, wp, lp); } break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); DrawText(hdc, szMessage, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd, &ps); break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: lResult = DefWindowProc(hwnd, msg, wp, lp); break; } return(lResult); } //FUNCTION: InitInstance(HANDLE, int) //PURPOSE: Saves instance handle and creates main window //COMMENTS: // In this function, we save the instance handle in a global variable and // create and display the main program window. BOOL InitInstance(HINSTANCE hInstance, int CmdShow) { g_hInst = hInstance; hwndMain = CreateWindow(szAppName, szTitle, WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if(!hwndMain) { return FALSE; } ShowWindow(hwndMain, CmdShow); UpdateWindow(hwndMain); return TRUE; } //FUNCTION: InitApplication(HANDLE) //PURPOSE: Sets the properties for our window. BOOL InitApplication(HINSTANCE hInstance) { WNDCLASS wc; BOOL f; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hIcon = NULL; wc.hInstance = hInstance; wc.hCursor = NULL; wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; f = (RegisterClass(&wc)); return f; } // FUNCTION: WinMain(HANDLE, HANDLE, LPWSTR, int) // PURPOSE: Entry point for the application int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int CmdShow) { MSG msg; HWND hHelloWnd = NULL; hHelloWnd = FindWindow(szAppName, szTitle); if(hHelloWnd) { SetForegroundWindow(hHelloWnd); return 0; } if(!hPrevInstance) { if(!InitApplication(hInstance)) { return(FALSE); } } if(!InitInstance(hInstance, CmdShow)) { return(FALSE); } while(GetMessage(&msg, NULL, 0,0) == TRUE) { TranslateMessage(&msg); DispatchMessage(&msg); } return(msg.wParam); }
Потом test_sp2002.rc:
//Microsoft Developer Studio generated resource script. #include "resource.h" // Menu IDR_HELLO_MENUBAR RCDATA BEGIN 0, 1, I_IMAGENONE, IDOK, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, IDS_HELLO_OK, 0, NOMENU, END STRINGTABLE DISCARDABLE BEGIN IDS_HELLO_OK "OK" END
И resource.h:
// Microsoft Developer Studio generated include file. // Used by TEST_SP2002.RC #include <windows.h> #include <aygshell.h> #include <tpcuser.h> // BUGBUG #define TPC #define IDC_STATIC (-1) #define IDR_HELLO_MENUBAR 101 #define IDS_HELLO_OK 102 // Next default values for new objects #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif
Так выглядет эмулятор 2002:
Этот пример отображает на экране телефона надпись "Hello Smartphone 2002!", и слева будет кнопка/меню OK. При нажатие на кнопку/меню OK, приложение закрывается.
UI 2002 версии было имхо не очень. Так выглядет UI 2003 версии:
UI 2002 версии было имхо не очень. Так выглядет UI 2003 версии:
Ну точнее не столь UI, просто в 2002 версии имхо было меньше возможностей, чем в 2003 версии. Но UI было сильно ограничены компоненты хоть в 2002 и хоть в 2003, допустим были только - текстовое поле, чек-боксы, combobox, полосы прокрутки, и две кнопки/меню, хотя можно было бы сделать в принципе свои компоненты. Ну допустим хотелось чтобы был календарь, в обычной Windows он имхо есть, а там нет. Там всё урезано, потому-что ОС Microsoft Smartphone 2002/2003 весила где-то 8 мбайт, по нынишним меркам это очень мало.
Продолжим дальше, но уже в VS 2005, но сначало оффтоп.
Вчера я ел это:
1. Запустим Microsoft Visual Studio 2005, и создадим проект Neu->Projekt...:
2. В диалоговом окне "Neues Projekt", выберем "Visual C++", и "MFC-Anwendwendung für Intelligente Geräte", назовём проект "hello_w":
3. Запустится мастер, в "Plattformen" выберем в "Ausgwählte SDKs" Smartphone 2003:
4. В Anwendungstyp выберем "Auf Dialogfeldern basierend", в Ressourcesprache Deutsch, в "Verwendung von MFC" выберем "MFC in einer statischen Bibliothek verwenden":
5. В Benutzeroberflächenfeatures в "Dialogfeldtittel" напишим "Hello World Smartphone 2003":
6. Дальше пусть будет так, нажмём на кнопку "Fertig stellen":
Теперь сделаем следующее:
1.
2.
3.
4.
5.
Вот код hello_w.cpp:
// hello_wDlg.cpp : Implementierungsdatei #include "stdafx.h" #include "hello_w.h" #include "hello_wDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // Chello_wDlg-Dialogfeld Chello_wDlg::Chello_wDlg(CWnd* pParent /*=NULL*/) : CDialog(Chello_wDlg::IDD, pParent) , m_Text(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void Chello_wDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_Text); DDX_Control(pDX, IDC_EDIT1, m_Text2); } BEGIN_MESSAGE_MAP(Chello_wDlg, CDialog) #if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP) ON_WM_SIZE() #endif //}}AFX_MSG_MAP ON_COMMAND(IDOK, &Chello_wDlg::OnOk) END_MESSAGE_MAP() // Chello_wDlg-Meldungshandler BOOL Chello_wDlg::OnInitDialog() { CDialog::OnInitDialog(); // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt // wenn das Hauptfenster der Anwendung kein Dialogfeld ist SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden if (!m_dlgCommandBar.Create(this) || !m_dlgCommandBar.InsertMenuBar(IDR_MAINFRAME)) { TRACE0("Fehler beim Erstellen der Befehlsleiste.\n"); return FALSE; // Fehler beim Erstellen } // TODO: Hier zusätzliche Initialisierung einfügen return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten } #if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP) void Chello_wDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/) { if(AfxIsDRAEnabled()) { DRA::RelayoutDialog( AfxGetResourceHandle(), this->m_hWnd, DRA::GetDisplayMode() != DRA::Portrait ? MAKEINTRESOURCE(IDD_HELLO_W_DIALOG_WIDE) : MAKEINTRESOURCE(IDD_HELLO_W_DIALOG)); } } #endif void Chello_wDlg::OnOk() { // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein. LPTSTR lText; m_Text2.GetWindowTextW(lText, m_Text2.GetWindowTextLengthW() + 1); AfxMessageBox(lText); }
Вот код hello_w.rc:
// Microsoft Visual C++ generated resource script. #include "resourcesp.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Generated from the TEXTINCLUDE 2 resource. #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // Deutsch (Deutschland) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) #ifdef _WIN32 LANGUAGE LANG_GERMAN, SUBLANG_GERMAN #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // TEXTINCLUDE 1 TEXTINCLUDE BEGIN "resourcesp.h\0" END 2 TEXTINCLUDE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "#define _AFX_NO_SPLITTER_RESOURCES\r\n" "#define _AFX_NO_OLE_RESOURCES\r\n" "#define _AFX_NO_TRACKER_RESOURCES\r\n" "#define _AFX_NO_PROPERTY_RESOURCES\r\n" "\r\n" "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU)\r\n" "LANGUAGE 7, 1\r\n" "#pragma code_page(1252)\r\n" "#include ""res\\hello_wsp.rc2"" // Nicht mit Microsoft Visual C++ bearbeitete Ressourcen\r\n" "#include ""afxres.rc"" // Standardkomponenten\r\n" "#endif\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // Icon // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDR_MAINFRAME ICON "res\\hello_w.ico" ///////////////////////////////////////////////////////////////////////////// // Menu IDR_MAINFRAME MENU BEGIN MENUITEM "OK", IDOK END ///////////////////////////////////////////////////////////////////////////// // Dialog IDD_HELLO_W_DIALOG DIALOG 0, 0, 113, 116 STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION EXSTYLE WS_EX_APPWINDOW | 0x80000000L CAPTION "Hello World Smartphone 2003" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Vvedite Text:",IDC_STATIC,8,7,54,11 EDITTEXT IDC_EDIT1,7,15,78,14,ES_AUTOHSCROLL END ///////////////////////////////////////////////////////////////////////////// // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040704e4" BEGIN VALUE "CompanyName", "TODO: <Firmenname>" VALUE "FileDescription", "TODO: <Dateibeschreibung>" VALUE "FileVersion", "1.0.0.1" VALUE "InternalName", "hello_w.exe" VALUE "LegalCopyright", "TODO: (c) <Firmenname>. Alle Rechte vorbehalten." VALUE "OriginalFilename", "hello_w.exe" VALUE "ProductName", "TODO: <Produktname>" VALUE "ProductVersion", "1.0.0.1" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x407, 1252 END END ///////////////////////////////////////////////////////////////////////////// // DESIGNINFO #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN IDD_HELLO_W_DIALOG, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 106 TOPMARGIN, 7 BOTTOMMARGIN, 109 END END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // String Table STRINGTABLE BEGIN IDS_OK "OK" END #endif // Deutsch (Deutschland) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // Generated from the TEXTINCLUDE 3 resource. #define _AFX_NO_SPLITTER_RESOURCES #define _AFX_NO_OLE_RESOURCES #define _AFX_NO_TRACKER_RESOURCES #define _AFX_NO_PROPERTY_RESOURCES #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) LANGUAGE 7, 1 #pragma code_page(1252) #include "res\hello_wsp.rc2" // Nicht mit Microsoft Visual C++ bearbeitete Ressourcen #include "afxres.rc" // Standardkomponenten #endif ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED
Вуаля:
Про MFC можете почитать тут см.:
https://programming.mybb.ru/viewtopic.php?id=131
https://programming.mybb.ru/viewtopic.php?id=141
https://programming.mybb.ru/viewtopic.php?id=142
https://programming.mybb.ru/viewtopic.php?id=152
Продолжим. Сегодня сделает программу телефонная книга, которая записывает в файл имя, фамилию и телефон.
1. Короче интерфейс должен выглядет вот так, имя будет называться - m_firstname, фамилия - m_lastname, а номер телефона - m_phonenumber:
2. Телефонный номер должен вводить только числа, т.е. Zahl=True:
3. Меню будет пусть называться Save:
4. Вот код:
// mfc_fileDlg.cpp : Implementierungsdatei #include "stdafx.h" #include "mfc_file.h" #include "mfc_fileDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // Cmfc_fileDlg-Dialogfeld Cmfc_fileDlg::Cmfc_fileDlg(CWnd* pParent /*=NULL*/) : CDialog(Cmfc_fileDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void Cmfc_fileDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT1, m_firstname); DDX_Control(pDX, IDC_EDIT2, m_lastname); DDX_Control(pDX, IDC_EDIT3, m_phonenumber); } BEGIN_MESSAGE_MAP(Cmfc_fileDlg, CDialog) #if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP) ON_WM_SIZE() #endif //}}AFX_MSG_MAP ON_COMMAND(IDOK, &Cmfc_fileDlg::OnSave) END_MESSAGE_MAP() // Cmfc_fileDlg-Meldungshandler BOOL Cmfc_fileDlg::OnInitDialog() { CDialog::OnInitDialog(); // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt // wenn das Hauptfenster der Anwendung kein Dialogfeld ist SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden if(!m_dlgCommandBar.Create(this) || !m_dlgCommandBar.InsertMenuBar(IDR_MAINFRAME)) { TRACE0("Fehler beim Erstellen der Befehlsleiste.\n"); return FALSE; // Fehler beim Erstellen } // TODO: Hier zusätzliche Initialisierung einfügen return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten } #if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP) void Cmfc_fileDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/) { if(AfxIsDRAEnabled()) { DRA::RelayoutDialog( AfxGetResourceHandle(), this->m_hWnd, DRA::GetDisplayMode() != DRA::Portrait ? MAKEINTRESOURCE(IDD_MFC_FILE_DIALOG_WIDE) : MAKEINTRESOURCE(IDD_MFC_FILE_DIALOG)); } } #endif void Cmfc_fileDlg::OnSave() { // TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein. struct DATABANK { wchar_t firstname[80]; wchar_t lastname[80]; wchar_t phone[15]; }; DATABANK db; CFile f(_T("databank.bin"), CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); CString c; m_firstname.GetWindowTextW(c); wcscpy(db.firstname, c); m_lastname.GetWindowTextW(c); wcscpy(db.lastname, c); m_phonenumber.GetWindowTextW(c); wcscpy(db.phone, c); f.Write((void *)&db, sizeof(struct DATABANK)); f.Close(); }
5. Вуаля!
Создастся вот-такой бинарный файл databank.bin, с данными Anton Popov, и телефонным номером 0123456:
Сохранилось в файл databank.bin A n t o n, P o p o v, 0 1 2 3 4 5 6 вместо Anton Popov 0123456 потому-что это юникод, т.е. я использовал wchar_t с английского wide char. А везде î стоит, потому-что я не иницилиазировал строку, чтобы инициализировать нужно либо использовать функцию memset см. https://cplusplus.com/reference/cstring/memset/
Доброе утро! Продолжим воспоминание. Но сегодня речь пойдёт о C#:
1. Запустим Visual Studio 2005, нажмём Datei->Neu->Projekt...:, появится диалоговое окна Neues Projekt, там выберим Visual C#->Intelligents Gerät и Geräteanwendung:
2. Нажмём на OK.
3. Сделаем так:
4. Забыл сменить заголовок, напишим Text=Say name!:
5. Вот код Form1.cs:
#region Using directives using System; using System.Drawing; using System.Collections; using System.Windows.Forms; using System.Data; #endregion namespace DeviceApplication1 { /// <summary> /// Zusammenfassungsbeschreibung für das Formular. /// </summary> public class Form1 : System.Windows.Forms.Form { private MenuItem menuItem1; private MenuItem menuItem2; private Label label1; private TextBox textBox1; /// <summary> /// Hauptmenü des Formulars. /// </summary> private System.Windows.Forms.MainMenu mainMenu1; public Form1() { InitializeComponent(); } /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> protected override void Dispose(bool disposing) { base.Dispose(disposing); } #region Vom Windows Form-Designer generierter Code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> private void InitializeComponent() { this.mainMenu1 = new System.Windows.Forms.MainMenu(); this.label1 = new System.Windows.Forms.Label(); this.textBox1 = new System.Windows.Forms.TextBox(); this.menuItem1 = new System.Windows.Forms.MenuItem(); this.menuItem2 = new System.Windows.Forms.MenuItem(); // // mainMenu1 // this.mainMenu1.MenuItems.Add(this.menuItem1); this.mainMenu1.MenuItems.Add(this.menuItem2); // // label1 // this.label1.Location = new System.Drawing.Point(4, 4); this.label1.Size = new System.Drawing.Size(152, 22); this.label1.Text = "Your name:"; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(4, 30); this.textBox1.Size = new System.Drawing.Size(152, 24); // // menuItem1 // this.menuItem1.Text = "OK"; this.menuItem1.Click += new System.EventHandler(this.menuItem1_Click); // // menuItem2 // this.menuItem2.Text = "Exit"; this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click); // // Form1 // this.ClientSize = new System.Drawing.Size(176, 180); this.Controls.Add(this.label1); this.Controls.Add(this.textBox1); this.Menu = this.mainMenu1; this.Text = "Say name!"; this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown); } #endregion /// <summary> /// Der Haupteinstiegspunkt für die Anwendung. /// </summary> static void Main() { Application.Run(new Form1()); } private void menuItem1_Click(object sender, EventArgs e) { MessageBox.Show("Hello " + this.textBox1.Text + "!"); // Выводим на экран Hello "имя"! } private void menuItem2_Click(object sender, EventArgs e) { this.Close(); // Закрываем наше приложение } private void Form1_KeyDown(object sender, KeyEventArgs e) { if((e.KeyCode == System.Windows.Forms.Keys.F1)) { // Bildschirmtaste 1 // Nicht behandelt, wenn ein Menü vorhanden ist. } if((e.KeyCode == System.Windows.Forms.Keys.F2)) { // Bildschirmtaste 2 // Nicht behandelt, wenn ein Menü vorhanden ist. } if((e.KeyCode == System.Windows.Forms.Keys.Up)) { // Nach oben } if((e.KeyCode == System.Windows.Forms.Keys.Down)) { // Nach unten } if((e.KeyCode == System.Windows.Forms.Keys.Left)) { // Links } if((e.KeyCode == System.Windows.Forms.Keys.Right)) { // Rechts } if((e.KeyCode == System.Windows.Forms.Keys.Enter)) { // Eingabe } if((e.KeyCode == System.Windows.Forms.Keys.D1)) { // 1 } if((e.KeyCode == System.Windows.Forms.Keys.D2)) { // 2 } if((e.KeyCode == System.Windows.Forms.Keys.D3)) { // 3 } if((e.KeyCode == System.Windows.Forms.Keys.D4)) { // 4 } if((e.KeyCode == System.Windows.Forms.Keys.D5)) { // 5 } if((e.KeyCode == System.Windows.Forms.Keys.D6)) { // 6 } if((e.KeyCode == System.Windows.Forms.Keys.D7)) { // 7 } if((e.KeyCode == System.Windows.Forms.Keys.D8)) { // 8 } if((e.KeyCode == System.Windows.Forms.Keys.D9)) { // 9 } if((e.KeyCode == System.Windows.Forms.Keys.F8)) { // * } if((e.KeyCode == System.Windows.Forms.Keys.D0)) { // 0 } if((e.KeyCode == System.Windows.Forms.Keys.F9)) { // # } } } }
6. Вуаля!:
Продолжим воспоминания. Вот так выглядет Microsoft Smartphone 5.0:
Стало больше компонентов, чем раньше: