Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
55f0d45
feat(port): add macOS and Linux port scaffolding on wxWidgets
qamarq Oct 6, 2026
055fff7
ci(status): measure port progress from build errors and tests
qamarq Oct 6, 2026
9a89e59
ci(status): publish port status to a dedicated port-status branch
qamarq Oct 6, 2026
bc3c582
feat(mfcwx): add message dispatch, standard controls and Win32 window…
qamarq Oct 6, 2026
c54f359
feat(mfcwx): add dialogs, DDX/DDV and common dialogs
qamarq Oct 6, 2026
bed5705
feat(mfcwx): add menus built from menu resources and the Win32 menu API
qamarq Oct 6, 2026
a0ec65e
feat(secude): replace the proprietary SECUDE library with an OpenSSL …
qamarq Oct 6, 2026
105464b
fix(thirdparty): mask RC6 rotation counts and fix the libec smoke test
qamarq Oct 6, 2026
f768747
feat(mfcwx): add document/view architecture with tabbed MDI frames
qamarq Oct 6, 2026
91613f4
fix(secude): accept Windows-style paths in the key store API
qamarq Oct 6, 2026
23f928b
feat(mfcwx): add CWinApp on top of wxApp with message boxes and profi…
qamarq Oct 6, 2026
1a6f2cc
feat(app): locate data files, UI language and temp directory at startup
qamarq Oct 6, 2026
bfbbca2
feat(mfcwx): forward window scroll bar events as WM_HSCROLL/WM_VSCROLL
qamarq Oct 6, 2026
c5dcc9a
fix(app): make application sources compile with clang and gcc
qamarq Oct 6, 2026
0a111f9
feat(mfcwx): add partial runtime, GDI, control classes, Scintilla and…
qamarq Oct 6, 2026
cf6465e
docs(port): update porting status and next steps
qamarq Oct 6, 2026
6d4730b
feat(mfcwx): emulate WGL with a wxGLCanvas covering the window
qamarq Oct 6, 2026
99c18da
fix(mfcwx): add CWinApp::OnDDECommand
qamarq Oct 6, 2026
dc3248f
build(app): add macOS bundle, Linux install layout and CPack packages
qamarq Oct 6, 2026
0154e2a
feat(tools): add a dialog gallery that snapshots every dialog template
qamarq Oct 6, 2026
3574e5c
feat(mfcwx): complete the non-GUI runtime
qamarq Oct 6, 2026
abbae8b
fix(mfcwx): finish the GDI layer
qamarq Oct 6, 2026
fb35e45
feat(mfcwx): connect the GDI layer to window painting and invalidation
qamarq Oct 6, 2026
234de47
feat(mfcwx): implement the MFC control wrapper classes
qamarq Oct 6, 2026
6128563
fix(mfcwx): decode dialog template control captions as UTF-8
qamarq Oct 6, 2026
cf966ce
feat(mfcwx): proxy Scintilla messages to wxStyledTextCtrl with ANSI text
qamarq Oct 6, 2026
0fb9fb6
fix(mfcwx): forward every message of a Scintilla window to the proxy
qamarq Oct 6, 2026
57ec062
fix(mfcwx): keep NUL bytes of copied Scintilla text in CF_TEXT
qamarq Oct 6, 2026
0eecba4
fix(app): make all application sources compile with clang and gcc
qamarq Oct 6, 2026
71440e7
feat(mfcwx): add COleDataObject clipboard access and CPrintDialog acc…
qamarq Oct 6, 2026
38d9552
fix(mfcwx): provide APPDATA and USERPROFILE for the user key store
qamarq Oct 6, 2026
332600d
feat(mfcwx): add environment-driven window snapshots for UI checks
qamarq Oct 6, 2026
e5f1119
fix(app): show the version in the title and size the main window from…
qamarq Oct 6, 2026
3bcb02c
feat(mfcwx): replace HTML Help with an in-app help browser
qamarq Oct 6, 2026
3929b0c
fix(mfcwx): update status bar panes on idle and take titles after any…
qamarq Oct 6, 2026
3e4dfbd
ci(status): fix test counting and publishing of the port status
qamarq Oct 8, 2026
2a9eba9
fix(mfcwx): make CrypTool start on Linux
qamarq Oct 8, 2026
0147949
ci(linux): build, test and start CrypTool on Ubuntu
qamarq Oct 8, 2026
6f7ccfb
docs(port): update porting status now that CrypTool runs on macOS and…
qamarq Oct 8, 2026
418e3d4
ci(linux): run once per pull request commit and use upload-artifact v7
qamarq Oct 8, 2026
74720e1
build(app): sign the macOS bundle and find Linux data next to the binary
qamarq Oct 8, 2026
87c73c4
ci(release): build macOS and Linux packages and publish them on tags
qamarq Oct 8, 2026
960165d
build(app): let fixup_bundle resolve @rpath dylibs from Homebrew
qamarq Oct 8, 2026
0a60529
build(app): drop the unused Windows package name
qamarq Oct 8, 2026
dc3ffd6
ci(release): publish a release after every merge to main
qamarq Oct 8, 2026
cbf0ac0
ci(release): build the packages on pull requests, publish only from main
qamarq Oct 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
43 changes: 43 additions & 0 deletions .github/workflows/linux.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Linux

