网站建设制作 企业站开发哪家好/五种新型营销方式

网站建设制作 企业站开发哪家好,五种新型营销方式,网站建设服务类型现状,做网站筹钱需要多少钱Win32 简易对话框封装简易框架示例 1. 菜单操作: 多语言 2. 通知栏图标菜单 3. 其他操作: 接受拖拽文件等等 CDialogFrame.h #pragma once #include "CWindow/CDialogBase.h" #include "CNSFHeader.h" #include "Win32Utils/CBytesUtils.h" …

Win32 简易对话框封装简易框架示例

1. 菜单操作: 多语言

2. 通知栏图标菜单

3. 其他操作: 接受拖拽文件等等 

CDialogFrame.h

#pragma once
#include "CWindow/CDialogBase.h"
#include "CNSFHeader.h"
#include "Win32Utils/CBytesUtils.h"
#include "Win32Utils/CIniHelper.h"#define HELP_ABOUT_URL "https://gitee.com/flame_cyclone/nsf_information_editor"#define CONFIG_INI_ROOT                                   _T("config")
#define CONFIG_INI_TOPMOST                                _T("settings_topmost")
#define CONFIG_INI_LANGUAGE                               _T("settings_language")class CDialogFrame :public CDialogBase
{
public:LRESULT OnCommand(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);protected:dlg_msg LRESULT OnInitDialog(WPARAM wParam, LPARAM lParam);dlg_msg LRESULT OnClose(WPARAM wParam, LPARAM lParam);dlg_msg LRESULT OnRButtonUp(WPARAM wParam, LPARAM lParam);dlg_msg LRESULT OnDropFiles(WPARAM wParam, LPARAM lParam);dlg_msg LRESULT OnWindowPosChinging(WPARAM wParam, LPARAM lParam);dlg_command LRESULT OnTrayIcon(WPARAM wParam, LPARAM lParam);dlg_command LRESULT OnFileOpen(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnFileSave(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnFileSaveAs(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnFileExit(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnSettingsTopmost(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnRadioStandard(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnHelpAbout(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnSettingsLang_zh_CN(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnSettingsLang_zh_SG(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnSettingsLang_zh_HK(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnSettingsLang_zh_TW(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnSettingsLang_zh_MO(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnSettingsLang_ja_JP(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnSettingsLang_ko_KR(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);dlg_command LRESULT OnSettingsLang_en_US(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd);virtual BOOL PreTranslateMessage(LPMSG pMsg);private:bool InputLimitLength(HWND hWnd, int nLength = -1);bool InputLimitDec(HWND hWnd, int nLength = -1, UINT nMin = 0, UINT nMax = UINT_MAX);bool InputLimitHex(HWND hWnd, int nLength = -1, UINT nMin = 0, UINT nMax = UINT_MAX);void LanguageChange(LANGID lang);void LoadInformationFromFile(const _tstring& strFile);void SaveInformationFromFile(const _tstring& strFile);void LoadInformationFromNSFHeader(const NSF_HEADER& header);bool IsNsfFormat(const NSF_HEADER& header);void ShowTrayIcon();void DeleteTrayIcon();VOID CreatePopMenu(int xPos, int yPos, bool isTop);bool ShowForeground(HWND hWnd);private:HMENU                   m_hPopMenu = NULL;HMENU                   m_hMainMenu = NULL;HWND                    m_hHideWnd = NULL;LANGID                  m_langID;CIniHelper              m_cfg;std::vector<uint8_t>    m_nsfData;NSF_HEADER              m_nsfHeader = { 0 };_tstring                m_strPath;bool                    m_fBusy = false;DECLARE_DLG_MESSAGE_MAP()
};

CDialogFrame.cpp

#include "CDialogFrame.h"
#include <Windows.h>
#include <strsafe.h>
#include <imm.h>
#include <thread>
#include "resource.h"
#include "Win32Utils/CStrUtils.h"
#include "Win32Utils/CComFileDlg.h"
#include "Win32Utils/CPathUtils.h"
#include "Win32Utils/CMessageBoxCenter.h"
#include "Win32Utils/CVersionUtils.h"#pragma comment(lib ,"imm32.lib")
#pragma comment(lib, "SetupAPI.lib")
#pragma comment(lib, "Bthprops.lib")#define WM_TRAYICON                 (WM_USER + 10)BEGIN_DLG_MESSAGE_MAP(CDialogFrame, CDialogBase)ON_DLG_MESSAGE(WM_INITDIALOG, &CDialogFrame::OnInitDialog)ON_DLG_MESSAGE(WM_CLOSE, &CDialogFrame::OnClose)ON_DLG_MESSAGE(WM_WINDOWPOSCHANGING, &CDialogFrame::OnWindowPosChinging)ON_DLG_MESSAGE(WM_RBUTTONUP, &CDialogFrame::OnRButtonUp)ON_DLG_MESSAGE(WM_TRAYICON, &CDialogFrame::OnTrayIcon)ON_DLG_MESSAGE(WM_DROPFILES, &CDialogFrame::OnDropFiles)ON_DLG_COMMAND(IDC_BUTTON_OPEN_FILE, &CDialogFrame::OnFileOpen)ON_DLG_COMMAND(ID_FILE_OPEN, &CDialogFrame::OnFileOpen)ON_DLG_COMMAND(ID_FILE_SAVE, &CDialogFrame::OnFileSave)ON_DLG_COMMAND(ID_FILE_SAVE_AS, &CDialogFrame::OnFileSaveAs)ON_DLG_COMMAND(ID_FILE_EXIT, &CDialogFrame::OnFileExit)ON_DLG_COMMAND(ID_SETTINGS_TOPMOST, &CDialogFrame::OnSettingsTopmost)ON_DLG_COMMAND(ID_HELP_ABOUT, &CDialogFrame::OnHelpAbout)ON_DLG_COMMAND(ID_LANGUAGE_ZH_CN, &CDialogFrame::OnSettingsLang_zh_CN)ON_DLG_COMMAND(ID_LANGUAGE_ZH_SG, &CDialogFrame::OnSettingsLang_zh_SG)ON_DLG_COMMAND(ID_LANGUAGE_ZH_HK, &CDialogFrame::OnSettingsLang_zh_HK)ON_DLG_COMMAND(ID_LANGUAGE_ZH_TW, &CDialogFrame::OnSettingsLang_zh_TW)ON_DLG_COMMAND(ID_LANGUAGE_ZH_MO, &CDialogFrame::OnSettingsLang_zh_MO)ON_DLG_COMMAND(ID_LANGUAGE_JA_JP, &CDialogFrame::OnSettingsLang_ja_JP)ON_DLG_COMMAND(ID_LANGUAGE_KO_KR, &CDialogFrame::OnSettingsLang_ko_KR)ON_DLG_COMMAND(ID_LANGUAGE_EN_US, &CDialogFrame::OnSettingsLang_en_US)ON_DLG_COMMAND_RANGE(IDC_RADIO_STANDARD_NTSC, IDC_RADIO_STANDARD_NTSC_PAL, &CDialogFrame::OnRadioStandard)
END_DLG_MESSAGE_MAP()LRESULT CDialogFrame::OnInitDialog(WPARAM wParam, LPARAM lParam)
{m_hHideWnd = CreateWindow(_T("Static"), _T("Hide"), WS_CHILDWINDOW, 0, 0, 0, 0,m_hWnd, NULL, GetModuleHandle(NULL), NULL);if (m_hHideWnd){::SetParent(m_hHideWnd, NULL);}m_hMainMenu = ::GetMenu(m_hWnd);if (m_hMainMenu){ShowTrayIcon();}CHANGEFILTERSTRUCT cfs = { 0 };cfs.cbSize = sizeof(cfs);//允许低权限进程拖动文件进来ChangeWindowMessageFilterEx(m_hWnd, WM_DROPFILES, MSGFLT_ALLOW, &cfs);ChangeWindowMessageFilterEx(m_hWnd, WM_COPYDATA, MSGFLT_ALLOW, &cfs);ChangeWindowMessageFilterEx(m_hWnd, WM_COPYDATA - 1, MSGFLT_ALLOW, &cfs);::SetMenu(m_hWnd, m_hMainMenu);HICON hIconSmall = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON_MAIN));HICON hIconBig = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON_MAIN));if (hIconBig){::SendMessage(m_hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIconBig);}if (hIconSmall){::SendMessage(m_hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIconSmall);}// 禁用输入法ImmAssociateContext(GetItem(IDC_EDIT_TOTAL_SONGS), NULL);ImmAssociateContext(GetItem(IDC_EDIT_START_SONG), NULL);ImmAssociateContext(GetItem(IDC_EDIT_LOAD_ADDR), NULL);ImmAssociateContext(GetItem(IDC_EDIT_INIT_ADDR), NULL);ImmAssociateContext(GetItem(IDC_EDIT_PLAY_ADDR), NULL);ImmAssociateContext(GetItem(IDC_EDIT_NAME), NULL);ImmAssociateContext(GetItem(IDC_EDIT_ARTIST), NULL);ImmAssociateContext(GetItem(IDC_EDIT_COPYRIGHT), NULL);ImmAssociateContext(GetItem(IDC_EDIT_PLAY_SPEED_NTSC), NULL);ImmAssociateContext(GetItem(IDC_EDIT_PLAY_SPEED_PAL), NULL);ImmAssociateContext(GetItem(IDC_EDIT_BANK_0), NULL);ImmAssociateContext(GetItem(IDC_EDIT_BANK_1), NULL);ImmAssociateContext(GetItem(IDC_EDIT_BANK_2), NULL);ImmAssociateContext(GetItem(IDC_EDIT_BANK_3), NULL);ImmAssociateContext(GetItem(IDC_EDIT_BANK_4), NULL);ImmAssociateContext(GetItem(IDC_EDIT_BANK_5), NULL);ImmAssociateContext(GetItem(IDC_EDIT_BANK_6), NULL);ImmAssociateContext(GetItem(IDC_EDIT_BANK_7), NULL);NSF_HEADER header = { 0 };LoadInformationFromNSFHeader(header);if (m_cfg.GetInt(CONFIG_INI_ROOT, CONFIG_INI_TOPMOST, true)){PostCommand(ID_SETTINGS_TOPMOST);}_tstring strLanguage = m_cfg.GetString(CONFIG_INI_ROOT, CONFIG_INI_LANGUAGE, _T(""));if (_T("zh_CN") == strLanguage){PostCommand(ID_LANGUAGE_ZH_CN);}else if (_T("zh_SG") == strLanguage){PostCommand(ID_LANGUAGE_ZH_SG);}else if (_T("zh_HK") == strLanguage){PostCommand(ID_LANGUAGE_ZH_HK);}else if (_T("zh_TW") == strLanguage){PostCommand(ID_LANGUAGE_ZH_TW);}else if (_T("zh_MO") == strLanguage){PostCommand(ID_LANGUAGE_ZH_MO);}else if (_T("ja_JP") == strLanguage){PostCommand(ID_LANGUAGE_JA_JP);}else if (_T("ko_KR") == strLanguage){PostCommand(ID_LANGUAGE_KO_KR);}else if (_T("en_US") == strLanguage){PostCommand(ID_LANGUAGE_EN_US);}else{LANGID langID = GetThreadUILanguage();if (LANG_CHINESE == PRIMARYLANGID(langID)){if (SUBLANG_CHINESE_HONGKONG == SUBLANGID(langID)){PostCommand(ID_LANGUAGE_ZH_HK);}else if (SUBLANG_CHINESE_TRADITIONAL == SUBLANGID(langID)){PostCommand(ID_LANGUAGE_ZH_TW);}else if (SUBLANG_CHINESE_SINGAPORE == SUBLANGID(langID)){PostCommand(ID_LANGUAGE_ZH_SG);}else if (SUBLANG_CHINESE_MACAU == SUBLANGID(langID)){PostCommand(ID_LANGUAGE_ZH_MO);}else{PostCommand(ID_LANGUAGE_ZH_CN);}}else if(LANG_JAPANESE == PRIMARYLANGID(langID)){PostCommand(ID_LANGUAGE_JA_JP);}else if (LANG_KOREAN == PRIMARYLANGID(langID)){PostCommand(ID_LANGUAGE_KO_KR);}else{PostCommand(ID_LANGUAGE_EN_US);}}LoadAccel(IDR_ACCELERATOR_MAIN);return LRESULT(TRUE);
}LRESULT CDialogFrame::OnRadioStandard(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{EnableItem(IDC_EDIT_PLAY_SPEED_NTSC, TRUE);EnableItem(IDC_EDIT_PLAY_SPEED_PAL, TRUE);if (wID == IDC_RADIO_STANDARD_NTSC) EnableItem(IDC_EDIT_PLAY_SPEED_PAL, FALSE);if (wID == IDC_RADIO_STANDARD_PAL) EnableItem(IDC_EDIT_PLAY_SPEED_NTSC, FALSE);return LRESULT(TRUE);
}LRESULT CDialogFrame::OnWindowPosChinging(WPARAM wParam, LPARAM lParam)
{LPWINDOWPOS lpWindowPos = (LPWINDOWPOS)lParam;lpWindowPos->flags |= SWP_NOSIZE;return LRESULT(TRUE);
}LRESULT CDialogFrame::OnClose(WPARAM wParam, LPARAM lParam)
{return (LRESULT)FALSE;
}dlg_msg LRESULT CDialogFrame::OnRButtonUp(WPARAM wParam, LPARAM lParam)
{int xPos = GET_X_LPARAM(lParam);int yPos = GET_Y_LPARAM(lParam);POINT pt = { xPos, yPos };ClientToScreen(m_hWnd, &pt);CreatePopMenu(pt.x, pt.y, false);return LRESULT(TRUE);
}LRESULT CDialogFrame::OnCommand(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{LONG_PTR style = GetWindowLongPtr(GetItem(wID), GWL_STYLE);if ((BS_RADIOBUTTON == (BS_RADIOBUTTON & style)) || (BS_AUTORADIOBUTTON == (BS_AUTORADIOBUTTON & style))){if (wNotify == 0){CheckRadioButton(wStart, wEnd, wID);}}return (LRESULT)FALSE;
}LRESULT CDialogFrame::OnDropFiles(WPARAM wParam, LPARAM lParam)
{HDROP hDrop = (HDROP)wParam;TCHAR szFile[MAX_PATH] = { 0 };UINT nCount = DragQueryFile(hDrop, (UINT)(-1), szFile, _countof(szFile));for (UINT i = 0; i < nCount; i++){::DragQueryFile(hDrop, i, szFile, _countof(szFile));if (_T("nsf") == CPathUtils::GetFileExt(szFile)){LoadInformationFromFile(szFile);break;}}DragFinish(hDrop);return TRUE;
}LRESULT CDialogFrame::OnFileOpen(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{if (m_fBusy){return (LRESULT)TRUE;}m_fBusy = true;std::thread([this, wID]() {SetThreadUILanguage(m_langID);UINT uIndex = 0;COMDLG_FILTERSPEC filters[] = { { _T("nsf"), _T("*.nsf") } };_tstring strPath = m_strPath;if (CComFileDlg::GetOpenPath(m_hWnd, strPath, uIndex, filters, _countof(filters))){LoadInformationFromFile(strPath);}m_fBusy = false;}).detach();return (LRESULT)TRUE;
}LRESULT CDialogFrame::OnFileSave(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{if (!m_strPath.empty()){SaveInformationFromFile(m_strPath);}else{PostCommand(ID_FILE_SAVE_AS);}return (LRESULT)TRUE;
}LRESULT CDialogFrame::OnFileSaveAs(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{if (m_fBusy){return (LRESULT)TRUE;}m_fBusy = true;std::thread([this, wID]() {SetThreadUILanguage(m_langID);UINT uIndex = 0;COMDLG_FILTERSPEC filters[] = { { _T("nsf"), _T("*.nsf") } };if (CComFileDlg::GetSavePath(m_hWnd, m_strPath, uIndex, filters, _countof(filters))){if (0 !=  CStrUtils::CompareNoCase(CPathUtils::GetFileExt(m_strPath, false), _T("nsf"))){m_strPath += _T(".nsf");}SaveInformationFromFile(m_strPath);}m_fBusy = false;}).detach();return (LRESULT)TRUE;
}LRESULT CDialogFrame::OnFileExit(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{PostMessage(WM_CLOSE);return (LRESULT)TRUE;
}LRESULT CDialogFrame::OnSettingsTopmost(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{HMENU hMenu = GetMenu(m_hWnd);bool fChecked = IsMenuItemChecked(hMenu, wID, false);fChecked = !fChecked;CheckMenuItem(hMenu, wID, fChecked, false);::SetWindowPos(m_hWnd, fChecked ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);m_cfg.SetInt(CONFIG_INI_ROOT, CONFIG_INI_TOPMOST, fChecked);return (LRESULT)TRUE;
}LRESULT CDialogFrame::OnHelpAbout(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{::ShellExecute(NULL, _T("open"), _T(HELP_ABOUT_URL), NULL, NULL, SW_SHOW);return LRESULT(TRUE);
}LRESULT CDialogFrame::OnSettingsLang_zh_CN(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{HMENU hMenu = GetMenu(m_hWnd);CheckRadioMenuItem(hMenu, wID, true);LanguageChange(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED));m_cfg.SetString(CONFIG_INI_ROOT, CONFIG_INI_LANGUAGE, _T("zh_CN"));return (LRESULT)TRUE;
}LRESULT CDialogFrame::OnSettingsLang_zh_SG(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{HMENU hMenu = GetMenu(m_hWnd);CheckRadioMenuItem(hMenu, wID, true);LanguageChange(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SINGAPORE));m_cfg.SetString(CONFIG_INI_ROOT, CONFIG_INI_LANGUAGE, _T("zh_SG"));return (LRESULT)TRUE;
}LRESULT CDialogFrame::OnSettingsLang_zh_HK(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{HMENU hMenu = GetMenu(m_hWnd);CheckRadioMenuItem(hMenu, wID, true);LanguageChange(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG));m_cfg.SetString(CONFIG_INI_ROOT, CONFIG_INI_LANGUAGE, _T("zh_HK"));return (LRESULT)TRUE;
}LRESULT CDialogFrame::OnSettingsLang_zh_TW(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{HMENU hMenu = GetMenu(m_hWnd);CheckRadioMenuItem(hMenu, wID, true);LanguageChange(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL));m_cfg.SetString(CONFIG_INI_ROOT, CONFIG_INI_LANGUAGE, _T("zh_TW"));return (LRESULT)TRUE;
}LRESULT CDialogFrame::OnSettingsLang_zh_MO(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{HMENU hMenu = GetMenu(m_hWnd);CheckRadioMenuItem(hMenu, wID, true);LanguageChange(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_MACAU));m_cfg.SetString(CONFIG_INI_ROOT, CONFIG_INI_LANGUAGE, _T("zh_MO"));return (LRESULT)TRUE;
}LRESULT CDialogFrame::OnSettingsLang_ja_JP(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{HMENU hMenu = GetMenu(m_hWnd);CheckRadioMenuItem(hMenu, wID, true);LanguageChange(MAKELANGID(LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN));m_cfg.SetString(CONFIG_INI_ROOT, CONFIG_INI_LANGUAGE, _T("ja_JP"));return (LRESULT)TRUE;
}LRESULT CDialogFrame::OnSettingsLang_ko_KR(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{HMENU hMenu = GetMenu(m_hWnd);CheckRadioMenuItem(hMenu, wID, true);LanguageChange(MAKELANGID(LANG_KOREAN, SUBLANG_JAPANESE_JAPAN));m_cfg.SetString(CONFIG_INI_ROOT, CONFIG_INI_LANGUAGE, _T("ko_KR"));return (LRESULT)TRUE;
}LRESULT CDialogFrame::OnSettingsLang_en_US(WORD wNotify, WORD wID, HWND hWnd, WORD wStart, WORD wEnd)
{HMENU hMenu = GetMenu(m_hWnd);CheckRadioMenuItem(hMenu, wID, true);LanguageChange(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));m_cfg.SetString(CONFIG_INI_ROOT, CONFIG_INI_LANGUAGE, _T("en_US"));return (LRESULT)TRUE;
}void CDialogFrame::LanguageChange(LANGID lang)
{m_langID = lang;SetThreadUILanguage(lang);//修改菜单文本{HMENU hMenu = GetMenu(m_hWnd);ModifyMenuText(hMenu, 0, IDS_STRING_FILE, TRUE);ModifyMenuText(hMenu, ID_FILE_OPEN, IDS_STRING_FILE_OPEN, FALSE);ModifyMenuText(hMenu, ID_FILE_SAVE, IDS_STRING_FILE_SAVE, FALSE);ModifyMenuText(hMenu, ID_FILE_SAVE_AS, IDS_STRING_FILE_SAVE_AS, FALSE);ModifyMenuText(hMenu, ID_FILE_EXIT, IDS_STRING_FILE_EXIT, FALSE);ModifyMenuText(hMenu, 1, IDS_STRING_SETTINGS, TRUE);ModifyMenuText(hMenu, ID_SETTINGS_TOPMOST, IDS_STRING_SETTINGS_TOPMOST, FALSE);ModifyMenuText(::GetSubMenu(hMenu, 1), 1, IDS_STRING_SETTINGS_LANGUAGE, TRUE);ModifyMenuText(hMenu, 2, IDS_STRING_HELP, TRUE);ModifyMenuText(hMenu, ID_HELP_ABOUT, IDS_STRING_HELP_ABOUT, FALSE);}//界面文本{SetItemString(IDC_STATIC_FILE_PATH, LoadString(IDS_STRING_PATH));SetItemString(IDC_BUTTON_OPEN_FILE, LoadString(IDS_STRING_OPEN));SetItemString(IDC_STATIC_TOTAL_SONGS, LoadString(IDS_STRING_TOTAL_SONGS));SetItemString(IDC_STATIC_START_SONG, LoadString(IDS_STRING_START_SONG));SetItemString(IDC_STATIC_LOAD_ADDR, LoadString(IDS_STRING_LOAD_ADDR));SetItemString(IDC_STATIC_INIT_ADDR, LoadString(IDS_STRING_INIT_ADDR));SetItemString(IDC_STATIC_PLAY_ADDR, LoadString(IDS_STRING_PLAY_ADDR));SetItemString(IDC_STATIC_NAME, LoadString(IDS_STRING_NAME));SetItemString(IDC_STATIC_ARTIST, LoadString(IDS_STRING_ARTIST));SetItemString(IDC_STATIC_COPYRIGHT, LoadString(IDS_STRING_COPYRIGHT));SetItemString(IDC_STATIC_STANDARD, LoadString(IDS_STRING_STANDARD));SetItemString(IDC_STATIC_PLAY_SPEED, LoadString(IDS_STRING_PLAY_SPEED));SetItemString(IDC_STATIC_BANKSWITCH, LoadString(IDS_STRING_BANKSWITCH));SetItemString(IDC_STATIC_EXTRA_SOUND, LoadString(IDS_STRING_EXTRA_SOUND));}// 标题{_tstring strCaption = LoadString(IDS_STRING_CAPTION);CVersionUtils::VERSION_INFO version = CVersionUtils::GetFileVersion(CPathUtils::GetCurrentModulePath());if (!version.strFileVersion.empty()){strCaption += _T(" ");strCaption += version.strFileVersion;}if (!version.strCompanyName.empty()){strCaption += _T(" ");strCaption += _T("(");strCaption += version.strCompanyName;strCaption += _T(")");}::SetWindowText(m_hWnd, strCaption.c_str());}::DrawMenuBar(m_hWnd);
}LRESULT CDialogFrame::OnTrayIcon(WPARAM wParam, LPARAM lParam)
{if (WM_LBUTTONDBLCLK == lParam){ShowForeground(m_hWnd);}if (NULL != m_hHideWnd){::SetForegroundWindow(m_hHideWnd);}if (WM_RBUTTONUP == lParam){HWND hForegroundWindow = GetForegroundWindow();if (hForegroundWindow == m_hHideWnd || hForegroundWindow == m_hWnd){POINT pt = { 0 };::GetCursorPos(&pt);CreatePopMenu(pt.x, pt.y, false);}}return FALSE;
}bool CDialogFrame::ShowForeground(HWND hWnd)
{HWND hForeWnd = ::GetForegroundWindow();DWORD dwForeID = ::GetWindowThreadProcessId(hForeWnd, NULL);DWORD dwCurID = ::GetCurrentThreadId();::AttachThreadInput(dwCurID, dwForeID, TRUE);BOOL isSuc = ::SetForegroundWindow(hWnd);::AttachThreadInput(dwCurID, dwForeID, FALSE);if (isSuc){//return true;}if (!::IsWindowVisible(hWnd)){::ShowWindow(hWnd, SW_SHOW);}if (IsIconic(hWnd)){::ShowWindow(hWnd, SW_SHOWNORMAL);}return ::SetForegroundWindow(hWnd);
}void CDialogFrame::ShowTrayIcon()
{NOTIFYICONDATA nid = { 0 };nid.cbSize = sizeof(NOTIFYICONDATA);nid.hWnd = m_hWnd;nid.uID = 0;nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;nid.uCallbackMessage = WM_TRAYICON;nid.hIcon = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON_MAIN));StringCchCopy(nid.szTip, _countof(nid.szTip), _T("Demo"));Shell_NotifyIcon(NIM_ADD, &nid);
}void CDialogFrame::DeleteTrayIcon()
{NOTIFYICONDATA nid = { 0 };nid.cbSize = sizeof(nid);nid.hWnd = m_hWnd;nid.uID = 0;nid.uFlags = 0;Shell_NotifyIcon(NIM_DELETE, &nid);
}VOID CDialogFrame::CreatePopMenu(int xPos, int yPos, bool isTop)
{MENUITEMINFO mii = { 0 };TCHAR szBuf[MAX_PATH] = { 0 };mii.cbSize = sizeof(mii);mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU | MIIM_ID;mii.fType = MFT_STRING | MFT_OWNERDRAW;mii.dwTypeData = szBuf;if (!m_hWnd){return;}{HMENU hMenu = m_hMainMenu;//ModifyMenuText(hMenu, ID_FILE_EXIT, IDS_FILE_EXIT, FALSE);//ModifyMenuText(hMenu, ID_SETTINGS_SHOW, IDS_SETTINGS_SHOW, FALSE);//ModifyMenuText(hMenu, ID_SETTINGS_HIDE, IDS_SETTINGS_HIDE, FALSE);}if (NULL == m_hPopMenu){m_hPopMenu = CreatePopupMenu();int nCount = ::GetMenuItemCount(m_hMainMenu);for (int i = 0; i < nCount; i++){mii.cch = _countof(szBuf);::GetMenuItemInfo(m_hMainMenu, i, TRUE, &mii);::InsertMenuItem(m_hPopMenu, i, TRUE, &mii);}}else{int nCount = ::GetMenuItemCount(m_hMainMenu);for (int i = 0; i < nCount; i++){mii.cch = _countof(szBuf);::GetMenuItemInfo(m_hMainMenu, i, TRUE, &mii);::SetMenuItemInfo(m_hPopMenu, i, TRUE, &mii);}}TrackPopupMenuEx(m_hPopMenu, TPM_LEFTALIGN | (isTop ? TPM_BOTTOMALIGN : TPM_TOPALIGN),xPos, yPos, m_hWnd, NULL);
}void CDialogFrame::LoadInformationFromFile(const _tstring& strFile)
{m_strPath = strFile;if (CBytesUtils::BytesFromFile(m_nsfData, m_strPath)){if (m_nsfData.size() >= sizeof(m_nsfHeader)){NSF_HEADER nsfHeader = { 0 };memcpy(&nsfHeader, m_nsfData.data(), sizeof(nsfHeader));if (IsNsfFormat(nsfHeader)){LoadInformationFromNSFHeader(nsfHeader);m_strPath = strFile;m_nsfHeader = nsfHeader;SetItemString(IDC_EDIT_FILE_PATH, m_strPath);}else{CMessageBoxCenter       m_boxCenter;MessageBox(m_hWnd,LoadString(IDS_STRING_FORMAT_INCORRENT).c_str(),LoadString(IDS_STRING_ERROR).c_str(),MB_OK | MB_ICONERROR);m_strPath.clear();SetItemString(IDC_EDIT_FILE_PATH, m_strPath);}}}
}void CDialogFrame::LoadInformationFromNSFHeader(const NSF_HEADER& header)
{SetItemInt(IDC_EDIT_TOTAL_SONGS, header.total_songs);SetItemInt(IDC_EDIT_START_SONG, header.start_song);SetItemString(IDC_EDIT_LOAD_ADDR, CStrUtils::Format(_T("%04X"), header.load_address));SetItemString(IDC_EDIT_INIT_ADDR, CStrUtils::Format(_T("%04X"), header.init_address));SetItemString(IDC_EDIT_PLAY_ADDR, CStrUtils::Format(_T("%04X"), header.play_address));SetItemString(IDC_EDIT_NAME, CStrUtils::U8StrToTStr(header.name));SetItemString(IDC_EDIT_ARTIST, CStrUtils::U8StrToTStr(header.artist));SetItemString(IDC_EDIT_COPYRIGHT, CStrUtils::U8StrToTStr(header.copyright));SetItemString(IDC_EDIT_PLAY_SPEED_NTSC, CStrUtils::Format(_T("%d"), header.play_speed_ntsc));SetItemString(IDC_EDIT_PLAY_SPEED_PAL, CStrUtils::Format(_T("%d"), header.play_speed_pal));for (int i = 0; i < 8; i++){SetItemString(IDC_EDIT_BANK_0 + i, CStrUtils::Format(_T("%02X"), header.bankswitch[i]));}switch (header.standard){case 0:CheckRadioButton(IDC_RADIO_STANDARD_NTSC, IDC_RADIO_STANDARD_NTSC_PAL, IDC_RADIO_STANDARD_NTSC);EnableItem(IDC_EDIT_PLAY_SPEED_NTSC, TRUE);EnableItem(IDC_EDIT_PLAY_SPEED_PAL, FALSE);break;case 1:CheckRadioButton(IDC_RADIO_STANDARD_NTSC, IDC_RADIO_STANDARD_NTSC_PAL, IDC_RADIO_STANDARD_PAL);EnableItem(IDC_EDIT_PLAY_SPEED_NTSC, FALSE);EnableItem(IDC_EDIT_PLAY_SPEED_PAL, TRUE);break;case 2:CheckRadioButton(IDC_RADIO_STANDARD_NTSC, IDC_RADIO_STANDARD_NTSC_PAL, IDC_RADIO_STANDARD_NTSC_PAL);EnableItem(IDC_EDIT_PLAY_SPEED_NTSC, TRUE);EnableItem(IDC_EDIT_PLAY_SPEED_PAL, TRUE);break;}for (int i = 0; i < 7; i++){CheckButton(IDC_CHECK_AUDIO_VRC6 + i, header.extra_sound & (0x01 << i));}
}bool CDialogFrame::IsNsfFormat(const NSF_HEADER& header)
{if (0x4D53454E == *(uint32_t*)&header.format_file &&0x1A == header.format_file[4]){return true;}return false;
}void CDialogFrame::SaveInformationFromFile(const _tstring& strPath)
{std::vector<uint8_t> vData = m_nsfData;NSF_HEADER  nsfHeader = { 0 };if (vData.size() < sizeof(nsfHeader)){vData.resize(sizeof(nsfHeader));}nsfHeader.format_file[0] = 0x4E;nsfHeader.format_file[1] = 0x45;nsfHeader.format_file[2] = 0x53;nsfHeader.format_file[3] = 0x4D;nsfHeader.format_file[4] = 0x1A;nsfHeader.total_songs = GetItemInt(IDC_EDIT_TOTAL_SONGS);nsfHeader.start_song = GetItemInt(IDC_EDIT_START_SONG);nsfHeader.load_address = CStrUtils::StrToUInt(GetItemString(IDC_EDIT_LOAD_ADDR), 16);nsfHeader.init_address = CStrUtils::StrToUInt(GetItemString(IDC_EDIT_INIT_ADDR), 16);nsfHeader.play_address = CStrUtils::StrToUInt(GetItemString(IDC_EDIT_PLAY_ADDR), 16);std::string strName = CStrUtils::TStrToU8Str(GetItemString(IDC_EDIT_NAME));std::string strArtist = CStrUtils::TStrToU8Str(GetItemString(IDC_EDIT_ARTIST));std::string strCopyRight = CStrUtils::TStrToU8Str(GetItemString(IDC_EDIT_COPYRIGHT));if (strName.size() > 31) strName.resize(31);if (strArtist.size() > 31) strArtist.resize(31);if (strCopyRight.size() > 31) strCopyRight.resize(31);memcpy(nsfHeader.name, strName.c_str(), strName.size());memcpy(nsfHeader.artist, strArtist.c_str(), strArtist.size());memcpy(nsfHeader.copyright, strCopyRight.c_str(), strCopyRight.size());nsfHeader.play_speed_ntsc = GetItemInt(IDC_EDIT_PLAY_SPEED_NTSC);nsfHeader.play_speed_pal = GetItemInt(IDC_EDIT_PLAY_SPEED_PAL);for (int i = 0; i < 8; i++){nsfHeader.bankswitch[i] = CStrUtils::StrToUInt(GetItemString(IDC_EDIT_BANK_0 + i), 16);}if (IsButtonChecked(IDC_RADIO_STANDARD_NTSC)) nsfHeader.standard = 0x00;if (IsButtonChecked(IDC_RADIO_STANDARD_PAL)) nsfHeader.standard = 0x01;if (IsButtonChecked(IDC_RADIO_STANDARD_NTSC_PAL)) nsfHeader.standard = 0x02;for (int i = 0; i < 7; i++){if (IsButtonChecked(IDC_CHECK_AUDIO_VRC6 + i)){nsfHeader.extra_sound |= (1 << i);}}memcpy(vData.data(), &nsfHeader, sizeof(nsfHeader));CBytesUtils::BytesToFile(strPath, vData);SetItemString(IDC_EDIT_FILE_PATH, m_strPath);
}BOOL CDialogFrame::PreTranslateMessage(LPMSG pMsg)
{if (WM_KEYDOWN == pMsg->message){UINT vkCode = (UINT)pMsg->wParam;SHORT fCtrl = GetAsyncKeyState(VK_CONTROL) & 0x8000;// 删除忽略if (VK_BACK == vkCode || VK_DELETE == vkCode){return FALSE;}// 组合键忽略if (fCtrl){if (vkCode == 'C' || vkCode == 'V' || vkCode == 'X' || vkCode == 'Z' || vkCode == 'A'){return FALSE;}}// 方向位置忽略if (vkCode >= VK_END && vkCode <= VK_DOWN){return FALSE;}if (GetItem(IDC_EDIT_NAME) == pMsg->hwnd){return InputLimitLength(pMsg->hwnd, 31);}if (GetItem(IDC_EDIT_ARTIST) == pMsg->hwnd){return InputLimitLength(pMsg->hwnd, 31);}if (GetItem(IDC_EDIT_COPYRIGHT) == pMsg->hwnd){return InputLimitLength(pMsg->hwnd, 31);}}return FALSE;
}bool CDialogFrame::InputLimitLength(HWND hWnd, int nLength/* = -1*/)
{int iStart = 0;int iEnd = 0;int iSelect = 0;::SendMessage(hWnd, EM_GETSEL, (WPARAM)&iStart, (LPARAM)&iEnd);iSelect = iEnd - iStart;int nCurLength = GetItemStringLength(hWnd);if (nCurLength >= nLength){if (iSelect > 0){return false;}return true;}_tstring strText = GetItemString(hWnd);return false;
}bool CDialogFrame::InputLimitDec(HWND hWnd, int nLength/* = -1*/, UINT nMin/* = 0*/, UINT nMax/* = UINT_MAX*/)
{return false;
}bool CDialogFrame::InputLimitHex(HWND hWnd, int nLength/* = -1*/, UINT nMin/* = 0*/, UINT nMax/* = UINT_MAX*/)
{return false;
}

main.cpp

#include "CDialogFrame.h"
#include "resource.h"int APIENTRY WinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPSTR lpCmdLine,_In_ int nShowCmd)
{UNREFERENCED_PARAMETER(hInstance);UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);UNREFERENCED_PARAMETER(nShowCmd);CDialogFrame dlg;dlg.DoModalEx(IDD_DIALOG_MAIN, nullptr);return 0;
}

 完整项目仓库

https://gitee.com/flame_cyclone/nsf_information_editor

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在WordPress网站中查看移动版本—快速预览与自定义设置

在WordPress网站的构建过程中&#xff0c;确保网站在移动端的显示效果至关重要。毕竟&#xff0c;随着越来越多的用户通过手机访问互联网&#xff0c;一个优化良好的移动版网站将直接影响用户的留存率和访问体验。 如果你是WordPress网站的所有者&#xff0c;本文将向你介绍如…

课程1. 深度学习简介

课程1. 深度学习简介 神经网络结构逻辑回归XOR问题&#xff08;异或问题&#xff09; 中间特征的生成全连接神经网络中间网络层的激活函数Sigmoid函数Tanh函数ReLU函数其它激活函数 使用全连接神经网络解决 XOR 问题神经网络用于回归问题训练神经网络 不同类型的神经网络 附加材…

数据结构 1-2 线性表的链式存储-链表

1 原理 顺序表的缺点&#xff1a; 插入和删除移动大量元素数组的大小不好控制占用一大段连续的存储空间&#xff0c;造成很多碎片 链表规避了上述顺序表缺点 逻辑上相邻的两个元素在物理位置上不相邻 头结点 L&#xff1a;头指针 头指针&#xff1a;链表中第一个结点的存储…

Kubernetes开发环境minikube | 开发部署MySQL单节点应用

minikube是一个主要用于开发与测试Kubernetes应用的运行环境 本文主要描述在minikube运行环境中部署MySQL单节点应用 minikube start --force kubectl get nodes 如上所示&#xff0c;启动minikube单节点运行环境 minikube ssh docker pull 如上所示&#xff0c;从MySQL官…

DeepSeek 助力 Vue 开发:打造丝滑的二维码生成(QR Code)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

一文详解U盘启动UEFI/Legacy方式以及GPT/MBR关系

对于装系统的老手而说一直想研究一下装系统的原理&#xff0c;以及面对一些问题时的解决思路&#xff0c;故对以前的方法进行原理上的解释&#xff0c;主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导&#xff0c;我们可以看一下微pe制作的启动盘&#…

一周学会Flask3 Python Web开发-flask3上下文全局变量session,g和current_app

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili flask3提供了session,g和current_app上下文全局变量来方便我们操作访问数据。 以下是一个表格&#xff0c;用于比较Flask中的…

antv G6绘制流程图

效果图&#xff08;优点&#xff1a;可以自定义每一条折线的颜色&#xff0c;可以自定义节点的颜色&#xff0c;以及折线的计算样式等&#xff09;&#xff1a; 代码&#xff1a; <!-- 流程图组件 --> <template><div id"container"></div>…

DeepSeek-R1本地部署保姆级教程

一、DeepSeek-R1本地部署配置要求 &#xff08;一&#xff09;轻量级模型 ▌DeepSeek-R1-1.5B 内存容量&#xff1a;≥8GB 显卡需求&#xff1a;支持CPU推理&#xff08;无需独立GPU&#xff09; 适用场景&#xff1a;本地环境验证测试/Ollama集成调试 &#xff08;二&a…

2025-spring boot 之多数据源管理

1、是使用Spring提供的AbstractRoutingDataSource抽象类 注入多个数据源。 创建 DataSourceConfig 配置类 通过spring jdbc 提供的带路由的抽象数据源 AbstractRoutingDataSource import org.springframework.beans.factory.annotation.Autowired; import org.springframew…

项目实战--网页五子棋(匹配模块)(4)

上期我们完成了游戏大厅的前端部分内容&#xff0c;今天我们实现后端部分内容 1. 维护在线用户 在用户登录成功后&#xff0c;我们可以维护好用户的websocket会话&#xff0c;把用户表示为在线状态&#xff0c;方便获取到用户的websocket会话 package org.ting.j20250110_g…

第4章 4.4 EF Core数据库迁移 Add-Migration UpDate-Database

4.4.1 数据库迁移原理 总结一下就是&#xff1a; 1. 数据库迁移命令的执行&#xff0c;其实就是生成在数据库执行的脚本代码&#xff08;两个文件&#xff1a;数字_迁移名.cs 数字_迁移名.Designer.cs&#xff09;&#xff0c;用于对数据库进行定义和修饰。 2. 数据库迁移…

51单片机编程学习笔记——点亮LED

大纲 器件51单片机开发板总结 安装驱动点亮LED烧录 随着最近机器人爆火&#xff0c;之前写的ROS2系列博客《Robot Operating System》也获得了更多的关注。我决定在机器人领域里再走一步&#xff0c;于是想到可以学习单片机。研究了下学习路径&#xff0c;最后还是选择先从51单…

蓝桥杯单片机组第十二届省赛第二批次

前言 第十二届省赛涉及知识点&#xff1a;NE555频率数据读取&#xff0c;NE555频率转换周期&#xff0c;PCF8591同时测量光敏电阻和电位器的电压、按键长短按判断。 本试题涉及模块较少&#xff0c;题目不难&#xff0c;基本上准备充分的都能完整的实现每一个功能&#xff0c;并…

opencv:距离变换 cv2.distanceTransform

函数 cv2.distanceTransform() 用于计算图像中每一个非零点像素与其最近的零点像素之间的距离&#xff08;Distance Transform&#xff0c; DT算法&#xff09;,输出的是保存每一个非零点与最近零点的距离信息&#xff1b;图像上越亮的点&#xff0c;代表了离零点的距离越远。 …

基于Spring Boot的党员学习交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car&#xff0c;需要转换到相机坐标系下&#xff0c;旋转矩阵R_car2Cam&#xff0c;平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1&#xff1a;先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…

数字IC后端培训教程| 芯片后端实战项目中base layer drc violation解析

今天分享一个咱们社区IC后端训练营学员遇到的一个经典DRC案例。这个DRC Violation的名字为PP.S.9(这里的PP就是Plus P)。这一层是属于管子的base layer。更多关于base layer的介绍&#xff0c;可以查看下面这份教程。 https://alidocs.dingtalk.com/api/doc/transit?spaceId5…

2025年校园网络招聘会汇总

1、卫生健康行业2025届毕业生春季校园网络招聘会 企业数量职位数量岗位数量10020002000 访问地址&#xff1a; https://www.weirenjob.com/zph/zph_wsjkxy2025jbyscjxywlzph/ 2、山东地区面向2025届高校毕业生网络招聘活动 企业数量职位数量岗位数量909271052434 访问地址&a…

Windows 10 GPU STACK 0.5.1 安装

Windows 10 GPU STACK 0.5.1 安装 1 GPUStack 安装1.Python安装&#xff08;3.10/11/12&#xff09;2.GPUStack 下载3.生成密码4.访问5.设置模型下载目录6.禁用开机自启并重启服务7.安装模型8.查看安装的进度 2.试验场聊天测试1.对话模式 3.API Key 测试 1 GPUStack 安装 1.Py…