paint_rect.cpp

本文介绍了一个简单的Windows应用程序实例,包括窗口类注册、消息处理及基本绘图功能。通过使用Windows API函数,展示了如何创建窗口、响应用户操作并进行简单图形绘制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1194442938015&lmt=1194190197&format=336x280_as&output=html&correlator=1194442937843&url=file%3A%2F%2F%2FC%3A%2FDocuments%2520and%2520Settings%2Flhh1%2F%E6%A1%8C%E9%9D%A2%2FCLanguage.htm&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=FFFFFF&color_border=FFFFFF&ad_type=text&ga_vid=583001034.1194442938&ga_sid=1194442938&ga_hid=1942779085&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency"> 
#include <windows.h> 
#include "Paint_Rect.h"


#if defined (WIN32)
 #define IS_WIN32 TRUE
#else
 #define IS_WIN32 FALSE
#endif

#define IS_NT      IS_WIN32 && (BOOL)(GetVersion() < 0x80000000)
#define IS_WIN32S  IS_WIN32 && (BOOL)(!(IS_NT) && (LOBYTE(LOWORD(GetVersion()))<4))
#define IS_WIN95   (BOOL)(!(IS_NT) && !(IS_WIN32S)) && IS_WIN32

HINSTANCE hInst;   // current instance

LPCTSTR lpszAppName  = "MyApp";
LPCTSTR lpszTitle    = "My Application";

BOOL RegisterWin95( CONST WNDCLASS* lpwc );

int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                      LPTSTR lpCmdLine, int nCmdShow)
{
   MSG      msg;
   HWND     hWnd;
   WNDCLASS wc;

   // Register the main application window class.
   //............................................
   wc.style         = CS_HREDRAW | CS_VREDRAW;
   wc.lpfnWndProc   = (WNDPROC)WndProc;      
   wc.cbClsExtra    = 0;                     
   wc.cbWndExtra    = 0;                     
   wc.hInstance     = hInstance;             
   wc.hIcon         = LoadIcon( hInstance, lpszAppName );
   wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
   wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
   wc.lpszMenuName  = lpszAppName;             
   wc.lpszClassName = lpszAppName;             

   if ( IS_WIN95 )
   {
      if ( !RegisterWin95( &wc ) )
         return( FALSE );
   }
   else if ( !RegisterClass( &wc ) )
      return( FALSE );

   hInst = hInstance;

   // Create the main application window.
   //....................................
   hWnd = CreateWindow( lpszAppName,
                        lpszTitle,   
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, 0,
                        CW_USEDEFAULT, 0, 
                        NULL,             
                        NULL,             
                        hInstance,        
                        NULL              
                      );

   if ( !hWnd )
      return( FALSE );

   ShowWindow( hWnd, nCmdShow );
   UpdateWindow( hWnd );        

   while( GetMessage( &msg, NULL, 0, 0) )  
   {
      TranslateMessage( &msg );
      DispatchMessage( &msg ); 
   }

   return( msg.wParam );
}