on:
push:
branches: [main]
pull_request:
workflow_dispatch:

concurrency:
group: linux-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v5
- name: Install dependencies
run: |
sudo apt-get update -qq
sudo apt-get install -y -qq ninja-build libwxgtk3.2-dev libssl-dev libgmp-dev libglu1-mesa-dev xvfb xauth
- name: Configure
run: cmake -S . -B build -G Ninja -DMFCWX_TESTS=ON -DCRYPTOOL_THIRDPARTY_TESTS=ON
- name: Build
run: ninja -C build
- name: Test
run: xvfb-run -a ctest --test-dir build --output-on-failure --timeout 300
- name: Start CrypTool
env:
MFCWX_SNAPSHOT_DIR: ${{ runner.temp }}/snapshots
MFCWX_SNAPSHOT_COUNT: 3
MFCWX_SNAPSHOT_DISMISS: 1
MFCWX_SNAPSHOT_INTERVAL: 3000
run: |
mkdir -p "$MFCWX_SNAPSHOT_DIR"
timeout 120 xvfb-run -a -s "-screen 0 1600x1000x24" build/port/app/CrypTool
ls "$MFCWX_SNAPSHOT_DIR"/*.png
- uses: actions/upload-artifact@v7
if: always()
with:
name: linux-snapshots
path: ${{ runner.temp }}/snapshots
if-no-files-found: ignore
43 changes: 43 additions & 0 deletions .github/workflows/port-status.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Port status

on:
push:
branches: [xplat-port]
workflow_dispatch:

permissions:
contents: write

concurrency:
group: port-status
cancel-in-progress: true

jobs:
status:
runs-on: macos-latest
steps:
- uses: actions/checkout@v5
- name: Install dependencies
run: brew install wxwidgets@3.2 openssl@3 gmp ninja cmake
- name: Measure
run: python3 port/tools/port_status.py
- name: Publish to the port-status branch
run: |
pub="$RUNNER_TEMP/port-status"
git init -q "$pub"
cd "$pub"
git config user.name "port-status-bot"
git config user.email "port-status-bot@users.noreply.github.com"
git remote add origin "$(git -C "$GITHUB_WORKSPACE" config --get remote.origin.url)"
git -C "$GITHUB_WORKSPACE" config --get-regexp '^http\..*\.extraheader$' | while read -r key value; do
git config "$key" "$value"
done
if git fetch -q --depth 1 origin port-status; then
git checkout -q -b port-status FETCH_HEAD
else
git checkout -q --orphan port-status
fi
cp "$GITHUB_WORKSPACE"/port/status/* .
git add badge.json status.json STATUS.md
git diff --cached --quiet || git commit -m "chore(status): update port status for ${GITHUB_SHA::8}"
git push origin port-status
88 changes: 88 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
name: Release

on:
push:
branches: [main]
pull_request:
workflow_dispatch:

permissions:
contents: write

jobs:
macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v5
- name: Install dependencies
run: brew install wxwidgets@3.2 openssl@3 gmp ninja cmake
- name: Build
run: |
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
ninja -C build
- name: Package
run: cd build && cpack -G DragNDrop
- uses: actions/upload-artifact@v7
with:
name: macos
path: build/CrypTool-*.dmg
if-no-files-found: error

linux:
strategy:
matrix:
runner: [ubuntu-24.04, ubuntu-24.04-arm]
runs-on: ${{ matrix.runner }}
steps:
- uses: actions/checkout@v5
- name: Install dependencies
run: |
sudo apt-get update -qq
sudo apt-get install -y -qq ninja-build libwxgtk3.2-dev libssl-dev libgmp-dev libglu1-mesa-dev xvfb xauth
- name: Build
run: |
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr
ninja -C build
- name: Start CrypTool
env:
MFCWX_SNAPSHOT_DIR: ${{ runner.temp }}/snapshots
MFCWX_SNAPSHOT_COUNT: 2
MFCWX_SNAPSHOT_DISMISS: 1
MFCWX_SNAPSHOT_INTERVAL: 3000
run: |
mkdir -p "$MFCWX_SNAPSHOT_DIR"
timeout 120 xvfb-run -a build/port/app/CrypTool
ls "$MFCWX_SNAPSHOT_DIR"/*.png
- name: Package
run: cd build && cpack -G "DEB;TGZ"
- uses: actions/upload-artifact@v7
with:
name: linux-${{ matrix.runner }}
path: |
build/CrypTool-*.deb
build/CrypTool-*.tar.gz
if-no-files-found: error

release:
needs: [macos, linux]
if: github.event_name != 'pull_request'
runs-on: ubuntu-24.04
steps:
- uses: actions/download-artifact@v8
with:
path: dist
merge-multiple: true
- uses: actions/checkout@v5
with:
sparse-checkout: CMakeLists.txt
sparse-checkout-cone-mode: false
path: src
- name: Create the release
env:
GH_TOKEN: ${{ github.token }}
run: |
version=$(sed -n 's/^project([^ ]* VERSION \([0-9.]*\).*/\1/p' src/CMakeLists.txt)
tag="v${version}-build.${GITHUB_RUN_NUMBER}"
ls -la dist
gh release create "$tag" dist/* --repo "$GITHUB_REPOSITORY" --target "$GITHUB_SHA" \
--title "CrypTool ${version} (build ${GITHUB_RUN_NUMBER})" --generate-notes
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
build/
build-*/
port/secude/build*/
port/thirdparty/build*/
port/rc/test/build*/
__pycache__/
port/status/
.DS_Store
41 changes: 41 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
cmake_minimum_required(VERSION 3.20)

