From 472729dfb9271d429673bd39f5a6edf881e88c4f Mon Sep 17 00:00:00 2001 From: Nicolas Arnaud-Cormos Date: Thu, 12 Sep 2024 16:03:41 +0200 Subject: [PATCH 1/7] fix: Small changes to TextDocument after API review - Remove duplicated selectRangeMark (same as selectRange) method - Tidy up some methods using ranges --- docs/API/knut/textdocument.md | 6 ------ src/core/textdocument.cpp | 35 ++++++++++------------------------- src/core/textdocument.h | 11 +++++------ tests/tst_textdocument.cpp | 2 +- 4 files changed, 16 insertions(+), 38 deletions(-) diff --git a/docs/API/knut/textdocument.md b/docs/API/knut/textdocument.md index 2d427f03..049b8c53 100644 --- a/docs/API/knut/textdocument.md +++ b/docs/API/knut/textdocument.md @@ -91,7 +91,6 @@ Inherited properties: [Document properties](../knut/document.md#properties) ||**[selectPreviousLine](#selectPreviousLine)**(int count = 1)| ||**[selectPreviousWord](#selectPreviousWord)**(int count = 1)| ||**[selectRange](#selectRange)**([RangeMark](../knut/rangemark.md) range)| -||**[selectRangeMark](#selectRangeMark)**([RangeMark](../knut/rangemark.md) mark)| ||**[selectRegion](#selectRegion)**(int from, int to)| ||**[selectStartOfLine](#selectStartOfLine)**(int count = 1)| ||**[selectStartOfWord](#selectStartOfWord)**()| @@ -475,11 +474,6 @@ Selects the previous word, repeat the operation `count` times. Selects the range passed in parameter. -#### **selectRangeMark**([RangeMark](../knut/rangemark.md) mark) - -Selects the text defined by the range make `mark`. - - #### **selectRegion**(int from, int to) Selects the text between `from` and `to` positions. diff --git a/src/core/textdocument.cpp b/src/core/textdocument.cpp index 226995c6..d9b97b04 100644 --- a/src/core/textdocument.cpp +++ b/src/core/textdocument.cpp @@ -833,7 +833,11 @@ void TextDocument::selectRegion(int from, int to) void TextDocument::selectRange(const RangeMark &range) { LOG(range); - selectRegion(range.start(), range.end()); + if (range.document() != this) { + spdlog::error("{}: Can't use a range mark from another editor.", FUNCTION_NAME); + return; + } + range.select(); } /*! @@ -1017,11 +1021,11 @@ void TextDocument::deleteRegion(int from, int to) void TextDocument::deleteRange(const RangeMark &range) { LOG(range); - QTextCursor cursor(m_document->document()); - cursor.setPosition(range.start(), QTextCursor::MoveAnchor); - cursor.setPosition(range.end(), QTextCursor::KeepAnchor); - cursor.removeSelectedText(); - m_document->setTextCursor(cursor); + if (range.document() != this) { + spdlog::error("{}: Can't use a range mark from another editor.", FUNCTION_NAME); + return; + } + range.remove(); } /*! @@ -1185,25 +1189,6 @@ Core::RangeMark TextDocument::createRangeMark() LOG_RETURN("rangeMark", createRangeMark(start, end)); } -/** - * \qmlmethod TextDocument::selectRangeMark(RangeMark mark) - * - * Selects the text defined by the range make `mark`. - * - * \sa RangeMark - */ -void TextDocument::selectRangeMark(const Core::RangeMark &mark) -{ - LOG(LOG_ARG("mark", mark)); - - if (mark.document() != this) { - spdlog::error("{}: Can't use a range mark from another editor.", FUNCTION_NAME); - return; - } - - mark.select(); -} - /*! * \qmlmethod bool TextDocument::find(string text, int options = TextDocument.NoFindFlags) * Searches the string `text` in the editor. Options could be a combination of: diff --git a/src/core/textdocument.h b/src/core/textdocument.h index 29270f94..66914862 100644 --- a/src/core/textdocument.h +++ b/src/core/textdocument.h @@ -142,16 +142,13 @@ public slots: void paste(); void cut(); - // Text handling - void remove(int length); + // Insertion void insert(const QString &text); void insertAtLine(const QString &text, int line = -1); void insertAtPosition(const QString &text, int pos); - void replace(int length, const QString &text); - void replace(int from, int to, const QString &text); - void replace(const Core::RangeMark &range, const QString &text); // Deletion + void remove(int length); void deleteLine(int line = -1); void deleteSelection(); void deleteEndOfLine(); @@ -171,7 +168,6 @@ public slots: // RangeMark Core::RangeMark createRangeMark(int from, int to); Core::RangeMark createRangeMark(); - void selectRangeMark(const Core::RangeMark &mark); // Find bool find(const QString &text, int options = NoFindFlags); @@ -179,6 +175,9 @@ public slots: QString match(const QString ®exp, int options = NoFindFlags); // Replace + void replace(int length, const QString &text); + void replace(int from, int to, const QString &text); + void replace(const Core::RangeMark &range, const QString &text); bool replaceOne(const QString &before, const QString &after, int options = NoFindFlags); int replaceAll(const QString &before, const QString &after, int options = NoFindFlags); int replaceAllInRange(const QString &before, const QString &after, const Core::RangeMark &range, diff --git a/tests/tst_textdocument.cpp b/tests/tst_textdocument.cpp index 64070b40..802ea2d2 100644 --- a/tests/tst_textdocument.cpp +++ b/tests/tst_textdocument.cpp @@ -278,7 +278,7 @@ private slots: // When replacing the text in the rangemark, the rangemark should span the new text afterwards. const auto newText = QString("Hello World"); mark.replace(newText); - document.selectRangeMark(mark); + document.selectRange(mark); QCOMPARE(document.selectedText(), newText); // Delete everything in the range mark. From 141cd3af39cccaa45d974653cd39d8217afb7e40 Mon Sep 17 00:00:00 2001 From: Nicolas Arnaud-Cormos Date: Fri, 13 Sep 2024 08:53:16 +0200 Subject: [PATCH 2/7] docs: Fix parameter name to `methodName` --- docs/API/knut/cppdocument.md | 6 +++--- src/core/cppdocument.cpp | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/API/knut/cppdocument.md b/docs/API/knut/cppdocument.md index 786758af..de8ecc2d 100644 --- a/docs/API/knut/cppdocument.md +++ b/docs/API/knut/cppdocument.md @@ -29,7 +29,7 @@ Inherited properties: [CodeDocument properties](../knut/codedocument.md#properti |string |**[correspondingHeaderSource](#correspondingHeaderSource)**()| |void |**[deleteMethod](#deleteMethod)**()| |void |**[deleteMethod](#deleteMethod)**(string methodName)| -|void |**[deleteMethod](#deleteMethod)**(string method, string signature)| +|void |**[deleteMethod](#deleteMethod)**(string methodName, string signature)| |int |**[gotoBlockEnd](#gotoBlockEnd)**(int count)| |int |**[gotoBlockStart](#gotoBlockStart)**(int count)| ||**[insertCodeInMethod](#insertCodeInMethod)**(string methodName, string code, Position insertAt)| @@ -142,9 +142,9 @@ Therefore, all overloads of the function will be deleted. Also see: CppDocument::deleteMethod(string methodName, string signature) -#### void **deleteMethod**(string method, string signature) +#### void **deleteMethod**(string methodName, string signature) -Delete the method or function with the specified `method` and optional `signature`. +Delete the method or function with the specified `methodName` and `signature`. The method definition/declaration will be deleted from the current file, as well as the corresponding header/source file. References to the method will not be deleted. diff --git a/src/core/cppdocument.cpp b/src/core/cppdocument.cpp index 3bd23545..b5662c78 100644 --- a/src/core/cppdocument.cpp +++ b/src/core/cppdocument.cpp @@ -1594,9 +1594,9 @@ void CppDocument::deleteMethodLocal(const QString &methodName, const QString &si } /*! - * \qmlmethod void CppDocument::deleteMethod(string method, string signature) + * \qmlmethod void CppDocument::deleteMethod(string methodName, string signature) * - * Delete the method or function with the specified `method` and optional `signature`. + * Delete the method or function with the specified `methodName` and `signature`. * The method definition/declaration will be deleted from the current file, * as well as the corresponding header/source file. * References to the method will not be deleted. @@ -1618,16 +1618,16 @@ void CppDocument::deleteMethodLocal(const QString &methodName, const QString &si * * If an empty string is provided as the `signature`, all overloads of the function are deleted as well. */ -void CppDocument::deleteMethod(const QString &method, const QString &signature) +void CppDocument::deleteMethod(const QString &methodName, const QString &signature) { - LOG(method, signature); + LOG(methodName, signature); QString headerSourceName = correspondingHeaderSource(); if (!headerSourceName.isEmpty()) { auto headerSource = qobject_cast(Project::instance()->get(headerSourceName)); - headerSource->deleteMethodLocal(method, signature); + headerSource->deleteMethodLocal(methodName, signature); } - deleteMethodLocal(method, signature); + deleteMethodLocal(methodName, signature); } /*! From a325aaa52d9aaad152e6cfa35959e5af7f053e82 Mon Sep 17 00:00:00 2001 From: Nicolas Arnaud-Cormos Date: Fri, 13 Sep 2024 14:35:38 +0200 Subject: [PATCH 3/7] refactor: Remove files with unknown copyright - replace 2048Game with MainWindow - replace the mfc-tutorial project with mfc-dialog Both are created using the MSVC default template for MFC projects. --- src/rccore/rc_parse.cpp | 3 +- test_data/projects/mfc-dialog/Tutorial.cpp | 92 +++ test_data/projects/mfc-dialog/Tutorial.h | 32 + test_data/projects/mfc-dialog/Tutorial.rc | Bin 0 -> 11044 bytes test_data/projects/mfc-dialog/TutorialDlg.cpp | 140 ++++ test_data/projects/mfc-dialog/TutorialDlg.h | 45 ++ test_data/projects/mfc-dialog/framework.h | 39 + test_data/projects/mfc-dialog/pch.cpp | 5 + test_data/projects/mfc-dialog/pch.h | 13 + .../mfc-dialog/res/Tutorial.ico} | Bin .../projects/mfc-dialog/res/Tutorial.rc2 | Bin 0 -> 800 bytes test_data/projects/mfc-dialog/resource.h | 22 + test_data/projects/mfc-dialog/targetver.h | 8 + .../projects/mfc-tutorial/MFC_UpdateGUI.rc | 185 ----- test_data/projects/mfc-tutorial/Resource.h | 28 - .../projects/mfc-tutorial/TutorialApp.cpp | 38 - test_data/projects/mfc-tutorial/TutorialApp.h | 32 - .../projects/mfc-tutorial/TutorialDlg.cpp | 216 ------ test_data/projects/mfc-tutorial/TutorialDlg.h | 71 -- .../mfc-tutorial/res/MFC_UpdateGUI.ico | Bin 21630 -> 0 bytes .../mfc-tutorial/res/MFC_UpdateGUI.rc2 | 13 - test_data/projects/mfc-tutorial/stdafx.cpp | 7 - test_data/projects/mfc-tutorial/stdafx.h | 51 -- test_data/rcfiles/2048Game/2048Game.rc | 687 ------------------ test_data/rcfiles/2048Game/res/Toolbar256.bmp | Bin 5816 -> 0 bytes test_data/rcfiles/2048Game/res/classview.bmp | Bin 958 -> 0 bytes .../rcfiles/2048Game/res/classview_hc.bmp | Bin 5096 -> 0 bytes test_data/rcfiles/2048Game/res/fileview.bmp | Bin 478 -> 0 bytes .../rcfiles/2048Game/res/fileview_hc.bmp | Bin 2216 -> 0 bytes test_data/rcfiles/2048Game/res/menuimages.bmp | Bin 1078 -> 0 bytes .../rcfiles/2048Game/res/menuimages_hc.bmp | Bin 5816 -> 0 bytes test_data/rcfiles/2048Game/res/properties.bmp | Bin 598 -> 0 bytes .../rcfiles/2048Game/res/properties_hc.bmp | Bin 2936 -> 0 bytes test_data/rcfiles/2048Game/resource.h | 109 --- test_data/rcfiles/mainWindow/MainWindow.rc | Bin 0 -> 23974 bytes .../rcfiles/mainWindow/res/MainWindow.ico | Bin 0 -> 67777 bytes .../res/MainWindow.rc2} | Bin 804 -> 804 bytes .../rcfiles/mainWindow/res/MainWindowDoc.ico | Bin 0 -> 4710 bytes .../{2048Game => mainWindow}/res/Toolbar.bmp | Bin .../rcfiles/mainWindow/res/userimages.bmp | Bin 0 -> 7976 bytes test_data/rcfiles/mainWindow/resource.h | 28 + .../TutorialDialogWithNamespace.cpp | 260 +++---- .../message_map/TutorialDlg.cpp.expected | 246 +++---- .../message_map/TutorialDlg.cpp.original | 264 +++---- .../afx_msg_declaration.h.expected | 95 +-- .../afx_msg_declaration.h.original | 95 +-- test_data/tst_project.qml | 24 +- test_data/tst_rcdocument.qml | 47 +- .../tst_rcwriter/qrc_expected_default.qrc | 12 - .../qrc_expected_noalias_onlyexist.qrc | 26 - test_data/tst_treesitter/mfc-TutorialDlg.cpp | 262 +++---- tests/tst_cppdocument_treesitter.cpp | 37 +- tests/tst_rcparser.cpp | 4 +- tests/tst_rcwriter.cpp | 73 +- tests/tst_treesitter.cpp | 2 +- 55 files changed, 946 insertions(+), 2365 deletions(-) create mode 100644 test_data/projects/mfc-dialog/Tutorial.cpp create mode 100644 test_data/projects/mfc-dialog/Tutorial.h create mode 100644 test_data/projects/mfc-dialog/Tutorial.rc create mode 100644 test_data/projects/mfc-dialog/TutorialDlg.cpp create mode 100644 test_data/projects/mfc-dialog/TutorialDlg.h create mode 100644 test_data/projects/mfc-dialog/framework.h create mode 100644 test_data/projects/mfc-dialog/pch.cpp create mode 100644 test_data/projects/mfc-dialog/pch.h rename test_data/{rcfiles/2048Game/res/2048Game.ico => projects/mfc-dialog/res/Tutorial.ico} (100%) create mode 100644 test_data/projects/mfc-dialog/res/Tutorial.rc2 create mode 100644 test_data/projects/mfc-dialog/resource.h create mode 100644 test_data/projects/mfc-dialog/targetver.h delete mode 100644 test_data/projects/mfc-tutorial/MFC_UpdateGUI.rc delete mode 100644 test_data/projects/mfc-tutorial/Resource.h delete mode 100644 test_data/projects/mfc-tutorial/TutorialApp.cpp delete mode 100644 test_data/projects/mfc-tutorial/TutorialApp.h delete mode 100644 test_data/projects/mfc-tutorial/TutorialDlg.cpp delete mode 100644 test_data/projects/mfc-tutorial/TutorialDlg.h delete mode 100644 test_data/projects/mfc-tutorial/res/MFC_UpdateGUI.ico delete mode 100644 test_data/projects/mfc-tutorial/res/MFC_UpdateGUI.rc2 delete mode 100644 test_data/projects/mfc-tutorial/stdafx.cpp delete mode 100644 test_data/projects/mfc-tutorial/stdafx.h delete mode 100644 test_data/rcfiles/2048Game/2048Game.rc delete mode 100644 test_data/rcfiles/2048Game/res/Toolbar256.bmp delete mode 100644 test_data/rcfiles/2048Game/res/classview.bmp delete mode 100644 test_data/rcfiles/2048Game/res/classview_hc.bmp delete mode 100644 test_data/rcfiles/2048Game/res/fileview.bmp delete mode 100644 test_data/rcfiles/2048Game/res/fileview_hc.bmp delete mode 100644 test_data/rcfiles/2048Game/res/menuimages.bmp delete mode 100644 test_data/rcfiles/2048Game/res/menuimages_hc.bmp delete mode 100644 test_data/rcfiles/2048Game/res/properties.bmp delete mode 100644 test_data/rcfiles/2048Game/res/properties_hc.bmp delete mode 100644 test_data/rcfiles/2048Game/resource.h create mode 100644 test_data/rcfiles/mainWindow/MainWindow.rc create mode 100644 test_data/rcfiles/mainWindow/res/MainWindow.ico rename test_data/rcfiles/{2048Game/res/My2048Game.rc2 => mainWindow/res/MainWindow.rc2} (92%) create mode 100644 test_data/rcfiles/mainWindow/res/MainWindowDoc.ico rename test_data/rcfiles/{2048Game => mainWindow}/res/Toolbar.bmp (100%) create mode 100644 test_data/rcfiles/mainWindow/res/userimages.bmp create mode 100644 test_data/rcfiles/mainWindow/resource.h diff --git a/src/rccore/rc_parse.cpp b/src/rccore/rc_parse.cpp index 05f82d4d..1b0e0a57 100644 --- a/src/rccore/rc_parse.cpp +++ b/src/rccore/rc_parse.cpp @@ -70,12 +70,13 @@ static QHash loadResourceFile(const QString &resourceFile) QTextStream stream(&file); QHash resourceMap; + static QRegularExpression empty_spaces("\\s+"); while (!stream.atEnd()) { const QString line = stream.readLine(); if (!line.startsWith("#define")) continue; - QStringList fields = line.split(' ', Qt::SkipEmptyParts); + QStringList fields = line.split(empty_spaces, Qt::SkipEmptyParts); if (fields.size() < 3) continue; const auto &value = fields.at(1); diff --git a/test_data/projects/mfc-dialog/Tutorial.cpp b/test_data/projects/mfc-dialog/Tutorial.cpp new file mode 100644 index 00000000..1877b81b --- /dev/null +++ b/test_data/projects/mfc-dialog/Tutorial.cpp @@ -0,0 +1,92 @@ + +// Tutorial.cpp : Defines the class behaviors for the application. +// + +#include "pch.h" +#include "framework.h" +#include "Tutorial.h" +#include "TutorialDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CTutorialApp + +BEGIN_MESSAGE_MAP(CTutorialApp, CWinApp) + ON_COMMAND(ID_HELP, &CWinApp::OnHelp) +END_MESSAGE_MAP() + + +// CTutorialApp construction + +CTutorialApp::CTutorialApp() +{ + // TODO: add construction code here, + // Place all significant initialization in InitInstance +} + + +// The one and only CTutorialApp object + +CTutorialApp theApp; + + +// CTutorialApp initialization + +BOOL CTutorialApp::InitInstance() +{ + CWinApp::InitInstance(); + + + // Create the shell manager, in case the dialog contains + // any shell tree view or shell list view controls. + CShellManager *pShellManager = new CShellManager; + + // Activate "Windows Native" visual manager for enabling themes in MFC controls + CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); + + // Standard initialization + // If you are not using these features and wish to reduce the size + // of your final executable, you should remove from the following + // the specific initialization routines you do not need + // Change the registry key under which our settings are stored + // TODO: You should modify this string to be something appropriate + // such as the name of your company or organization + SetRegistryKey(_T("Local AppWizard-Generated Applications")); + + CTutorialDlg dlg; + m_pMainWnd = &dlg; + INT_PTR nResponse = dlg.DoModal(); + if (nResponse == IDOK) + { + // TODO: Place code here to handle when the dialog is + // dismissed with OK + } + else if (nResponse == IDCANCEL) + { + // TODO: Place code here to handle when the dialog is + // dismissed with Cancel + } + else if (nResponse == -1) + { + TRACE(traceAppMsg, 0, "Warning: dialog creation failed, so application is terminating unexpectedly.\n"); + TRACE(traceAppMsg, 0, "Warning: if you are using MFC controls on the dialog, you cannot #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS.\n"); + } + + // Delete the shell manager created above. + if (pShellManager != nullptr) + { + delete pShellManager; + } + +#if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS) + ControlBarCleanUp(); +#endif + + // Since the dialog has been closed, return FALSE so that we exit the + // application, rather than start the application's message pump. + return FALSE; +} + diff --git a/test_data/projects/mfc-dialog/Tutorial.h b/test_data/projects/mfc-dialog/Tutorial.h new file mode 100644 index 00000000..dac74f48 --- /dev/null +++ b/test_data/projects/mfc-dialog/Tutorial.h @@ -0,0 +1,32 @@ + +// Tutorial.h : main header file for the PROJECT_NAME application +// + +#pragma once + +#ifndef __AFXWIN_H__ + #error "include 'pch.h' before including this file for PCH" +#endif + +#include "resource.h" // main symbols + + +// CTutorialApp: +// See Tutorial.cpp for the implementation of this class +// + +class CTutorialApp : public CWinApp +{ +public: + CTutorialApp(); + +// Overrides +public: + virtual BOOL InitInstance(); + +// Implementation + + DECLARE_MESSAGE_MAP() +}; + +extern CTutorialApp theApp; diff --git a/test_data/projects/mfc-dialog/Tutorial.rc b/test_data/projects/mfc-dialog/Tutorial.rc new file mode 100644 index 0000000000000000000000000000000000000000..ece506d8566b263a8b784ee31b110cbb3b570956 GIT binary patch literal 11044 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 +} + +void CTutorialDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialogEx::DoDataExchange(pDX); + DDX_Check(pDX, IDC_CHECK1, m_check); + DDV_MaxChars(pDX, m_message, 3); // added for testing DDV_ doesn't break extraction! + DDX_Control(pDX, IDC_EDIT1, m_edit); + DDX_Control(pDX, IDC_COMBO1, m_combo); + DDX_Control(pDX, IDC_SLIDER1, m_slider); + DDX_Text(pDX, IDC_MESSAGE, m_message); +} + +BEGIN_MESSAGE_MAP(CTutorialDlg, CDialogEx) + ON_WM_PAINT() +// ON_WM_QUERYDRAGICON() + ON_BN_CLICKED(IDC_CHECK1, &CTutorialDlg::OnBnClickedCheck1) + ON_EN_CHANGE(IDC_EDIT1, &CTutorialDlg::OnEnChangeEdit1) + ON_CBN_SELCHANGE(IDC_COMBO1, &CTutorialDlg::OnCbnSelchangeCombo1) + ON_WM_HSCROLL() + ON_WM_TIMER() +END_MESSAGE_MAP() + + +// CTutorialDlg message handlers + +BOOL CTutorialDlg::OnInitDialog() +{ + CDialogEx::OnInitDialog(); + + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + + // TODO: Add extra initialization here + + return TRUE; // return TRUE unless you set the focus to a control +} + +// If you add a minimize button to your dialog, you will need the code below +// to draw the icon. For MFC applications using the document/view model, +// this is automatically done for you by the framework. + +void CTutorialDlg::OnPaint() +{ + if (IsIconic()) + { + CPaintDC dc(this); // device context for painting + + SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); + + // Center icon in client rectangle + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // Draw the icon + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CDialogEx::OnPaint(); + } +} + +// The system calls this function to obtain the cursor to display while the user drags +// the minimized window. +//HCURSOR CTutorialDlg::OnQueryDragIcon() +//{ +// return static_cast(m_hIcon); +//} + + + +void CTutorialDlg::OnBnClickedCheck1() +{ + // TODO: Add your control notification handler code here +} + + +void CTutorialDlg::OnEnChangeEdit1() +{ + // TODO: If this is a RICHEDIT control, the control will not + // send this notification unless you override the CDialogEx::OnInitDialog() + // function and call CRichEditCtrl().SetEventMask() + // with the ENM_CHANGE flag ORed into the mask. + + // TODO: Add your control notification handler code here +} + + +void CTutorialDlg::OnCbnSelchangeCombo1() +{ + // TODO: Add your control notification handler code here +} + + +void CTutorialDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) +{ + // TODO: Add your message handler code here and/or call default + + CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar); +} + + +void CTutorialDlg::OnTimer(UINT_PTR nIDEvent) +{ + // TODO: Add your message handler code here and/or call default + + CDialogEx::OnTimer(nIDEvent); +} diff --git a/test_data/projects/mfc-dialog/TutorialDlg.h b/test_data/projects/mfc-dialog/TutorialDlg.h new file mode 100644 index 00000000..075dcc42 --- /dev/null +++ b/test_data/projects/mfc-dialog/TutorialDlg.h @@ -0,0 +1,45 @@ + +// TutorialDlg.h : header file +// + +#pragma once + + +/// Main dialog for the sample application. This is created and displayed in +/// the CTutorialApp::InitInstance function. +class CTutorialDlg : public CDialogEx +{ +// Construction +public: + CTutorialDlg(CWnd* pParent = nullptr); // standard constructor + +// Dialog Data +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_TUTORIAL_DIALOG }; +#endif + + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + +// Implementation +protected: + HICON m_hIcon; + + // Generated message map functions + virtual BOOL OnInitDialog(); + afx_msg void OnPaint(); +// afx_msg HCURSOR OnQueryDragIcon(); + DECLARE_MESSAGE_MAP() +public: + BOOL m_check; + CEdit m_edit; + CComboBox m_combo; + CSliderCtrl m_slider; + CString m_message; + afx_msg void OnBnClickedCheck1(); + afx_msg void OnEnChangeEdit1(); + afx_msg void OnCbnSelchangeCombo1(); + afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); + afx_msg void OnTimer(UINT_PTR nIDEvent); +}; diff --git a/test_data/projects/mfc-dialog/framework.h b/test_data/projects/mfc-dialog/framework.h new file mode 100644 index 00000000..b25aff0c --- /dev/null +++ b/test_data/projects/mfc-dialog/framework.h @@ -0,0 +1,39 @@ +#pragma once + +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif + +#include "targetver.h" + +#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit + +// turns off MFC's hiding of some common and often safely ignored warning messages +#define _AFX_ALL_WARNINGS + +#include // MFC core and standard components +#include // MFC extensions + + + + + +#ifndef _AFX_NO_OLE_SUPPORT +#include // MFC support for Internet Explorer 4 Common Controls +#endif +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC support for Windows Common Controls +#endif // _AFX_NO_AFXCMN_SUPPORT + +#include // MFC support for ribbons and control bars + + + + + + + + + + + diff --git a/test_data/projects/mfc-dialog/pch.cpp b/test_data/projects/mfc-dialog/pch.cpp new file mode 100644 index 00000000..64b7eef6 --- /dev/null +++ b/test_data/projects/mfc-dialog/pch.cpp @@ -0,0 +1,5 @@ +// pch.cpp: source file corresponding to the pre-compiled header + +#include "pch.h" + +// When you are using pre-compiled headers, this source file is necessary for compilation to succeed. diff --git a/test_data/projects/mfc-dialog/pch.h b/test_data/projects/mfc-dialog/pch.h new file mode 100644 index 00000000..885d5d62 --- /dev/null +++ b/test_data/projects/mfc-dialog/pch.h @@ -0,0 +1,13 @@ +// pch.h: This is a precompiled header file. +// Files listed below are compiled only once, improving build performance for future builds. +// This also affects IntelliSense performance, including code completion and many code browsing features. +// However, files listed here are ALL re-compiled if any one of them is updated between builds. +// Do not add files here that you will be updating frequently as this negates the performance advantage. + +#ifndef PCH_H +#define PCH_H + +// add headers that you want to pre-compile here +#include "framework.h" + +#endif //PCH_H diff --git a/test_data/rcfiles/2048Game/res/2048Game.ico b/test_data/projects/mfc-dialog/res/Tutorial.ico similarity index 100% rename from test_data/rcfiles/2048Game/res/2048Game.ico rename to test_data/projects/mfc-dialog/res/Tutorial.ico diff --git a/test_data/projects/mfc-dialog/res/Tutorial.rc2 b/test_data/projects/mfc-dialog/res/Tutorial.rc2 new file mode 100644 index 0000000000000000000000000000000000000000..dad199e7b75214ac527531113245ae988fc5acf7 GIT binary patch literal 800 zcmdUt&1wQs428dSq3;mrveW_JptLSTS_`(_79Fq5fE{7fg)gt3bNz$Th0B(3Gr7r0 za&j}fZ9%~;H_`>cJ8M=fXsH=9rz5MRtH^^+OJb?$I(uygFG7~OFLGq2?BG+rrBJRA zJaI1xrotR@8d=6A`RZ)>>*}R$b2ev2X6AFJ_)O>|9X#^JNL)X7rq7Ts=~s0fGN32l zAtR}xd9}(|QDsh{{8}B7eC8PZhn>>?Q`bDo{dYaMrzbR&DW`6mp dB>2{Do8yMPugfmI)8GG;O0Vu6ce4DCsrS#UX=4BY literal 0 HcmV?d00001 diff --git a/test_data/projects/mfc-dialog/resource.h b/test_data/projects/mfc-dialog/resource.h new file mode 100644 index 00000000..24b7005c --- /dev/null +++ b/test_data/projects/mfc-dialog/resource.h @@ -0,0 +1,22 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Tutorial.rc +// +#define IDD_TUTORIAL_DIALOG 102 +#define IDR_MAINFRAME 128 +#define IDC_CHECK1 1000 +#define IDC_EDIT1 1001 +#define IDC_COMBO1 1002 +#define IDC_SLIDER1 1003 +#define IDC_MESSAGE 1004 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 130 +#define _APS_NEXT_COMMAND_VALUE 32771 +#define _APS_NEXT_CONTROL_VALUE 1005 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/test_data/projects/mfc-dialog/targetver.h b/test_data/projects/mfc-dialog/targetver.h new file mode 100644 index 00000000..87c0086d --- /dev/null +++ b/test_data/projects/mfc-dialog/targetver.h @@ -0,0 +1,8 @@ +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/test_data/projects/mfc-tutorial/MFC_UpdateGUI.rc b/test_data/projects/mfc-tutorial/MFC_UpdateGUI.rc deleted file mode 100644 index 84462bd8..00000000 --- a/test_data/projects/mfc-tutorial/MFC_UpdateGUI.rc +++ /dev/null @@ -1,185 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.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_ENU)\r\n" - "LANGUAGE 9, 1\r\n" - "#pragma code_page(1252)\r\n" - "#include ""res\\MFC_UpdateGUI.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\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\\MFC_UpdateGUI.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_UPDATEGUI_DIALOG DIALOGEX 0, 0, 320, 200 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | - WS_CAPTION -EXSTYLE WS_EX_APPWINDOW -CAPTION "Application Update GUI Elements" -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - DEFPUSHBUTTON "Click to Add",ID_BTN_ADD,65,7,50,16 - PUSHBUTTON "Quit",IDCANCEL,263,177,50,16 - LTEXT "Button Clicks:",IDC_STATIC,118,11,50,8 - LTEXT "0",IDC_ECHO_AREA,166,10,55,11,0,WS_EX_CLIENTEDGE - CONTROL "",IDC_V_SLIDER_BAR,"msctls_trackbar32",TBS_VERT | - TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,17,19,17,141 - CONTROL "",IDC_H_SLIDER_BAR,"msctls_trackbar32",TBS_BOTH | - TBS_NOTICKS | WS_TABSTOP,86,178,162,15 - LTEXT "Vertical Bar",IDC_STATIC,7,161,39,8 - LTEXT "Horizontal Bar",IDC_STATIC,147,163,47,8 - CTEXT "Static",IDC_V_SLIDER_ECHO,12,10,28,10,0, - WS_EX_CLIENTEDGE - CTEXT "Static",IDC_H_SLIDER_ECHO,115,163,28,10,0, - WS_EX_CLIENTEDGE - LTEXT "0",IDC_TIMERECHO,167,142,146,11,0,WS_EX_CLIENTEDGE - LTEXT "0",IDC_MOUSEECHO,167,128,146,11,0,WS_EX_CLIENTEDGE - LTEXT "Timer Echo:",IDC_STATIC,115,143,45,8 - LTEXT "Mouse Echo:",IDC_STATIC,115,130,45,8 - CONTROL "Timer Control Sliders",IDC_TIMER_CONTROL_SLIDERS,"Button", - BS_AUTOCHECKBOX | WS_TABSTOP,116,74,86,10 -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 "040904e4" - BEGIN - VALUE "CompanyName", "TODO: " - VALUE "FileDescription", "TODO: " - VALUE "FileVersion", "1.0.0.1" - VALUE "InternalName", "MFC_UpdateGUI.exe" - VALUE "LegalCopyright", "TODO: (c) . All rights reserved." - VALUE "OriginalFilename", "MFC_UpdateGUI.exe" - VALUE "ProductName", "TODO: " - VALUE "ProductVersion", "1.0.0.1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_UPDATEGUI_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 313 - TOPMARGIN, 7 - BOTTOMMARGIN, 193 - END -END -#endif // APSTUDIO_INVOKED - -#endif // English (U.S.) 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_ENU) -LANGUAGE 9, 1 -#pragma code_page(1252) -#include "res\MFC_UpdateGUI.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/test_data/projects/mfc-tutorial/Resource.h b/test_data/projects/mfc-tutorial/Resource.h deleted file mode 100644 index e0d15c6f..00000000 --- a/test_data/projects/mfc-tutorial/Resource.h +++ /dev/null @@ -1,28 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by MFC_UpdateGUI.rc -// -#define IDD_MFC_UPDATEGUI_DIALOG 102 -#define IDD_UPDATEGUI_DIALOG 103 -#define IDR_MAINFRAME 128 -#define IDC_ECHO_AREA 1000 -#define ID_BTN_ADD 1001 -#define IDC_TIMERECHO 1002 -#define IDC_V_SLIDER_BAR 1003 -#define IDC_H_SLIDER_BAR 1004 -#define IDC_V_SLIDER_ECHO 1005 -#define IDC_H_SLIDER_ECHO 1006 -#define IDC_MOUSEECHO 1007 -#define IDC_CHECK_CONTROL_SLIDERS 1008 -#define IDC_TIMER_CONTROL_SLIDERS 1008 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 129 -#define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1009 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/test_data/projects/mfc-tutorial/TutorialApp.cpp b/test_data/projects/mfc-tutorial/TutorialApp.cpp deleted file mode 100644 index 4bae2157..00000000 --- a/test_data/projects/mfc-tutorial/TutorialApp.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "stdafx.h" -#include "TutorialApp.h" -#include "TutorialDlg.h" - -// DEBUG_NEW macro allows MFC applications to determine memory leak locations in debug builds -#ifdef _DEBUG - #define new DEBUG_NEW -#endif - - -BEGIN_MESSAGE_MAP(CTutorialApp, CWinApp) -END_MESSAGE_MAP() - -CTutorialApp::CTutorialApp() -{ -} - -// The one and only CTutorialApp object -CTutorialApp theApp; - -BOOL CTutorialApp::InitInstance() -{ - // InitCommonControls() is required on Windows XP if an application - // manifest specifies use of ComCtl32.dll version 6 or later to enable - // visual styles. Otherwise, any window creation will fail. - InitCommonControls(); - - CWinApp::InitInstance(); - - // Create and show our dialog - CTutorialDlg dlg; - m_pMainWnd = &dlg; - INT_PTR nResponse = dlg.DoModal(); - - // Since the dialog has been closed, return FALSE so that we exit the - // application, rather than start the application's message pump. - return FALSE; -} diff --git a/test_data/projects/mfc-tutorial/TutorialApp.h b/test_data/projects/mfc-tutorial/TutorialApp.h deleted file mode 100644 index 1bed30f2..00000000 --- a/test_data/projects/mfc-tutorial/TutorialApp.h +++ /dev/null @@ -1,32 +0,0 @@ -// University of Washington Bothell Graphics Library -// Authors: Kelvin Sung, Steve Baer -// The accompanying library supports CSS Graphics courses taught at UW-Bothell -// See: http://courses.washington.edu/css450/ -// http://courses.washington.edu/css451/ -/////////////////////////////////////////////////////////////////////////////////// -#pragma once - -#ifndef __AFXWIN_H__ - #error include 'stdafx.h' before including this file for PCH -#endif - -#include "resource.h" // main symbols - -/// CTutorialApp: -/// All MFC Applications have a single instance of a subclass of CWinApp. -/// This object handles application start-up / shut-down and loading the GUI components -class CTutorialApp : public CWinApp -{ -public: - CTutorialApp(); - - /// This could be considered the "entry point" for the application. - /// The class is constructed on the stack and this function is called at the appropriate - /// time to allow for command line parsing, setting up windows, ... - virtual BOOL InitInstance(); - DECLARE_MESSAGE_MAP() -}; - -/// The one and only application object for this application. All objects -/// can reference this static object by including this header file. -extern CTutorialApp theApp; diff --git a/test_data/projects/mfc-tutorial/TutorialDlg.cpp b/test_data/projects/mfc-tutorial/TutorialDlg.cpp deleted file mode 100644 index 811f6322..00000000 --- a/test_data/projects/mfc-tutorial/TutorialDlg.cpp +++ /dev/null @@ -1,216 +0,0 @@ -#include "stdafx.h" -#include "TutorialApp.h" -#include "TutorialDlg.h" - -// DEBUG_NEW macro allows MFC applications to determine memory leak locations in debug builds -#ifdef _DEBUG - #define new DEBUG_NEW -#endif - - -CTutorialDlg::CTutorialDlg(CWnd* pParent) -: CDialog(CTutorialDlg::IDD, pParent) -, m_EchoText(L"") -, m_HSliderEcho(L"") -, m_VSliderEcho(L"") -, m_MouseEcho(L"") -, m_TimerEcho(L"") -, m_TimerCtrlSliders(TRUE) -, m_OkCount(0) -, m_Seconds(0) -{ - m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); -} - -void CTutorialDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - DDX_Text(pDX, IDC_ECHO_AREA, m_EchoText); - DDV_MaxChars(pDX, m_EchoText, 3); // added for testing DDV_ doesn't break extraction! - DDX_Text(pDX, IDC_H_SLIDER_ECHO, m_HSliderEcho); - DDX_Text(pDX, IDC_V_SLIDER_ECHO, m_VSliderEcho); - DDX_Control(pDX, IDC_V_SLIDER_BAR, m_VSliderBar); - DDX_Control(pDX, IDC_H_SLIDER_BAR, m_HSliderBar); - // Added a comment here for testing - DDX_Text(pDX, IDC_MOUSEECHO, m_MouseEcho); - DDX_Text(pDX, IDC_TIMERECHO, m_TimerEcho); - DDX_Check(pDX, IDC_TIMER_CONTROL_SLIDERS, m_TimerCtrlSliders); -} - -BEGIN_MESSAGE_MAP(CTutorialDlg, CDialog) - ON_WM_PAINT() - ON_WM_HSCROLL() - ON_WM_VSCROLL() - ON_WM_TIMER() - ON_WM_LBUTTONDOWN() - ON_WM_MOUSEMOVE() - ON_WM_RBUTTONDOWN() - ON_BN_CLICKED(ID_BTN_ADD, /*a random comment*/OnBnClickedBtnAdd) - ON_BN_CLICKED(/*another random comment*/ IDC_TIMER_CONTROL_SLIDERS, OnBnClickedTimerControlSliders) -END_MESSAGE_MAP() - -// This is called when the dialog is first created and shown. -// It is a good spot to initialize member variables. -BOOL CTutorialDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog - SetIcon(m_hIcon, TRUE); // Set big icon - SetIcon(m_hIcon, FALSE); // Set small icon - - // Add extra initialization here. - // We want to initialize the slider bars - m_VSliderBar.SetRange(0, 100, TRUE); - m_VSliderBar.SetPos(50); - m_VSliderEcho.Format(L"%d", 50); - - m_HSliderBar.SetRange(0, 10, TRUE); - m_HSliderBar.SetPos(5); - m_HSliderEcho.Format(L"%d", 5); - - // Initialize the timer to go off every 1000 milliseconds (every second) - // when timer "goes-off", our OnTimer() event handler function will be - // called and it is upto us to decide what we want to do. - SetTimer(0, 1000, NULL); - - UpdateData(false); - - return TRUE; // return TRUE unless you set the focus to a control -} - -// If you add a minimize button to your dialog, you will need the code below -// to draw the icon. For MFC applications using the document/view model, -// this is automatically done for you by the framework. -void CTutorialDlg::OnPaint() -{ - if (IsIconic()) - { - CPaintDC dc(this); // device context for painting - - SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); - - // Center icon in client rectangle - int cxIcon = GetSystemMetrics(SM_CXICON); - int cyIcon = GetSystemMetrics(SM_CYICON); - CRect rect; - GetClientRect(&rect); - int x = (rect.Width() - cxIcon + 1) / 2; - int y = (rect.Height() - cyIcon + 1) / 2; - - // Draw the icon - dc.DrawIcon(x, y, m_hIcon); - } - else - { - CDialog::OnPaint(); - } -} - -void CTutorialDlg::OnBnClickedBtnAdd() -{ - m_OkCount++; - m_EchoText.Format(L"%d", m_OkCount); - - // Notice, without UpdateData() status area will _NOT_ be updated. - UpdateData(FALSE); -} - - -void CTutorialDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) -{ - // We should check to make sure we know which slider bar is generating the events - if (pScrollBar == (CScrollBar *) &m_HSliderBar) - { - int value = m_HSliderBar.GetPos(); - m_HSliderEcho.Format(L"%d", value); - UpdateData(false); - } - else - CDialog::OnHScroll(nSBCode, nPos, pScrollBar); -} - -void CTutorialDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) -{ - // We should check to make sure we know which slider bar is generating the events - if (pScrollBar == (CScrollBar *) &m_VSliderBar) - { - int value = m_VSliderBar.GetPos(); - m_VSliderEcho.Format(L"%d", value); - UpdateData(false); - } - else - CDialog::OnVScroll(nSBCode, nPos, pScrollBar); -} - -void CTutorialDlg::OnTimer(UINT_PTR nIDEvent) -{ - m_Seconds++; - - if (m_TimerCtrlSliders) - { - // Get ready to decrease the sliders ... - int hvalue = m_HSliderBar.GetPos(); - if (hvalue > 0) - { - m_HSliderBar.SetPos(hvalue-1); - m_HSliderEcho.Format(L"%d", hvalue-1); - } - - int vvalue = m_VSliderBar.GetPos(); - if (vvalue > 0) - { - m_VSliderBar.SetPos(vvalue-1); - m_VSliderEcho.Format(L"%d", vvalue-1); - } - - if ( (hvalue==0) && (vvalue==0) ) - m_TimerCtrlSliders = false; - } - - m_TimerEcho.Format(L"%d: Seconds have passed", m_Seconds); - UpdateData(false); -} - -void CTutorialDlg::OnLButtonDown(UINT nFlags, CPoint point) -{ - CString prefix; - if(nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if(nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sLeft mouse down at %d,%d", prefix, point.x, point.y); - UpdateData(false); -} - -void CTutorialDlg::OnMouseMove(UINT nFlags, CPoint point) -{ - CString prefix; - if(nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if(nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sMouse move at %d,%d", prefix, point.x, point.y); - UpdateData(false); -} - -void CTutorialDlg::OnRButtonDown(UINT nFlags, CPoint point) -{ - CString prefix; - if(nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if(nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sRight mouse down at %d,%d", prefix, point.x, point.y); - UpdateData(false); -} - -void CTutorialDlg::OnBnClickedTimerControlSliders() -{ - UpdateData(true); - // This will fill all UI-connected variables with whatever - // value that is showing on the UI control objects. - // - // In this case, we care most about the value for m_TimerCtrlSliders -} diff --git a/test_data/projects/mfc-tutorial/TutorialDlg.h b/test_data/projects/mfc-tutorial/TutorialDlg.h deleted file mode 100644 index b2a4830d..00000000 --- a/test_data/projects/mfc-tutorial/TutorialDlg.h +++ /dev/null @@ -1,71 +0,0 @@ -// University of Washington Bothell Graphics Library -// Authors: Kelvin Sung, Steve Baer -// The accompanying library supports CSS Graphics courses taught at UW-Bothell -// See: http://courses.washington.edu/css450/ -// http://courses.washington.edu/css451/ -/////////////////////////////////////////////////////////////////////////////////// -#pragma once - -/// Main dialog for the sample application. This is created and displayed in -/// the CTutorialApp::InitInstance function. -class CTutorialDlg : public CDialog -{ -public: - CTutorialDlg(CWnd* pParent = NULL); - - /// The IDD enum is a common technique in MFC to associate a dialog with - /// a resource that you edit in the dialog editor - enum { IDD = IDD_UPDATEGUI_DIALOG }; - -protected: - /// The virtual DoDataExchange is an MFC method for synchronizing values in this - /// class with their corresponding controls on the dialog. - /// See MSDN documentation for more information - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - - /// Called immediately after a dialog is created, but before it is displayed. - /// This is where all of the control initialization usually occurs. This is - /// also where the graphics window is set up - virtual BOOL OnInitDialog(); - - /// A message map is an MFC macro for mapping window's events (paint, size, mouse,...) that - /// occur on a window to functions in this class. - /// The functions in this class that begin with afx_msg are "handlers" for window's messages - DECLARE_MESSAGE_MAP() - - /// Called when this dialog receives a WM_PAINT message (event) - /// The MFC wizard adds code to paint properly if this dialog is minimized to the taskbar - afx_msg void OnPaint(); - - /// Called when this dialog receives slider scroll messages from the slider controls - /// Horizontal Scroll - afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); - - /// Called when this dialog receives slider scroll messages from the slider controls - /// Vertical Scroll - afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); - afx_msg void OnTimer(UINT_PTR nIDEvent); - afx_msg void OnLButtonDown(UINT nFlags, CPoint point); - afx_msg void OnMouseMove(UINT nFlags, CPoint point); - afx_msg void OnRButtonDown(UINT nFlags, CPoint point); - /// - /// Called when this dialog receives button click message from the add button - afx_msg void OnBnClickedBtnAdd(); - afx_msg void OnBnClickedTimerControlSliders(); - -private: - int m_Seconds; - int m_OkCount; - CString m_EchoText; - - CString m_HSliderEcho; - CString m_VSliderEcho; - CSliderCtrl m_VSliderBar; - CSliderCtrl m_HSliderBar; - - CString m_MouseEcho; - CString m_TimerEcho; - - BOOL m_TimerCtrlSliders; - HICON m_hIcon; -}; diff --git a/test_data/projects/mfc-tutorial/res/MFC_UpdateGUI.ico b/test_data/projects/mfc-tutorial/res/MFC_UpdateGUI.ico deleted file mode 100644 index 8a84ca3d34597ada57e4c79ef62b28cf07b5ed9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21630 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 V7_3;)FxY%t!w{8u!r68W{|isv(C`2N diff --git a/test_data/projects/mfc-tutorial/res/MFC_UpdateGUI.rc2 b/test_data/projects/mfc-tutorial/res/MFC_UpdateGUI.rc2 deleted file mode 100644 index 08ef4bba..00000000 --- a/test_data/projects/mfc-tutorial/res/MFC_UpdateGUI.rc2 +++ /dev/null @@ -1,13 +0,0 @@ -// -// MFC_UpdateGUI.RC2 - resources Microsoft Visual C++ does not edit directly -// - -#ifdef APSTUDIO_INVOKED -#error this file is not editable by Microsoft Visual C++ -#endif //APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// Add manually edited resources here... - -///////////////////////////////////////////////////////////////////////////// diff --git a/test_data/projects/mfc-tutorial/stdafx.cpp b/test_data/projects/mfc-tutorial/stdafx.cpp deleted file mode 100644 index 01aee718..00000000 --- a/test_data/projects/mfc-tutorial/stdafx.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// MFC_UpdateGUI.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - - diff --git a/test_data/projects/mfc-tutorial/stdafx.h b/test_data/projects/mfc-tutorial/stdafx.h deleted file mode 100644 index 1bbdeb7a..00000000 --- a/test_data/projects/mfc-tutorial/stdafx.h +++ /dev/null @@ -1,51 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, -// but are changed infrequently - -#pragma once - -#ifndef _SECURE_ATL -#define _SECURE_ATL 1 -#endif - -#ifndef VC_EXTRALEAN -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers -#endif - -// Modify the following defines if you have to target a platform prior to the ones specified below. -// Refer to MSDN for the latest info on corresponding values for different platforms. -#ifndef WINVER // Allow use of features specific to Windows XP or later. -#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. -#endif - -#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. -#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. -#endif - -#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. -#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. -#endif - -#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later. -#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE. -#endif - -#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit - -// turns off MFC's hiding of some common and often safely ignored warning messages -#define _AFX_ALL_WARNINGS - -#include // MFC core and standard components -#include // MFC extensions - - - - - -#ifndef _AFX_NO_OLE_SUPPORT -#include // MFC support for Internet Explorer 4 Common Controls -#endif -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT - diff --git a/test_data/rcfiles/2048Game/2048Game.rc b/test_data/rcfiles/2048Game/2048Game.rc deleted file mode 100644 index 2156d261..00000000 --- a/test_data/rcfiles/2048Game/2048Game.rc +++ /dev/null @@ -1,687 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#ifndef APSTUDIO_INVOKED -#include "targetver.h" -#endif -#include "afxres.h" -#include "verrsrc.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Ukrainian (Ukraine) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_UKR) -LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT -#pragma code_page(1251) - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#ifndef APSTUDIO_INVOKED\r\n" - "#include ""targetver.h""\r\n" - "#endif\r\n" - "#include ""afxres.h""\r\n" - "#include ""verrsrc.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "#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_ENU)\r\n" - "LANGUAGE 9, 1\r\n" - "#include ""res\\My2048Game.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#include ""afxprint.rc"" // printing/print preview resources\r\n" - "#if !defined(_AFXDLL)\r\n" - "#include ""afxribbon.rc"" // MFC ribbon and control bar resources\r\n" - "#endif\r\n" - "#endif\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_DIALOG1 DIALOGEX 0, 0, 201, 87 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Íàñòðîéêè" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - DEFPUSHBUTTON "OK",IDOK,64,66,50,14 - PUSHBUTTON "Cancel",IDCANCEL,144,66,50,14 - LTEXT "Êîëè÷åñòâî êâàäðàòîâ",IDC_STATIC,7,15,80,8 - COMBOBOX IDC_COMBO1,96,12,88,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP - LTEXT "Èìÿ èãðîêà",IDC_STATIC,7,41,39,8 - COMBOBOX IDC_COMBO2,95,36,89,12,CBS_SIMPLE | CBS_SORT | WS_VSCROLL | WS_TABSTOP -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_DIALOG1, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 194 - TOPMARGIN, 7 - BOTTOMMARGIN, 80 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// AFX_DIALOG_LAYOUT -// - -IDD_DIALOG1 AFX_DIALOG_LAYOUT -BEGIN - 0 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog Info -// - -IDD_DIALOG1 DLGINIT -BEGIN - IDC_COMBO1, 0x403, 2, 0 -0x0033, - IDC_COMBO1, 0x403, 2, 0 -0x0034, - IDC_COMBO1, 0x403, 2, 0 -0x0035, - IDC_COMBO1, 0x403, 2, 0 -0x0036, - 0 -END - -#endif // Ukrainian (Ukraine) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About 2048Game" -FONT 8, "MS Shell Dlg", 0, 0, 0x1 -BEGIN - ICON IDR_MAINFRAME,IDC_STATIC,14,14,21,20 - LTEXT "2048Game, Version 1.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX - LTEXT "Copyright (C) 2016",IDC_STATIC,42,26,114,8 - DEFPUSHBUTTON "OK",IDOK,113,41,50,14,WS_GROUP -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_ABOUTBOX, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 163 - TOPMARGIN, 7 - BOTTOMMARGIN, 55 - END -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\\2048Game.ico" - -IDR_My2048GameTYPE ICON "res\\2048GameDoc.ico" - -IDI_FILE_VIEW ICON "res\\file_view.ico" - -IDI_FILE_VIEW_HC ICON "res\\file_view_hc.ico" - -IDI_CLASS_VIEW ICON "res\\class_view.ico" - -IDI_CLASS_VIEW_HC ICON "res\\class_view_hc.ico" - -IDI_OUTPUT_WND ICON "res\\output_wnd.ico" - -IDI_OUTPUT_WND_HC ICON "res\\output_wnd_hc.ico" - -IDI_PROPERTIES_WND ICON "res\\properties_wnd.ico" - -IDI_PROPERTIES_WND_HC ICON "res\\properties_wnd_hc.ico" - - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - -IDR_MAINFRAME BITMAP "res\\Toolbar.bmp" - -IDR_MAINFRAME_256 BITMAP "res\\Toolbar256.bmp" - -IDR_SORT BITMAP "res\\sort.bmp" - -IDB_SORT_24 BITMAP "res\\sort_hc.bmp" - -IDB_FILE_VIEW BITMAP "res\\fileview.bmp" - -IDB_FILE_VIEW_24 BITMAP "res\\fileview_hc.bmp" - -IDB_CLASS_VIEW BITMAP "res\\classview.bmp" - -IDB_CLASS_VIEW_24 BITMAP "res\\classview_hc.bmp" - -IDR_EXPLORER BITMAP "res\\explorer.bmp" - -IDB_EXPLORER_24 BITMAP "res\\explorer_hc.bmp" - -IDR_MENU_IMAGES BITMAP "res\\menuimages.bmp" - -IDB_MENU_IMAGES_24 BITMAP "res\\menuimages_hc.bmp" - -IDR_PROPERTIES BITMAP "res\\properties.bmp" - -IDB_PROPERTIES_HC BITMAP "res\\properties_hc.bmp" - - -///////////////////////////////////////////////////////////////////////////// -// -// Toolbar -// - -IDR_MAINFRAME TOOLBAR 16, 15 -BEGIN - BUTTON ID_FILE_NEW - BUTTON ID_FILE_OPEN - BUTTON ID_FILE_SAVE - SEPARATOR - BUTTON ID_EDIT_CUT - BUTTON ID_EDIT_COPY - BUTTON ID_EDIT_PASTE - SEPARATOR - BUTTON ID_FILE_PRINT - BUTTON ID_APP_ABOUT -END - -IDR_MAINFRAME_256 TOOLBAR 16, 15 -BEGIN - BUTTON ID_FILE_NEW - BUTTON ID_FILE_OPEN - BUTTON ID_FILE_SAVE - SEPARATOR - BUTTON ID_EDIT_CUT - BUTTON ID_EDIT_COPY - BUTTON ID_EDIT_PASTE - SEPARATOR - BUTTON ID_FILE_PRINT - BUTTON ID_APP_ABOUT -END - -IDR_SORT TOOLBAR 16, 15 -BEGIN - BUTTON ID_SORT_MENU - BUTTON ID_NEW_FOLDER -END - -IDR_EXPLORER TOOLBAR 16, 15 -BEGIN - BUTTON ID_PROPERTIES -END - -IDR_MENU_IMAGES TOOLBAR 16, 15 -BEGIN - BUTTON ID_WINDOW_MANAGER - SEPARATOR - BUTTON ID_WINDOW_CASCADE - BUTTON ID_WINDOW_TILE_HORZ - BUTTON ID_TOOLS_MACRO - BUTTON ID_SORTING_SORTALPHABETIC - BUTTON ID_SORTING_SORTBYTYPE - BUTTON ID_SORTING_SORTBYACCESS - BUTTON ID_SORTING_GROUPBYTYPE -END - -IDR_PROPERTIES TOOLBAR 16, 15 -BEGIN - BUTTON ID_EXPAND_ALL - BUTTON ID_SORTPROPERTIES - BUTTON ID_PROPERTIES1 - BUTTON ID_PROPERTIES2 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDR_MAINFRAME MENU -BEGIN - POPUP "&File" - BEGIN - MENUITEM "&New\tCtrl+N", ID_FILE_NEW - MENUITEM "&Open...\tCtrl+O", ID_FILE_OPEN - MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE - MENUITEM "Save &As...", ID_FILE_SAVE_AS - MENUITEM SEPARATOR - MENUITEM "&Print...\tCtrl+P", ID_FILE_PRINT - MENUITEM "Print Pre&view", ID_FILE_PRINT_PREVIEW - MENUITEM "P&rint Setup...", ID_FILE_PRINT_SETUP - MENUITEM SEPARATOR - MENUITEM "Recent File", ID_FILE_MRU_FILE1, GRAYED - MENUITEM SEPARATOR - MENUITEM "E&xit", ID_APP_EXIT - END - POPUP "&Edit" - BEGIN - MENUITEM "&Undo\tCtrl+Z", ID_EDIT_UNDO - MENUITEM SEPARATOR - MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT - MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY - MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE - END - POPUP "&View" - BEGIN - POPUP "&Toolbars and Docking Windows" - BEGIN - MENUITEM "", ID_VIEW_TOOLBAR - END - MENUITEM "&Status Bar", ID_VIEW_STATUS_BAR - POPUP "&Application Look" - BEGIN - MENUITEM "Windows &2000", ID_VIEW_APPLOOK_WIN_2000 - MENUITEM "Office &XP", ID_VIEW_APPLOOK_OFF_XP - MENUITEM "&Windows XP", ID_VIEW_APPLOOK_WIN_XP - MENUITEM "Office 200&3", ID_VIEW_APPLOOK_OFF_2003 - MENUITEM "Visual Studio 200&5", ID_VIEW_APPLOOK_VS_2005 - MENUITEM "Visual Studio 200&8", ID_VIEW_APPLOOK_VS_2008 - POPUP "Office 200&7" - BEGIN - MENUITEM "&Blue Style", ID_VIEW_APPLOOK_OFF_2007_BLUE - MENUITEM "B&lack Style", ID_VIEW_APPLOOK_OFF_2007_BLACK - MENUITEM "&Silver Style", ID_VIEW_APPLOOK_OFF_2007_SILVER - MENUITEM "&Aqua Style", ID_VIEW_APPLOOK_OFF_2007_AQUA - END - END - END - POPUP "&Help" - BEGIN - MENUITEM "&About 2048Game...", ID_APP_ABOUT - END - POPUP "Settings" - BEGIN - MENUITEM "Field settings", ID_SETTINGS_FIELDSETTINGS - MENUITEM "Background color", ID_SETTINGS_BACKGROUNDCOLOR - END -END - -IDR_POPUP_EDIT MENU -BEGIN - POPUP "Edit" - BEGIN - MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT - MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY - MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE - END -END - -IDR_POPUP_SORT MENU -BEGIN - POPUP "Sorting" - BEGIN - MENUITEM "&Sort Alphabeticaly", ID_SORTING_SORTALPHABETIC - MENUITEM "Sort by &Type", ID_SORTING_SORTBYTYPE - MENUITEM "Sort by Acc&ess", ID_SORTING_SORTBYACCESS - MENUITEM "Group by t&ype", ID_SORTING_GROUPBYTYPE - END -END - -IDR_POPUP_EXPLORER MENU -BEGIN - POPUP "Explorer" - BEGIN - MENUITEM "&Open", ID_OPEN - MENUITEM "Open &With....", ID_OPEN_WITH - MENUITEM SEPARATOR - MENUITEM "&Compile", ID_DUMMY_COMPILE - MENUITEM SEPARATOR - MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT - MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY - MENUITEM "&Remove", ID_EDIT_CLEAR - MENUITEM SEPARATOR - MENUITEM "&Properties...", ID_PROPERTIES - END -END - -IDR_OUTPUT_POPUP MENU -BEGIN - POPUP "Popup" - BEGIN - MENUITEM "&Copy", ID_EDIT_COPY - MENUITEM "&Clear", ID_EDIT_CLEAR - MENUITEM SEPARATOR - MENUITEM "&Hide", ID_VIEW_OUTPUTWND - END -END - -IDR_HELP_MENU MENU -BEGIN - MENUITEM "&About 2048Game...", ID_APP_ABOUT -END - -IDR_THEME_MENU MENU -BEGIN - MENUITEM "Office 2007 (&Blue Style)", ID_VIEW_APPLOOK_OFF_2007_BLUE - MENUITEM "Office 2007 (B&lack Style)", ID_VIEW_APPLOOK_OFF_2007_BLACK - MENUITEM "Office 2007 (&Silver Style)", ID_VIEW_APPLOOK_OFF_2007_SILVER - MENUITEM "Office 2007 (&Aqua Style)", ID_VIEW_APPLOOK_OFF_2007_AQUA - MENUITEM "Win&dows 7", ID_VIEW_APPLOOK_WINDOWS_7 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Accelerator -// - -IDR_MAINFRAME ACCELERATORS -BEGIN - "N", ID_FILE_NEW, VIRTKEY, CONTROL - "O", ID_FILE_OPEN, VIRTKEY, CONTROL - "S", ID_FILE_SAVE, VIRTKEY, CONTROL - "P", ID_FILE_PRINT, VIRTKEY, CONTROL - "Z", ID_EDIT_UNDO, VIRTKEY, CONTROL - "X", ID_EDIT_CUT, VIRTKEY, CONTROL - "C", ID_EDIT_COPY, VIRTKEY, CONTROL - "V", ID_EDIT_PASTE, VIRTKEY, CONTROL - VK_BACK, ID_EDIT_UNDO, VIRTKEY, ALT - VK_DELETE, ID_EDIT_CUT, VIRTKEY, SHIFT - VK_INSERT, ID_EDIT_COPY, VIRTKEY, CONTROL - VK_INSERT, ID_EDIT_PASTE, VIRTKEY, SHIFT - VK_F6, ID_NEXT_PANE, VIRTKEY - VK_F6, ID_PREV_PANE, VIRTKEY, SHIFT -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 0x40004L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904B0" - BEGIN - VALUE "CompanyName", "TODO: " - VALUE "FileDescription", "2048Game" - VALUE "FileVersion", "1.0.0.1" - VALUE "InternalName", "2048Game.exe" - VALUE "LegalCopyright", "TODO: (c) . All rights reserved." - VALUE "OriginalFilename", "2048Game.exe" - VALUE "ProductName", "TODO: " - VALUE "ProductVersion", "1.0.0.1" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDP_OLE_INIT_FAILED "OLE initialization failed. Make sure that the OLE libraries are the correct version." - IDS_LOSE "You lose" - IDS_POINTS "Points" - IDS_START_GAME "Start game" - IDS_ABOUT "About game" - IDS_UNDO "Undo" - IDS_MENU "Menu" -END - -STRINGTABLE -BEGIN - IDR_MAINFRAME "2048Game\n\n2048Game\n\n\nMy2048Game.Document\n2048Game.Document" -END - -STRINGTABLE -BEGIN - AFX_IDS_APP_TITLE "2048Game" - AFX_IDS_IDLEMESSAGE "Ready" -END - -STRINGTABLE -BEGIN - ID_INDICATOR_EXT "EXT" - ID_INDICATOR_CAPS "CAP" - ID_INDICATOR_NUM "NUM" - ID_INDICATOR_SCRL "SCRL" - ID_INDICATOR_OVR "OVR" - ID_INDICATOR_REC "REC" -END - -STRINGTABLE -BEGIN - ID_FILE_NEW "Create a new document\nNew" - ID_FILE_OPEN "Open an existing document\nOpen" - ID_FILE_CLOSE "Close the active document\nClose" - ID_FILE_SAVE "Save the active document\nSave" - ID_FILE_SAVE_AS "Save the active document with a new name\nSave As" - ID_FILE_PAGE_SETUP "Change the printing options\nPage Setup" - ID_FILE_PRINT_SETUP "Change the printer and printing options\nPrint Setup" - ID_FILE_PRINT "Print the active document\nPrint" - ID_FILE_PRINT_DIRECT "Print the active document using current options\nQuick Print" - ID_FILE_PRINT_PREVIEW "Display full pages\nPrint Preview" -END - -STRINGTABLE -BEGIN - ID_APP_ABOUT "Display program information, version number and copyright\nAbout" - ID_APP_EXIT "Quit the application; prompts to save documents\nExit" -END - -STRINGTABLE -BEGIN - ID_FILE_MRU_FILE1 "Open this document" - ID_FILE_MRU_FILE2 "Open this document" - ID_FILE_MRU_FILE3 "Open this document" - ID_FILE_MRU_FILE4 "Open this document" - ID_FILE_MRU_FILE5 "Open this document" - ID_FILE_MRU_FILE6 "Open this document" - ID_FILE_MRU_FILE7 "Open this document" - ID_FILE_MRU_FILE8 "Open this document" - ID_FILE_MRU_FILE9 "Open this document" - ID_FILE_MRU_FILE10 "Open this document" - ID_FILE_MRU_FILE11 "Open this document" - ID_FILE_MRU_FILE12 "Open this document" - ID_FILE_MRU_FILE13 "Open this document" - ID_FILE_MRU_FILE14 "Open this document" - ID_FILE_MRU_FILE15 "Open this document" - ID_FILE_MRU_FILE16 "Open this document" -END - -STRINGTABLE -BEGIN - ID_NEXT_PANE "Switch to the next window pane\nNext Pane" - ID_PREV_PANE "Switch back to the previous window pane\nPrevious Pane" -END - -STRINGTABLE -BEGIN - ID_WINDOW_SPLIT "Split the active window into panes\nSplit" -END - -STRINGTABLE -BEGIN - ID_EDIT_CLEAR "Erase the selection\nErase" - ID_EDIT_CLEAR_ALL "Erase everything\nErase All" - ID_EDIT_COPY "Copy the selection and put it on the Clipboard\nCopy" - ID_EDIT_CUT "Cut the selection and put it on the Clipboard\nCut" - ID_EDIT_FIND "Find the specified text\nFind" - ID_EDIT_PASTE "Insert Clipboard contents\nPaste" - ID_EDIT_REPEAT "Repeat the last action\nRepeat" - ID_EDIT_REPLACE "Replace specific text with different text\nReplace" - ID_EDIT_SELECT_ALL "Select the entire document\nSelect All" - ID_EDIT_UNDO "Undo the last action\nUndo" - ID_EDIT_REDO "Redo the previously undone action\nRedo" -END - -STRINGTABLE -BEGIN - ID_VIEW_STATUS_BAR "Show or hide the status bar\nToggle Status Bar" -END - -STRINGTABLE -BEGIN - AFX_IDS_SCSIZE "Change the window size" - AFX_IDS_SCMOVE "Change the window position" - AFX_IDS_SCMINIMIZE "Reduce the window to an icon" - AFX_IDS_SCMAXIMIZE "Enlarge the window to full size" - AFX_IDS_SCNEXTWINDOW "Switch to the next document window" - AFX_IDS_SCPREVWINDOW "Switch to the previous document window" - AFX_IDS_SCCLOSE "Close the active window and prompts to save the documents" -END - -STRINGTABLE -BEGIN - AFX_IDS_SCRESTORE "Restore the window to normal size" - AFX_IDS_SCTASKLIST "Activate Task List" -END - -STRINGTABLE -BEGIN - AFX_IDS_PREVIEW_CLOSE "Close print preview mode\nCancel Preview" -END - -STRINGTABLE -BEGIN - IDS_STATUS_PANE1 "Pane 1" - IDS_STATUS_PANE2 "Pane 2" - IDS_TOOLBAR_STANDARD "Standard" - IDS_TOOLBAR_CUSTOMIZE "Customize..." -END - -STRINGTABLE -BEGIN - IDS_FILE_VIEW "File View" - IDS_CLASS_VIEW "Class View" - IDS_OUTPUT_WND "Output" - IDS_PROPERTIES_WND "Properties" -END - -STRINGTABLE -BEGIN - IDS_EXPLORER "Explorer" - IDS_EDIT_MENU "Edit" -END - -STRINGTABLE -BEGIN - IDS_BUILD_TAB "Build" - IDS_DEBUG_TAB "Debug" - IDS_FIND_TAB "Find" -END - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE 9, 1 -#include "res\My2048Game.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#include "afxprint.rc" // printing/print preview resources -#if !defined(_AFXDLL) -#include "afxribbon.rc" // MFC ribbon and control bar resources -#endif -#endif - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/test_data/rcfiles/2048Game/res/Toolbar256.bmp b/test_data/rcfiles/2048Game/res/Toolbar256.bmp deleted file mode 100644 index 91a2553037e79916922307b86e41461d2b4add14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5816 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 S&2I5zpnGulR`Zasu>SyP^l1wK diff --git a/test_data/rcfiles/2048Game/res/classview.bmp b/test_data/rcfiles/2048Game/res/classview.bmp deleted file mode 100644 index 1e02aa1aed9c499b6ea7b79b04371725fb62e7cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 958 zcmbVJu};G<5H$isE!5^W7+Db;>cE1;!hd99>5>gc6=}xY0N=nCq)MnG14BoaNEtgt z*;=VXc<<~$x^jtqe)he4clOQQ$FWg+#C(AfV?-E7<^;1bx8YpD!IT(--z155n6Wgg z)e4>mo&KilxWd54EldJz9S^1Y)jai>W$YAR?e)b7b%(% zwt*+Lv((#-TIHqCEB4fj$;+$psg?8Cd+;`hCvGMqOT8Axeo~AD<(5p0@~SoBtoPt$ z4GIOWoBB|XJQUsSo|HGPD$TE+bt0a6lcuo?+zDb^+@hp-2XAv3 z;jr9bxFLWX;VOq5iUSNn3<(ejK@O1+FhC$231s`i&#pU(1k%yzjG4DPZ}<28z5V?@ z`MynlI3U!)ra#-^yb+Gea4dmi9`*&C(P!Dm7^Xbld~giI^JDLwHZf8U7}7Svwn1sF zXMJE(fTy&LBY0Nb^0cCRE{K)wRxOgN9d;EN)zih`^~{+1%|UN!pa0tZ~0!ZSuVZAxdWTe;c271M$USM)DzgiRvsFe#nOP1Ws`P7-Q@;ZIZm0-R7 z=5yzHWu4vJ#h}zmA7(gDtK#ZL`hZ`Q zgo2e5r-3J0hB{J5?;zI_j(2>zYb$QS!jIJ8zf{O}7fW|!4;rNOt&8r~p>o$+QBIw| zG?$Gq%#tZv-0U~l&qWLxt@KS1=FnN>=Fx9WkXPF8<;YNTvHME0kERR#3Gw4)tO zQh}22TzJ9)5Yp(ZCgyzM=Xo?x*sa1`ufot&2Ag8Y!->se(c@nkN9FfkX2WJ|U4^}ecCPxP4gZ;8s zJ>#OTv6q65hB_tBp0@2)Gze*1{TzA1Heq4JW+?%Y?o9(OPui)8nG}KI90#}J;+Aau zw_4n^a&lkE*tdC-uhaV1pLcf*iXmpHC*U-Wbv@UH_>ZcL{c`MPX!R+kZXw9LGcNdKr#PSbWT_aB<=P8F7 z^%vL;wha$27q^89{PxkJj3dFQWR0GUA8|PsJt2mKA8W;nFo!q)WMc;Wq#}!|ASKt= zpa*B(?U3>wF%^??d}>NDIRRiNrNeT`z}ldMFR3w>&lQ_*1aGqq+;Ps2cz*&+-8?aY zl;D|d%xt~PCnNO;j|=ROgbJr96>YSnO!u~_+wC|J?$2>20S=I@8}XwIwqHa%d7DI@ zd@!m061&*8Xdpo>r^^PS#36@+oekdj^LVk~WR;NE@~nEIGD-lZDF3FM$5gQ6;GA)6 zqe|DS)YqT~XC{cpfF}gEG#w?V$33OE%Yed8h@b7mPYG~>Cty5SGh|pcu(@R56H9mW z;|}NMi#*u_nLJcRM(P=v5dLzQ-X{+gDtyukAiPuZJrlD%;xca0Q{2N7-GXAA1EL&h zVGce)*FEp4>=a!lnI*o48KJB%50mwTz6>z+C&aMdbG-4*Wnu$L9Ne5$PfSEfPqy>W z;{XLK3jUucp3wm*!*n&-pDOh==mB8r;FwCF9-ov-G#W z(;>BP8ZlEM9bA?}a*7GE5Eip_IBF)h|A> z4n^UC6@_~jq8`uD#j+M*S@W?B>~#=4Vb-)uN30u_jsJOQm4ULo@h8USAOhoTe%`nMpdrvuRnb|J|i$d(Yllab`@*nCG{!}Ihbqjx7 vTJYWc{H<7?K9;izV=l*-A1RFrp|V;)s&eOlxr8m-XVk!p?mazSoBIC%g<$}) diff --git a/test_data/rcfiles/2048Game/res/fileview.bmp b/test_data/rcfiles/2048Game/res/fileview.bmp deleted file mode 100644 index a2d62d0cb7f2363a89c70891f234160ca7e5ddb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 478 zcmZWlF%H5o40I(1wtj<=H=wSFZ!mTOqz+^w5~}(YHjr5Q1ja1p6_u#OV9rje7WEqY z(u;d>z1hAqG8~Xsh&3WdWVApg+NX1S`Ad!ni=2yuj4ico3)Ta%MIyRG;86*Q6JF2( z9(dS0>`|n)s+O`b0my_qF+B4%$Cv&y0&}%*ga}9sd{1!FwGY Qbdl4@X`FftH!Cy#0ndjAV*mgE diff --git a/test_data/rcfiles/2048Game/res/fileview_hc.bmp b/test_data/rcfiles/2048Game/res/fileview_hc.bmp deleted file mode 100644 index b60f48381c6875f87a042ddea6805e8472b0a016..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2216 zcmbW1drVtZ9LHpHVU>k#N zGF}7OECRvtE{`%^-C*U>jYlc3@+j>nE#=igTcEe^_P(#ba@nDxBh#DTIr;V8@BMv0 z=XcKS?vKjW2o|p$Fuw}pH5lt)JR#Twvp^6D&o?~9kHs4>aRToDMML5BulH?VJy7Mx z7yoiO{X|^)m(f=~J$3fL@gMhwe)ZM|9|ym^XG`$*%|TnAdH#j98=hOcaTBVH60q>i zjA<2jH66{Wdkq6E5~Z}dw_e;ODeJ5*YOl-()IhQ8ez#+&&8}>=bvIz05^H;PU?6eS zm1{`_;_vI!f^;PxPo^r?B+AxZy!Gt4^373sFGgktg@mEXD3O+A5_3j;*5I4gdd7#{ z`hM3)k5eso47P%)qP7HCz$*YxSf+8)xbK0^J2m1NSGn~AE^Uud;Bnx9@ z!^y=}v18n^0q#gI_hARQtJ(9W#2#ER|4RPM##Hso;c;I?oJ1siGSGU5bXp1PEN+_g z8Am-68jpU^rR{ZUI-w6ew=0mv5)Wp^=VxFE{#BT#@EL;_-ZBh9->e*o%4v-?`f_oSXTYOt+kmZyJJ28A45!86-;8^>m8w}ZqixOsYU z;Tq4F$~~%dX}Xk6HOPYJp`2FAzCbyw+~P$!7Wl+FK8(rhkT@To@uSy zFr;d2Ko&d??R9~YXMmX@ynGIa5RMZPUlQgejX6@MxvOQhsf~&=T0ajT#|F7ilw63M z-qqv_F4P|mKf@ydiDj_KYqQ8AUzeVEi6wDUkA!yFNZTA~HP5t{p2DKh9j9l!_ z3oRdl`p_J}fKrYHi`%4!vMfUbAw&2WpPTl&A*Y;}QL8$6WH;iGmFKWD#gHURkvs;R zy@xzTdv7D+Nz5(DnRVsOQ(0yy#Ime=M#pa)%z?R~qxR>p{fMW%>IR7Y@HE9^@H6GI5epCO{Vj+mCBH0x z&MU$Q9w|n*ykBVJ00UKq1guFHM&iEFn~BCY5y!G{2aH&fUWY>y z*rjb^DT0Q6Ix)g(hVK#aq!o%wF|XL}dx*rGR#QngN)xh+F8-bu`&&*->K`k3BuCfZ z`h0!MPuswHOp*acR&6Is(_jI+hUt2&v(qNSXvCp+(JK1tO9R^i`67>p^4Q_h~(cG>6SFyBMsFp7u=G7fn zf2vp9S!v<_&E6B|qQihHXxr)@UyR=RPYGD82(_$gKw91{DgI}j6-xN|D6v5B7pNNe AlK=n! diff --git a/test_data/rcfiles/2048Game/res/menuimages.bmp b/test_data/rcfiles/2048Game/res/menuimages.bmp deleted file mode 100644 index 777184138812bf02ddb1c2d3b3e40a9bc016b93b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1078 zcmZ{jv1%JZ5QZ;tiUooF3Pw#_rpg1D1#c7dDj|g2p=uEa8i7Eq^#lf0hLmcqyyC#G zVEh27RH(arGjn%p?2&eMHM`&bv$L!FAK$+eW`FQ^v`o99eJXsSx#GvWmVI%~#;9jV z%SF>P5WRhizSj|rkA`p}5le#UAi9rfU6vwcS#9?FN0FfOld(k*siOxLyWKA7aKU~j z^L?LI^RFWFd9`_z3m>3ZSlNaHF6n$eC!+83vS%ifrgpdR3I3-h1fMnff&L2pyLlxf zF!I-L!LqK3;QSR`H|W=P{OSB-{-O!!dC|)MZsF6Ee?EQ_c}akY#QKHqAm$0IMZdDK z1klN}YuC?KKk}db4f3Lt@j96F6{b!y)jv1v;pfkGa6SJs`c%DTVNKt&kKTd~)+Wz{ zT3~I5V;QXRs!2Q!d~NE)Mt)hTyllH|=X_(TBprluSpDfz+jU(VV|_ZYLz?*Y;fVt9 zh+00TALKLZ;YnI8N~U}ZaQIX!uDs_^JAHFPq z!Ed*$c0})A^6{e2{rT%jbv?+B`j-ESN2JFe`25Onc0BrSdVfKN+y8C(C+0_6Qa*b` jEs@|+?Pkvxp8FhR)1>b!{qfki#RnUi2^1|8ZcDA77VMKMye2#Tl(imwQE23zao1I*xz)7$^eCY#OP8;thO$#VAWp1t?} z&hFX0%nh#|qHz<%*@qNcxMSUF@@qcAMDULIhEe z_a~PAy-WtZHZ0gjAp=g!nm!_Gq~An(~mQ!j))%VKgVD7fk#uxkJeeU3l5Y@ zZ+E-vZ(V8y>)3wx9%kCL)?2JmQJ2$(MQ*GsGd;N8*m0%4?T^|U7pj|UPBm4PWvq;`|EXlsG^#9ztFWDulK62X{~IEL-E*&#Ma zizK&O5F_%O>nh{t@<>@Nn>l4&Z~2Ju2wv-O}Ex7y?4xgTE^i zNk~PzoIg$b9$vDjN&HDPJ@~sK>s$rW5}^F6?)_GB{cvJ+5)u*nM$peatSxUpVYs;C zi=#`}rhAY7L3Mv&ZP4V+W=k{Mv_5@9Y1wh`FFX0GE=f_`?{uaS*)Y=4%Bw#5a@`BUsvp%HTccSg-pMEQGN z1!M_O{^Tuka&p+$fo?XNISZ|B+Tcw1%c2g=T9`-eQ~`gg6NP}48?gk?MD3J6JO8oO zwqC3`U2H@kAiGjm=clgb_Fs-a2BaZ?0-?8nLKs?2MktuE)^x2!ud!&=rYNTf8a3OW zy5KI7ulJ}~OwyhXw$8H8F6nlr?6$#z5ODmHlatvyrl+T~RZic(<8+=-VcJ)-duzqo zHAj9jU*S3^@)wo%Ru(=6A^chRFaq_REA?l8DI#~lcCcSa;`sOU^dR|={6imxgn)&Q zG=c-Cdk)JI2=yh3Jng(BY7YK@FJ0a@0_?>c|Hw%9cD7)_0`4(hwd#$(VhGs534dal zka2iyVnI;q0aS7RLH+@GoQ2vhoh#X~k$RDLmBU8|Z!_P`pEygbl+!-#NfpVXpQxEl zbVz4UvJs&4JPxt^wOVaZ+S}yh77`LdUrkY|%Z=X?J)^Oz9IXY>vkeiUKg55@_4LM{ zo$ahn-C5(Zv-g)bbdwNZwj%`CcCVf}i72p>AFl~_`TPfb`T3JzluC=>E$w6VQK8tW z;)z!lHI6@edszjPe@aTq@bdxV@&}IBzC#bs6o{g7=G(=@e(TaX@VDJ-=ejBKXW2sM zPCncSsDgjo?Y_y@XOn~@@>b4*7p3PPG!gjn!w1~n!*B&VS(@}EG!)RA~484d}8yUkbOfwOc=@~ zpDDVKp^Jz4P4`nxQPI29ZC_ip@vG|n+X|v*9L@ZO+Nq+*pSA+N;^C8afD)W}i0}ve z(K>}Kp6v{s7T}o*m{K@E0`2OC#h>JA;y)6OEe=X*Jum$tqu>^=qeSN+0#jfvqGj)G1 z&Cky#Mp~A&mFLtO7Mml2GR9M*q-tt!=j$Eg5< diff --git a/test_data/rcfiles/2048Game/res/properties.bmp b/test_data/rcfiles/2048Game/res/properties.bmp deleted file mode 100644 index 72e2b298687e5e7aac2f870b0e99a8f04871246d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 598 zcmZvYJ#ND=427AZfVJfsJw{L%XqT=%M~0%%$RU6U* z@A27>FRyo&@lJgp59FTQ**(?lbC=7F;%2<&-WMuc(rsB58ZBRIO*@iD5QS^HUBaxy zDXsye@YdGc3{m2(<~GaOa`Cob9cnne@j1{@(E9)cUaj+Eh-rKZRD?!MT|j&x5;%<` zePf{?H3c+3{S}zs2@atiAAKqh3{bU$M+EGrvNDY!f6opE9zV>{!>`|Kk)?sq2>$# diff --git a/test_data/rcfiles/2048Game/res/properties_hc.bmp b/test_data/rcfiles/2048Game/res/properties_hc.bmp deleted file mode 100644 index d18a7ca4940d757b291f94a51943544078a2f794..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2936 zcmcJQYe*DP6vs~=r4KC9fcO?PHjiMpJ*oO|xM|NEOWGk0{U zMdKmZ7GfWdR|;Me@EQkGum{lL{KSzf7{Jc$c6+UQrC|h{)9LhDt(Q5@YSrUV>3bf% zSdeI*o3Pigr#5E?pRnZMb|W8L^t;=4!1R0Yw;n8FWz|YZ?(uj?-0JnBVMLwAL@u0l zCoe5MQ{748dAsdQ0#@dJcMlCZI7`;5`QeQw6DR)oYe?iFxt57DL!|BN>+9|9#T~In ze8O)u8ufa8dV0D}r(>3op=lepc=;*fd%F9SIg=($Mzx5D2pU9wDIki1AlqY~Y(BSa zooEg;yfvCkoOtu=IVT1|XM+_sW=c6kTEE|q+mSXfFff+-qe5rbv(%MkIfiPb8u5RL z0iBZhCCR~aXz2KgQk162k89_Yy_sF{22!s=S{;>Q9Kug-0eftOKg|126)MZxX3Z<% z9rtJiot;I+)wVjk1zSU7UV(v35q>0>0%)RaqA2wXvI#zX3hMfkg|pATomKS?GU{Oi z`-+kT%1_`aKbZ~H?=K!vTc2?*d8JvMhWyIlDE0S+U@i_ok;thd9a2H4UN>llh{ zdJlz7u)B%b=syir{PJrb^8MH1kE`*|v<=O)55+dVk8yp7X&H{bJ*-KqEI#@qCrtg@ zkL91rOzLu7#mv&orAOB$So7C0$}GP_=GSP!&jAl5&H7VvD82?I*O@KI5P|>V{J&Ya zhAi*tXhnYEX)hzr@cV-NA?qK4A2p-fhNIg*&gl3AM_gdO!R&%VB_!rwJgiu9HRc@kpv{o`V-k1U4iNM0@EIThVq+G*~09F{CMWzcBGB* z{D0Zq)m*R|rH-W~^xVD0XyOpnltGcV1kEIHCgHR}u%KlLrYxT+P5u!WQhZz4|Ce(4 zw4N_fPrgJw{R&mL;9{$Citv+LAV(-hFk#gHue)U9bz?^P=4DDX>Z|!BH#cI<7Rh0e zc$3H(#M5Y5XyN%$HtPAesV}}wef1q`+Mu?LZbbPBJobd2CWLYxR2_2VE$^(qpqZfN t*Qo!|vDTk#5!wGea^Oeg;16a;1Xda|8)kTC*T`3_&SCh~3I8er@Dp#buu}j4 diff --git a/test_data/rcfiles/2048Game/resource.h b/test_data/rcfiles/2048Game/resource.h deleted file mode 100644 index 7ce1e14d..00000000 --- a/test_data/rcfiles/2048Game/resource.h +++ /dev/null @@ -1,109 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by 2048Game.rc -// -#define IDD_ABOUTBOX 100 -#define IDP_OLE_INIT_FAILED 100 -#define IDS_LOSE 101 -#define IDS_POINTS 102 -#define IDS_START_GAME 103 -#define IDS_ABOUT 104 -#define IDS_UNDO 105 -#define IDS_MENU 106 -#define IDR_POPUP_EDIT 119 -#define ID_STATUSBAR_PANE1 120 -#define ID_STATUSBAR_PANE2 121 -#define IDS_STATUS_PANE1 122 -#define IDS_STATUS_PANE2 123 -#define IDS_TOOLBAR_STANDARD 124 -#define IDS_TOOLBAR_CUSTOMIZE 125 -#define ID_VIEW_CUSTOMIZE 126 -#define IDR_MAINFRAME 128 -#define IDR_MAINFRAME_256 129 -#define IDR_My2048GameTYPE 130 -#define ID_WINDOW_MANAGER 131 -#define ID_VIEW_FILEVIEW 133 -#define ID_VIEW_CLASSVIEW 134 -#define ID_PROPERTIES 135 -#define ID_OPEN 136 -#define ID_OPEN_WITH 137 -#define ID_DUMMY_COMPILE 138 -#define ID_CLASS_ADD_MEMBER_FUNCTION 139 -#define ID_CLASS_ADD_MEMBER_VARIABLE 140 -#define ID_CLASS_DEFINITION 141 -#define ID_CLASS_PROPERTIES 142 -#define ID_NEW_FOLDER 143 -#define ID_SORT_MENU 144 -#define ID_SORTING_GROUPBYTYPE 145 -#define ID_SORTING_SORTALPHABETIC 146 -#define ID_SORTING_SORTBYTYPE 147 -#define ID_SORTING_SORTBYACCESS 148 -#define ID_VIEW_OUTPUTWND 149 -#define ID_VIEW_PROPERTIESWND 150 -#define ID_SORTPROPERTIES 151 -#define ID_PROPERTIES1 152 -#define ID_PROPERTIES2 153 -#define ID_EXPAND_ALL 154 -#define IDS_FILE_VIEW 155 -#define IDS_CLASS_VIEW 156 -#define IDS_OUTPUT_WND 157 -#define IDS_PROPERTIES_WND 158 -#define IDI_FILE_VIEW 161 -#define IDI_FILE_VIEW_HC 162 -#define IDI_CLASS_VIEW 163 -#define IDI_CLASS_VIEW_HC 164 -#define IDI_OUTPUT_WND 165 -#define IDI_OUTPUT_WND_HC 166 -#define IDI_PROPERTIES_WND 167 -#define IDI_PROPERTIES_WND_HC 168 -#define IDR_EXPLORER 169 -#define IDB_EXPLORER_24 170 -#define IDR_SORT 171 -#define IDB_SORT_24 172 -#define IDR_POPUP_SORT 173 -#define IDR_POPUP_EXPLORER 174 -#define IDB_FILE_VIEW 175 -#define IDB_FILE_VIEW_24 176 -#define IDB_CLASS_VIEW 177 -#define IDB_CLASS_VIEW_24 178 -#define IDR_MENU_IMAGES 179 -#define IDB_MENU_IMAGES_24 180 -#define ID_TOOLS_MACRO 181 -#define IDR_OUTPUT_POPUP 182 -#define IDR_PROPERTIES 183 -#define IDB_PROPERTIES_HC 184 -#define IDR_THEME_MENU 200 -#define ID_SET_STYLE 201 -#define ID_VIEW_APPLOOK_WIN_2000 205 -#define ID_VIEW_APPLOOK_OFF_XP 206 -#define ID_VIEW_APPLOOK_WIN_XP 207 -#define ID_VIEW_APPLOOK_OFF_2003 208 -#define ID_VIEW_APPLOOK_VS_2005 209 -#define ID_VIEW_APPLOOK_VS_2008 210 -#define ID_VIEW_APPLOOK_OFF_2007_BLUE 215 -#define ID_VIEW_APPLOOK_OFF_2007_BLACK 216 -#define ID_VIEW_APPLOOK_OFF_2007_SILVER 217 -#define ID_VIEW_APPLOOK_OFF_2007_AQUA 218 -#define ID_VIEW_APPLOOK_WINDOWS_7 219 -#define IDS_BUILD_TAB 300 -#define IDS_DEBUG_TAB 301 -#define IDS_FIND_TAB 302 -#define IDS_EXPLORER 305 -#define IDS_EDIT_MENU 306 -#define IDD_DIALOG1 310 -#define IDC_COMBO1 1000 -#define IDC_COMBO2 1001 -#define ID_SETTINGS_CHANGESETTINGS 32771 -#define ID_SETTINGS_FIELDSETTINGS 32772 -#define ID_SETTINGS_BACKGROUNDCOLOR 32773 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 313 -#define _APS_NEXT_COMMAND_VALUE 32774 -#define _APS_NEXT_CONTROL_VALUE 1002 -#define _APS_NEXT_SYMED_VALUE 310 -#endif -#endif diff --git a/test_data/rcfiles/mainWindow/MainWindow.rc b/test_data/rcfiles/mainWindow/MainWindow.rc new file mode 100644 index 0000000000000000000000000000000000000000..026b786d50e9091aa56242d43979d69877ba413b GIT binary patch literal 23974 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 literal 0 HcmV?d00001 diff --git a/test_data/rcfiles/mainWindow/res/MainWindow.ico b/test_data/rcfiles/mainWindow/res/MainWindow.ico new file mode 100644 index 0000000000000000000000000000000000000000..d56fbcdfdf6eac0f4727c34770c26689271d96af GIT binary patch literal 67777 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 NK9A-8OQnhX{{?OVn?wKr literal 0 HcmV?d00001 diff --git a/test_data/rcfiles/2048Game/res/My2048Game.rc2 b/test_data/rcfiles/mainWindow/res/MainWindow.rc2 similarity index 92% rename from test_data/rcfiles/2048Game/res/My2048Game.rc2 rename to test_data/rcfiles/mainWindow/res/MainWindow.rc2 index 245b3a1d30f5a904d67e1b6ee442352cf0f72664..73fc9754f4211ca005a200c638a8970226f33b38 100644 GIT binary patch delta 50 zcmZ3&wuDXd|37^OeFk0zE+DDTpuphEkjRk9kjD@XCQ}&l8Oj;-7>XE@H){T70stN; B3q=3` delta 50 zcmZ3&wuDXd|37^OeFk0zE+DDTpuphEP|0A#V8CF)V8P(dkjRkBkjkLP5X9iTQS&zw E016oj761SM diff --git a/test_data/rcfiles/mainWindow/res/MainWindowDoc.ico b/test_data/rcfiles/mainWindow/res/MainWindowDoc.ico new file mode 100644 index 0000000000000000000000000000000000000000..96365d434ce66a0721e4b81a6a511a7982cb42dc GIT binary patch literal 4710 zcmeH~J#17*5Xa|&lRKR(8T$~{NeCP&Xwqy&WebFD)xhr9n;?B@)W3 zOp!#1WH(#|qOcSxMc5h&pg>m;!y%t#KfOCe%H}uo-hKFNtV9Y;jWHZVl{N{sph^HCK|Wo4xyD=TORgrYJ~OyM&XI|Bu>(!isT z@n~3pz8obFF_1fzz4n+7z}{Uk0tJ}|{;`Aq%7{!>k__zzV@&Rh%PV{RJC$KRORDlH zy$`vV-#hd5lGt0NNmgUj{Jprk+Usfm59R*&!vE0u*dmNHU;Ucz1d(}m#1veHj}=^^ zmom(bWg8Be$Nz*%=Ln-)e-7^N^9`O4rUsiD3;WtSS{`kW>s~)>pO=@*w{c)Lw`G}b zs>58-*!s&yH>a}Y<>m77&0H?u&i6$}Ophg(1{gZ%bnOP;)X zCExtAP9g_;IDtbhI&==5L+4aS0o28#_dIy?9=%7e!xHof`UD|CpP;9cfIgrP=mUy? zJ|ait7%a1+bp&?=atv~uZJK4-O9o4~AeTd&o;jp8SJs<<;tdirfi)R%&u5U`j}u zkRSn5Lhb}(Lhgjz3At@KEH`@cC*)7auS=AWKcO}pUod*=pvy*8Z1!mAX>}Q?K_FiM zTL4EOpDnH8pauaPL2)oKTW$sgumrFKKm-!n7640NV8AJ$2w>q06NfbkU`#y)4{aQcBnlXjOG4vfC zVmF6$Y!-!s+4ngN3z6Fkhp`Zfp|HpF9rNqk-xXnC-`p%QjZ&#zKYjYNHM(sF@#8{F zH~H*t)^UMo)nPDxF~)^-Ax$^&DD3L+Oy{q3E5^mRn5K(`eO{eL>`O~acr7iZ>8;C` z>vd&y7>u_dc_~M0J#M#ojyOEq(tY~i!NWcDY)FqvB|QnggwMd^_c@v3xOkuUIlHF} z?{oP*WkK&c2U3GO3I@(J>u7mAx~K3?;uQrS-BXV4DcmLghxe3fo0mH8tp1z*%}lM^ zt<`GXLes9-Yc-C{S}j*(J9dJq#)f1&JNnLt@*&yoPT`?Js?}_FpwJ-IEZxoB^D)&d z@{;QhA!f#5JXEOMYN2QmwAC{EY@AJJcV~BI4MP^M=x6uJ&Xq#ezwEI`j9xE~XJ>pK ebf!9zJj>c|s^4=u%RGFh;Db)((f^2J&wm5njJ}%y literal 0 HcmV?d00001 diff --git a/test_data/rcfiles/2048Game/res/Toolbar.bmp b/test_data/rcfiles/mainWindow/res/Toolbar.bmp similarity index 100% rename from test_data/rcfiles/2048Game/res/Toolbar.bmp rename to test_data/rcfiles/mainWindow/res/Toolbar.bmp diff --git a/test_data/rcfiles/mainWindow/res/userimages.bmp b/test_data/rcfiles/mainWindow/res/userimages.bmp new file mode 100644 index 0000000000000000000000000000000000000000..affe657025e47679f501e959df84b108ec017b51 GIT binary patch literal 7976 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 kJ<{dhy25LoadIcon(IDR_MAINFRAME); + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTutorialDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); - DDX_Text(pDX, IDC_ECHO_AREA, m_EchoText); - DDX_Text(pDX, IDC_H_SLIDER_ECHO, m_HSliderEcho); - DDX_Text(pDX, IDC_V_SLIDER_ECHO, m_VSliderEcho); - DDX_Control(pDX, IDC_V_SLIDER_BAR, m_VSliderBar); - DDX_Control(pDX, IDC_H_SLIDER_BAR, m_HSliderBar); - DDX_Text(pDX, IDC_MOUSEECHO, m_MouseEcho); - DDX_Text(pDX, IDC_TIMERECHO, m_TimerEcho); - DDX_Check(pDX, IDC_TIMER_CONTROL_SLIDERS, m_TimerCtrlSliders); + CDialogEx::DoDataExchange(pDX); + DDX_Check(pDX, IDC_CHECK1, m_check); + DDX_Control(pDX, IDC_EDIT1, m_edit); + DDX_Control(pDX, IDC_COMBO1, m_combo); + DDX_Control(pDX, IDC_SLIDER1, m_slider); + DDX_Text(pDX, IDC_MESSAGE, m_message); } -BEGIN_MESSAGE_MAP(CTutorialDlg, CDialog) - ON_WM_PAINT() - ON_WM_HSCROLL() - ON_WM_VSCROLL() - ON_WM_TIMER() - ON_WM_LBUTTONDOWN() - ON_WM_MOUSEMOVE() - ON_WM_RBUTTONDOWN() - ON_BN_CLICKED(ID_BTN_ADD, OnBnClickedBtnAdd) - ON_BN_CLICKED(IDC_TIMER_CONTROL_SLIDERS, OnBnClickedTimerControlSliders) +BEGIN_MESSAGE_MAP(CTutorialDlg, CDialogEx) + ON_WM_PAINT() +// ON_WM_QUERYDRAGICON() + ON_BN_CLICKED(IDC_CHECK1, &CTutorialDlg::OnBnClickedCheck1) + ON_EN_CHANGE(IDC_EDIT1, &CTutorialDlg::OnEnChangeEdit1) + ON_CBN_SELCHANGE(IDC_COMBO1, &CTutorialDlg::OnCbnSelchangeCombo1) + ON_WM_HSCROLL() + ON_WM_TIMER() END_MESSAGE_MAP() -// This is called when the dialog is first created and shown. -// It is a good spot to initialize member variables. -BOOL CTutorialDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog - SetIcon(m_hIcon, TRUE); // Set big icon - SetIcon(m_hIcon, FALSE); // Set small icon - // Add extra initialization here. - // We want to initialize the slider bars - m_VSliderBar.SetRange(0, 100, TRUE); - m_VSliderBar.SetPos(50); - m_VSliderEcho.Format(L"%d", 50); +// CTutorialDlg message handlers - m_HSliderBar.SetRange(0, 10, TRUE); - m_HSliderBar.SetPos(5); - m_HSliderEcho.Format(L"%d", 5); +BOOL CTutorialDlg::OnInitDialog() +{ + CDialogEx::OnInitDialog(); - // Initialize the timer to go off every 1000 milliseconds (every second) - // when timer "goes-off", our OnTimer() event handler function will be - // called and it is upto us to decide what we want to do. - SetTimer(0, 1000, NULL); + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon - UpdateData(false); + // TODO: Add extra initialization here - return TRUE; // return TRUE unless you set the focus to a control + return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below -// to draw the icon. For MFC applications using the document/view model, -// this is automatically done for you by the framework. +// to draw the icon. For MFC applications using the document/view model, +// this is automatically done for you by the framework. + void CTutorialDlg::OnPaint() { - if (IsIconic()) - { - CPaintDC dc(this); // device context for painting - - SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); - - // Center icon in client rectangle - int cxIcon = GetSystemMetrics(SM_CXICON); - int cyIcon = GetSystemMetrics(SM_CYICON); - CRect rect; - GetClientRect(&rect); - int x = (rect.Width() - cxIcon + 1) / 2; - int y = (rect.Height() - cyIcon + 1) / 2; - - // Draw the icon - dc.DrawIcon(x, y, m_hIcon); - } - else - { - CDialog::OnPaint(); - } + if (IsIconic()) + { + CPaintDC dc(this); // device context for painting + + SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); + + // Center icon in client rectangle + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // Draw the icon + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CDialogEx::OnPaint(); + } } -void CTutorialDlg::OnBnClickedBtnAdd() -{ - m_OkCount++; - m_EchoText.Format(L"%d", m_OkCount); +// The system calls this function to obtain the cursor to display while the user drags +// the minimized window. +//HCURSOR CTutorialDlg::OnQueryDragIcon() +//{ +// return static_cast(m_hIcon); +//} - // Notice, without UpdateData() status area will _NOT_ be updated. - UpdateData(FALSE); -} -void CTutorialDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) +void CTutorialDlg::OnBnClickedCheck1() { - // We should check to make sure we know which slider bar is generating the events - if (pScrollBar == (CScrollBar *) &m_HSliderBar) - { - int value = m_HSliderBar.GetPos(); - m_HSliderEcho.Format(L"%d", value); - UpdateData(false); - } - else - CDialog::OnHScroll(nSBCode, nPos, pScrollBar); + // TODO: Add your control notification handler code here } -void CTutorialDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) -{ - // We should check to make sure we know which slider bar is generating the events - if (pScrollBar == (CScrollBar *) &m_VSliderBar) - { - int value = m_VSliderBar.GetPos(); - m_VSliderEcho.Format(L"%d", value); - UpdateData(false); - } - else - CDialog::OnVScroll(nSBCode, nPos, pScrollBar); -} -void CTutorialDlg::OnTimer(UINT_PTR nIDEvent) +void CTutorialDlg::OnEnChangeEdit1() { - m_Seconds++; - - if (m_TimerCtrlSliders) - { - // Get ready to decrease the sliders ... - int hvalue = m_HSliderBar.GetPos(); - if (hvalue > 0) - { - m_HSliderBar.SetPos(hvalue-1); - m_HSliderEcho.Format(L"%d", hvalue-1); - } - - int vvalue = m_VSliderBar.GetPos(); - if (vvalue > 0) - { - m_VSliderBar.SetPos(vvalue-1); - m_VSliderEcho.Format(L"%d", vvalue-1); - } - - if ( (hvalue==0) && (vvalue==0) ) - m_TimerCtrlSliders = false; - } - - m_TimerEcho.Format(L"%d: Seconds have passed", m_Seconds); - UpdateData(false); -} + // TODO: If this is a RICHEDIT control, the control will not + // send this notification unless you override the CDialogEx::OnInitDialog() + // function and call CRichEditCtrl().SetEventMask() + // with the ENM_CHANGE flag ORed into the mask. -void CTutorialDlg::OnLButtonDown(UINT nFlags, CPoint point) -{ - CString prefix; - if(nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if(nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sLeft mouse down at %d,%d", prefix, point.x, point.y); - UpdateData(false); + // TODO: Add your control notification handler code here } -void CTutorialDlg::OnMouseMove(UINT nFlags, CPoint point) + +void CTutorialDlg::OnCbnSelchangeCombo1() { - CString prefix; - if(nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if(nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sMouse move at %d,%d", prefix, point.x, point.y); - UpdateData(false); + // TODO: Add your control notification handler code here } -void CTutorialDlg::OnRButtonDown(UINT nFlags, CPoint point) + +void CTutorialDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { - CString prefix; - if(nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if(nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sRight mouse down at %d,%d", prefix, point.x, point.y); - UpdateData(false); + // TODO: Add your message handler code here and/or call default + + CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar); } -void CTutorialDlg::OnBnClickedTimerControlSliders() + +void CTutorialDlg::OnTimer(UINT_PTR nIDEvent) { - UpdateData(true); - // This will fill all UI-connected variables with whatever - // value that is showing on the UI control objects. - // - // In this case, we care most about the value for m_TimerCtrlSliders + // TODO: Add your message handler code here and/or call default + + CDialogEx::OnTimer(nIDEvent); } } // namespace TestNamespace diff --git a/test_data/tst_cppdocument/message_map/TutorialDlg.cpp.expected b/test_data/tst_cppdocument/message_map/TutorialDlg.cpp.expected index 88fcdc9f..1374039b 100644 --- a/test_data/tst_cppdocument/message_map/TutorialDlg.cpp.expected +++ b/test_data/tst_cppdocument/message_map/TutorialDlg.cpp.expected @@ -1,204 +1,132 @@ -#include "stdafx.h" -#include "TutorialApp.h" + +// TutorialDlg.cpp : implementation file +// + +#include "pch.h" +#include "framework.h" +#include "Tutorial.h" #include "TutorialDlg.h" +#include "afxdialogex.h" -// DEBUG_NEW macro allows MFC applications to determine memory leak locations in debug builds #ifdef _DEBUG - #define new DEBUG_NEW +#define new DEBUG_NEW #endif -CTutorialDlg::CTutorialDlg(CWnd* pParent) -: CDialog(CTutorialDlg::IDD, pParent) -, m_EchoText(L"") -, m_HSliderEcho(L"") -, m_VSliderEcho(L"") -, m_MouseEcho(L"") -, m_TimerEcho(L"") -, m_TimerCtrlSliders(TRUE) -, m_OkCount(0) -, m_Seconds(0) +// CTutorialDlg dialog + + + +CTutorialDlg::CTutorialDlg(CWnd* pParent /*=nullptr*/) + : CDialogEx(IDD_TUTORIAL_DIALOG, pParent) + , m_check(FALSE) + , m_message(_T("")) { - m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTutorialDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); - DDX_Text(pDX, IDC_ECHO_AREA, m_EchoText); - DDX_Text(pDX, IDC_H_SLIDER_ECHO, m_HSliderEcho); - DDX_Text(pDX, IDC_V_SLIDER_ECHO, m_VSliderEcho); - DDX_Control(pDX, IDC_V_SLIDER_BAR, m_VSliderBar); - DDX_Control(pDX, IDC_H_SLIDER_BAR, m_HSliderBar); - DDX_Text(pDX, IDC_MOUSEECHO, m_MouseEcho); - DDX_Text(pDX, IDC_TIMERECHO, m_TimerEcho); - DDX_Check(pDX, IDC_TIMER_CONTROL_SLIDERS, m_TimerCtrlSliders); + CDialogEx::DoDataExchange(pDX); + DDX_Check(pDX, IDC_CHECK1, m_check); + DDV_MaxChars(pDX, m_message, 3); // added for testing DDV_ doesn't break extraction! + DDX_Control(pDX, IDC_EDIT1, m_edit); + DDX_Control(pDX, IDC_COMBO1, m_combo); + DDX_Control(pDX, IDC_SLIDER1, m_slider); + DDX_Text(pDX, IDC_MESSAGE, m_message); } -// This is called when the dialog is first created and shown. -// It is a good spot to initialize member variables. -BOOL CTutorialDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog - SetIcon(m_hIcon, TRUE); // Set big icon - SetIcon(m_hIcon, FALSE); // Set small icon +// CTutorialDlg message handlers - // Add extra initialization here. - // We want to initialize the slider bars - m_VSliderBar.SetRange(0, 100, TRUE); - m_VSliderBar.SetPos(50); - m_VSliderEcho.Format(L"%d", 50); - - m_HSliderBar.SetRange(0, 10, TRUE); - m_HSliderBar.SetPos(5); - m_HSliderEcho.Format(L"%d", 5); +BOOL CTutorialDlg::OnInitDialog() +{ + CDialogEx::OnInitDialog(); - // Initialize the timer to go off every 1000 milliseconds (every second) - // when timer "goes-off", our OnTimer() event handler function will be - // called and it is upto us to decide what we want to do. - SetTimer(0, 1000, NULL); + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon - UpdateData(false); + // TODO: Add extra initialization here - return TRUE; // return TRUE unless you set the focus to a control + return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below -// to draw the icon. For MFC applications using the document/view model, -// this is automatically done for you by the framework. -void CTutorialDlg::OnPaint() +// to draw the icon. For MFC applications using the document/view model, +// this is automatically done for you by the framework. + +void CTutorialDlg::OnPaint() { - if (IsIconic()) - { - CPaintDC dc(this); // device context for painting - - SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); - - // Center icon in client rectangle - int cxIcon = GetSystemMetrics(SM_CXICON); - int cyIcon = GetSystemMetrics(SM_CYICON); - CRect rect; - GetClientRect(&rect); - int x = (rect.Width() - cxIcon + 1) / 2; - int y = (rect.Height() - cyIcon + 1) / 2; - - // Draw the icon - dc.DrawIcon(x, y, m_hIcon); - } - else - { - CDialog::OnPaint(); - } + if (IsIconic()) + { + CPaintDC dc(this); // device context for painting + + SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); + + // Center icon in client rectangle + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // Draw the icon + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CDialogEx::OnPaint(); + } } -void CTutorialDlg::OnBnClickedBtnAdd() -{ - m_OkCount++; - m_EchoText.Format(L"%d", m_OkCount); +// The system calls this function to obtain the cursor to display while the user drags +// the minimized window. +//HCURSOR CTutorialDlg::OnQueryDragIcon() +//{ +// return static_cast(m_hIcon); +//} - // Notice, without UpdateData() status area will _NOT_ be updated. - UpdateData(FALSE); -} -void CTutorialDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) +void CTutorialDlg::OnBnClickedCheck1() { - // We should check to make sure we know which slider bar is generating the events - if (pScrollBar == (CScrollBar *) &m_HSliderBar) - { - int value = m_HSliderBar.GetPos(); - m_HSliderEcho.Format(L"%d", value); - UpdateData(false); - } - else - CDialog::OnHScroll(nSBCode, nPos, pScrollBar); + // TODO: Add your control notification handler code here } -void CTutorialDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) -{ - // We should check to make sure we know which slider bar is generating the events - if (pScrollBar == (CScrollBar *) &m_VSliderBar) - { - int value = m_VSliderBar.GetPos(); - m_VSliderEcho.Format(L"%d", value); - UpdateData(false); - } - else - CDialog::OnVScroll(nSBCode, nPos, pScrollBar); -} -void CTutorialDlg::OnTimer(UINT_PTR nIDEvent) +void CTutorialDlg::OnEnChangeEdit1() { - m_Seconds++; - - if (m_TimerCtrlSliders) - { - // Get ready to decrease the sliders ... - int hvalue = m_HSliderBar.GetPos(); - if (hvalue > 0) - { - m_HSliderBar.SetPos(hvalue-1); - m_HSliderEcho.Format(L"%d", hvalue-1); - } - - int vvalue = m_VSliderBar.GetPos(); - if (vvalue > 0) - { - m_VSliderBar.SetPos(vvalue-1); - m_VSliderEcho.Format(L"%d", vvalue-1); - } - - if ( (hvalue==0) && (vvalue==0) ) - m_TimerCtrlSliders = false; - } - - m_TimerEcho.Format(L"%d: Seconds have passed", m_Seconds); - UpdateData(false); -} + // TODO: If this is a RICHEDIT control, the control will not + // send this notification unless you override the CDialogEx::OnInitDialog() + // function and call CRichEditCtrl().SetEventMask() + // with the ENM_CHANGE flag ORed into the mask. -void CTutorialDlg::OnLButtonDown(UINT nFlags, CPoint point) -{ - CString prefix; - if(nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if(nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sLeft mouse down at %d,%d", prefix, point.x, point.y); - UpdateData(false); + // TODO: Add your control notification handler code here } -void CTutorialDlg::OnMouseMove(UINT nFlags, CPoint point) + +void CTutorialDlg::OnCbnSelchangeCombo1() { - CString prefix; - if(nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if(nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sMouse move at %d,%d", prefix, point.x, point.y); - UpdateData(false); + // TODO: Add your control notification handler code here } -void CTutorialDlg::OnRButtonDown(UINT nFlags, CPoint point) + +void CTutorialDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { - CString prefix; - if(nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if(nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sRight mouse down at %d,%d", prefix, point.x, point.y); - UpdateData(false); + // TODO: Add your message handler code here and/or call default + + CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar); } -void CTutorialDlg::OnBnClickedTimerControlSliders() + +void CTutorialDlg::OnTimer(UINT_PTR nIDEvent) { - UpdateData(true); - // This will fill all UI-connected variables with whatever - // value that is showing on the UI control objects. - // - // In this case, we care most about the value for m_TimerCtrlSliders + // TODO: Add your message handler code here and/or call default + + CDialogEx::OnTimer(nIDEvent); } diff --git a/test_data/tst_cppdocument/message_map/TutorialDlg.cpp.original b/test_data/tst_cppdocument/message_map/TutorialDlg.cpp.original index 673f24e0..1c7fc39c 100644 --- a/test_data/tst_cppdocument/message_map/TutorialDlg.cpp.original +++ b/test_data/tst_cppdocument/message_map/TutorialDlg.cpp.original @@ -1,214 +1,140 @@ -#include "stdafx.h" -#include "TutorialApp.h" + +// TutorialDlg.cpp : implementation file +// + +#include "pch.h" +#include "framework.h" +#include "Tutorial.h" #include "TutorialDlg.h" +#include "afxdialogex.h" -// DEBUG_NEW macro allows MFC applications to determine memory leak locations in debug builds #ifdef _DEBUG - #define new DEBUG_NEW +#define new DEBUG_NEW #endif -CTutorialDlg::CTutorialDlg(CWnd* pParent) -: CDialog(CTutorialDlg::IDD, pParent) -, m_EchoText(L"") -, m_HSliderEcho(L"") -, m_VSliderEcho(L"") -, m_MouseEcho(L"") -, m_TimerEcho(L"") -, m_TimerCtrlSliders(TRUE) -, m_OkCount(0) -, m_Seconds(0) +// CTutorialDlg dialog + + + +CTutorialDlg::CTutorialDlg(CWnd* pParent /*=nullptr*/) + : CDialogEx(IDD_TUTORIAL_DIALOG, pParent) + , m_check(FALSE) + , m_message(_T("")) { - m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTutorialDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); - DDX_Text(pDX, IDC_ECHO_AREA, m_EchoText); - DDX_Text(pDX, IDC_H_SLIDER_ECHO, m_HSliderEcho); - DDX_Text(pDX, IDC_V_SLIDER_ECHO, m_VSliderEcho); - DDX_Control(pDX, IDC_V_SLIDER_BAR, m_VSliderBar); - DDX_Control(pDX, IDC_H_SLIDER_BAR, m_HSliderBar); - DDX_Text(pDX, IDC_MOUSEECHO, m_MouseEcho); - DDX_Text(pDX, IDC_TIMERECHO, m_TimerEcho); - DDX_Check(pDX, IDC_TIMER_CONTROL_SLIDERS, m_TimerCtrlSliders); + CDialogEx::DoDataExchange(pDX); + DDX_Check(pDX, IDC_CHECK1, m_check); + DDV_MaxChars(pDX, m_message, 3); // added for testing DDV_ doesn't break extraction! + DDX_Control(pDX, IDC_EDIT1, m_edit); + DDX_Control(pDX, IDC_COMBO1, m_combo); + DDX_Control(pDX, IDC_SLIDER1, m_slider); + DDX_Text(pDX, IDC_MESSAGE, m_message); } -BEGIN_MESSAGE_MAP(CTutorialDlg, CDialog) - ON_WM_PAINT() - ON_WM_HSCROLL() - ON_WM_VSCROLL() - ON_WM_TIMER() - ON_WM_LBUTTONDOWN() - ON_WM_MOUSEMOVE() - ON_WM_RBUTTONDOWN() - ON_BN_CLICKED(ID_BTN_ADD, OnBnClickedBtnAdd) - ON_BN_CLICKED(IDC_TIMER_CONTROL_SLIDERS, OnBnClickedTimerControlSliders) +BEGIN_MESSAGE_MAP(CTutorialDlg, CDialogEx) + ON_WM_PAINT() +// ON_WM_QUERYDRAGICON() + ON_BN_CLICKED(IDC_CHECK1, &CTutorialDlg::OnBnClickedCheck1) + ON_EN_CHANGE(IDC_EDIT1, &CTutorialDlg::OnEnChangeEdit1) + ON_CBN_SELCHANGE(IDC_COMBO1, &CTutorialDlg::OnCbnSelchangeCombo1) + ON_WM_HSCROLL() + ON_WM_TIMER() END_MESSAGE_MAP() -// This is called when the dialog is first created and shown. -// It is a good spot to initialize member variables. -BOOL CTutorialDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog - SetIcon(m_hIcon, TRUE); // Set big icon - SetIcon(m_hIcon, FALSE); // Set small icon +// CTutorialDlg message handlers - // Add extra initialization here. - // We want to initialize the slider bars - m_VSliderBar.SetRange(0, 100, TRUE); - m_VSliderBar.SetPos(50); - m_VSliderEcho.Format(L"%d", 50); - - m_HSliderBar.SetRange(0, 10, TRUE); - m_HSliderBar.SetPos(5); - m_HSliderEcho.Format(L"%d", 5); +BOOL CTutorialDlg::OnInitDialog() +{ + CDialogEx::OnInitDialog(); - // Initialize the timer to go off every 1000 milliseconds (every second) - // when timer "goes-off", our OnTimer() event handler function will be - // called and it is upto us to decide what we want to do. - SetTimer(0, 1000, NULL); + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon - UpdateData(false); + // TODO: Add extra initialization here - return TRUE; // return TRUE unless you set the focus to a control + return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below -// to draw the icon. For MFC applications using the document/view model, -// this is automatically done for you by the framework. -void CTutorialDlg::OnPaint() +// to draw the icon. For MFC applications using the document/view model, +// this is automatically done for you by the framework. + +void CTutorialDlg::OnPaint() { - if (IsIconic()) - { - CPaintDC dc(this); // device context for painting - - SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); - - // Center icon in client rectangle - int cxIcon = GetSystemMetrics(SM_CXICON); - int cyIcon = GetSystemMetrics(SM_CYICON); - CRect rect; - GetClientRect(&rect); - int x = (rect.Width() - cxIcon + 1) / 2; - int y = (rect.Height() - cyIcon + 1) / 2; - - // Draw the icon - dc.DrawIcon(x, y, m_hIcon); - } - else - { - CDialog::OnPaint(); - } + if (IsIconic()) + { + CPaintDC dc(this); // device context for painting + + SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); + + // Center icon in client rectangle + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // Draw the icon + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CDialogEx::OnPaint(); + } } -void CTutorialDlg::OnBnClickedBtnAdd() -{ - m_OkCount++; - m_EchoText.Format(L"%d", m_OkCount); +// The system calls this function to obtain the cursor to display while the user drags +// the minimized window. +//HCURSOR CTutorialDlg::OnQueryDragIcon() +//{ +// return static_cast(m_hIcon); +//} - // Notice, without UpdateData() status area will _NOT_ be updated. - UpdateData(FALSE); -} -void CTutorialDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) +void CTutorialDlg::OnBnClickedCheck1() { - // We should check to make sure we know which slider bar is generating the events - if (pScrollBar == (CScrollBar *) &m_HSliderBar) - { - int value = m_HSliderBar.GetPos(); - m_HSliderEcho.Format(L"%d", value); - UpdateData(false); - } - else - CDialog::OnHScroll(nSBCode, nPos, pScrollBar); + // TODO: Add your control notification handler code here } -void CTutorialDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) -{ - // We should check to make sure we know which slider bar is generating the events - if (pScrollBar == (CScrollBar *) &m_VSliderBar) - { - int value = m_VSliderBar.GetPos(); - m_VSliderEcho.Format(L"%d", value); - UpdateData(false); - } - else - CDialog::OnVScroll(nSBCode, nPos, pScrollBar); -} -void CTutorialDlg::OnTimer(UINT_PTR nIDEvent) +void CTutorialDlg::OnEnChangeEdit1() { - m_Seconds++; - - if (m_TimerCtrlSliders) - { - // Get ready to decrease the sliders ... - int hvalue = m_HSliderBar.GetPos(); - if (hvalue > 0) - { - m_HSliderBar.SetPos(hvalue-1); - m_HSliderEcho.Format(L"%d", hvalue-1); - } - - int vvalue = m_VSliderBar.GetPos(); - if (vvalue > 0) - { - m_VSliderBar.SetPos(vvalue-1); - m_VSliderEcho.Format(L"%d", vvalue-1); - } - - if ( (hvalue==0) && (vvalue==0) ) - m_TimerCtrlSliders = false; - } - - m_TimerEcho.Format(L"%d: Seconds have passed", m_Seconds); - UpdateData(false); -} + // TODO: If this is a RICHEDIT control, the control will not + // send this notification unless you override the CDialogEx::OnInitDialog() + // function and call CRichEditCtrl().SetEventMask() + // with the ENM_CHANGE flag ORed into the mask. -void CTutorialDlg::OnLButtonDown(UINT nFlags, CPoint point) -{ - CString prefix; - if(nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if(nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sLeft mouse down at %d,%d", prefix, point.x, point.y); - UpdateData(false); + // TODO: Add your control notification handler code here } -void CTutorialDlg::OnMouseMove(UINT nFlags, CPoint point) + +void CTutorialDlg::OnCbnSelchangeCombo1() { - CString prefix; - if(nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if(nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sMouse move at %d,%d", prefix, point.x, point.y); - UpdateData(false); + // TODO: Add your control notification handler code here } -void CTutorialDlg::OnRButtonDown(UINT nFlags, CPoint point) + +void CTutorialDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { - CString prefix; - if(nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if(nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sRight mouse down at %d,%d", prefix, point.x, point.y); - UpdateData(false); + // TODO: Add your message handler code here and/or call default + + CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar); } -void CTutorialDlg::OnBnClickedTimerControlSliders() + +void CTutorialDlg::OnTimer(UINT_PTR nIDEvent) { - UpdateData(true); - // This will fill all UI-connected variables with whatever - // value that is showing on the UI control objects. - // - // In this case, we care most about the value for m_TimerCtrlSliders + // TODO: Add your message handler code here and/or call default + + CDialogEx::OnTimer(nIDEvent); } diff --git a/test_data/tst_cppdocument/message_map/afx_msg_declaration.h.expected b/test_data/tst_cppdocument/message_map/afx_msg_declaration.h.expected index 4092e400..bd25cfad 100644 --- a/test_data/tst_cppdocument/message_map/afx_msg_declaration.h.expected +++ b/test_data/tst_cppdocument/message_map/afx_msg_declaration.h.expected @@ -1,71 +1,44 @@ -// University of Washington Bothell Graphics Library -// Authors: Kelvin Sung, Steve Baer -// The accompanying library supports CSS Graphics courses taught at UW-Bothell -// See: http://courses.washington.edu/css450/ -// http://courses.washington.edu/css451/ -/////////////////////////////////////////////////////////////////////////////////// -#pragma once - -/// Main dialog for the sample application. This is created and displayed in -/// the CTutorialApp::InitInstance function. -class CTutorialDlg : public CDialog -{ -public: - CTutorialDlg(CWnd* pParent = NULL); - - /// The IDD enum is a common technique in MFC to associate a dialog with - /// a resource that you edit in the dialog editor - enum { IDD = IDD_UPDATEGUI_DIALOG }; - -protected: - /// The virtual DoDataExchange is an MFC method for synchronizing values in this - /// class with their corresponding controls on the dialog. - /// See MSDN documentation for more information - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - /// Called immediately after a dialog is created, but before it is displayed. - /// This is where all of the control initialization usually occurs. This is - /// also where the graphics window is set up - virtual BOOL OnInitDialog(); +// TutorialDlg.h : header file +// - /// A message map is an MFC macro for mapping window's events (paint, size, mouse,...) that - /// occur on a window to functions in this class. - /// The functions in this class that begin with afx_msg are "handlers" for window's messages - DECLARE_MESSAGE_MAP() +#pragma once - /// Called when this dialog receives a WM_PAINT message (event) - /// The MFC wizard adds code to paint properly if this dialog is minimized to the taskbar - afx_msg void OnPaint(); - /// Called when this dialog receives slider scroll messages from the slider controls - /// Horizontal Scroll - afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); +// CTutorialDlg dialog +class CTutorialDlg : public CDialogEx +{ +// Construction +public: + CTutorialDlg(CWnd* pParent = nullptr); // standard constructor - /// Called when this dialog receives slider scroll messages from the slider controls - /// Vertical Scroll - afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); - void timerEvent(QTimerEvent *event) override; - afx_msg void OnLButtonDown(UINT nFlags, CPoint point); - afx_msg void OnMouseMove(UINT nFlags, CPoint point); - afx_msg void OnRButtonDown(UINT nFlags, CPoint point); - /// - /// Called when this dialog receives button click message from the add button - afx_msg void OnBnClickedBtnAdd(); - afx_msg void OnBnClickedTimerControlSliders(); +// Dialog Data +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_TUTORIAL_DIALOG }; +#endif -private: - int m_Seconds; - int m_OkCount; - CString m_EchoText; + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - CString m_HSliderEcho; - CString m_VSliderEcho; - CSliderCtrl m_VSliderBar; - CSliderCtrl m_HSliderBar; - CString m_MouseEcho; - CString m_TimerEcho; +// Implementation +protected: + HICON m_hIcon; - BOOL m_TimerCtrlSliders; - HICON m_hIcon; + // Generated message map functions + virtual BOOL OnInitDialog(); + afx_msg void OnPaint(); +// afx_msg HCURSOR OnQueryDragIcon(); + DECLARE_MESSAGE_MAP() +public: + BOOL m_check; + CEdit m_edit; + CComboBox m_combo; + CSliderCtrl m_slider; + CString m_message; + afx_msg void OnBnClickedCheck1(); + afx_msg void OnEnChangeEdit1(); + afx_msg void OnCbnSelchangeCombo1(); + afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); + void timerEvent(QTimerEvent *event) override; }; diff --git a/test_data/tst_cppdocument/message_map/afx_msg_declaration.h.original b/test_data/tst_cppdocument/message_map/afx_msg_declaration.h.original index b2a4830d..861323c5 100644 --- a/test_data/tst_cppdocument/message_map/afx_msg_declaration.h.original +++ b/test_data/tst_cppdocument/message_map/afx_msg_declaration.h.original @@ -1,71 +1,44 @@ -// University of Washington Bothell Graphics Library -// Authors: Kelvin Sung, Steve Baer -// The accompanying library supports CSS Graphics courses taught at UW-Bothell -// See: http://courses.washington.edu/css450/ -// http://courses.washington.edu/css451/ -/////////////////////////////////////////////////////////////////////////////////// -#pragma once - -/// Main dialog for the sample application. This is created and displayed in -/// the CTutorialApp::InitInstance function. -class CTutorialDlg : public CDialog -{ -public: - CTutorialDlg(CWnd* pParent = NULL); - - /// The IDD enum is a common technique in MFC to associate a dialog with - /// a resource that you edit in the dialog editor - enum { IDD = IDD_UPDATEGUI_DIALOG }; - -protected: - /// The virtual DoDataExchange is an MFC method for synchronizing values in this - /// class with their corresponding controls on the dialog. - /// See MSDN documentation for more information - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - /// Called immediately after a dialog is created, but before it is displayed. - /// This is where all of the control initialization usually occurs. This is - /// also where the graphics window is set up - virtual BOOL OnInitDialog(); +// TutorialDlg.h : header file +// - /// A message map is an MFC macro for mapping window's events (paint, size, mouse,...) that - /// occur on a window to functions in this class. - /// The functions in this class that begin with afx_msg are "handlers" for window's messages - DECLARE_MESSAGE_MAP() +#pragma once - /// Called when this dialog receives a WM_PAINT message (event) - /// The MFC wizard adds code to paint properly if this dialog is minimized to the taskbar - afx_msg void OnPaint(); - /// Called when this dialog receives slider scroll messages from the slider controls - /// Horizontal Scroll - afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); +// CTutorialDlg dialog +class CTutorialDlg : public CDialogEx +{ +// Construction +public: + CTutorialDlg(CWnd* pParent = nullptr); // standard constructor - /// Called when this dialog receives slider scroll messages from the slider controls - /// Vertical Scroll - afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); - afx_msg void OnTimer(UINT_PTR nIDEvent); - afx_msg void OnLButtonDown(UINT nFlags, CPoint point); - afx_msg void OnMouseMove(UINT nFlags, CPoint point); - afx_msg void OnRButtonDown(UINT nFlags, CPoint point); - /// - /// Called when this dialog receives button click message from the add button - afx_msg void OnBnClickedBtnAdd(); - afx_msg void OnBnClickedTimerControlSliders(); +// Dialog Data +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_TUTORIAL_DIALOG }; +#endif -private: - int m_Seconds; - int m_OkCount; - CString m_EchoText; + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - CString m_HSliderEcho; - CString m_VSliderEcho; - CSliderCtrl m_VSliderBar; - CSliderCtrl m_HSliderBar; - CString m_MouseEcho; - CString m_TimerEcho; +// Implementation +protected: + HICON m_hIcon; - BOOL m_TimerCtrlSliders; - HICON m_hIcon; + // Generated message map functions + virtual BOOL OnInitDialog(); + afx_msg void OnPaint(); +// afx_msg HCURSOR OnQueryDragIcon(); + DECLARE_MESSAGE_MAP() +public: + BOOL m_check; + CEdit m_edit; + CComboBox m_combo; + CSliderCtrl m_slider; + CString m_message; + afx_msg void OnBnClickedCheck1(); + afx_msg void OnEnChangeEdit1(); + afx_msg void OnCbnSelchangeCombo1(); + afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); + afx_msg void OnTimer(UINT_PTR nIDEvent); }; diff --git a/test_data/tst_project.qml b/test_data/tst_project.qml index b0e0c4af..f4d871f6 100644 --- a/test_data/tst_project.qml +++ b/test_data/tst_project.qml @@ -13,24 +13,24 @@ import Knut Script { function test_allFiles() { - Project.root = Dir.currentScriptPath + "/projects/mfc-tutorial" + Project.root = Dir.currentScriptPath + "/projects/mfc-dialog" var files = Project.allFiles(); - compare(files.length, 10) - compare(files[0], "MFC_UpdateGUI.rc") + compare(files.length, 12) + compare(files[0], "Tutorial.cpp") var rcFiles = Project.allFilesWithExtension("rc"); compare(rcFiles.length, 1) - compare(rcFiles[0], "MFC_UpdateGUI.rc") + compare(rcFiles[0], "Tutorial.rc") } function test_open() { - Project.root = Dir.currentScriptPath + "/projects/mfc-tutorial" + Project.root = Dir.currentScriptPath + "/projects/mfc-dialog" var txtdoc = Project.open("TutorialDlg.cpp") compare(txtdoc.type, Document.Cpp) - var rcdoc = Project.open("MFC_UpdateGUI.rc") + var rcdoc = Project.open("Tutorial.rc") compare(rcdoc.type, Document.Rc) } @@ -43,21 +43,21 @@ Script { simpleResults.sort((a, b) => a.file.localeCompare(b.file)); - compare(simpleResults[0].file, Project.root + "/TutorialApp.cpp") - compare(simpleResults[0].line, 21) + compare(simpleResults[0].file, Project.root + "/Tutorial.cpp") + compare(simpleResults[0].line, 38) compare(simpleResults[0].column, 6) compare(simpleResults[1].file, Project.root + "/TutorialDlg.h") - compare(simpleResults[1].line, 10) + compare(simpleResults[1].line, 9) compare(simpleResults[1].column, 9) - let multilinePattern = "m_VSliderBar\\.SetRange\\(0,\\s*100,\\s*TRUE\\);\\s*m_VSliderBar\\.SetPos\\(50\\);"; + let multilinePattern = "SetIcon\\(m_hIcon,\\s*TRUE\\);.*\\s*SetIcon\\(m_hIcon,\\s*FALSE\\);"; let multilineResults = Project.findInFiles(multilinePattern) compare(multilineResults.length, 1) compare(multilineResults[0].file, Project.root + "/TutorialDlg.cpp") - compare(multilineResults[0].line, 65) - compare(multilineResults[0].column, 3) + compare(multilineResults[0].line, 58) + compare(multilineResults[0].column, 2) } else { Message.warning("Ripgrep (rg) isn't available on the system") diff --git a/test_data/tst_rcdocument.qml b/test_data/tst_rcdocument.qml index dea79c97..4783d673 100644 --- a/test_data/tst_rcdocument.qml +++ b/test_data/tst_rcdocument.qml @@ -13,44 +13,45 @@ import Knut Script { property var document: RcDocument { - fileName: Dir.currentScriptPath + "/rcfiles/2048Game/2048Game.rc" + fileName: Dir.currentScriptPath + "/rcfiles/mainWindow/MainWindow.rc" Component.onCompleted: mergeAllLanguages() } function test_assets() { verify(document.valid) - compare(document.assets.length, 14) + compare(document.assets.length, 2) document.convertAssets(RcDocument.RemoveUnknown | RcDocument.SplitToolBar | RcDocument.ConvertToPng); - compare(document.assets.length, 34) + compare(document.assets.length, 8) compare(document.assets[1].id, "IDR_MAINFRAME_1") + Message.log(document.assets[1].fileName) verify(document.assets[1].fileName.endsWith("res/Toolbar_1.png")) } function test_toolBar() { - compare(document.toolBars.length, 6) - compare(document.toolBars[2].id, "IDR_SORT") - compare(document.toolBars[2].iconSize, Qt.size(16, 15)) - compare(document.toolBars[2].children.length, 2) - compare(document.toolBars[2].children[1].id, "ID_NEW_FOLDER") - - var toolBar = document.toolBar("IDR_MENU_IMAGES") - compare(toolBar.id, "IDR_MENU_IMAGES") - compare(toolBar.children.length, 9) - verify(toolBar.children[1].isSeparator) - compare(toolBar.children[4].id, "ID_TOOLS_MACRO") + compare(document.toolBars.length, 2) + compare(document.toolBars[0].id, "IDR_MAINFRAME") + compare(document.toolBars[0].iconSize, Qt.size(16, 15)) + compare(document.toolBars[0].children.length, 10) + compare(document.toolBars[0].children[1].id, "ID_FILE_OPEN") + + var toolBar = document.toolBar("IDR_MAINFRAME_256") + compare(toolBar.id, "IDR_MAINFRAME_256") + compare(toolBar.children.length, 10) + verify(toolBar.children[3].isSeparator) + compare(toolBar.children[4].id, "ID_EDIT_CUT") } function test_dialog() { - var dialog = document.dialog("IDD_DIALOG1", RcDocument.UpdateGeometry | RcDocument.UpdateHierachy, 2, 2) - compare(dialog.geometry.width, 402) - compare(dialog.geometry.height, 174) + var dialog = document.dialog("IDD_ABOUTBOX", RcDocument.UpdateGeometry | RcDocument.UpdateHierachy, 2, 2) + compare(dialog.geometry.width, 340) + compare(dialog.geometry.height, 124) } function test_menu() { var menu = document.menu("IDR_MAINFRAME") compare(menu.id, "IDR_MAINFRAME") - compare(menu.children.length, 5) + compare(menu.children.length, 4) var editMenu = menu.children[1] var separator = editMenu.children[1] @@ -65,15 +66,11 @@ Script { compare(subAction.text, "&Status Bar") compare(subAction.isAction, true) compare(subAction.id, "ID_VIEW_STATUS_BAR") - var subMenu = viewMenu.children[2] - compare(subMenu.text, "&Application Look") - compare(subMenu.isAction, false) - compare(subMenu.isTopLevel, false) } function test_actions() { var actions = document.actionsFromMenu("IDR_MAINFRAME") - compare(actions.length, 28) + compare(actions.length, 13) var actionFileNew = actions[0] compare(actionFileNew.id, "ID_FILE_NEW"); @@ -85,7 +82,7 @@ Script { Message.log(actionFileNew.iconPath) verify(actionFileNew.iconPath.endsWith("res/Toolbar_0.png")); - var actionEditPaste = actions[12] + var actionEditPaste = actions[9] compare(actionEditPaste.id, "ID_EDIT_PASTE"); compare(actionEditPaste.title, "&Paste"); compare(actionEditPaste.shortcuts.length, 2); @@ -94,7 +91,7 @@ Script { Message.log(actionEditPaste.iconPath) verify(actionEditPaste.iconPath.endsWith("res/Toolbar_5.png")); - var actionPrevPane = actions[25] + var actionPrevPane = actions[12] compare(actionPrevPane.id, "ID_APP_ABOUT"); compare(actionPrevPane.toolTip, "About"); compare(actionPrevPane.statusTip, "Display program information, version number and copyright"); diff --git a/test_data/tst_rcwriter/qrc_expected_default.qrc b/test_data/tst_rcwriter/qrc_expected_default.qrc index 93c6b0e0..5feb7ed0 100644 --- a/test_data/tst_rcwriter/qrc_expected_default.qrc +++ b/test_data/tst_rcwriter/qrc_expected_default.qrc @@ -3,17 +3,5 @@ res/Toolbar.bmp res/Toolbar256.bmp - res/sort.bmp - res/sort_hc.bmp - res/fileview.bmp - res/fileview_hc.bmp - res/classview.bmp - res/classview_hc.bmp - res/explorer.bmp - res/explorer_hc.bmp - res/menuimages.bmp - res/menuimages_hc.bmp - res/properties.bmp - res/properties_hc.bmp \ No newline at end of file diff --git a/test_data/tst_rcwriter/qrc_expected_noalias_onlyexist.qrc b/test_data/tst_rcwriter/qrc_expected_noalias_onlyexist.qrc index 8e1ef53f..cff20cd6 100644 --- a/test_data/tst_rcwriter/qrc_expected_noalias_onlyexist.qrc +++ b/test_data/tst_rcwriter/qrc_expected_noalias_onlyexist.qrc @@ -9,31 +9,5 @@ res/Toolbar_5.png res/Toolbar_6.png res/Toolbar_7.png - res/Toolbar256_0.png - res/Toolbar256_1.png - res/Toolbar256_2.png - res/Toolbar256_3.png - res/Toolbar256_4.png - res/Toolbar256_5.png - res/Toolbar256_6.png - res/Toolbar256_7.png - res/fileview.png - res/fileview_hc.png - res/classview.png - res/classview_hc.png - res/menuimages_0.png - res/menuimages_1.png - res/menuimages_2.png - res/menuimages_3.png - res/menuimages_4.png - res/menuimages_5.png - res/menuimages_6.png - res/menuimages_7.png - res/menuimages_hc.png - res/properties_0.png - res/properties_1.png - res/properties_2.png - res/properties_3.png - res/properties_hc.png \ No newline at end of file diff --git a/test_data/tst_treesitter/mfc-TutorialDlg.cpp b/test_data/tst_treesitter/mfc-TutorialDlg.cpp index 6ed729dc..1c7fc39c 100644 --- a/test_data/tst_treesitter/mfc-TutorialDlg.cpp +++ b/test_data/tst_treesitter/mfc-TutorialDlg.cpp @@ -1,214 +1,140 @@ -#include "stdafx.h" -#include "TutorialApp.h" + +// TutorialDlg.cpp : implementation file +// + +#include "pch.h" +#include "framework.h" +#include "Tutorial.h" #include "TutorialDlg.h" +#include "afxdialogex.h" -// DEBUG_NEW macro allows MFC applications to determine memory leak locations in debug builds #ifdef _DEBUG - #define new DEBUG_NEW +#define new DEBUG_NEW #endif -CTutorialDlg::CTutorialDlg(CWnd* pParent) -: CDialog(CTutorialDlg::IDD, pParent) -, m_EchoText(L"") -, m_HSliderEcho(L"") -, m_VSliderEcho(L"") -, m_MouseEcho(L"") -, m_TimerEcho(L"") -, m_TimerCtrlSliders(TRUE) -, m_OkCount(0) -, m_Seconds(0) +// CTutorialDlg dialog + + + +CTutorialDlg::CTutorialDlg(CWnd* pParent /*=nullptr*/) + : CDialogEx(IDD_TUTORIAL_DIALOG, pParent) + , m_check(FALSE) + , m_message(_T("")) { - m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTutorialDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); - DDX_Text(pDX, IDC_ECHO_AREA, m_EchoText); - DDX_Text(pDX, IDC_H_SLIDER_ECHO, m_HSliderEcho); - DDX_Text(pDX, IDC_V_SLIDER_ECHO, m_VSliderEcho); - DDX_Control(pDX, IDC_V_SLIDER_BAR, m_VSliderBar); - DDX_Control(pDX, IDC_H_SLIDER_BAR, m_HSliderBar); - DDX_Text(pDX, IDC_MOUSEECHO, m_MouseEcho); - DDX_Text(pDX, IDC_TIMERECHO, m_TimerEcho); - DDX_Check(pDX, IDC_TIMER_CONTROL_SLIDERS, m_TimerCtrlSliders); + CDialogEx::DoDataExchange(pDX); + DDX_Check(pDX, IDC_CHECK1, m_check); + DDV_MaxChars(pDX, m_message, 3); // added for testing DDV_ doesn't break extraction! + DDX_Control(pDX, IDC_EDIT1, m_edit); + DDX_Control(pDX, IDC_COMBO1, m_combo); + DDX_Control(pDX, IDC_SLIDER1, m_slider); + DDX_Text(pDX, IDC_MESSAGE, m_message); } -BEGIN_MESSAGE_MAP(CTutorialDlg, CDialog) - ON_WM_PAINT() - ON_WM_HSCROLL() - ON_WM_VSCROLL() - ON_WM_TIMER() - ON_WM_LBUTTONDOWN() - ON_WM_MOUSEMOVE() - ON_WM_RBUTTONDOWN() - ON_BN_CLICKED(ID_BTN_ADD, OnBnClickedBtnAdd) - ON_BN_CLICKED(IDC_TIMER_CONTROL_SLIDERS, OnBnClickedTimerControlSliders) +BEGIN_MESSAGE_MAP(CTutorialDlg, CDialogEx) + ON_WM_PAINT() +// ON_WM_QUERYDRAGICON() + ON_BN_CLICKED(IDC_CHECK1, &CTutorialDlg::OnBnClickedCheck1) + ON_EN_CHANGE(IDC_EDIT1, &CTutorialDlg::OnEnChangeEdit1) + ON_CBN_SELCHANGE(IDC_COMBO1, &CTutorialDlg::OnCbnSelchangeCombo1) + ON_WM_HSCROLL() + ON_WM_TIMER() END_MESSAGE_MAP() -// This is called when the dialog is first created and shown. -// It is a good spot to initialize member variables. -BOOL CTutorialDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - // Set the icon for this dialog. The framework does this automatically - // when the application's main window is not a dialog - SetIcon(m_hIcon, TRUE); // Set big icon - SetIcon(m_hIcon, FALSE); // Set small icon +// CTutorialDlg message handlers - // Add extra initialization here. - // We want to initialize the slider bars - m_VSliderBar.SetRange(0, 100, TRUE); - m_VSliderBar.SetPos(50); - m_VSliderEcho.Format(L"%d", 50); - - m_HSliderBar.SetRange(0, 10, TRUE); - m_HSliderBar.SetPos(5); - m_HSliderEcho.Format(L"%d", 5); +BOOL CTutorialDlg::OnInitDialog() +{ + CDialogEx::OnInitDialog(); - // Initialize the timer to go off every 1000 milliseconds (every second) - // when timer "goes-off", our OnTimer() event handler function will be - // called and it is upto us to decide what we want to do. - SetTimer(0, 1000, NULL); + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon - UpdateData(false); + // TODO: Add extra initialization here - return TRUE; // return TRUE unless you set the focus to a control + return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below -// to draw the icon. For MFC applications using the document/view model, -// this is automatically done for you by the framework. +// to draw the icon. For MFC applications using the document/view model, +// this is automatically done for you by the framework. + void CTutorialDlg::OnPaint() { - if (IsIconic()) - { - CPaintDC dc(this); // device context for painting - - SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); - - // Center icon in client rectangle - int cxIcon = GetSystemMetrics(SM_CXICON); - int cyIcon = GetSystemMetrics(SM_CYICON); - CRect rect; - GetClientRect(&rect); - int x = (rect.Width() - cxIcon + 1) / 2; - int y = (rect.Height() - cyIcon + 1) / 2; - - // Draw the icon - dc.DrawIcon(x, y, m_hIcon); - } - else - { - CDialog::OnPaint(); - } + if (IsIconic()) + { + CPaintDC dc(this); // device context for painting + + SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); + + // Center icon in client rectangle + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // Draw the icon + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CDialogEx::OnPaint(); + } } -void CTutorialDlg::OnBnClickedBtnAdd() -{ - m_OkCount++; - m_EchoText.Format(L"%d", m_OkCount); +// The system calls this function to obtain the cursor to display while the user drags +// the minimized window. +//HCURSOR CTutorialDlg::OnQueryDragIcon() +//{ +// return static_cast(m_hIcon); +//} - // Notice, without UpdateData() status area will _NOT_ be updated. - UpdateData(FALSE); -} -void CTutorialDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) +void CTutorialDlg::OnBnClickedCheck1() { - // We should check to make sure we know which slider bar is generating the events - if (pScrollBar == (CScrollBar *) &m_HSliderBar) - { - int value = m_HSliderBar.GetPos(); - m_HSliderEcho.Format(L"%d", value); - UpdateData(false); - } - else - CDialog::OnHScroll(nSBCode, nPos, pScrollBar); + // TODO: Add your control notification handler code here } -void CTutorialDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) -{ - // We should check to make sure we know which slider bar is generating the events - if (pScrollBar == (CScrollBar *) &m_VSliderBar) - { - int value = m_VSliderBar.GetPos(); - m_VSliderEcho.Format(L"%d", value); - UpdateData(false); - } - else - CDialog::OnVScroll(nSBCode, nPos, pScrollBar); -} -void CTutorialDlg::OnTimer(UINT_PTR nIDEvent) +void CTutorialDlg::OnEnChangeEdit1() { - m_Seconds++; - - if (m_TimerCtrlSliders) - { - // Get ready to decrease the sliders ... - int hvalue = m_HSliderBar.GetPos(); - if (hvalue > 0) - { - m_HSliderBar.SetPos(hvalue-1); - m_HSliderEcho.Format(L"%d", hvalue-1); - } - - int vvalue = m_VSliderBar.GetPos(); - if (vvalue > 0) - { - m_VSliderBar.SetPos(vvalue-1); - m_VSliderEcho.Format(L"%d", vvalue-1); - } - - if ( (hvalue==0) && (vvalue==0) ) - m_TimerCtrlSliders = false; - } - - m_TimerEcho.Format(L"%d: Seconds have passed", m_Seconds); - UpdateData(false); -} + // TODO: If this is a RICHEDIT control, the control will not + // send this notification unless you override the CDialogEx::OnInitDialog() + // function and call CRichEditCtrl().SetEventMask() + // with the ENM_CHANGE flag ORed into the mask. -void CTutorialDlg::OnLButtonDown(UINT nFlags, CPoint point) -{ - CString prefix; - if (nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if (nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sLeft mouse down at %d,%d", prefix, point.x, point.y); - UpdateData(false); + // TODO: Add your control notification handler code here } -void CTutorialDlg::OnMouseMove(UINT nFlags, CPoint point) + +void CTutorialDlg::OnCbnSelchangeCombo1() { - CString prefix; - if (nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if (nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sMouse move at %d,%d", prefix, point.x, point.y); - UpdateData(false); + // TODO: Add your control notification handler code here } -void CTutorialDlg::OnRButtonDown(UINT nFlags, CPoint point) + +void CTutorialDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { - CString prefix; - if (nFlags & MK_CONTROL) - prefix = L"[CTRL]"; - if (nFlags & MK_SHIFT) - prefix+= L"[SHIFT]"; - m_MouseEcho.Format(L"%sRight mouse down at %d,%d", prefix, point.x, point.y); - UpdateData(false); + // TODO: Add your message handler code here and/or call default + + CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar); } -void CTutorialDlg::OnBnClickedTimerControlSliders() + +void CTutorialDlg::OnTimer(UINT_PTR nIDEvent) { - UpdateData(true); - // This will fill all UI-connected variables with whatever - // value that is showing on the UI control objects. - // - // In this case, we care most about the value for m_TimerCtrlSliders + // TODO: Add your message handler code here and/or call default + + CDialogEx::OnTimer(nIDEvent); } diff --git a/tests/tst_cppdocument_treesitter.cpp b/tests/tst_cppdocument_treesitter.cpp index 93cfebcd..6db8602f 100644 --- a/tests/tst_cppdocument_treesitter.cpp +++ b/tests/tst_cppdocument_treesitter.cpp @@ -25,7 +25,7 @@ private slots: void extractDataExchange() { - Test::testCppDocument("projects/mfc-tutorial", "TutorialDlg.cpp", [](Core::CppDocument *document) { + Test::testCppDocument("projects/mfc-dialog", "TutorialDlg.cpp", [](Core::CppDocument *document) { auto ddx = document->mfcExtractDDX("CTutorialDlg"); QCOMPARE(ddx.className, "CTutorialDlg"); @@ -33,23 +33,23 @@ private slots: QVERIFY(ddx.range.text().startsWith("void CTutorialDlg::DoDataExchange(CDataExchange* pDX)")); QVERIFY(ddx.range.text().endsWith("}")); - QCOMPARE(ddx.entries.size(), 8); - QCOMPARE(ddx.entries.first().function, "DDX_Text"); - QCOMPARE(ddx.entries.first().idc, "IDC_ECHO_AREA"); - QCOMPARE(ddx.entries.first().member, "m_EchoText"); + QCOMPARE(ddx.entries.size(), 5); + QCOMPARE(ddx.entries.first().function, "DDX_Check"); + QCOMPARE(ddx.entries.first().idc, "IDC_CHECK1"); + QCOMPARE(ddx.entries.first().member, "m_check"); QCOMPARE(ddx.entries.at(3).function, "DDX_Control"); - QCOMPARE(ddx.entries.at(3).idc, "IDC_V_SLIDER_BAR"); - QCOMPARE(ddx.entries.at(3).member, "m_VSliderBar"); + QCOMPARE(ddx.entries.at(3).idc, "IDC_SLIDER1"); + QCOMPARE(ddx.entries.at(3).member, "m_slider"); - QCOMPARE(ddx.entries.last().function, "DDX_Check"); - QCOMPARE(ddx.entries.last().idc, "IDC_TIMER_CONTROL_SLIDERS"); - QCOMPARE(ddx.entries.last().member, "m_TimerCtrlSliders"); + QCOMPARE(ddx.entries.last().function, "DDX_Text"); + QCOMPARE(ddx.entries.last().idc, "IDC_MESSAGE"); + QCOMPARE(ddx.entries.last().member, "m_message"); QCOMPARE(ddx.validators.size(), 1); const auto &validator = ddx.validators.first(); QCOMPARE(validator.function, "DDV_MaxChars"); - QCOMPARE(validator.member, "m_EchoText"); + QCOMPARE(validator.member, "m_message"); QCOMPARE(validator.arguments, QStringList({"3"})); }); } @@ -138,18 +138,15 @@ private slots: const QList> expectedEntries = { {"ON_WM_PAINT", {}}, + {"ON_BN_CLICKED", {"IDC_CHECK1", "&CTutorialDlg::OnBnClickedCheck1"}}, + {"ON_EN_CHANGE", {"IDC_EDIT1", "&CTutorialDlg::OnEnChangeEdit1"}}, + {"ON_CBN_SELCHANGE", {"IDC_COMBO1", "&CTutorialDlg::OnCbnSelchangeCombo1"}}, {"ON_WM_HSCROLL", {}}, - {"ON_WM_VSCROLL", {}}, - {"ON_WM_TIMER", {}}, - {"ON_WM_LBUTTONDOWN", {}}, - {"ON_WM_MOUSEMOVE", {}}, - {"ON_WM_RBUTTONDOWN", {}}, - {"ON_BN_CLICKED", {"ID_BTN_ADD", "OnBnClickedBtnAdd"}}, - {"ON_BN_CLICKED", {"IDC_TIMER_CONTROL_SLIDERS", "OnBnClickedTimerControlSliders"}}}; + {"ON_WM_TIMER", {}}}; QVERIFY(messageMap.isValid()); QCOMPARE(messageMap.className, QString("CTutorialDlg")); - QCOMPARE(messageMap.superClass, QString("CDialog")); + QCOMPARE(messageMap.superClass, QString("CDialogEx")); QCOMPARE(messageMap.entries.size(), expectedEntries.size()); for (int i = 0; i < expectedEntries.size(); ++i) { @@ -169,7 +166,7 @@ private slots: { Core::KnutCore core; auto project = Core::Project::instance(); - project->setRoot(Test::testDataPath() + "/projects/mfc-tutorial"); + project->setRoot(Test::testDataPath() + "/projects/mfc-dialog"); auto cppdocument = qobject_cast(Core::Project::instance()->get("TutorialDlg.cpp")); diff --git a/tests/tst_rcparser.cpp b/tests/tst_rcparser.cpp index 698b8797..04f6628b 100644 --- a/tests/tst_rcparser.cpp +++ b/tests/tst_rcparser.cpp @@ -130,9 +130,9 @@ private slots: QCOMPARE(gotoFuncDialog.controls.at(2).styles, styles2); } - void test2048Game() + void testMainWindow() { - RcFile rcFile = parse(Test::testDataPath() + "/rcfiles/2048Game/2048Game.rc"); + RcFile rcFile = parse(Test::testDataPath() + "/rcfiles/mainWindow/MainWindow.rc"); QCOMPARE(rcFile.isValid, true); } diff --git a/tests/tst_rcwriter.cpp b/tests/tst_rcwriter.cpp index 164e91a0..e4343557 100644 --- a/tests/tst_rcwriter.cpp +++ b/tests/tst_rcwriter.cpp @@ -26,7 +26,7 @@ class TestRcwriter : public QObject private slots: void testQrc() { - RcFile rcFile = parse(Test::testDataPath() + "/rcfiles/2048Game/2048Game.rc"); + RcFile rcFile = parse(Test::testDataPath() + "/rcfiles/mainWindow/MainWindow.rc"); auto data = rcFile.data.value("LANG_ENGLISH;SUBLANG_ENGLISH_US"); // Default settings test @@ -34,7 +34,7 @@ private slots: QBuffer buffer; if (buffer.open(QIODevice::WriteOnly)) { auto assets = convertAssets(data, Asset::NoFlags); - writeAssetsToQrc(assets, &buffer, Test::testDataPath() + "/rcfiles/2048Game/2048Game.qrc"); + writeAssetsToQrc(assets, &buffer, Test::testDataPath() + "/rcfiles/mainWindow/MainWindow.qrc"); buffer.close(); } if (buffer.open(QIODevice::ReadOnly)) { @@ -44,12 +44,12 @@ private slots: } } - // Don't add if asset does not exist, don't use aliases + // Don't add if asset does not exist, split toolbars { - QFile buffer; + QBuffer buffer; if (buffer.open(QIODevice::WriteOnly)) { auto assets = convertAssets(data); - writeAssetsToQrc(assets, &buffer, Test::testDataPath() + "/rcfiles/2048Game/2048Game.qrc"); + writeAssetsToQrc(assets, &buffer, Test::testDataPath() + "/rcfiles/mainWindow/MainWindow.qrc"); buffer.close(); } if (buffer.open(QIODevice::ReadOnly)) { @@ -62,26 +62,24 @@ private slots: void testConvertDialog() { - RcFile rcFile = parse(Test::testDataPath() + "/rcfiles/2048Game/2048Game.rc"); - auto usData = rcFile.data.value("LANG_ENGLISH;SUBLANG_ENGLISH_US"); - auto result = convertDialog(usData, usData.dialogs.first(), RcCore::Widget::AllFlags); + RcFile rcFile = parse(Test::testDataPath() + "/rcfiles/luaDebugger/LuaDebugger.rc"); + auto data = rcFile.data.value("LANG_GERMAN;SUBLANG_GERMAN"); + auto result = convertDialog(data, data.dialogs.at(1), RcCore::Widget::AllFlags); - QCOMPARE(result.id, "IDD_ABOUTBOX"); - QCOMPARE(result.geometry, QRect(0, 0, 255, 103)); + QCOMPARE(result.id, "IDD_GOTO"); + QCOMPARE(result.geometry, QRect(0, 0, 273, 95)); QCOMPARE(result.className, "QDialog"); - QCOMPARE(result.properties["windowTitle"].toString(), "About 2048Game"); + QCOMPARE(result.properties["windowTitle"].toString(), "Go To Line"); - auto ukData = rcFile.data.value("LANG_UKRAINIAN;SUBLANG_DEFAULT"); - result = convertDialog(ukData, ukData.dialogs.first(), RcCore::Widget::AllFlags); - QCOMPARE(result.children.size(), 6); + QCOMPARE(result.children.size(), 4); auto item = result.children.at(2); QCOMPARE(item.className, "QPushButton"); QCOMPARE(item.properties.value("text").toString(), "OK"); - QCOMPARE(item.geometry, QRect(96, 108, 75, 24)); + QCOMPARE(item.geometry, QRect(96, 59, 75, 24)); + item = result.children.at(0); + QCOMPARE(item.properties.value("text").toString(), "Line Number:"); item = result.children.last(); - QCOMPARE(item.className, "QComboBox"); - QStringList values = {"3", "4", "5", "6"}; - QCOMPARE(item.properties.value("text").toStringList(), values); + QCOMPARE(item.className, "QLineEdit"); } void testWriteDialog() @@ -126,37 +124,26 @@ private slots: void testConvertAction() { - RcFile rcFile = parse(Test::testDataPath() + "/rcfiles/2048Game/2048Game.rc"); + RcFile rcFile = parse(Test::testDataPath() + "/rcfiles/cryEdit/CryEdit.rc"); auto data = rcFile.data.value("LANG_ENGLISH;SUBLANG_ENGLISH_US"); // MainFrame menu and shortcuts and toolbar auto result = convertActions(data); - QCOMPARE(result.size(), 51); - auto action = result.first(); - QCOMPARE(action.id, "ID_FILE_NEW"); - QCOMPARE(action.title, "&New"); - QCOMPARE(action.toolTip, "New"); - QCOMPARE(action.statusTip, "Create a new document"); + QCOMPARE(result.size(), 690); + auto action = result.at(1); + QCOMPARE(action.id, "ID_FILE_OPEN_LEVEL"); + QCOMPARE(action.title, "Open..."); + QCOMPARE(action.toolTip, "Open"); + QCOMPARE(action.statusTip, "Open an existing level"); QCOMPARE(action.shortcuts.size(), 1); - QCOMPARE(action.shortcuts.first().event, "Ctrl+N"); - QCOMPARE(action.shortcuts.last().event, "Ctrl+N"); - QVERIFY(action.iconPath.endsWith("res/Toolbar_0.png")); - - action = result.value(12); - QCOMPARE(action.id, "ID_EDIT_PASTE"); - QCOMPARE(action.title, "&Paste"); - QCOMPARE(action.shortcuts.size(), 2); - QCOMPARE(action.shortcuts.first().event, "Ctrl+V"); - QCOMPARE(action.shortcuts.last().event, "Shift+Ins"); - QVERIFY(action.iconPath.endsWith("res/Toolbar_5.png")); - - action = result.at(40); - QCOMPARE(action.id, "ID_PREV_PANE"); - QCOMPARE(action.toolTip, "Previous Pane"); - QCOMPARE(action.statusTip, "Switch back to the previous window pane"); - QCOMPARE(action.shortcuts.size(), 1); - QCOMPARE(action.shortcuts.first().event, "Shift+F6"); + QCOMPARE(action.shortcuts.first().event, "Ctrl+O"); + + action = result.value(401); + QCOMPARE(action.id, "ID_VIEW_ERRORREPORT"); + QCOMPARE(action.title, "&Error Report"); + QCOMPARE(action.shortcuts.size(), 0); + QVERIFY(action.checked); } }; diff --git a/tests/tst_treesitter.cpp b/tests/tst_treesitter.cpp index e1ff1f22..50963c6b 100644 --- a/tests/tst_treesitter.cpp +++ b/tests/tst_treesitter.cpp @@ -294,7 +294,7 @@ private slots: cursor.execute(query, tree->rootNode(), std::make_unique(source)); auto matches = cursor.allRemainingMatches(); - QCOMPARE(matches.size(), 2); + QCOMPARE(matches.size(), 3); } void eq_except_predicate_errors() From 8b13e59ea11bc9feb0c4557e5bd3d30d54ef424d Mon Sep 17 00:00:00 2001 From: Laurent Montel Date: Tue, 8 Oct 2024 15:47:35 +0200 Subject: [PATCH 4/7] fix: don't use rootIsDecorated here --- src/gui/optionsdialog.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/optionsdialog.ui b/src/gui/optionsdialog.ui index 2d2f4f7c..c60dc390 100644 --- a/src/gui/optionsdialog.ui +++ b/src/gui/optionsdialog.ui @@ -568,6 +568,9 @@ + + false + true From 4a0f5a626b94732a66f5b849d8e4a7a24c947358 Mon Sep 17 00:00:00 2001 From: Laurent Montel Date: Tue, 8 Oct 2024 15:11:00 +0200 Subject: [PATCH 5/7] fix: fix duplicate list of shortcuts --- src/gui/mainwindow.cpp | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index e62c5e53..80199034 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -276,27 +276,20 @@ MainWindow::MainWindow(QWidget *parent) updateScriptActions(); } -static void actionsFromMenu(QMenu *menu, QList &actions) -{ - const auto &menuActions = menu->actions(); - for (QAction *action : menuActions) { - if (action->isSeparator()) - continue; - else if (action->menu()) { - if (action->menu()->objectName() == "recentProjectsMenu") - continue; - actionsFromMenu(action->menu(), actions); - } else - actions.push_back(action); - } -} - QList MainWindow::menuActions() const { QList actions; - const auto &menus = menuBar()->findChildren(); - for (QMenu *menu : menus) - actionsFromMenu(menu, actions); + const auto &actionMenus = menuBar()->actions(); + for (auto action : actionMenus) { + if (action->menu()) { + const auto acts = action->menu()->actions(); + for (const auto ¤tAction : acts) { + if (!currentAction->text().isEmpty()) { + actions.append(currentAction); + } + } + } + } actions.append(QMainWindow::actions()); return actions; } From 22d3b9b201b897947aef463f87543ab08982fc3b Mon Sep 17 00:00:00 2001 From: Laurent Montel Date: Mon, 7 Oct 2024 10:08:12 +0200 Subject: [PATCH 6/7] fix: remove obsolete comment --- src/rccore/rc_convert.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rccore/rc_convert.cpp b/src/rccore/rc_convert.cpp index 4ac48689..c45a64df 100644 --- a/src/rccore/rc_convert.cpp +++ b/src/rccore/rc_convert.cpp @@ -226,7 +226,7 @@ static Widget convertCheckBox(const Data &data, Data::Control &control) return widget; } -// TODO +// https://learn.microsoft.com/en-us/windows/desktop/menurc/combobox-control static Widget convertComboBox(const Data &data, const QString &dialogId, Data::Control &control) { Widget widget; From 36541c871825a66d54d9c47ba9848aa2e181cf81 Mon Sep 17 00:00:00 2001 From: Laurent Montel Date: Mon, 7 Oct 2024 14:57:51 +0200 Subject: [PATCH 7/7] fix: add double quote so we understand that identifier can be empty --- src/core/rcdocument.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/rcdocument.cpp b/src/core/rcdocument.cpp index 244b6d35..d7f31fe1 100644 --- a/src/core/rcdocument.cpp +++ b/src/core/rcdocument.cpp @@ -422,12 +422,12 @@ QString extractStringForDialog(const RcCore::Data::Dialog *dialog, const QString if (dialog) { const auto control = findControlWithId(dialog, id); if (!control) { - spdlog::warn("{}: control from id {} does not exist in the rc file.", FUNCTION_NAME, id); + spdlog::warn("{}: control from id \"{}\" does not exist in the rc file.", FUNCTION_NAME, id); return {}; } return control.value().text; } else { - spdlog::warn("{}: id {} does not exist in the rc file.", FUNCTION_NAME, id); + spdlog::warn("{}: id \"{}\" does not exist in the rc file.", FUNCTION_NAME, id); return {}; } }