BOOL RegisterWin95( CONST WNDCLASS* lpwc )
{
   WNDCLASSEX wcex;

   wcex.style         = lpwc->style;
   wcex.lpfnWndProc   = lpwc->lpfnWndProc;
   wcex.cbClsExtra    = lpwc->cbClsExtra;
   wcex.cbWndExtra    = lpwc->cbWndExtra;
   wcex.hInstance     = lpwc->hInstance;
   wcex.hIcon         = lpwc->hIcon;
   wcex.hCursor       = lpwc->hCursor;
   wcex.hbrBackground = lpwc->hbrBackground;
   wcex.lpszMenuName  = lpwc->lpszMenuName;
   wcex.lpszClassName = lpwc->lpszClassName;

   // Added elements for Windows 95.
   //...............................
   wcex.cbSize = sizeof(WNDCLASSEX);
   wcex.hIconSm = LoadImage(wcex.hInstance, lpwc->lpszClassName,
                            IMAGE_ICON, 16, 16,
                            LR_DEFAULTCOLOR );
   
   return RegisterClassEx( &wcex );
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
   switch( uMsg )
   {
      case WM_COMMAND :
              switch( LOWORD( wParam ) )
              {
                 case IDM_TEST :
                        {
                           HDC     hDC;
                           HBRUSH  hOldBrush;
                           RECT    rect;

                           GetClientRect( hWnd, &rect );

                           hDC = GetDC( hWnd );

                           // Paint gray box.
                           //................
                           hOldBrush = SelectObject( hDC,
                                            GetStockObject( LTGRAY_BRUSH ) );
                           PatBlt( hDC, 5, 5, 60, 40, PATCOPY );

                           // Paint 3D border.
                           //.................
                           SelectObject( hDC, GetStockObject( GRAY_BRUSH ) );
                           PatBlt( hDC, 10, 40, 52, 2, PATCOPY );
                           PatBlt( hDC, 60,  8, 2, 32, PATCOPY );

                           SelectObject( hDC, GetStockObject( WHITE_BRUSH ) );
                           PatBlt( hDC, 8,  8, 52,  2, PATCOPY );
                           PatBlt( hDC, 8, 10,  2, 32, PATCOPY );

                           SelectObject( hDC, hOldBrush );
                           ReleaseDC( hWnd, hDC );
                        }
                        break;

                 case IDM_ABOUT :
                        DialogBox( hInst, "AboutBox", hWnd, (DLGPROC)About );
                        break;

                 case IDM_EXIT :
                        DestroyWindow( hWnd );
                        break;
              }
              break;
     
      case WM_DESTROY :
              PostQuitMessage(0);
              break;

      default :
            return( DefWindowProc( hWnd, uMsg, wParam, lParam ) );
   }

   return( 0L );
}


LRESULT CALLBACK About( HWND hDlg,          
                        UINT message,       
                        WPARAM wParam,      
                        LPARAM lParam)
{
   switch (message)
   {
       case WM_INITDIALOG:
               return (TRUE);

       case WM_COMMAND:                             
               if (   LOWORD(wParam) == IDOK        
                   || LOWORD(wParam) == IDCANCEL)   
               {
                       EndDialog(hDlg, TRUE);       
                       return (TRUE);
               }
               break;
   }

   return (FALSE);
}