project(CrypTool1 VERSION 1.4.43 LANGUAGES C CXX)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Build type" FORCE)
endif()

set(REPO_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
enable_testing()

if(APPLE)
foreach(prefix /opt/homebrew/opt /usr/local/opt)
if(EXISTS ${prefix}/wxwidgets@3.2/bin/wx-config-3.2 AND NOT wxWidgets_CONFIG_EXECUTABLE)
set(wxWidgets_CONFIG_EXECUTABLE ${prefix}/wxwidgets@3.2/bin/wx-config-3.2)
endif()
if(EXISTS ${prefix}/openssl@3 AND NOT OPENSSL_ROOT_DIR)
set(OPENSSL_ROOT_DIR ${prefix}/openssl@3)
endif()
endforeach()
endif()

find_package(wxWidgets 3.2 REQUIRED COMPONENTS stc aui html gl adv xml core base)
find_package(OpenSSL 3 REQUIRED)
find_package(OpenGL REQUIRED)
find_package(Threads REQUIRED)

add_subdirectory(port/thirdparty)
add_subdirectory(port/secude)
if(TARGET secude_compat)
# The application is C++14; the library may use a newer standard internally.
set_property(TARGET secude_compat PROPERTY INTERFACE_COMPILE_FEATURES "")
endif()
add_subdirectory(port/mfcwx)
add_subdirectory(port/app)

option(CRYPTOOL_DIALOG_GALLERY "Build the dialog snapshot tool" OFF)
if(CRYPTOOL_DIALOG_GALLERY)
add_subdirectory(port/tools/gallery)
endif()
42 changes: 21 additions & 21 deletions ChallengeResponse/ChallengeResponseDlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,30 +72,30 @@ BEGIN_MESSAGE_MAP(CChallengeResponseDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CREATE()
ON_BN_CLICKED(IDC_EXIT_BUTTON, OnExitButton)
ON_BN_CLICKED(IDC_START_RADIO, OnModeRadioButtons)
ON_BN_CLICKED(IDC_EXIT_BUTTON, &CChallengeResponseDlg::OnExitButton)
ON_BN_CLICKED(IDC_START_RADIO, &CChallengeResponseDlg::OnModeRadioButtons)
ON_WM_MOUSEMOVE()
ON_BN_CLICKED(IDC_ACTION_ATTACK_RADIO, OnChangeAction)
ON_BN_CLICKED(IDC_ACTION_ATTACK_RADIO, &CChallengeResponseDlg::OnChangeAction)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_BN_CLICKED(IDC_AUTHENTICATE_CLIENT_BUTTON, OnAuthenticateClientButton)
ON_BN_CLICKED(IDC_AUTHENTICATE_CLIENT_BUTTON, &CChallengeResponseDlg::OnAuthenticateClientButton)
ON_WM_DESTROY()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_AUTHENTICATE_ATTACKER_BUTTON, OnAuthenticateAttackerButton)
ON_BN_CLICKED(IDC_CHECK_MASK, OnCheckMask)
ON_BN_CLICKED(IDC_SCENARIO_HELP_BUTTON, OnScenarioHelpButton)
ON_BN_CLICKED(IDC_RESET_BUTTON, OnResetButton)
ON_BN_CLICKED(IDC_HELP, OnHelp)
ON_BN_CLICKED(IDC_EINFUEHRUNG_RADIO, OnModeRadioButtons)
ON_BN_CLICKED(IDC_PASSWORT_RADIO, OnModeRadioButtons)
ON_BN_CLICKED(IDC_EINMALPASSWOERTER, OnModeRadioButtons)
ON_BN_CLICKED(IDC_CHALLENGERESPONSE1_RADIO, OnModeRadioButtons)
ON_BN_CLICKED(IDC_CHALLENGERESPONSE2_RADIO, OnModeRadioButtons)
ON_BN_CLICKED(IDC_WECHSELSEITIG_RADIO, OnModeRadioButtons)
ON_BN_CLICKED(IDC_ACTION_CONNECT_RADIO, OnChangeAction)
ON_BN_CLICKED(IDC_ACTION_DISCONNECT_RADIO, OnChangeAction)
ON_BN_CLICKED(IDC_ACTION_NOTHING_RADIO, OnChangeAction)
ON_BN_CLICKED(IDC_ACTION_REMOVE_ATTACK_RADIO, OnChangeAction)
ON_BN_CLICKED(IDC_AUTHENTICATE_ATTACKER_BUTTON, &CChallengeResponseDlg::OnAuthenticateAttackerButton)
ON_BN_CLICKED(IDC_CHECK_MASK, &CChallengeResponseDlg::OnCheckMask)
ON_BN_CLICKED(IDC_SCENARIO_HELP_BUTTON, &CChallengeResponseDlg::OnScenarioHelpButton)
ON_BN_CLICKED(IDC_RESET_BUTTON, &CChallengeResponseDlg::OnResetButton)
ON_BN_CLICKED((UINT)(UINT_PTR)IDC_HELP, &CChallengeResponseDlg::OnHelp)
ON_BN_CLICKED(IDC_EINFUEHRUNG_RADIO, &CChallengeResponseDlg::OnModeRadioButtons)
ON_BN_CLICKED(IDC_PASSWORT_RADIO, &CChallengeResponseDlg::OnModeRadioButtons)
ON_BN_CLICKED(IDC_EINMALPASSWOERTER, &CChallengeResponseDlg::OnModeRadioButtons)
ON_BN_CLICKED(IDC_CHALLENGERESPONSE1_RADIO, &CChallengeResponseDlg::OnModeRadioButtons)
ON_BN_CLICKED(IDC_CHALLENGERESPONSE2_RADIO, &CChallengeResponseDlg::OnModeRadioButtons)
ON_BN_CLICKED(IDC_WECHSELSEITIG_RADIO, &CChallengeResponseDlg::OnModeRadioButtons)
ON_BN_CLICKED(IDC_ACTION_CONNECT_RADIO, &CChallengeResponseDlg::OnChangeAction)
ON_BN_CLICKED(IDC_ACTION_DISCONNECT_RADIO, &CChallengeResponseDlg::OnChangeAction)
ON_BN_CLICKED(IDC_ACTION_NOTHING_RADIO, &CChallengeResponseDlg::OnChangeAction)
ON_BN_CLICKED(IDC_ACTION_REMOVE_ATTACK_RADIO, &CChallengeResponseDlg::OnChangeAction)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

Expand Down Expand Up @@ -234,9 +234,9 @@ void CChallengeResponseDlg::OnMouseMove(UINT nFlags, CPoint point)

if (scenario.isMouseOverObject(m_action,point)){

::SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)hCmark);
::SetClassLongPtr(m_hWnd,GCLP_HCURSOR,(LONG_PTR)hCmark);
}else{
::SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)hCstandard);
::SetClassLongPtr(m_hWnd,GCLP_HCURSOR,(LONG_PTR)hCstandard);
}
CDialog::OnMouseMove(nFlags, point);
}
Expand Down
8 changes: 4 additions & 4 deletions ChallengeResponse/Computer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ bool CComputer::isMouseOverObject(CPoint &point)
}


