Воспоминание 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