// GradientProgressCtrl.cpp : implementation file // #include "stdafx.h" #include "VProgressCtrl.h" //#include "MemDC.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif class CMemDC : public CDC { public: CMemDC(CDC* pDC); CMemDC* operator->(){return this;} operator CMemDC*(){return this;} virtual ~CMemDC(); private: CBitmap m_bitmap; CBitmap* m_pOldBitmap; CDC* m_pDC; CRect m_rect; BOOL m_bMemDC; }; CMemDC::CMemDC(CDC* pDC):CDC() { ASSERT(pDC!=NULL); m_pDC=pDC; m_pOldBitmap=NULL; m_bMemDC=!pDC->IsPrinting(); // if(m_bMemDC) { pDC->GetClipBox(&m_rect); CreateCompatibleDC(pDC); m_bitmap.CreateCompatibleBitmap(pDC,m_rect.Width(),m_rect.Height()); m_pOldBitmap=SelectObject(&m_bitmap); SetWindowOrg(m_rect.left,m_rect.top); } else //为相关的现有设备准备打印 { m_bPrinting=pDC->m_bPrinting; m_hDC=pDC->m_hDC; m_hAttribDC=pDC->m_hAttribDC; } } CMemDC::~CMemDC() { if(m_bMemDC) { m_pDC->BitBlt(m_rect.left,m_rect.top,m_rect.Width(),m_rect.Height(), this,m_rect.left,m_rect.top,SRCCOPY); SelectObject(m_pOldBitmap); } else { m_hDC=m_hAttribDC=NULL; } } ///////////////////////////////////////////////////////////////////////////// // CVProgressCtrl CVProgressCtrl::CVProgressCtrl() : m_nTextType(TextCustom) , m_strFormat(_T("%s")) , m_nLower(0) , m_nUpper(100) , m_nCurrentPosition(0) , m_nStep(1) , m_clrStart(RGB(255,0,0)) , m_clrEnd(RGB(0,0,255)) , m_clrBkGround(GetSysColor(COLOR_3DFACE)) , m_clrText(RGB(255,255,255)) { m_nLower=0; m_nUpper=100; m_nCurrentPosition=0; m_nStep=10; } CVProgressCtrl::~CVProgressCtrl() { } BEGIN_MESSAGE_MAP(CVProgressCtrl, CProgressCtrl) //{{AFX_MSG_MAP(CVProgressCtrl) ON_WM_ERASEBKGND() ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CVProgressCtrl message handlers void CVProgressCtrl::SetRange(int nLower,int nUpper) { //This Function is to Set Range of the progress m_nLower=nLower; m_nUpper=nUpper; m_nCurrentPosition=nLower; CProgressCtrl::SetRange(nLower,nUpper); } int CVProgressCtrl::SetStep(int nStep) { m_nStep=nStep; return (CProgressCtrl::SetStep(nStep)); } BOOL CVProgressCtrl::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return TRUE;//CProgressCtrl::OnEraseBkgnd(pDC); } void CVProgressCtrl::DrawGradient(CPaintDC *pDC, const RECT &rectClient, const int &nMaxWidth) { RECT rectFill; //显示区域 float fStep; //每一步的幅宽 CBrush brush; //显示的颜色画刷 CMemDC memDC(pDC); int r,g,b; float rStep,gStep,bStep; //得到不同颜色并相减,返回颜色之间的最大差值 r=(GetRValue(m_clrEnd)-GetRValue(m_clrStart)); g=(GetGValue(m_clrEnd)-GetGValue(m_clrStart)); b=(GetBValue(m_clrEnd)-GetBValue(m_clrStart)); //使进程条显示的总数 等于最大的颜色差值 int nSteps=max(abs(r),max(abs(g),abs(b))); //确定每一颜色填充多大的矩形区域 fStep=(float)rectClient.right/(float)nSteps; //设置每一颜色填充的步数 rStep=r/(float)nSteps; gStep=g/(float)nSteps; bStep=b/(float)nSteps; r=GetRValue(m_clrStart); g=GetGValue(m_clrStart); b=GetBValue(m_clrStart); //绘制颜色渐变的进程条 for(int iOnBand=0;iOnBand<nSteps;iOnBand++) { ::SetRect(&rectFill, //以下为填充矩形区域的左上角x,y和右下角x,y (int)(iOnBand*fStep), 0, (int)((iOnBand+1)*fStep), rectClient.bottom+1); VERIFY(brush.CreateSolidBrush(RGB(r+rStep*iOnBand,g+gStep*iOnBand,b+bStep*iOnBand))); memDC.FillRect(&rectFill,&brush); VERIFY(brush.DeleteObject()); //在结束绘制之前,使用背景色填充乘下的的客户区域 if(rectFill.right>nMaxWidth) { ::SetRect(&rectFill,rectFill.right,0,rectClient.right,rectClient.bottom); VERIFY(brush.CreateSolidBrush(m_clrBkGround)); memDC.FillRect(&rectFill,&brush); VERIFY(brush.DeleteObject()); return; } } } void CVProgressCtrl::DrawProgressText(CPaintDC& dc,RECT& rectClient) { //根据文本类型,设置显示的文本 switch(m_nTextType) { case TextPercent: m_strText.Format(m_strFormat,(int)(100*(float)m_nCurrentPosition/m_nUpper)); break; case TextPos: m_strText.Format(m_strFormat,m_nCurrentPosition); break; default://TextCustom break; } //设置文本颜色 dc.SetTextColor(m_clrText); dc.SetBkMode(TRANSPARENT); //绘制文本 dc.DrawText(m_strText,&rectClient,DT_VCENTER|DT_CENTER|DT_SINGLELINE); } void CVProgressCtrl::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here if(m_nCurrentPosition<=m_nLower||m_nCurrentPosition>=m_nUpper) { CRect rect; GetClientRect(rect); CBrush brush; brush.CreateSolidBrush(::GetSysColor(COLOR_3DFACE)); dc.FillRect(&rect,&brush); VERIFY(brush.DeleteObject()); return; } CRect rectClient; GetClientRect(rectClient); float maxWidth((float)m_nCurrentPosition/(float)m_nUpper*(float)rectClient.right); //绘制进度条 DrawGradient(&dc,rectClient,(int)maxWidth); //绘制进度条文本 DrawProgressText(dc,rectClient); // Do not call CProgressCtrl::OnPaint() for painting messages } int CVProgressCtrl::SetPos(int nPos) { //Set the Position of the Progress m_nCurrentPosition = nPos; return (CProgressCtrl::SetPos(nPos)); } void CVProgressCtrl::SetText(LPCTSTR lpcszText) { m_strText.Format(m_strFormat,lpcszText); this->Invalidate(); } void CVProgressCtrl::SetTextType(int nTextType,LPCTSTR lpszFormat) { m_nTextType = nTextType;//文本类型 m_strFormat = lpszFormat;//文本格式化 int nIndex;//内容在格式化中的位置 if (m_strFormat.GetLength() == 0) { nIndex = 0; } else { int nTemp = m_strFormat.Find(_T("%s")); if (nTemp == -1) { nIndex = m_strFormat.GetLength(); } else { nIndex = nTemp; m_strFormat.Delete(nTemp,2); while ((nTemp = m_strFormat.Find(_T("%"),nTemp)) > -1) { m_strFormat.Insert(nTemp,_T("%")); nTemp += 2; } } } //根据文本类型不同,设置格式化字符串 switch(m_nTextType) { case TextPercent: m_strFormat.Insert(nIndex,_T("%d%%")); break; case TextPos: m_strFormat.Insert(nIndex,_T("%d")); break; default: m_strFormat.Insert(nIndex,_T("%s")); break; } } 这个代码中为什么进度条到达100%后会重置为0
06-04
// B2saomiaotuxiangchuangkou.cpp : 实现文件 // #include "stdafx.h" #include "Imageprocessing.h" #include "B2saomiaotuxiangchuangkou.h" #include "afxdialogex.h" // B2saomiaotuxiangchuangkou 对话框 IMPLEMENT_DYNAMIC(B2saomiaotuxiangchuangkou, CDialogEx) B2saomiaotuxiangchuangkou::B2saomiaotuxiangchuangkou(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_B2saomiaotuxiangchuangkou, pParent) { //m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } //B2saomiaotuxiangchuangkou::~B2saomiaotuxiangchuangkou() //{ //} void B2saomiaotuxiangchuangkou::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_FOLDER_PATH, m_editFolderPath); DDX_Control(pDX, IDC_LIST_IMAGES, m_listImages); DDX_Control(pDX, IDC_STATIC_ORIGINAL_IMAGE, m_staticOriginalImage); DDX_Control(pDX, IDC_STATIC_PROCESSED_IMAGE, m_staticProcessedImage); DDX_Control(pDX, IDC_COMBO_SAVE_OPTION, m_comboSaveOption); } BEGIN_MESSAGE_MAP(B2saomiaotuxiangchuangkou, CDialogEx) ON_WM_PAINT() ON_WM_TIMER() ON_WM_MOUSEWHEEL() ON_BN_CLICKED(IDC_BUTTON_SELECT_FOLDER, &B2saomiaotuxiangchuangkou::OnBnClickedButtonSelectFolder) ON_BN_CLICKED(IDC_BUTTON_START, &B2saomiaotuxiangchuangkou::OnBnClickedButtonStart) ON_BN_CLICKED(IDC_BUTTON_PAUSE, &B2saomiaotuxiangchuangkou::OnBnClickedButtonPause) ON_BN_CLICKED(IDC_BUTTON_STOP, &B2saomiaotuxiangchuangkou::OnBnClickedButtonStop) ON_BN_CLICKED(IDC_BUTTON_RESET, &B2saomiaotuxiangchuangkou::OnBnClickedButtonReset) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_IMAGES, &B2saomiaotuxiangchuangkou::OnLvnItemchangedListImages) ON_MESSAGE(WM_UPDATE_IMAGE, [](WPARAM wParam, LPARAM lParam) { B2saomiaotuxiangchuangkou* pThis = (B2saomiaotuxiangchuangkou*)lParam; pThis->DisplayImage((int)wParam); return 0; }) ON_MESSAGE(WM_PROCESSING_DONE, [](WPARAM wParam, LPARAM lParam) { B2saomiaotuxiangchuangkou* pThis = (B2saomiaotuxiangchuangkou*)lParam; pThis->ResetProcessing(); return 0; }) ON_MESSAGE(WM_UPDATE_IMAGE, &B2saomiaotuxiangchuangkou::OnUpdateImage) ON_MESSAGE(WM_PROCESSING_DONE, &B2saomiaotuxiangchuangkou::OnProcessingDone) END_MESSAGE_MAP() BOOL B2saomiaotuxiangchuangkou::OnInitDialog() { CDialogEx::OnInitDialog(); /*SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE);*/ // 初始化列表控件 m_listImages.InsertColumn(0, _T("图片文件"), LVCFMT_LEFT, 300); m_listImages.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // 初始化下拉框 m_comboSaveOption.AddString(_T("覆盖原图")); m_comboSaveOption.AddString(_T("另存为")); m_comboSaveOption.SetCurSel(0); m_comboSaveOption.EnableWindow(FALSE); // 初始按钮状态 GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(FALSE); return TRUE; } void B2saomiaotuxiangchuangkou::OnBnClickedButtonSelectFolder() { CString strFolder; BROWSEINFO bi = { 0 }; bi.lpszTitle = _T("选择图片文件夹"); LPITEMIDLIST pidl = SHBrowseForFolder(&bi); if (pidl != nullptr) { TCHAR szPath[MAX_PATH]; if (SHGetPathFromIDList(pidl, szPath)) { m_strFolderPath = szPath; m_editFolderPath.SetWindowText(m_strFolderPath); LoadImageList(); m_comboSaveOption.EnableWindow(TRUE); UpdateButtonStates(); } CoTaskMemFree(pidl); } } void B2saomiaotuxiangchuangkou::LoadImageList() { m_listImages.DeleteAllItems(); m_imageFiles.RemoveAll(); CFileFind finder; BOOL bWorking = finder.FindFile(m_strFolderPath + _T("\\*.*")); int nIndex = 0; while (bWorking) { bWorking = finder.FindNextFile(); if (finder.IsDots()) continue; if (!finder.IsDirectory()) { CString strFile = finder.GetFileName(); CString strExt = strFile.Right(3); strExt.MakeLower(); if (strExt == _T("jpg") || strExt == _T("jpeg") || strExt == _T("bmp") || strExt == _T("png")) { m_listImages.InsertItem(nIndex, strFile); m_imageFiles.Add(finder.GetFilePath()); nIndex++; } } } finder.Close(); if (m_imageFiles.GetSize() > 0) { m_nCurrentIndex = 0; DisplayImage(0); GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE); } } void B2saomiaotuxiangchuangkou::DisplayImage(int nIndex) { if (nIndex < 0 || nIndex >= m_imageFiles.GetSize()) return; m_nCurrentIndex = nIndex; m_currentImage.Destroy(); if (SUCCEEDED(m_currentImage.Load(m_imageFiles[nIndex]))) { m_staticOriginalImage.Invalidate(); m_staticProcessedImage.Invalidate(); } } void B2saomiaotuxiangchuangkou::DisplayProcessedImage() { if (m_processedImage.IsNull()) return; m_staticProcessedImage.Invalidate(); } void B2saomiaotuxiangchuangkou::OnPaint() { CDialogEx::OnPaint(); if (m_currentImage.IsNull()) return; // 绘制原图 CDC* pDC = m_staticOriginalImage.GetDC(); CRect rect; m_staticOriginalImage.GetClientRect(&rect); pDC->FillSolidRect(rect, RGB(240, 240, 240)); DrawImage(pDC, m_currentImage, rect, m_dZoomOriginal, m_ptZoomCenterOriginal); m_staticOriginalImage.ReleaseDC(pDC); // 绘制处理后的图像 if (!m_processedImage.IsNull()) { pDC = m_staticProcessedImage.GetDC(); m_staticProcessedImage.GetClientRect(&rect); pDC->FillSolidRect(rect, RGB(240, 240, 240)); DrawImage(pDC, m_processedImage, rect, m_dZoomProcessed, m_ptZoomCenterProcessed); m_staticProcessedImage.ReleaseDC(pDC); } } void B2saomiaotuxiangchuangkou::DrawImage(CDC* pDC, CImage& image, CRect rect, double dZoom, CPoint ptCenter) { int origWidth = image.GetWidth(); int origHeight = image.GetHeight(); // 计算保持比例的显示尺寸 double dAspect = (double)origHeight / (double)origWidth; int displayWidth = (int)(origWidth * dZoom); int displayHeight = (int)(origHeight * dZoom * dAspect); // 计算显示位置(居中) int x = ptCenter.x - (int)(displayWidth * (double)ptCenter.x / rect.Width()); int y = ptCenter.y - (int)(displayHeight * (double)ptCenter.y / rect.Height()); // 确保图像在控件范围内 if (x < 0) x = 0; if (y < 0) y = 0; if (x + displayWidth > rect.Width()) x = rect.Width() - displayWidth; if (y + displayHeight > rect.Height()) y = rect.Height() - displayHeight; // 绘制图像 image.StretchBlt(pDC->m_hDC, x, y, displayWidth, displayHeight, SRCCOPY); } BOOL B2saomiaotuxiangchuangkou::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { // 确定鼠标在哪个控件上 CRect rectOriginal, rectProcessed; m_staticOriginalImage.GetWindowRect(&rectOriginal); m_staticProcessedImage.GetWindowRect(&rectProcessed); if (rectOriginal.PtInRect(pt)) { // 原图缩放 double dFactor = (zDelta > 0) ? 1.1 : 0.9; m_dZoomOriginal *= dFactor; // 限制缩放范围 if (m_dZoomOriginal < 0.1) m_dZoomOriginal = 0.1; if (m_dZoomOriginal > 5.0) m_dZoomOriginal = 5.0; // 设置缩放中心点 m_ptZoomCenterOriginal = pt - rectOriginal.TopLeft(); m_staticOriginalImage.Invalidate(); } else if (rectProcessed.PtInRect(pt)) { // 处理后图像缩放 double dFactor = (zDelta > 0) ? 1.1 : 0.9; m_dZoomProcessed *= dFactor; // 限制缩放范围 if (m_dZoomProcessed < 0.1) m_dZoomProcessed = 0.1; if (m_dZoomProcessed > 5.0) m_dZoomProcessed = 5.0; // 设置缩放中心点 m_ptZoomCenterProcessed = pt - rectProcessed.TopLeft(); m_staticProcessedImage.Invalidate(); } return CDialogEx::OnMouseWheel(nFlags, zDelta, pt); } void B2saomiaotuxiangchuangkou::OnLvnItemchangedListImages(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); if ((pNMLV->uChanged & LVIF_STATE) && (pNMLV->uNewState & LVIS_SELECTED)) { if (m_bProcessing) { // 处理过程中:临时显示3秒 m_bUserBrowsing = TRUE; PostMessage(WM_UPDATE_IMAGE, pNMLV->iItem, (LPARAM)this); SetTimer(1, 3000, nullptr); // 3秒定时器 } else { // 非处理状态:持续显示 DisplayImage(pNMLV->iItem); } } *pResult = 0; } void B2saomiaotuxiangchuangkou::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == 1 && m_bUserBrowsing) { KillTimer(1); m_bUserBrowsing = FALSE; DisplayImage(m_nProcessingIndex); // 切回处理中的图片 } CDialogEx::OnTimer(nIDEvent); } void B2saomiaotuxiangchuangkou::OnBnClickedButtonStart() { if (m_imageFiles.GetSize() == 0) return; m_bProcessing = TRUE; m_nProcessingIndex = 0; UpdateButtonStates(); // 启动处理线程 AfxBeginThread([](LPVOID pParam) -> UINT { B2saomiaotuxiangchuangkou* pThis = (B2saomiaotuxiangchuangkou*)pParam; while (pThis->m_nProcessingIndex < pThis->m_imageFiles.GetSize()) { if (pThis->m_bPaused) { Sleep(100); continue; } // 更新显示 pThis->PostMessage(WM_UPDATE_IMAGE, pThis->m_nProcessingIndex, (LPARAM)pThis); // 处理当前图像 pThis->ProcessCurrentImage(); pThis->DisplayProcessedImage(); // 保存处理结果 pThis->SaveProcessedImage(); pThis->m_nProcessingIndex++; Sleep(500); // 模拟处理时间 } pThis->PostMessage(WM_PROCESSING_DONE, 0, (LPARAM)pThis); return 0; }, this); } void B2saomiaotuxiangchuangkou::ProcessCurrentImage() { if (m_currentImage.IsNull()) return; // 示例处理:转换为灰度图 m_processedImage.Destroy(); m_processedImage.Create(m_currentImage.GetWidth(), m_currentImage.GetHeight(), m_currentImage.GetBPP()); for (int y = 0; y < m_currentImage.GetHeight(); y++) { for (int x = 0; x < m_currentImage.GetWidth(); x++) { COLORREF color = m_currentImage.GetPixel(x, y); BYTE r = GetRValue(color); BYTE g = GetGValue(color); BYTE b = GetBValue(color); BYTE gray = static_cast<BYTE>(0.299 * r + 0.587 * g + 0.114 * b); m_processedImage.SetPixel(x, y, RGB(gray, gray, gray)); } } } void B2saomiaotuxiangchuangkou::SaveProcessedImage() { if (m_processedImage.IsNull()) return; int nOption = m_comboSaveOption.GetCurSel(); CString strPath; if (nOption == 0) { // 覆盖原图 strPath = m_imageFiles[m_nProcessingIndex]; } else { // 另存为 CString strDir = m_strFolderPath + _T("\\Processed"); CreateDirectory(strDir, nullptr); CString strFile; m_listImages.GetItemText(m_nProcessingIndex, 0, strFile); strPath = strDir + _T("\\") + strFile; } // 保存图像 HRESULT hr = m_processedImage.Save(strPath); } void B2saomiaotuxiangchuangkou::OnBnClickedButtonPause() { m_bPaused = !m_bPaused; CButton* pButton = (CButton*)GetDlgItem(IDC_BUTTON_PAUSE); pButton->SetWindowText(m_bPaused ? _T("继续") : _T("暂停")); UpdateButtonStates(); } void B2saomiaotuxiangchuangkou::OnBnClickedButtonStop() { m_bProcessing = FALSE; m_bPaused = FALSE; GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(TRUE); } void B2saomiaotuxiangchuangkou::OnBnClickedButtonReset() { m_processedImage.Destroy(); m_staticProcessedImage.Invalidate(); GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(FALSE); } void B2saomiaotuxiangchuangkou::ResetProcessing() { m_bProcessing = FALSE; m_bPaused = FALSE; m_nProcessingIndex = -1; UpdateButtonStates(); GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(TRUE); } void B2saomiaotuxiangchuangkou::UpdateButtonStates() { GetDlgItem(IDC_BUTTON_START)->EnableWindow(!m_bProcessing && m_imageFiles.GetSize() > 0); GetDlgItem(IDC_BUTTON_PAUSE)->EnableWindow(m_bProcessing); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(m_bProcessing); GetDlgItem(IDC_BUTTON_RESET)->EnableWindow(FALSE); } LRESULT B2saomiaotuxiangchuangkou::OnUpdateImage(WPARAM wParam, LPARAM lParam) { DisplayImage(static_cast<int>(wParam)); return 0; } LRESULT B2saomiaotuxiangchuangkou::OnProcessingDone(WPARAM wParam, LPARAM lParam) { ResetProcessing(); return 0; }报严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) 不存在从 "lambda []int (WPARAM wParam, LPARAM lParam)->int" 到 "LRESULT (CWnd::*)(WPARAM, LPARAM)" 的适当转换函数 Imageprocessing c:\Users\Administrator\Desktop\111\Imageprocessing\Imageprocessing\B2saomiaotuxiangchuangkou.cpp 45 错误(活动) 不存在从 "lambda []int (WPARAM wParam, LPARAM lParam)->int" 到 "LRESULT (CWnd::*)(WPARAM, LPARAM)" 的适当转换函数 Imageprocessing c:\Users\Administrator\Desktop\111\Imageprocessing\Imageprocessing\B2saomiaotuxiangchuangkou.cpp 50 错误(活动) 没有与参数列表匹配的 重载函数 "CListCtrl::GetItemText" 实例 Imageprocessing c:\Users\Administrator\Desktop\111\Imageprocessing\Imageprocessing\B2saomiaotuxiangchuangkou.cpp 353 错误 C2440 “static_cast”: 无法从“B2saomiaotuxiangchuangkou::GetThisMessageMap::<lambda_ac786482bcca587bd9cc736ece35bc71>”转换为“LRESULT (__cdecl CWnd::* )(WPARAM,LPARAM)” Imageprocessing c:\users\administrator\desktop\111\imageprocessing\imageprocessing\b2saomiaotuxiangchuangkou.cpp 49 错误 C2440 “static_cast”: 无法从“B2saomiaotuxiangchuangkou::GetThisMessageMap::<lambda_a9c7879179f942e6187dc0172c95ae29>”转换为“LRESULT (__cdecl CWnd::* )(WPARAM,LPARAM)” Imageprocessing c:\users\administrator\desktop\111\imageprocessing\imageprocessing\b2saomiaotuxiangchuangkou.cpp 54 错误 C2661 “CListCtrl::GetItemText”: 没有重载函数接受 3 个参数 Imageprocessing c:\users\administrator\desktop\111\imageprocessing\imageprocessing\b2saomiaotuxiangchuangkou.cpp 353
06-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值