void CComputer::setParameters(int x1, int y1, int x2, int y2, int borderWidth, CString &name, int textPosition, int dataPosition, bool isAttacker)
void CComputer::setParameters(int x1, int y1, int x2, int y2, int borderWidth, const CString &name, int textPosition, int dataPosition, bool isAttacker)
{
setParametersSO(x1,y1,x2,y2,borderWidth);
this->name=name;
Expand Down Expand Up @@ -95,8 +95,8 @@ void CComputer::draw(CClientDC &dc)

drawDataText(dc);

dc.SelectObject(&originalFont);
dc.SelectObject(&originalPen);
dc.SelectObject(originalFont);
dc.SelectObject(originalPen);
}

void CComputer::drawDataText(CClientDC &dc)
Expand All @@ -123,7 +123,7 @@ void CComputer::eraseDataText(CClientDC &dc)
dc.SetTextColor(white);
originalFont = dc.SelectObject(&dataFont);
drawDataText(dc);
dc.SelectObject(&originalFont);
dc.SelectObject(originalFont);
}

int CComputer::getX1()
Expand Down
2 changes: 1 addition & 1 deletion ChallengeResponse/Computer.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class CComputer : CScenarioObject


void draw(CClientDC& dc);
void setParameters(int x1,int y1, int x2, int y2, int borderwidth, CString& name, int textposition, int dataposition, bool isAttacker);
void setParameters(int x1,int y1, int x2, int y2, int borderwidth, const CString& name, int textposition, int dataposition, bool isAttacker);
bool isMouseOverObject(CPoint &point);

