| ¶Ô±ÈÐÂÎļþ |
| | |
| | | ================================================================================ |
| | | MICROSOFT åºç¡ç±»åº : Servo é¡¹ç®æ¦è¿° |
| | | =============================================================================== |
| | | |
| | | åºç¨ç¨åºå导已为æ¨åå»ºäºæ¤ Servo åºç¨ç¨åºãæ¤åºç¨ç¨åºä¸ä»
æ¼ç¤º Microsoft åºç¡ç±»çåºæ¬ä½¿ç¨æ¹æ³ï¼è¿å¯ä½ä¸ºæ¨ç¼ååºç¨ç¨åºçèµ·ç¹ã |
| | | |
| | | æ¬æä»¶æ¦è¦ä»ç»ç»æ Servo åºç¨ç¨åºçæ¯ä¸ªæä»¶çå
容ã |
| | | |
| | | Servo.vcxproj |
| | | è¿æ¯ä½¿ç¨åºç¨ç¨åºå导çæç VC++ 项ç®çä¸»é¡¹ç®æä»¶ï¼å
¶ä¸å
å«çæè¯¥æä»¶ç Visual C++ ççæ¬ä¿¡æ¯ï¼ä»¥åæå
³ä½¿ç¨åºç¨ç¨åºå坼鿩çå¹³å°ãé
ç½®å项ç®åè½çä¿¡æ¯ã |
| | | |
| | | Servo.vcxproj.filters |
| | | è¿æ¯ä½¿ç¨âåºç¨ç¨åºå导âçæç VC++ 项ç®çé卿件ãå®å
嫿å
³é¡¹ç®æä»¶ä¸çéå¨ä¹é´çå
³èä¿¡æ¯ãå¨ IDE ä¸ï¼éè¿è¿ç§å
³èï¼å¨ç¹å®èç¹ä¸ä»¥åç»å½¢å¼æ¾ç¤ºå
·æç¸ä¼¼æ©å±åçæä»¶ãä¾å¦ï¼â.cppâæä»¶ä¸âæºæä»¶âçéå¨å
³èã |
| | | |
| | | Servo.h |
| | | è¿æ¯åºç¨ç¨åºç主头æä»¶ã |
| | | å
¶ä¸å
æ¬å
¶ä»é¡¹ç®ç¹å®çæ 头ï¼å
æ¬ Resource.hï¼ï¼å¹¶å£°æ CServoApp åºç¨ç¨åºç±»ã |
| | | |
| | | Servo.cpp |
| | | è¿æ¯å
å«åºç¨ç¨åºç±» CServoApp ç主åºç¨ç¨åºæºæä»¶ã |
| | | |
| | | Servo.rc |
| | | è¿æ¯ç¨åºä½¿ç¨çææ Microsoft Windows èµæºçå表ãå®å
æ¬ RES åç®å½ä¸åå¨ç徿 ãä½å¾åå
æ ãæ¤æä»¶å¯ä»¥ç´æ¥å¨ Microsoft Visual C++ ä¸è¿è¡ç¼è¾ã项ç®èµæºå
å«å¨ 2052 ä¸ã |
| | | |
| | | res\Servo.ico |
| | | è¿æ¯ç¨ä½åºç¨ç¨åºå¾æ ç徿 æä»¶ãæ¤å¾æ å
æ¬å¨ä¸»èµæºæä»¶ Servo.rc ä¸ã |
| | | |
| | | res\Servo.rc2 |
| | | æ¤æä»¶å
å«ä¸å¨ Microsoft Visual C++ ä¸è¿è¡ç¼è¾çèµæºãæ¨åºè¯¥å°ä¸å¯ç±èµæºç¼è¾å¨ç¼è¾çææèµæºæ¾å¨æ¤æä»¶ä¸ã |
| | | |
| | | |
| | | ///////////////////////////////////////////////////////////////////////////// |
| | | |
| | | åºç¨ç¨åºå导å建ä¸ä¸ªå¯¹è¯æ¡ç±»ï¼ |
| | | |
| | | ServoDlg.hãServoDlg.cpp - å¯¹è¯æ¡ |
| | | è¿äºæä»¶å
å« CServoDlg ç±»ãæ¤ç±»å®ä¹åºç¨ç¨åºçä¸»å¯¹è¯æ¡çè¡ä¸ºãå¯¹è¯æ¡æ¨¡æ¿å
å«å¨ Servo.rc ä¸ï¼è¯¥æä»¶å¯ä»¥å¨ Microsoft Visual C++ ä¸ç¼è¾ã |
| | | |
| | | ///////////////////////////////////////////////////////////////////////////// |
| | | |
| | | å
¶ä»åè½ï¼ |
| | | |
| | | ActiveX æ§ä»¶ |
| | | 该åºç¨ç¨åºå
å«å¯¹ä½¿ç¨ ActiveX æ§ä»¶çæ¯æã |
| | | |
| | | ///////////////////////////////////////////////////////////////////////////// |
| | | |
| | | å
¶ä»æ åæä»¶: |
| | | |
| | | StdAfx.h, StdAfx.cpp |
| | | è¿äºæä»¶ç¨äºçæå为 Servo.pch çé¢ç¼è¯å¤´ (PCH) æä»¶åå为 StdAfx.obj çé¢ç¼è¯ç±»åæä»¶ã |
| | | |
| | | Resource.h |
| | | è¿æ¯æ å头æä»¶ï¼å¯ç¨äºå®ä¹æ°çèµæº IDãMicrosoft Visual C++ å°è¯»åå¹¶æ´æ°æ¤æä»¶ã |
| | | |
| | | Servo.manifest |
| | | Windows XP 使ç¨åºç¨ç¨åºæ¸
åæä»¶æ¥æè¿°ç¹å®çæ¬çå¹¶è¡ç¨åºéçåºç¨ç¨åºä¾èµé¡¹ãå è½½ç¨åºä½¿ç¨è¿äºä¿¡æ¯æ¥ä»ç¨åºéç¼åä¸å è½½ç¸åºçç¨åºéï¼å¹¶ä¿æ¤å
¶ä¸è¢«åºç¨ç¨åºè®¿é®ãåºç¨ç¨åºæ¸
åå¯è½ä¼å
å«å¨å
ï¼ä»¥ä½ä¸ºä¸åºç¨ç¨åºå¯æ§è¡æä»¶å®è£
å¨å䏿件夹ä¸çå¤é¨ .manifest æä»¶è¿è¡éæ°ååï¼å®è¿å¯è½ä»¥èµæºçå½¢å¼å
å«å¨å¯æ§è¡æä»¶ä¸ã |
| | | ///////////////////////////////////////////////////////////////////////////// |
| | | |
| | | å
¶ä»æ³¨é: |
| | | |
| | | åºç¨ç¨åºå导使ç¨âTODO:âæ¥æç¤ºåºæ·»å æèªå®ä¹çæºä»£ç é¨åã |
| | | |
| | | 妿åºç¨ç¨åºä½¿ç¨å
±äº« DLL ä¸ç MFCï¼æ¨å°éè¦éæ°åå MFC DLLã妿åºç¨ç¨åºæä½¿ç¨çè¯è¨ä¸æä½ç³»ç»çåºå设置ä¸åï¼åè¿éè¦éæ°ååç¸åºçæ¬å°åèµæº mfc110XXX.DLLã |
| | | æå
³ä¸è¿°è¯é¢çæ´å¤ä¿¡æ¯ï¼è¯·åè§ MSDN ææ¡£ä¸æå
³éæ°åå Visual C++ åºç¨ç¨åºçé¨åã |
| | | |
| | | ///////////////////////////////////////////////////////////////////////////// |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | |
| | | // Servo.cpp : å®ä¹åºç¨ç¨åºçç±»è¡ä¸ºã |
| | | // |
| | | |
| | | #include "stdafx.h" |
| | | #include "Servo.h" |
| | | #include "ServoDlg.h" |
| | | #include "ServoGraph.h" |
| | | |
| | | #ifdef _DEBUG |
| | | #define new DEBUG_NEW |
| | | #endif |
| | | |
| | | |
| | | // CServoApp |
| | | |
| | | BEGIN_MESSAGE_MAP(CServoApp, CWinApp) |
| | | ON_COMMAND(ID_HELP, &CWinApp::OnHelp) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | // CServoApp æé |
| | | |
| | | CServoApp::CServoApp() |
| | | { |
| | | // æ¯æéæ°å¯å¨ç®¡çå¨ |
| | | m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART; |
| | | |
| | | // TODO: 卿¤å¤æ·»å æé 代ç ï¼ |
| | | // å°ææéè¦çåå§åæ¾ç½®å¨ InitInstance ä¸ |
| | | } |
| | | |
| | | |
| | | // å¯ä¸çä¸ä¸ª CServoApp 对象 |
| | | |
| | | CServoApp theApp; |
| | | |
| | | |
| | | // CServoApp åå§å |
| | | |
| | | BOOL CServoApp::InitInstance() |
| | | { |
| | | // 妿ä¸ä¸ªè¿è¡å¨ Windows XP ä¸çåºç¨ç¨åºæ¸
åæå®è¦ |
| | | // ä½¿ç¨ ComCtl32.dll çæ¬ 6 ææ´é«çæ¬æ¥å¯ç¨å¯è§åæ¹å¼ï¼ |
| | | //åéè¦ InitCommonControlsEx()ã å¦åï¼å°æ æ³å建çªå£ã |
| | | INITCOMMONCONTROLSEX InitCtrls; |
| | | InitCtrls.dwSize = sizeof(InitCtrls); |
| | | // å°å®è®¾ç½®ä¸ºå
æ¬ææè¦å¨åºç¨ç¨åºä¸ä½¿ç¨ç |
| | | // å
Œ
±æ§ä»¶ç±»ã |
| | | InitCtrls.dwICC = ICC_WIN95_CLASSES; |
| | | InitCommonControlsEx(&InitCtrls); |
| | | |
| | | CWinApp::InitInstance(); |
| | | |
| | | |
| | | AfxEnableControlContainer(); |
| | | |
| | | // å建 shell 管çå¨ï¼ä»¥é²å¯¹è¯æ¡å
å« |
| | | // ä»»ä½ shell æ è§å¾æ§ä»¶æ shell å表è§å¾æ§ä»¶ã |
| | | CShellManager *pShellManager = new CShellManager; |
| | | |
| | | // æ¿æ´»âWindows Nativeâè§è§ç®¡çå¨ï¼ä»¥ä¾¿å¨ MFC æ§ä»¶ä¸å¯ç¨ä¸»é¢ |
| | | CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); |
| | | |
| | | // æ ååå§å |
| | | // 妿æªä½¿ç¨è¿äºåè½å¹¶å¸æåå° |
| | | // æç»å¯æ§è¡æä»¶ç大å°ï¼ååºç§»é¤ä¸å |
| | | // ä¸éè¦çç¹å®åå§åä¾ç¨ |
| | | // æ´æ¹ç¨äºåå¨è®¾ç½®ç注å表项 |
| | | // TODO: åºéå½ä¿®æ¹è¯¥åç¬¦ä¸²ï¼ |
| | | // ä¾å¦ä¿®æ¹ä¸ºå
¬å¸æç»ç»å |
| | | SetRegistryKey(_T("åºç¨ç¨åºå导çæçæ¬å°åºç¨ç¨åº")); |
| | | |
| | | |
| | | // æ¬ç¨åºæä»¶ç®å½ |
| | | TCHAR sDrive[_MAX_DRIVE]; |
| | | TCHAR sDir[_MAX_DIR]; |
| | | TCHAR sFilename[_MAX_FNAME], sAppFilename[_MAX_FNAME]; |
| | | TCHAR sExt[_MAX_EXT]; |
| | | GetModuleFileName(AfxGetInstanceHandle(), sAppFilename, _MAX_FNAME); |
| | | _tsplitpath_s(sAppFilename, sDrive, sDir, sFilename, sExt); |
| | | m_strAppDir = CString(sDrive) + CString(sDir); |
| | | m_strAppFile = CString(sFilename); |
| | | |
| | | |
| | | // æ³¨åæ§ä»¶ |
| | | CServoGraph::RegisterWndClass(); |
| | | |
| | | |
| | | CServoDlg dlg; |
| | | m_pMainWnd = &dlg; |
| | | INT_PTR nResponse = dlg.DoModal(); |
| | | if (nResponse == IDOK) |
| | | { |
| | | // TODO: 卿¤æ¾ç½®å¤ç使¶ç¨ |
| | | // âç¡®å®âæ¥å
³éå¯¹è¯æ¡ç代ç |
| | | } |
| | | else if (nResponse == IDCANCEL) |
| | | { |
| | | // TODO: 卿¤æ¾ç½®å¤ç使¶ç¨ |
| | | // âåæ¶âæ¥å
³éå¯¹è¯æ¡ç代ç |
| | | } |
| | | else if (nResponse == -1) |
| | | { |
| | | TRACE(traceAppMsg, 0, "è¦å: å¯¹è¯æ¡å建失败ï¼åºç¨ç¨åºå°æå¤ç»æ¢ã\n"); |
| | | TRACE(traceAppMsg, 0, "è¦å: 妿æ¨å¨å¯¹è¯æ¡ä¸ä½¿ç¨ MFC æ§ä»¶ï¼åæ æ³ #define _AFX_NO_MFC_CONTROLS_IN_DIALOGSã\n"); |
| | | } |
| | | |
| | | // å é¤ä¸é¢å建ç shell 管çå¨ã |
| | | if (pShellManager != NULL) |
| | | { |
| | | delete pShellManager; |
| | | } |
| | | |
| | | // ç±äºå¯¹è¯æ¡å·²å
³éï¼æä»¥å°è¿å FALSE 以便éåºåºç¨ç¨åºï¼ |
| | | // è䏿¯å¯å¨åºç¨ç¨åºçæ¶æ¯æ³µã |
| | | return FALSE; |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | |
| | | // Servo.h : PROJECT_NAME åºç¨ç¨åºç主头æä»¶ |
| | | // |
| | | |
| | | #pragma once |
| | | |
| | | #ifndef __AFXWIN_H__ |
| | | #error "å¨å
嫿¤æä»¶ä¹åå
å«âstdafx.hâä»¥çæ PCH æä»¶" |
| | | #endif |
| | | |
| | | #include "resource.h" // ä¸»ç¬¦å· |
| | | |
| | | |
| | | // CServoApp: |
| | | // æå
³æ¤ç±»çå®ç°ï¼è¯·åé
Servo.cpp |
| | | // |
| | | |
| | | class CServoApp : public CWinApp |
| | | { |
| | | public: |
| | | CServoApp(); |
| | | |
| | | |
| | | public: |
| | | // CModel m_model; |
| | | HANDLE m_hAppMutex; |
| | | CString m_strAppDir; |
| | | CString m_strAppFile; |
| | | int m_nVersionNumber; |
| | | CString m_strVersionName; |
| | | |
| | | // éå |
| | | public: |
| | | virtual BOOL InitInstance(); |
| | | |
| | | // å®ç° |
| | | |
| | | DECLARE_MESSAGE_MAP() |
| | | }; |
| | | |
| | | extern CServoApp theApp; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
| | | <ItemGroup Label="ProjectConfigurations"> |
| | | <ProjectConfiguration Include="Debug|Win32"> |
| | | <Configuration>Debug</Configuration> |
| | | <Platform>Win32</Platform> |
| | | </ProjectConfiguration> |
| | | <ProjectConfiguration Include="Release|Win32"> |
| | | <Configuration>Release</Configuration> |
| | | <Platform>Win32</Platform> |
| | | </ProjectConfiguration> |
| | | <ProjectConfiguration Include="Debug|x64"> |
| | | <Configuration>Debug</Configuration> |
| | | <Platform>x64</Platform> |
| | | </ProjectConfiguration> |
| | | <ProjectConfiguration Include="Release|x64"> |
| | | <Configuration>Release</Configuration> |
| | | <Platform>x64</Platform> |
| | | </ProjectConfiguration> |
| | | </ItemGroup> |
| | | <PropertyGroup Label="Globals"> |
| | | <ProjectGuid>{66ADACE5-3166-4D1F-B30B-DE5E01FB01A2}</ProjectGuid> |
| | | <RootNamespace>Servo</RootNamespace> |
| | | <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> |
| | | <Keyword>MFCProj</Keyword> |
| | | </PropertyGroup> |
| | | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> |
| | | <ConfigurationType>Application</ConfigurationType> |
| | | <UseDebugLibraries>true</UseDebugLibraries> |
| | | <PlatformToolset>v140</PlatformToolset> |
| | | <CharacterSet>Unicode</CharacterSet> |
| | | <UseOfMfc>Dynamic</UseOfMfc> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> |
| | | <ConfigurationType>Application</ConfigurationType> |
| | | <UseDebugLibraries>false</UseDebugLibraries> |
| | | <PlatformToolset>v140</PlatformToolset> |
| | | <WholeProgramOptimization>true</WholeProgramOptimization> |
| | | <CharacterSet>Unicode</CharacterSet> |
| | | <UseOfMfc>Dynamic</UseOfMfc> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> |
| | | <ConfigurationType>Application</ConfigurationType> |
| | | <UseDebugLibraries>true</UseDebugLibraries> |
| | | <PlatformToolset>v140</PlatformToolset> |
| | | <CharacterSet>MultiByte</CharacterSet> |
| | | <UseOfMfc>Dynamic</UseOfMfc> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> |
| | | <ConfigurationType>Application</ConfigurationType> |
| | | <UseDebugLibraries>false</UseDebugLibraries> |
| | | <PlatformToolset>v140</PlatformToolset> |
| | | <WholeProgramOptimization>true</WholeProgramOptimization> |
| | | <CharacterSet>Unicode</CharacterSet> |
| | | <UseOfMfc>Dynamic</UseOfMfc> |
| | | </PropertyGroup> |
| | | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> |
| | | <ImportGroup Label="ExtensionSettings"> |
| | | </ImportGroup> |
| | | <ImportGroup Label="Shared"> |
| | | </ImportGroup> |
| | | <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
| | | <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
| | | </ImportGroup> |
| | | <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
| | | <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
| | | </ImportGroup> |
| | | <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
| | | <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
| | | </ImportGroup> |
| | | <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
| | | <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> |
| | | </ImportGroup> |
| | | <PropertyGroup Label="UserMacros" /> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
| | | <LinkIncremental>true</LinkIncremental> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
| | | <LinkIncremental>true</LinkIncremental> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
| | | <LinkIncremental>false</LinkIncremental> |
| | | </PropertyGroup> |
| | | <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
| | | <LinkIncremental>false</LinkIncremental> |
| | | </PropertyGroup> |
| | | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> |
| | | <ClCompile> |
| | | <PrecompiledHeader>Use</PrecompiledHeader> |
| | | <WarningLevel>Level3</WarningLevel> |
| | | <Optimization>Disabled</Optimization> |
| | | <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <SDLCheck>true</SDLCheck> |
| | | </ClCompile> |
| | | <Link> |
| | | <SubSystem>Windows</SubSystem> |
| | | <GenerateDebugInformation>true</GenerateDebugInformation> |
| | | </Link> |
| | | <Midl> |
| | | <MkTypLibCompatible>false</MkTypLibCompatible> |
| | | <ValidateAllParameters>true</ValidateAllParameters> |
| | | <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | </Midl> |
| | | <ResourceCompile> |
| | | <Culture>0x0804</Culture> |
| | | <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
| | | </ResourceCompile> |
| | | </ItemDefinitionGroup> |
| | | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> |
| | | <ClCompile> |
| | | <PrecompiledHeader>Use</PrecompiledHeader> |
| | | <WarningLevel>Level3</WarningLevel> |
| | | <Optimization>Disabled</Optimization> |
| | | <PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <SDLCheck>true</SDLCheck> |
| | | </ClCompile> |
| | | <Link> |
| | | <SubSystem>Windows</SubSystem> |
| | | <GenerateDebugInformation>true</GenerateDebugInformation> |
| | | </Link> |
| | | <Midl> |
| | | <MkTypLibCompatible>false</MkTypLibCompatible> |
| | | <ValidateAllParameters>true</ValidateAllParameters> |
| | | <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | </Midl> |
| | | <ResourceCompile> |
| | | <Culture>0x0804</Culture> |
| | | <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
| | | </ResourceCompile> |
| | | </ItemDefinitionGroup> |
| | | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
| | | <ClCompile> |
| | | <WarningLevel>Level3</WarningLevel> |
| | | <PrecompiledHeader>Use</PrecompiledHeader> |
| | | <Optimization>MaxSpeed</Optimization> |
| | | <FunctionLevelLinking>true</FunctionLevelLinking> |
| | | <IntrinsicFunctions>true</IntrinsicFunctions> |
| | | <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <SDLCheck>true</SDLCheck> |
| | | </ClCompile> |
| | | <Link> |
| | | <SubSystem>Windows</SubSystem> |
| | | <GenerateDebugInformation>true</GenerateDebugInformation> |
| | | <EnableCOMDATFolding>true</EnableCOMDATFolding> |
| | | <OptimizeReferences>true</OptimizeReferences> |
| | | </Link> |
| | | <Midl> |
| | | <MkTypLibCompatible>false</MkTypLibCompatible> |
| | | <ValidateAllParameters>true</ValidateAllParameters> |
| | | <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | </Midl> |
| | | <ResourceCompile> |
| | | <Culture>0x0804</Culture> |
| | | <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
| | | </ResourceCompile> |
| | | </ItemDefinitionGroup> |
| | | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> |
| | | <ClCompile> |
| | | <WarningLevel>Level3</WarningLevel> |
| | | <PrecompiledHeader>Use</PrecompiledHeader> |
| | | <Optimization>MaxSpeed</Optimization> |
| | | <FunctionLevelLinking>true</FunctionLevelLinking> |
| | | <IntrinsicFunctions>true</IntrinsicFunctions> |
| | | <PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <SDLCheck>true</SDLCheck> |
| | | </ClCompile> |
| | | <Link> |
| | | <SubSystem>Windows</SubSystem> |
| | | <GenerateDebugInformation>true</GenerateDebugInformation> |
| | | <EnableCOMDATFolding>true</EnableCOMDATFolding> |
| | | <OptimizeReferences>true</OptimizeReferences> |
| | | </Link> |
| | | <Midl> |
| | | <MkTypLibCompatible>false</MkTypLibCompatible> |
| | | <ValidateAllParameters>true</ValidateAllParameters> |
| | | <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | </Midl> |
| | | <ResourceCompile> |
| | | <Culture>0x0804</Culture> |
| | | <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> |
| | | <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> |
| | | </ResourceCompile> |
| | | </ItemDefinitionGroup> |
| | | <ItemGroup> |
| | | <Text Include="ReadMe.txt" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClInclude Include="Resource.h" /> |
| | | <ClInclude Include="Servo.h" /> |
| | | <ClInclude Include="ServoDlg.h" /> |
| | | <ClInclude Include="ServoGraph.h" /> |
| | | <ClInclude Include="stdafx.h" /> |
| | | <ClInclude Include="targetver.h" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClCompile Include="Servo.cpp" /> |
| | | <ClCompile Include="ServoDlg.cpp" /> |
| | | <ClCompile Include="ServoGraph.cpp" /> |
| | | <ClCompile Include="stdafx.cpp"> |
| | | <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> |
| | | <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> |
| | | <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> |
| | | <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> |
| | | </ClCompile> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ResourceCompile Include="Servo.rc" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <None Include="res\Servo.rc2" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <Image Include="res\Servo.ico" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <Manifest Include="res\application.exe.manifest" /> |
| | | </ItemGroup> |
| | | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> |
| | | <ImportGroup Label="ExtensionTargets"> |
| | | </ImportGroup> |
| | | <ProjectExtensions> |
| | | <VisualStudio> |
| | | <UserProperties RESOURCE_FILE="Servo.rc" /> |
| | | </VisualStudio> |
| | | </ProjectExtensions> |
| | | </Project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
| | | <ItemGroup> |
| | | <Filter Include="æºæä»¶"> |
| | | <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> |
| | | <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> |
| | | </Filter> |
| | | <Filter Include="头æä»¶"> |
| | | <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> |
| | | <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions> |
| | | </Filter> |
| | | <Filter Include="èµæºæä»¶"> |
| | | <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> |
| | | <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> |
| | | </Filter> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <Text Include="ReadMe.txt" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClInclude Include="Servo.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="ServoDlg.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="stdafx.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="targetver.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="Resource.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="ServoGraph.h"> |
| | | <Filter>头æä»¶</Filter> |
| | | </ClInclude> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClCompile Include="Servo.cpp"> |
| | | <Filter>æºæä»¶</Filter> |
| | | </ClCompile> |
| | | <ClCompile Include="ServoDlg.cpp"> |
| | | <Filter>æºæä»¶</Filter> |
| | | </ClCompile> |
| | | <ClCompile Include="stdafx.cpp"> |
| | | <Filter>æºæä»¶</Filter> |
| | | </ClCompile> |
| | | <ClCompile Include="ServoGraph.cpp"> |
| | | <Filter>æºæä»¶</Filter> |
| | | </ClCompile> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ResourceCompile Include="Servo.rc"> |
| | | <Filter>èµæºæä»¶</Filter> |
| | | </ResourceCompile> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <None Include="res\Servo.rc2"> |
| | | <Filter>èµæºæä»¶</Filter> |
| | | </None> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <Image Include="res\Servo.ico"> |
| | | <Filter>èµæºæä»¶</Filter> |
| | | </Image> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <Manifest Include="res\application.exe.manifest" /> |
| | | </ItemGroup> |
| | | </Project> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | |
| | | // ServoDlg.cpp : å®ç°æä»¶ |
| | | // |
| | | |
| | | #include "stdafx.h" |
| | | #include "Servo.h" |
| | | #include "ServoDlg.h" |
| | | #include "afxdialogex.h" |
| | | |
| | | #ifdef _DEBUG |
| | | #define new DEBUG_NEW |
| | | #endif |
| | | |
| | | |
| | | #define INDICATE_BONDER1 1 |
| | | #define INDICATE_BONDER2 2 |
| | | #define INDICATE_FLIPER 3 |
| | | #define INDICATE_ALIGNER 4 |
| | | #define INDICATE_LPORT4 5 |
| | | #define INDICATE_LPORT3 6 |
| | | #define INDICATE_LPORT2 7 |
| | | #define INDICATE_LPORT1 8 |
| | | #define INDICATE_ROBOT_ARM1 9 |
| | | #define INDICATE_ROBOT_ARM2 10 |
| | | #define INDICATE_VACUUM_BAKE 11 |
| | | #define INDICATE_BAKE_COOLING 12 |
| | | #define INDICATE_MEASUREMENT 13 |
| | | |
| | | |
| | | // ç¨äºåºç¨ç¨åºâå
³äºâèå项ç CAboutDlg å¯¹è¯æ¡ |
| | | |
| | | class CAboutDlg : public CDialogEx |
| | | { |
| | | public: |
| | | CAboutDlg(); |
| | | |
| | | // å¯¹è¯æ¡æ°æ® |
| | | #ifdef AFX_DESIGN_TIME |
| | | enum { IDD = IDD_ABOUTBOX }; |
| | | #endif |
| | | |
| | | protected: |
| | | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV æ¯æ |
| | | |
| | | // å®ç° |
| | | protected: |
| | | DECLARE_MESSAGE_MAP() |
| | | }; |
| | | |
| | | CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX) |
| | | { |
| | | } |
| | | |
| | | void CAboutDlg::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | } |
| | | |
| | | BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | // CServoDlg å¯¹è¯æ¡ |
| | | |
| | | |
| | | |
| | | CServoDlg::CServoDlg(CWnd* pParent /*=NULL*/) |
| | | : CDialogEx(IDD_SERVO_DIALOG, pParent) |
| | | { |
| | | m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); |
| | | m_crBkgnd = RGB(255, 255, 255); |
| | | m_hbrBkgnd = nullptr; |
| | | } |
| | | |
| | | void CServoDlg::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | } |
| | | |
| | | BEGIN_MESSAGE_MAP(CServoDlg, CDialogEx) |
| | | ON_WM_SYSCOMMAND() |
| | | ON_WM_PAINT() |
| | | ON_WM_QUERYDRAGICON() |
| | | ON_BN_CLICKED(IDOK, &CServoDlg::OnBnClickedOk) |
| | | ON_BN_CLICKED(IDCANCEL, &CServoDlg::OnBnClickedCancel) |
| | | ON_WM_CTLCOLOR() |
| | | ON_WM_DESTROY() |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | // CServoDlg æ¶æ¯å¤çç¨åº |
| | | |
| | | BOOL CServoDlg::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | |
| | | // å°âå
³äº...âèå项添å å°ç³»ç»èåä¸ã |
| | | |
| | | // IDM_ABOUTBOX å¿
é¡»å¨ç³»ç»å½ä»¤èå´å
ã |
| | | ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); |
| | | ASSERT(IDM_ABOUTBOX < 0xF000); |
| | | |
| | | CMenu* pSysMenu = GetSystemMenu(FALSE); |
| | | if (pSysMenu != NULL) |
| | | { |
| | | BOOL bNameValid; |
| | | CString strAboutMenu; |
| | | bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); |
| | | ASSERT(bNameValid); |
| | | if (!strAboutMenu.IsEmpty()) |
| | | { |
| | | pSysMenu->AppendMenu(MF_SEPARATOR); |
| | | pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); |
| | | } |
| | | } |
| | | |
| | | // 设置æ¤å¯¹è¯æ¡ç徿 ã å½åºç¨ç¨åºä¸»çªå£ä¸æ¯å¯¹è¯æ¡æ¶ï¼æ¡æ¶å°èªå¨ |
| | | // æ§è¡æ¤æä½ |
| | | SetIcon(m_hIcon, TRUE); // è®¾ç½®å¤§å¾æ |
| | | SetIcon(m_hIcon, FALSE); // 设置å°å¾æ |
| | | |
| | | |
| | | // ͼʾ |
| | | m_pGraph = CServoGraph::Hook(GetDlgItem(IDC_SERVO_GRAPH1)->GetSafeHwnd()); |
| | | CString strPath; |
| | | strPath.Format(_T("%s\\res\\Servo001.bmp"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); |
| | | m_pGraph->AddImage(1, (LPTSTR)(LPCTSTR)strPath, 0, 0); |
| | | |
| | | |
| | | // æ·»å æç¤ºå¨ |
| | | // Bonder |
| | | m_pGraph->AddIndicateBox(INDICATE_BONDER1, 220, 172, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_BONDER1, "10", "Bonder 1"); |
| | | m_pGraph->AddIndicateBox(INDICATE_BONDER2, 220, 516, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_BONDER2, "11", "Bonder 2"); |
| | | |
| | | |
| | | // 翻转 |
| | | m_pGraph->AddIndicateBox(INDICATE_FLIPER, 338, 172, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_FLIPER, "8", "Fliper"); |
| | | |
| | | |
| | | // å¯¹ä½ |
| | | m_pGraph->AddIndicateBox(INDICATE_ALIGNER, 428, 172, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_ALIGNER, "7", "Aligner"); |
| | | |
| | | |
| | | // Load port 4 |
| | | m_pGraph->AddIndicateBox(INDICATE_LPORT4, 518, 172, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_LPORT4, "4", "LPort4"); |
| | | |
| | | |
| | | // Load port 3 |
| | | m_pGraph->AddIndicateBox(INDICATE_LPORT3, 606, 172, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_LPORT3, "3", "LPort3"); |
| | | |
| | | |
| | | // Load port 2 |
| | | m_pGraph->AddIndicateBox(INDICATE_LPORT2, 690, 172, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_LPORT2, "2", "LPort2"); |
| | | |
| | | |
| | | // Load port 1 |
| | | m_pGraph->AddIndicateBox(INDICATE_LPORT1, 774, 172, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_LPORT1, "1", "LPort1"); |
| | | |
| | | |
| | | // Robot |
| | | m_pGraph->AddIndicateBox(INDICATE_ROBOT_ARM1, 620, 294, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_ROBOT_ARM1, "5", "Robot"); |
| | | m_pGraph->AddIndicateBox(INDICATE_ROBOT_ARM2, 673, 294, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_ROBOT_ARM2, "6", "Robot"); |
| | | |
| | | |
| | | // Vacuum bake |
| | | m_pGraph->AddIndicateBox(INDICATE_VACUUM_BAKE, 396, 516, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_VACUUM_BAKE, "9", "Vacuum bake"); |
| | | |
| | | |
| | | // Bake cooling |
| | | m_pGraph->AddIndicateBox(INDICATE_BAKE_COOLING, 566, 516, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_BAKE_COOLING, "12", "Bake cooling"); |
| | | |
| | | |
| | | // Bake cooling |
| | | m_pGraph->AddIndicateBox(INDICATE_MEASUREMENT, 736, 516, 48, RGB(22, 22, 22), |
| | | RGB(255, 127, 39), RGB(0, 176, 80)); |
| | | m_pGraph->SetBoxText(INDICATE_MEASUREMENT, "13", "Measurement"); |
| | | |
| | | |
| | | return TRUE; // é¤éå°ç¦ç¹è®¾ç½®å°æ§ä»¶ï¼å¦åè¿å TRUE |
| | | } |
| | | |
| | | void CServoDlg::OnSysCommand(UINT nID, LPARAM lParam) |
| | | { |
| | | if ((nID & 0xFFF0) == IDM_ABOUTBOX) |
| | | { |
| | | CAboutDlg dlgAbout; |
| | | dlgAbout.DoModal(); |
| | | } |
| | | else |
| | | { |
| | | CDialogEx::OnSysCommand(nID, lParam); |
| | | } |
| | | } |
| | | |
| | | // 妿åå¯¹è¯æ¡æ·»å æå°åæé®ï¼åéè¦ä¸é¢ç代ç |
| | | // æ¥ç»å¶è¯¥å¾æ ã 对äºä½¿ç¨ææ¡£/è§å¾æ¨¡åç MFC åºç¨ç¨åºï¼ |
| | | // è¿å°ç±æ¡æ¶èªå¨å®æã |
| | | |
| | | void CServoDlg::OnPaint() |
| | | { |
| | | if (IsIconic()) |
| | | { |
| | | CPaintDC dc(this); // ç¨äºç»å¶ç设å¤ä¸ä¸æ |
| | | |
| | | SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); |
| | | |
| | | // ä½¿å¾æ å¨å·¥ä½åºç©å½¢ä¸å±
ä¸ |
| | | 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; |
| | | |
| | | // ç»å¶å¾æ |
| | | dc.DrawIcon(x, y, m_hIcon); |
| | | } |
| | | else |
| | | { |
| | | CDialogEx::OnPaint(); |
| | | } |
| | | } |
| | | |
| | | //å½ç¨æ·æå¨æå°åçªå£æ¶ç³»ç»è°ç¨æ¤å½æ°åå¾å
æ |
| | | //æ¾ç¤ºã |
| | | HCURSOR CServoDlg::OnQueryDragIcon() |
| | | { |
| | | return static_cast<HCURSOR>(m_hIcon); |
| | | } |
| | | |
| | | |
| | | |
| | | void CServoDlg::OnBnClickedOk() |
| | | { |
| | | // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç |
| | | CDialogEx::OnOK(); |
| | | } |
| | | |
| | | |
| | | void CServoDlg::OnBnClickedCancel() |
| | | { |
| | | // TODO: 卿¤æ·»å æ§ä»¶éç¥å¤çç¨åºä»£ç |
| | | CDialogEx::OnCancel(); |
| | | } |
| | | |
| | | HBRUSH CServoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) |
| | | { |
| | | HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor); |
| | | |
| | | if (nCtlColor == CTLCOLOR_STATIC) { |
| | | pDC->SetBkColor(m_crBkgnd); |
| | | pDC->SetTextColor(RGB(0, 0, 0)); |
| | | } |
| | | |
| | | if (m_hbrBkgnd == nullptr) { |
| | | m_hbrBkgnd = CreateSolidBrush(m_crBkgnd); |
| | | } |
| | | |
| | | return m_hbrBkgnd; |
| | | } |
| | | |
| | | void CServoDlg::OnDestroy() |
| | | { |
| | | CDialogEx::OnDestroy(); |
| | | |
| | | if (m_hbrBkgnd != nullptr) { |
| | | ::DeleteObject(m_hbrBkgnd); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | |
| | | // ServoDlg.h : 头æä»¶ |
| | | // |
| | | |
| | | #pragma once |
| | | #include "ServoGraph.h" |
| | | |
| | | |
| | | // CServoDlg å¯¹è¯æ¡ |
| | | class CServoDlg : public CDialogEx |
| | | { |
| | | // æé |
| | | public: |
| | | CServoDlg(CWnd* pParent = NULL); // æ åæé 彿° |
| | | |
| | | // å¯¹è¯æ¡æ°æ® |
| | | #ifdef AFX_DESIGN_TIME |
| | | enum { IDD = IDD_SERVO_DIALOG }; |
| | | #endif |
| | | |
| | | protected: |
| | | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV æ¯æ |
| | | |
| | | |
| | | // å®ç° |
| | | protected: |
| | | HICON m_hIcon; |
| | | CServoGraph* m_pGraph; |
| | | COLORREF m_crBkgnd; |
| | | HBRUSH m_hbrBkgnd; |
| | | |
| | | // çæçæ¶æ¯æ å°å½æ° |
| | | virtual BOOL OnInitDialog(); |
| | | afx_msg void OnSysCommand(UINT nID, LPARAM lParam); |
| | | afx_msg void OnPaint(); |
| | | afx_msg HCURSOR OnQueryDragIcon(); |
| | | DECLARE_MESSAGE_MAP() |
| | | public: |
| | | afx_msg void OnBnClickedOk(); |
| | | afx_msg void OnBnClickedCancel(); |
| | | afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); |
| | | afx_msg void OnDestroy(); |
| | | }; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // ServoGraph.cpp: implementation of the CServoGraph class. |
| | | // |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | #include "stdafx.h" |
| | | #include "ServoGraph.h" |
| | | |
| | | #ifdef _DEBUG |
| | | #undef THIS_FILE |
| | | static char THIS_FILE[]=__FILE__; |
| | | #define new DEBUG_NEW |
| | | #endif |
| | | |
| | | ////////////////////////////////////////////////////////////////////// |
| | | // Construction/Destruction |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | CServoGraph::CServoGraph() |
| | | { |
| | | m_hWnd = NULL; |
| | | m_crBkgnd = RGB(255,255,255); |
| | | m_pHighItem = nullptr; |
| | | m_hWndTooltip = nullptr; |
| | | } |
| | | |
| | | CServoGraph::~CServoGraph() |
| | | { |
| | | for (auto& item : m_images) { |
| | | if (item.hBitmap != nullptr) { |
| | | ::DeleteObject(item.hBitmap); |
| | | } |
| | | } |
| | | } |
| | | |
| | | BOOL CServoGraph::RegisterWndClass() |
| | | { |
| | | WNDCLASS wc; |
| | | wc.lpszClassName = BYSERVOGRAPH_CLASS; |
| | | wc.hInstance = AfxGetInstanceHandle(); |
| | | wc.lpfnWndProc = WindowProc; |
| | | wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); |
| | | wc.hIcon = 0; |
| | | wc.lpszMenuName = NULL; |
| | | wc.hbrBackground = NULL; |
| | | wc.style = CS_GLOBALCLASS|CS_DBLCLKS; |
| | | wc.cbClsExtra = 0; |
| | | wc.cbWndExtra = 0; |
| | | |
| | | // 注åèªå®ä¹ç±» |
| | | return (::RegisterClass(&wc) != 0); |
| | | } |
| | | |
| | | CServoGraph* CServoGraph::Hook(HWND hWnd) |
| | | { |
| | | CServoGraph* pServoGraph = (CServoGraph*)GetProp(hWnd, BYSTAG_SERVOGRAPH); |
| | | if(pServoGraph == NULL) |
| | | { |
| | | pServoGraph = new CServoGraph; |
| | | pServoGraph->m_hWnd = hWnd; |
| | | |
| | | SetProp(hWnd, BYSTAG_SERVOGRAPH, (HANDLE)pServoGraph); |
| | | } |
| | | |
| | | return pServoGraph; |
| | | } |
| | | |
| | | void CServoGraph::Release() |
| | | { |
| | | if (m_hWndTooltip != NULL) { |
| | | ::DestroyWindow(m_hWndTooltip); |
| | | m_hWndTooltip = NULL; |
| | | } |
| | | |
| | | // delete |
| | | delete this; |
| | | } |
| | | |
| | | void CServoGraph::Notify(int nCode, int dwData, int dwData1/* = 0*/, int dwData2/* = 0*/) |
| | | { |
| | | HWND hParent; |
| | | hParent = GetParent(m_hWnd); |
| | | if(hParent != NULL) { |
| | | BYSERVOGRAPH_NMHDR iii_nmhdr; |
| | | iii_nmhdr.nmhdr.hwndFrom = m_hWnd; |
| | | iii_nmhdr.nmhdr.idFrom = GetWindowLong(m_hWnd, GWL_ID); |
| | | iii_nmhdr.nmhdr.code = nCode; |
| | | iii_nmhdr.dwData = dwData; |
| | | iii_nmhdr.dwData1 = dwData1; |
| | | iii_nmhdr.dwData2 = dwData2; |
| | | SendMessage(hParent, WM_NOTIFY, (WPARAM)iii_nmhdr.nmhdr.idFrom, (LPARAM)&iii_nmhdr); |
| | | } |
| | | } |
| | | |
| | | |
| | | //////////////////////////////// |
| | | // æ¦æªçªå£æ¶æ¯å½æ° |
| | | LRESULT CALLBACK CServoGraph::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
| | | { |
| | | CServoGraph* pServoGraph = (CServoGraph *)GetProp(hWnd, BYSTAG_SERVOGRAPH); |
| | | if(pServoGraph == NULL && uMsg != WM_NCCREATE) |
| | | { |
| | | return ::DefWindowProc(hWnd, uMsg, wParam, lParam); |
| | | } |
| | | |
| | | |
| | | // 妿Hookåååºæ¶æ¯ |
| | | ASSERT(hWnd); |
| | | switch(uMsg) |
| | | { |
| | | case WM_NCCREATE: |
| | | return OnNcCreate(hWnd, wParam, lParam); |
| | | |
| | | case WM_DESTROY: |
| | | return pServoGraph->OnDestroy(wParam, lParam); |
| | | |
| | | case WM_PAINT: |
| | | return pServoGraph->OnPaint(wParam, lParam); |
| | | |
| | | case WM_TIMER: |
| | | return pServoGraph->OnTimer(wParam, lParam); |
| | | |
| | | case WM_MOUSEMOVE: |
| | | return pServoGraph->OnMouseMove(wParam, lParam); |
| | | |
| | | case WM_LBUTTONDOWN: |
| | | return pServoGraph->OnLButtonDown(wParam, lParam); |
| | | |
| | | case WM_GETDLGCODE: |
| | | return DLGC_WANTALLKEYS; |
| | | |
| | | default: |
| | | break; |
| | | } |
| | | |
| | | return ::DefWindowProc(hWnd, uMsg, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_NCCREATE |
| | | // çªå£å建åçåå§åå·¥ä½ |
| | | LRESULT CServoGraph::OnNcCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) |
| | | { |
| | | CServoGraph* pServoGraph = (CServoGraph *)GetProp(hWnd, BYSTAG_SERVOGRAPH); |
| | | ASSERT(pServoGraph == NULL); |
| | | |
| | | Hook(hWnd); |
| | | return ::DefWindowProc(hWnd, WM_NCCREATE, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_DESTROY |
| | | LRESULT CServoGraph::OnDestroy(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | Release(); |
| | | return ::DefWindowProc(m_hWnd, WM_DESTROY, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_TIMER |
| | | LRESULT CServoGraph::OnTimer(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | if (wParam == 1) { |
| | | POINT pt; |
| | | GetCursorPos(&pt); |
| | | ::ScreenToClient(m_hWnd, &pt); |
| | | |
| | | void* pLastHighItem = m_pHighItem; |
| | | int nHitCode = HitTest(pt, m_pHighItem); |
| | | if (m_pHighItem != pLastHighItem) { |
| | | ::InvalidateRect(m_hWnd, NULL, TRUE); |
| | | } |
| | | |
| | | if (m_pHighItem == nullptr) { |
| | | ::KillTimer(m_hWnd, 1); |
| | | } |
| | | } |
| | | |
| | | return ::DefWindowProc(m_hWnd, WM_TIMER, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_MOUSEMOVE |
| | | LRESULT CServoGraph::OnMouseMove(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | POINT pt; |
| | | pt.x = LOWORD(lParam); |
| | | pt.y = HIWORD(lParam); |
| | | |
| | | void* pLastHighItem = m_pHighItem; |
| | | int nHitCode = HitTest(pt, m_pHighItem); |
| | | if (m_pHighItem != pLastHighItem) { |
| | | ::InvalidateRect(m_hWnd, NULL, TRUE); |
| | | } |
| | | if (m_pHighItem != NULL) { |
| | | ::KillTimer(m_hWnd, 1); |
| | | ::SetTimer(m_hWnd, 1, 100, NULL); |
| | | } |
| | | |
| | | |
| | | return ::DefWindowProc(m_hWnd, WM_MOUSEMOVE, wParam, lParam); |
| | | } |
| | | |
| | | /* |
| | | * WM_LBUTTONDOWN |
| | | * é¼ æ å·¦é®æä¸ |
| | | */ |
| | | LRESULT CServoGraph::OnLButtonDown(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | POINT pt, ptNew; |
| | | pt.x = LOWORD(lParam); |
| | | pt.y = HIWORD(lParam); |
| | | |
| | | BOOL bButtonUp = FALSE; |
| | | int nClickIndex = -1; |
| | | void* pPressItem = nullptr; |
| | | void* pTempItem = nullptr; |
| | | HitTest(pt, pPressItem); |
| | | |
| | | |
| | | // ææé¼ æ æ¶æ¯ï¼æ£æµæ¯å¦æå¨ |
| | | if (pPressItem != NULL) { |
| | | ::KillTimer(m_hWnd, 1); |
| | | if (::GetCapture() == NULL) { |
| | | SetCapture(m_hWnd); |
| | | ASSERT(m_hWnd == GetCapture()); |
| | | AfxLockTempMaps(); |
| | | for (;;) |
| | | { |
| | | MSG msg; |
| | | VERIFY(::GetMessage(&msg, NULL, 0, 0)); |
| | | |
| | | if (GetCapture() != m_hWnd) break; |
| | | |
| | | switch (msg.message) |
| | | { |
| | | case WM_MOUSEMOVE: |
| | | break; |
| | | |
| | | case WM_LBUTTONUP: |
| | | ptNew = msg.pt; |
| | | ::ScreenToClient(m_hWnd, &ptNew); |
| | | HitTest(ptNew, pTempItem); |
| | | if (pPressItem == pTempItem) { |
| | | bButtonUp = TRUE; |
| | | } |
| | | goto ExitLoop; |
| | | |
| | | case WM_KEYDOWN: |
| | | if (msg.wParam == VK_ESCAPE) { |
| | | goto ExitLoop; |
| | | } |
| | | break; |
| | | |
| | | default: |
| | | DispatchMessage(&msg); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | ExitLoop: |
| | | ReleaseCapture(); |
| | | ::InvalidateRect(m_hWnd, NULL, TRUE); |
| | | |
| | | if (bButtonUp) { |
| | | Notify((int)BYSERVOGRAPH_ITEM_CLICKED, ((INDICATEBOX*)pPressItem)->id); |
| | | } |
| | | |
| | | AfxUnlockTempMaps(FALSE); |
| | | } |
| | | } |
| | | |
| | | |
| | | return ::DefWindowProc(m_hWnd, WM_LBUTTONDOWN, wParam, lParam); |
| | | } |
| | | |
| | | /////////////////////////////// |
| | | // WM_PAINT |
| | | LRESULT CServoGraph::OnPaint(WPARAM wParam, LPARAM lParam) |
| | | { |
| | | HDC hDC, hMemDC; |
| | | HBITMAP hBitmap; |
| | | RECT rcClient; |
| | | CString strText; |
| | | HFONT hFont; |
| | | HBRUSH hBrushBK; |
| | | |
| | | |
| | | // BeginPaint |
| | | PAINTSTRUCT ps; |
| | | hDC = BeginPaint(m_hWnd, &ps); |
| | | GetClientRect(m_hWnd, &rcClient); |
| | | |
| | | hMemDC = ::CreateCompatibleDC(hDC); |
| | | hBitmap = ::CreateCompatibleBitmap(hDC, rcClient.right-rcClient.left, |
| | | rcClient.bottom-rcClient.top); |
| | | ::SelectObject(hMemDC, hBitmap); |
| | | |
| | | hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); |
| | | ::SelectObject(hMemDC, hFont); |
| | | |
| | | |
| | | // èæ¯é¢è² |
| | | hBrushBK = CreateSolidBrush( m_crBkgnd ); |
| | | ::FillRect(hMemDC, &rcClient, hBrushBK); |
| | | DeleteObject(hBrushBK); |
| | | |
| | | |
| | | // ç»IMAGE |
| | | HDC hDCTemp = ::CreateCompatibleDC(hMemDC); |
| | | for (auto& item : m_images) { |
| | | // è½½å
¥BMP |
| | | if (item.hBitmap == nullptr) { |
| | | item.hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), |
| | | item.szPath, IMAGE_BITMAP, 0, 0, |
| | | LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE); |
| | | if (item.hBitmap != nullptr) { |
| | | BITMAP bitmap; |
| | | ::GetObject(item.hBitmap, sizeof(BITMAP), &bitmap); |
| | | item.bmWidth = bitmap.bmWidth; |
| | | item.bmHeight = bitmap.bmHeight; |
| | | } |
| | | |
| | | } |
| | | |
| | | if (item.hBitmap != nullptr) { |
| | | ::SelectObject(hDCTemp, item.hBitmap); |
| | | ::BitBlt(hMemDC, item.x, item.y, item.bmWidth, item.bmHeight, |
| | | hDCTemp, 0, 0, SRCCOPY); |
| | | } |
| | | } |
| | | ::DeleteDC(hDCTemp); |
| | | |
| | | |
| | | // ç»èæ¯æç¤º |
| | | for (auto& item : m_indicateBkgnds) { |
| | | HBRUSH hbrBkgnd = CreateSolidBrush(item.backgroundColor); |
| | | ::FillRect(hMemDC, &item.rect, hbrBkgnd); |
| | | ::DeleteObject(hbrBkgnd); |
| | | } |
| | | |
| | | |
| | | // ç»æç¤ºæ¡ |
| | | ::SetBkMode(hMemDC, TRANSPARENT); |
| | | for (auto& item : m_indicateBoxs) { |
| | | RECT rcItem; |
| | | rcItem.left = item.x - item.box1Width / 2; |
| | | rcItem.top = item.y - item.box1Width / 2; |
| | | rcItem.right = rcItem.left + item.box1Width; |
| | | rcItem.bottom = rcItem.top + item.box1Width; |
| | | HBRUSH hbrFrame = CreateSolidBrush(m_pHighItem == &item ? item.box1FrameColor[1] : item.box1FrameColor[0]); |
| | | HBRUSH hbrBkgnd = CreateSolidBrush(item.box1BackgroundColor); |
| | | ::FillRect(hMemDC, &rcItem, hbrBkgnd); |
| | | ::FrameRect(hMemDC, &rcItem, hbrFrame); |
| | | ::DeleteObject(hbrBkgnd); |
| | | ::DeleteObject(hbrFrame); |
| | | |
| | | if (item.bBox2Visible) { |
| | | rcItem.left = item.x - item.box2Width / 2; |
| | | rcItem.top = item.y - item.box2Width / 2; |
| | | rcItem.right = rcItem.left + item.box2Width; |
| | | rcItem.bottom = rcItem.top + item.box2Width; |
| | | hbrFrame = CreateSolidBrush(item.box2FrameColor); |
| | | hbrBkgnd = CreateSolidBrush(item.box2BackgroundColor); |
| | | ::FillRect(hMemDC, &rcItem, hbrBkgnd); |
| | | ::FrameRect(hMemDC, &rcItem, hbrFrame); |
| | | ::DeleteObject(hbrBkgnd); |
| | | ::DeleteObject(hbrFrame); |
| | | } |
| | | |
| | | // text |
| | | ::DrawText(hMemDC, item.szText, strlen(item.szText), |
| | | &rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS); |
| | | } |
| | | |
| | | |
| | | // EndPaint |
| | | ::BitBlt(hDC, 0, 0, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, |
| | | hMemDC, 0, 0, SRCCOPY); |
| | | EndPaint(m_hWnd, &ps); |
| | | ::DeleteObject(hBitmap); |
| | | ::DeleteDC(hMemDC); |
| | | |
| | | |
| | | return 1; |
| | | } |
| | | |
| | | void CServoGraph::SetBkgndColor(COLORREF cr) |
| | | { |
| | | m_crBkgnd = cr; |
| | | } |
| | | |
| | | void CServoGraph::SetResDir(CString strDir) |
| | | { |
| | | m_strResDir = strDir; |
| | | } |
| | | |
| | | void CServoGraph::AddImage(int id, char* pszPath, int x, int y) |
| | | { |
| | | if (GetImage(id) != nullptr) return; |
| | | |
| | | IMAGE image; |
| | | memset(&image, 0, sizeof(IMAGE)); |
| | | image.id = id; |
| | | strcpy_s(image.szPath, MAX_PATH, pszPath); |
| | | image.x = x; |
| | | image.y = y; |
| | | m_images.push_back(image); |
| | | } |
| | | |
| | | CServoGraph::IMAGE* CServoGraph::GetImage(int id) |
| | | { |
| | | for (auto& item : m_images) { |
| | | if (item.id == id) return &item; |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | | |
| | | void CServoGraph::AddIndicateBox(int id, int x, int y, int width) |
| | | { |
| | | INDICATEBOX ib; |
| | | ib.id = id; |
| | | ib.x = x; |
| | | ib.y = y; |
| | | ib.box1Width = width; |
| | | ib.box1FrameColor[0] = RGB(22, 22, 22); |
| | | ib.box1FrameColor[1] = RGB(255, 127, 39); |
| | | ib.box1BackgroundColor = RGB(245, 245, 245); |
| | | ib.box2Width = width - 10; |
| | | m_indicateBoxs.push_back(ib); |
| | | } |
| | | |
| | | void CServoGraph::AddIndicateBox(int id, int x, int y, int width, |
| | | COLORREF crFrame1, COLORREF crFrame2, COLORREF crBackground) |
| | | { |
| | | INDICATEBOX ib; |
| | | ib.id = id; |
| | | ib.x = x; |
| | | ib.y = y; |
| | | ib.box1Width = width; |
| | | ib.box1FrameColor[0] = crFrame1; |
| | | ib.box1FrameColor[1] = crFrame2; |
| | | ib.box1BackgroundColor = crBackground; |
| | | ib.box2Width = width - 10; |
| | | m_indicateBoxs.push_back(ib); |
| | | } |
| | | |
| | | void CServoGraph::AddIndicateBoxContext(int id, void* pContext) |
| | | { |
| | | INDICATEBOX* pib = GetIndicateBox(id); |
| | | if (pib != nullptr) { |
| | | pib->m_contexts.push_back(pContext); |
| | | } |
| | | } |
| | | |
| | | BOOL CServoGraph::RemoveIndicateBoxContext(int id, void* pContext) |
| | | { |
| | | INDICATEBOX* pib = GetIndicateBox(id); |
| | | if (pib != nullptr) { |
| | | for (auto iter = pib->m_contexts.begin(); iter != pib->m_contexts.end(); iter++) { |
| | | if ((*iter) == pContext) { |
| | | pib->m_contexts.erase(iter); |
| | | return TRUE; |
| | | } |
| | | } |
| | | } |
| | | |
| | | return FALSE; |
| | | } |
| | | |
| | | BOOL CServoGraph::RemoveIndicateBoxAllContext(int id) |
| | | { |
| | | INDICATEBOX* pib = GetIndicateBox(id); |
| | | if (pib != nullptr) { |
| | | pib->m_contexts.clear(); |
| | | return TRUE; |
| | | } |
| | | |
| | | return FALSE; |
| | | } |
| | | |
| | | const std::vector<void*>& CServoGraph::GetIndicateBoxContexts(int id) |
| | | { |
| | | static std::vector<void*> empty; |
| | | INDICATEBOX* pib = GetIndicateBox(id); |
| | | if (pib == nullptr) return empty; |
| | | return pib->m_contexts; |
| | | } |
| | | |
| | | bool CServoGraph::IsIndicateBoxContextsEmpty(int id) |
| | | { |
| | | INDICATEBOX* pib = GetIndicateBox(id); |
| | | if (pib != nullptr) { |
| | | return pib->m_contexts.empty(); |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | void CServoGraph::ShowIndicateBoxInterior(int id, COLORREF color) |
| | | { |
| | | INDICATEBOX* pib = GetIndicateBox(id); |
| | | if (pib != nullptr) { |
| | | pib->bBox2Visible = true; |
| | | pib->box2FrameColor = RGB(128, 128, 128); |
| | | pib->box2BackgroundColor = color; |
| | | InvalidateRect(m_hWnd, NULL, TRUE); |
| | | } |
| | | } |
| | | |
| | | void CServoGraph::HideIndicateBoxInterior(int id) |
| | | { |
| | | INDICATEBOX* pib = GetIndicateBox(id); |
| | | if (pib != nullptr) { |
| | | pib->bBox2Visible = false; |
| | | InvalidateRect(m_hWnd, NULL, TRUE); |
| | | } |
| | | } |
| | | |
| | | CServoGraph::INDICATEBOX* CServoGraph::GetIndicateBox(int id) |
| | | { |
| | | for (auto& item : m_indicateBoxs) { |
| | | if (item.id == id) return &item; |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | | |
| | | void CServoGraph::AddIndicateBkgnd(int id, int left, int top, int width, int height, COLORREF color) |
| | | { |
| | | INDICATEBKGND ibk; |
| | | ibk.id = id; |
| | | ibk.rect.left = left; |
| | | ibk.rect.top = top; |
| | | ibk.rect.right = ibk.rect.left + width; |
| | | ibk.rect.bottom = ibk.rect.top + height;; |
| | | ibk.backgroundColor = color; |
| | | m_indicateBkgnds.push_back(ibk); |
| | | } |
| | | |
| | | void CServoGraph::SetIndicateBkgndColor(int id, COLORREF color) |
| | | { |
| | | INDICATEBKGND* pibk = GetIndicateBkgnd(id); |
| | | if (pibk != nullptr) { |
| | | pibk->backgroundColor = color; |
| | | InvalidateRect(m_hWnd, nullptr, TRUE); |
| | | } |
| | | } |
| | | |
| | | CServoGraph::INDICATEBKGND* CServoGraph::GetIndicateBkgnd(int id) |
| | | { |
| | | for (auto& item : m_indicateBkgnds) { |
| | | if (item.id == id) return &item; |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | | |
| | | /* |
| | | * æ£æµåæ ç¹æå¨ç项 |
| | | * è¿å, TYGTLITEM |
| | | */ |
| | | int CServoGraph::HitTest(POINT pt, OUT void*& pItem) |
| | | { |
| | | // æ£æµæ¯å¦å¨æä¸ªå项 |
| | | int nRet = HMGRAPH_HT_NOWHERE; |
| | | pItem = NULL; |
| | | RECT rcItem; |
| | | for (int i = 0; i < m_indicateBoxs.size(); i++) { |
| | | auto& item = m_indicateBoxs.at(i); |
| | | GetIndicateBoxRect(&item, &rcItem); |
| | | if (::PtInRect(&rcItem, pt)) { |
| | | pItem = &item; |
| | | nRet = HMGRAPH_HT_ITEM; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | void CServoGraph::GetIndicateBoxRect(INDICATEBOX* pBox, LPRECT lprcBox) |
| | | { |
| | | lprcBox->left = pBox->x - pBox->box1Width / 2; |
| | | lprcBox->top = pBox->y - pBox->box1Width / 2; |
| | | lprcBox->right = lprcBox->left + pBox->box1Width; |
| | | lprcBox->bottom = lprcBox->top + pBox->box1Width; |
| | | } |
| | | |
| | | BOOL CServoGraph::GetIndicateBoxRect(int id, LPRECT lprcBox) |
| | | { |
| | | INDICATEBOX* pBox = GetIndicateBox(id); |
| | | if (pBox == nullptr) return FALSE; |
| | | GetIndicateBoxRect(pBox, lprcBox); |
| | | return TRUE; |
| | | } |
| | | |
| | | HWND CServoGraph::GetSafeWnd() |
| | | { |
| | | return m_hWnd; |
| | | } |
| | | |
| | | void CServoGraph::SetBoxText(int id, const char* pszText, const char* pszTooltip) |
| | | { |
| | | if (m_hWndTooltip == NULL) { |
| | | m_hWndTooltip = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, |
| | | NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, |
| | | CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, |
| | | m_hWnd, NULL, NULL, NULL); |
| | | ::SendMessage(m_hWndTooltip, TTM_SETMAXTIPWIDTH, 0, 500); |
| | | } |
| | | |
| | | INDICATEBOX* pBox = GetIndicateBox(id); |
| | | if (pBox != nullptr) { |
| | | strcpy_s(pBox->szText, sizeof(pBox->szText), pszText); |
| | | |
| | | // tooltip |
| | | TOOLINFO tti; |
| | | memset(&tti, 0, sizeof(TOOLINFO)); |
| | | tti.cbSize = sizeof(TOOLINFO); |
| | | tti.uFlags = TTF_SUBCLASS; |
| | | tti.hwnd = m_hWnd; |
| | | GetIndicateBoxRect(pBox, &tti.rect); |
| | | tti.uId = id; |
| | | tti.lpszText = (LPSTR)pszTooltip; |
| | | SendMessage(m_hWndTooltip, TTM_ADDTOOL, 0, (LPARAM)(LPTOOLINFO)&tti); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // ServoGraph.h: interface for the CServoGraph class. |
| | | // |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | #if !defined(AFX_SERVOGRAPH_H__FBB8916A_DE77_4EA3_9C21_E51E6B06194C__INCLUDED_) |
| | | #define AFX_vGRAPH_H__FBB8916A_DE77_4EA3_9C21_E51E6B06194C__INCLUDED_ |
| | | |
| | | |
| | | #pragma comment(lib, "Msimg32.lib") // TransparentBlt |
| | | #include <vector> |
| | | |
| | | |
| | | |
| | | //====== ServoGraph ===================================================== |
| | | |
| | | #ifndef NOSERVOGRAPH |
| | | |
| | | #ifdef _WIN32 |
| | | |
| | | #define BYSERVOGRAPH_CLASSA "BYServoGraph" |
| | | #define BYSERVOGRAPH_CLASSW L"BYServoGraph" |
| | | |
| | | #ifdef UNICODE |
| | | #define BYSERVOGRAPH_CLASS BYSERVOGRAPH_CLASSW |
| | | #else |
| | | #define BYSERVOGRAPH_CLASS BYSERVOGRAPH_CLASSA |
| | | #endif |
| | | |
| | | #else |
| | | #define BYSERVOGRAPH_CLASS "BYSERVOGraph" |
| | | #endif |
| | | |
| | | |
| | | #define BYSTAG_SERVOGRAPH _T("ISSERVOGRAPH") |
| | | |
| | | |
| | | //====== WM_NOTIFY codes (NMHDR.code values) ================================== |
| | | #define BYSERVOGRAPH_FIRST (0U-1390U) // |
| | | #define BYSERVOGRAPH_LAST (0U-1350U) |
| | | #define BYSERVOGRAPH_ITEM_CLICKED (BYSERVOGRAPH_FIRST - 1) |
| | | |
| | | |
| | | typedef struct tagBYSERVOGRAPH_NMHDR |
| | | { |
| | | NMHDR nmhdr; |
| | | DWORD dwData; |
| | | DWORD dwData1; |
| | | DWORD dwData2; |
| | | } BYSERVOGRAPH_NMHDR; |
| | | |
| | | #endif |
| | | |
| | | |
| | | |
| | | |
| | | #if _MSC_VER > 1000 |
| | | #pragma once |
| | | #endif // _MSC_VER > 1000 |
| | | |
| | | |
| | | #define HMGRAPH_HITCODETEST _T("HitCode") |
| | | #define HMGRAPH_HT_NOWHERE 0x1 |
| | | #define HMGRAPH_HT_ITEM 0x2 |
| | | |
| | | |
| | | class CServoGraph |
| | | { |
| | | private: |
| | | typedef struct tagIMAGE |
| | | { |
| | | int id; |
| | | char szPath[MAX_PATH]; |
| | | int x; |
| | | int y; |
| | | HBITMAP hBitmap; |
| | | int bmWidth; |
| | | int bmHeight; |
| | | } IMAGE; |
| | | |
| | | |
| | | class INDICATEBOX |
| | | { |
| | | public: |
| | | INDICATEBOX() { |
| | | this->id = 0; |
| | | this->x = 0; |
| | | this->y = 0; |
| | | this->box1Width = 0; |
| | | this->box1BackgroundColor = RGB(255, 255, 255); |
| | | this->box1FrameColor[0] = RGB(22, 22, 22); |
| | | this->box1FrameColor[1] = RGB(22, 22, 22); |
| | | this->box2Width = 0; |
| | | this->box2BackgroundColor = RGB(0, 255, 255);; |
| | | this->box2FrameColor = RGB(255, 255, 0);; |
| | | this->bBox2Visible = FALSE; |
| | | }; |
| | | ~INDICATEBOX() {}; |
| | | |
| | | public: |
| | | int id; |
| | | int x; |
| | | int y; |
| | | int box1Width; |
| | | COLORREF box1BackgroundColor; |
| | | COLORREF box1FrameColor[2]; |
| | | char szText[64]; |
| | | int box2Width; |
| | | COLORREF box2BackgroundColor; |
| | | COLORREF box2FrameColor; |
| | | BOOL bBox2Visible; |
| | | std::vector<void*> m_contexts; |
| | | }; |
| | | |
| | | class INDICATEBKGND |
| | | { |
| | | public: |
| | | INDICATEBKGND() { |
| | | this->id = 0; |
| | | this->rect = { 0, 0, 10, 10 }; |
| | | this->backgroundColor = RGB(255, 255, 255);; |
| | | }; |
| | | ~INDICATEBKGND() {}; |
| | | |
| | | public: |
| | | int id; |
| | | RECT rect; |
| | | COLORREF backgroundColor; |
| | | }; |
| | | |
| | | public: |
| | | CServoGraph(); |
| | | virtual ~CServoGraph(); |
| | | static BOOL RegisterWndClass(); |
| | | static CServoGraph* Hook(HWND hWnd); |
| | | void Notify(int nCode, int dwData, int dwData1 = 0, int dwData2 = 0); |
| | | void Release(); |
| | | void SetBkgndColor(COLORREF cr); |
| | | static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); |
| | | static LRESULT OnNcCreate(HWND hWnd, WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnDestroy(WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnTimer(WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnPaint(WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnMouseMove(WPARAM wParam, LPARAM lParam); |
| | | LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam); |
| | | |
| | | public: |
| | | void AddImage(int id, char* pszPath, int x, int y); |
| | | void AddIndicateBox(int id, int x, int y, int width); |
| | | void AddIndicateBox(int id, int x, int y, int width, |
| | | COLORREF crFrame1, COLORREF crFrame2, COLORREF crBackground); |
| | | void AddIndicateBoxContext(int id, void* pContext); |
| | | BOOL RemoveIndicateBoxContext(int id, void* pContext); |
| | | BOOL RemoveIndicateBoxAllContext(int id); |
| | | const std::vector<void*>& GetIndicateBoxContexts(int id); |
| | | bool IsIndicateBoxContextsEmpty(int id); |
| | | void ShowIndicateBoxInterior(int id, COLORREF color); |
| | | void HideIndicateBoxInterior(int id); |
| | | CServoGraph::INDICATEBOX* GetIndicateBox(int id); |
| | | void AddIndicateBkgnd(int id, int left, int top, int width, int height, COLORREF color); |
| | | void SetIndicateBkgndColor(int id, COLORREF color); |
| | | CServoGraph::INDICATEBKGND* GetIndicateBkgnd(int id); |
| | | void SetResDir(CString strDir); |
| | | CServoGraph::IMAGE* GetImage(int id); |
| | | int HitTest(POINT pt, OUT void*& pItem); |
| | | void GetIndicateBoxRect(INDICATEBOX* pBox, LPRECT lprcBox); |
| | | BOOL GetIndicateBoxRect(int id, LPRECT lprcBox); |
| | | void SetBoxText(int id, const char* pszText, const char* pszTooltip); |
| | | HWND GetSafeWnd(); |
| | | |
| | | private: |
| | | HWND m_hWnd; |
| | | COLORREF m_crBkgnd; |
| | | CString m_strResDir; |
| | | |
| | | private: |
| | | std::vector<IMAGE> m_images; |
| | | std::vector<INDICATEBOX> m_indicateBoxs; |
| | | std::vector<INDICATEBKGND> m_indicateBkgnds; |
| | | void* m_pHighItem; |
| | | HWND m_hWndTooltip; |
| | | }; |
| | | |
| | | #endif // !defined(AFX_EQUIPMENTGRAPH_H__FBB8916A_DE77_4EA3_9C21_E51E6B06194C__INCLUDED_) |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
| | | <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> |
| | | <assemblyIdentity |
| | | name="XP style manifest" |
| | | processorArchitecture="amd64" |
| | | version="1.0.0.0" |
| | | type="win32"/> |
| | | <dependency> |
| | | <dependentAssembly> |
| | | <assemblyIdentity |
| | | type="win32" |
| | | name="Microsoft.Windows.Common-Controls" |
| | | version="6.0.0.0" |
| | | processorArchitecture="amd64" |
| | | publicKeyToken="6595b64144ccf1df" |
| | | language="*" |
| | | /> |
| | | </dependentAssembly> |
| | | </dependency> |
| | | </assembly> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | |
| | | // stdafx.cpp : åªå
æ¬æ åå
å«æä»¶çæºæä»¶ |
| | | // Servo.pch å°ä½ä¸ºé¢ç¼è¯å¤´ |
| | | // stdafx.obj å°å
å«é¢ç¼è¯ç±»åä¿¡æ¯ |
| | | |
| | | #include "stdafx.h" |
| | | |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | |
| | | // stdafx.h : æ åç³»ç»å
嫿件çå
å«æä»¶ï¼ |
| | | // ææ¯ç»å¸¸ä½¿ç¨ä½ä¸å¸¸æ´æ¹ç |
| | | // ç¹å®äºé¡¹ç®çå
嫿件 |
| | | |
| | | #pragma once |
| | | |
| | | #ifndef VC_EXTRALEAN |
| | | #define VC_EXTRALEAN // ä» Windows 头䏿餿å°ä½¿ç¨çèµæ |
| | | #endif |
| | | |
| | | #include "targetver.h" |
| | | |
| | | #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // æäº CString æé 彿°å°æ¯æ¾å¼ç |
| | | |
| | | // å
³é MFC 对æäºå¸¸è§ä½ç»å¸¸å¯æ¾å¿å¿½ç¥çè¦åæ¶æ¯çéè |
| | | #define _AFX_ALL_WARNINGS |
| | | |
| | | #include <afxwin.h> // MFC æ ¸å¿ç»ä»¶åæ åç»ä»¶ |
| | | #include <afxext.h> // MFC æ©å± |
| | | |
| | | |
| | | #include <afxdisp.h> // MFC èªå¨åç±» |
| | | |
| | | |
| | | |
| | | #ifndef _AFX_NO_OLE_SUPPORT |
| | | #include <afxdtctl.h> // MFC 对 Internet Explorer 4 å
Œ
±æ§ä»¶çæ¯æ |
| | | #endif |
| | | #ifndef _AFX_NO_AFXCMN_SUPPORT |
| | | #include <afxcmn.h> // MFC 对 Windows å
Œ
±æ§ä»¶çæ¯æ |
| | | #endif // _AFX_NO_AFXCMN_SUPPORT |
| | | |
| | | #include <afxcontrolbars.h> // åè½åºåæ§ä»¶æ¡ç MFC æ¯æ |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | #ifdef _UNICODE |
| | | #if defined _M_IX86 |
| | | #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") |
| | | #elif defined _M_X64 |
| | | #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") |
| | | #else |
| | | #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") |
| | | #endif |
| | | #endif |
| | | |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | |
| | | // å
æ¬ SDKDDKVer.h å°å®ä¹å¯ç¨çæé«çæ¬ç Windows å¹³å°ã |
| | | |
| | | // 妿è¦ä¸ºä»¥åç Windows å¹³å°çæåºç¨ç¨åºï¼è¯·å
æ¬ WinSDKVer.hï¼å¹¶å° |
| | | // å° _WIN32_WINNT å®è®¾ç½®ä¸ºè¦æ¯æçå¹³å°ï¼ç¶ååå
æ¬ SDKDDKVer.hã |
| | | |
| | | #include <SDKDDKVer.h> |