// eigene Variablen & Methoden
Expand Down
4 changes: 2 additions & 2 deletions ChallengeResponse/Packet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ void CPacket::draw(CClientDC &dc)
dc.MoveTo(x1+1,y2-1);
dc.LineTo(x2-1,y1+1);

dc.SelectObject(&originalPen);
dc.SelectObject(originalPen);
}

void CPacket::erase(CClientDC &dc)
Expand All @@ -73,7 +73,7 @@ void CPacket::erase(CClientDC &dc)
dc.MoveTo(x1,y2);
dc.LineTo(x2,y1);

dc.SelectObject(&originalPen);
dc.SelectObject(originalPen);
}


Expand Down
2 changes: 1 addition & 1 deletion ChallengeResponse/Scenario.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#include "stdafx.h"
#include "Scenario.h"
#include "ScenarioObject.h"
#include "wire.h"
#include "Wire.h"
#include "resource.h"

#ifdef _DEBUG
Expand Down
2 changes: 1 addition & 1 deletion ChallengeResponse/Wire.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ void CWire::draw(CClientDC& dc)
}
}

dc.SelectObject(&originalPen);
dc.SelectObject(originalPen);

}

Expand Down
14 changes: 7 additions & 7 deletions CrypTool/3DVisOpt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,13 @@ void C3DVisOpt::DoDataExchange(CDataExchange* pDX)

BEGIN_MESSAGE_MAP(C3DVisOpt, CDialog)
//{{AFX_MSG_MAP(C3DVisOpt)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_RESOLUTION, OnReleasedcaptureSliderResolution)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_DENSITY, OnReleasedcaptureSliderDensity)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_SHIFT, OnReleasedcaptureSliderShift)
ON_BN_CLICKED(IDC_RADIO_WORDSIZE_1, OnRadioWordsize1)
ON_BN_CLICKED(IDC_RADIO_WORDSIZE_2, OnRadioWordsize2)
ON_BN_CLICKED(IDC_RADIO_WORDSIZE_4, OnRadioWordsize4)
ON_BN_CLICKED(IDC_BUTTON_RESET, OnButtonReset)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_RESOLUTION, &C3DVisOpt::OnReleasedcaptureSliderResolution)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_DENSITY, &C3DVisOpt::OnReleasedcaptureSliderDensity)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_SHIFT, &C3DVisOpt::OnReleasedcaptureSliderShift)
ON_BN_CLICKED(IDC_RADIO_WORDSIZE_1, &C3DVisOpt::OnRadioWordsize1)
ON_BN_CLICKED(IDC_RADIO_WORDSIZE_2, &C3DVisOpt::OnRadioWordsize2)
ON_BN_CLICKED(IDC_RADIO_WORDSIZE_4, &C3DVisOpt::OnRadioWordsize4)
ON_BN_CLICKED(IDC_BUTTON_RESET, &C3DVisOpt::OnButtonReset)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

Expand Down
Loading
Loading