MFC的GetSystemMetrics()函数的问题

菜鸟一枚。
看这个函数的时候没搞懂。。。
问题如下:
我看到函数的参数有这两个
SM_CXSIZEFRAME,

SM_CYSIZEFRAME 围绕可改变大小的窗口的边框的厚度

这俩用时有啥区别吗。。还是说一个是计算边框水平部分的厚度,另一个是边框竖直部分的厚度的?

另:SM_CXSIZE,SM_CYSIZE 以像素计算的标题栏按钮的尺寸
对于这个参数值。。如果标题栏按钮有多个,怎么知道此“按钮的尺寸”指的是哪个呢。。
本人新手。。理解能力不好。。望大家赐教

mfc

4个回答

标题栏按钮就是最大化,最小化,关闭这几个按钮,
这几个按钮的大小,和标题栏的文字大小相关
每个按钮一样大,不会有不同大小的按钮
这是系统设置,基本上程序都是遵守的,所以平时编码也可以不必关心
偶尔用用,也不用考虑太复杂

lm_whales
lm_whales 这些尺寸,都是按照类型计算的,并不考虑具体是哪一个最大化,最小化,关闭这几个按钮是同一类的,尺寸都一样
大约 4 年之前 回复
lm_whales
lm_whales SM_CXSIZE,SM_CYSIZE 一纵一横,是一对,他是标题栏上面每个按钮的尺寸,其他仿此
大约 4 年之前 回复
qq_28254507
ProgJ //准备重绘图标 m_rtIcon.left = GetSystemMetrics(SM_CXFRAME); m_rtIcon.top = GetSystemMetrics(SM_CYFRAME); m_rtIcon.right = m_rtIcon.left + GetSystemMetrics(SM_CXSIZE); m_rtIcon.bottom = m_rtIcon.top + GetSystemMetrics(SM_CYSIZE);比如这里计算图标坐标的时候,怎么知道GetSystemMetrics(SM_CYSIZE)获得是哪个按钮的尺寸(毕竟还有关闭、最大化等按钮)
大约 4 年之前 回复
qq_28254507
ProgJ 但是我想重绘标题栏,计算坐标时遇到了这个问题。所以我想知道GetSystemMetrics(SM_CXSIZE)究竟是怎么用的
大约 4 年之前 回复
 GetSystemMetrics()函数的功能很多,当传递的参数为SM_CYSCREEN、SM_CXSCREEN时,可以得到屏幕高和宽的像素值。例子 如下:

 CRect    rect(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));

 这样,rect中存储的就是整个电脑屏幕的大小,如果再MoveWindow(&rect),你就可以自己实现对话框的全屏功能。

int WINAPI GetSystemMetrics( __in int nIndex);
  下面是GetSystemMetrics函数参数nIndex的定义:
  SM_ARRANGE 标志用于说明系统如何安排最小化窗口..详细请参看下方备注.:
  根据显示器显示的不同,系统数据可能有所不同.
  该SM_ARRANGE设置指定系统如何安排最小化窗口,并包含一个起始位置和方向。起始位置可为下列值之一.
  
Value Meaning
ARW_BOTTOMLEFT 开始在左下角的屏幕(默认位置) 。
ARW_BOTTOMRIGHT 开始在右下角的屏幕上。相当于ARW_STARTRIGHT.
ARW_HIDE 在屏幕可见区域,隐藏并最小化窗口。.
ARW_TOPLEFT 从左上角的屏幕上。相当于ARV_STARTTOP.
ARW_TOPRIGHT 相当于ARW_STARTTOP | SRW_STARTRIGHT 。 方向的安排可以为下列值之一。
  
Value Meaning
ARW_DOWN 纵向排列,从上到下。
ARW_LEFT 水平排列,从左到右。
ARW_RIGHT 水平排列,从右到左。
ARW_UP 纵向排列,从下到上。 SM_CLEANBOOT 返回系统启动方式 
  0 正常启动
  1 安全模式启动
  2 网络安全模式启动
  SM_CMOUSEBUTTONS 返回值为系统支持的 鼠标键数,返回0,则系统中没有安装鼠标。
  SM_CXBORDER,
  SM_CYBORDER 返回以像素值为单位的Windows窗口边框的宽度和高度,如果Windows的为3D形态,则
  等同于SM_CXEDGE参数
  SM_CXCURSOR,
  SM_CYCURSOR 返回以像素值为单位的标准光标的宽度和高度
  SM_CXDLGFRAME,
  SM_CYDLGFRAME 等同与SM_CXFIXEDFRAME and SM_CYFIXEDFRAME
  SM_CXDOUBLECLK,
  SM_CYDOUBLECLK 以像素值为单位的双击有效的矩形区域
  SM_CXEDGE,SM_CYEDGE 以像素值为单位的3D边框的宽度和高度
  SM_CXFIXEDFRAME,
  SM_CYFIXEDFRAME 围绕具有标题但无法改变尺寸的窗口(通常是一些对话框)的边框的厚度
  SM_CXFRAME,SM_CYFRAME 等同于SM_CXSIZEFRAME and SM_CYSIZEFRAME
  SM_CXFULLSCREEN,
  SM_CYFULLSCREEN 全屏幕窗口的窗口区域的宽度和高度
  SM_CXHSCROLL,
  SM_CYHSCROLL 水平滚动条的高度和水平滚动条上箭头的宽度
  SM_CXHTHUMB 以像素为单位的水平滚动条上的滑动块宽度
  SM_CXICON,SM_CYICON 系统缺省的图标的高度和宽度(一般为32*32)
  SM_CXICONSPACING,
  SM_CYICONSPACING 以大图标方式查看Item时图标之间的间距,这个距离总是大于等于
  SM_CXICON and SM_CYICON.
  SM_CXMAXIMIZED,
  SM_CYMAXIMIZED 处于顶层的最大化窗口的缺省尺寸
  SM_CXMAXTRACK,
  SM_CYMAXTRACK 具有可改变尺寸边框和 标题栏的窗口的缺省最大尺寸,如果窗口大于这个
  尺寸,窗口是不可移动的。
  SM_CXMENUCHECK,
  SM_CYMENUCHECK 以像素为单位计算的菜单选中标记位图的尺寸
  SM_CXMENUSIZE,
  SM_CYMENUSIZE 以像素计算的菜单栏按钮的尺寸
  SM_CXMIN,SM_CYMIN 窗口所能达到的最小尺寸
  SM_CXMINIMIZED,
  SM_CYMINIMIZED 正常的最小化窗口的尺寸
  SM_CXMINTRACK,
  SM_CYMINTRACK 最小跟踪距离,当使用者拖动窗口移动距离小于这个值,窗口不会移动。
  SM_CXSCREEN,
  SM_CYSCREEN 以像素为单位计算的屏幕尺寸。
  SM_CXSIZE,SM_CYSIZE 以像素计算的标题栏按钮的尺寸
  SM_CXSIZEFRAME,
  SM_CYSIZEFRAME 围绕可改变大小的窗口的边框的厚度
  SM_CXSMICON,
  SM_CYSMICON 以像素计算的小图标的尺寸,小图标一般出现在窗口标题栏上。
  SM_CXVSCROLL,
  SM_CYVSCROLL 以像素计算的垂直滚动条的宽度和垂直滚动条上箭头的高度
  SM_CYCAPTION 以像素计算的普通窗口标题的高度
  SM_CYMENU 以像素计算的单个菜单条的高度
  SM_CYSMCAPTION 以像素计算的窗口小标题栏的高度
  SM_CYVTHUMB 以像素计算的垂直滚动条中滚动块的高度
  SM_DBCSENABLED 如果为TRUE或不为0的值表明系统安装了双字节版本的USER.EXE,为FALSE或0则不是。
  SM_DEBUG 如果为TRUE或不为0的值表明系统安装了debug版本的USER.EXE,为FALSE或0则不是。
  SM_MENUDROPALIGNMENT 如果为TRUE或不为0的值下拉菜单是右对齐的否则是左对齐的。
  SM_MOUSEPRESENT 如果为TRUE或不为0的值则安装了鼠标,否则没有安装。
  SM_MOUSEWHEELPRESENT 如果为TRUE或不为0的值则安装了滚轮鼠标,否则没有安装。(Windows NT only)
  SM_SWAPBUTTON 如果为TRUE或不为0的值则鼠标左右键交换,否则没有。
GetSystemMetrics - index值
  SM_CXSCREEN = 0 'X Size of screen
  SM_CYSCREEN = 1 'Y Size of Screen
  SM_CXVSCROLL = 2 'X Size of arrow in vertical scroll bar.
  SM_CYHSCROLL = 3 'Y Size of arrow in horizontal scroll bar
  SM_CYCAPTION = 4 'Height of windows caption
  SM_CXBORDER = 5 'Width of no-sizable borders
  SM_CYBORDER = 6 'Height of non-sizable borders
  SM_CXDLGFRAME = 7 'Width of dialog box borders
  SM_CYDLGFRAME = 8 'Height of dialog box borders
  SM_CYHTHUMB = 9 'Height of scroll box on horizontal scroll bar
  SM_CXHTHUMB = 10 ' Width of scroll box on horizontal scroll bar
  SM_CXICON = 11 'Width of standard icon
  SM_CYICON = 12 'Height of standard icon
  SM_CXCURSOR = 13 'Width of standard cursor
  SM_CYCURSOR = 14 'Height of standard cursor
  SM_CYMENU = 15 'Height of menu
  SM_CXFULLSCREEN = 16 'Width of client area of maximized window
  SM_CYFULLSCREEN = 17 'Height of client area of maximized window
  SM_CYKANJIWINDOW = 18 'Height of Kanji window
  SM_MOUSEPRESENT = 19 'True is a mouse is present
  SM_CYVSCROLL = 20 'Height of arrow in vertical scroll bar
  SM_CXHSCROLL = 21 'Width of arrow in vertical scroll bar
  SM_DEBUG = 22 'True if deugging version of windows is running
  SM_SWAPBUTTON = 23 'True if left and right buttons are swapped.
  SM_CXMIN = 28 'Minimum width of window
  SM_CYMIN = 29 'Minimum height of window
  SM_CXSIZE = 30 'Width of title bar bitmaps
  SM_CYSIZE = 31 'height of title bar bitmaps
  SM_CXMINTRACK = 34 'Minimum tracking width of window
  SM_CYMINTRACK = 35 'Minimum tracking height of window
  SM_CXDOUBLECLK = 36 'double click width
  SM_CYDOUBLECLK = 37 'double click height
  SM_CXICONSPACING = 38 'width between desktop icons
  SM_CYICONSPACING = 39 'height between desktop icons
  SM_MENUDROPALIGNMENT = 40 'Zero if popup menus are aligned to the left of the memu bar item. True if it is aligned to the right.
  SM_PENWINDOWS = 41 'The handle of the pen windows DLL if loaded.
  SM_DBCSENABLED = 42 'True if double byte characteds are enabled
  SM_CMOUSEBUTTONS = 43 'Number of mouse buttons.
  SM_CMETRICS = 44 'Number of system metrics
  SM_CLEANBOOT = 67 'Windows 95 boot mode. 0 = normal, 1 = safe, 2 = safe with network
  SM_CXMAXIMIZED = 61 'default width of win95 maximised window
  SM_CXMAXTRACK = 59 'maximum width when resizing win95 windows
  SM_CXMENUCHECK = 71 'width of menu checkmark bitmap
  SM_CXMENUSIZE = 54 'width of button on menu bar
  SM_CXMINIMIZED = 57 'width of rectangle into which minimised windows must fit.
  SM_CYMAXIMIZED = 62 'default height of win95 maximised window
  SM_CYMAXTRACK = 60 'maximum width when resizing win95 windows
  SM_CYMENUCHECK = 72 'height of menu checkmark bitmap
  SM_CYMENUSIZE = 55 'height of button on menu bar
  SM_CYMINIMIZED = 58 'height of rectangle into which minimised windows must fit.
  SM_CYSMCAPTION = 51 'height of windows 95 small caption
  SM_MIDEASTENABLED = 74 'Hebrw and Arabic enabled for windows 95
  SM_NETWORK = 63 'bit o is set if a network is present.
  SM_SECURE = 44 'True if security is present on windows 95 system
  SM_SLOWMACHINE = 73 'true if machine is too slow to run win95.
GetSystemMetrics - 用法
  GetSystemMetrics函数可以获取系统分辨率,但这只是其功能之一,GetSystemMetrics函数只有一个参数,称之为「索引」,这个索引有75个 标识符,通过设置不同的标识符就可以获取系统分辨率、 窗体显示区域的宽度和高度、滚动条的宽度和高度。
  为了使使GetSystemMetrics的功能,我们以获取系统分辨率为例,并将其中的两个值用TextOut输出到窗体中。
  第一步:用GetSystemMetrics获取屏幕的宽度和高度
  1.intx, y;
  2.x = GetSystemMetrics(SM_CXSCREEN);//屏幕宽度
  3.y = GetSystemMetrics(SM_CYSCREEN);//屏幕高度
  第二步:用TextOut输出分辨率
  因为x和y的值是int类型,所以无法用TextOut直接输出,需要借助wsprintf函数,在C中,可以用printf函数直接将字符串输出到屏幕上,但wsprintf是将字符串输出到一个char字符 数组中,而且wsprintf会返回输出字符串的长度。
  1.TCHARszBuffer[10];
  2.intx =1024;
  3.inty =768;
  4.intiLength;
  5.iLength = wsprintf(szBuffer, TEXT("%5d"),x);
  小提示:szBuffer数组的长度一定要大于x的长度,否则不能输出。
  以上这段代码,是用wsprintf将x的值存入szBuffer中,然后在iLength中存放x的长度。这一步实际上解决了两个问题,将int类型的屏幕宽度转为了TCHAR类型,TextOut函数可以直接输出TCHAR类型字符串,而且获取了字符串的长度,那么我们就可以用TextOut函数在窗体中输出屏幕的宽度:
  TextOut(hdc, 0, 0, szBuffer, iLength);

一个是 X 方向,一个是 Y 方向
SM_CXSIZE,SM_CYSIZE 以像素计算的标题栏按钮的尺寸,应该是指整体的尺寸,而不是一个按钮的。
建议你自己编写代码试试,看看实际返回的数值就能知道它的含义。

qq_28254507
ProgJ 如果是整体尺寸的话。。那这里重绘图标的时候用GetSystemMetrics(SM_CXSIZE)就不对了吧?
大约 4 年之前 回复
qq_28254507
ProgJ //准备重绘图标 m_rtIcon.left = GetSystemMetrics(SM_CXFRAME); m_rtIcon.top = GetSystemMetrics(SM_CYFRAME); m_rtIcon.right = m_rtIcon.left + GetSystemMetrics(SM_CXSIZE); m_rtIcon.bottom = m_rtIcon.top + GetSystemMetrics(SM_CYSIZE);
大约 4 年之前 回复
qq_28254507
ProgJ //准备重绘图标 m_rtIcon.left = GetSystemMetrics(SM_CXFRAME); m_rtIcon.top = GetSystemMetrics(SM_CYFRAME); m_rtIcon.right = m_rtIcon.left + GetSystemMetrics(SM_CXSIZE); m_rtIcon.bottom = m_rtIcon.top + GetSystemMetrics(SM_CYSIZE);
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于MFC ribbon界面全屏的问题
想实现ribbon界面全屏,代码: ``` void CMainFrame::FullScreenModeOn() { m_wndRibbonBar.ShowWindow(SW_HIDE);//隐藏工具栏 m_wndStatusBar.ShowWindow(SW_HIDE);//隐藏状态栏 //隐藏菜单栏 SetMenu(NULL); // 保存以前的位置信息 GetWindowRect(&m_mainRect); // 去除主窗口的标题 LONG style=::GetWindowLong(m_hWnd,GWL_STYLE); style&=~WS_CAPTION; ::SetWindowLong(m_hWnd,GWL_STYLE,style); //得到当前系统的分辨率 int screenx=GetSystemMetrics(SM_CXSCREEN); int screeny=GetSystemMetrics(SM_CYSCREEN); // 全屏显示 SetWindowPos(NULL,-4,-4,screenx+8,screeny+8,SWP_NOZORDER); style=::GetWindowLong(this->m_hWnd,GWL_STYLE); } 调用此函数实现全屏后,由于还没实现退出全屏,我就强行关闭了软件 后面修改代码在oncreate函数里调用退出全屏函数: void CMainFrame::FullScreenModeOff() { //恢复窗口标题 LONG style=::GetWindowLong(m_hWnd,GWL_STYLE); style|=WS_CAPTION; ::SetWindowLong(m_hWnd,GWL_STYLE,style); //如果需要,显示工具栏 m_wndRibbonBar.ShowWindow(SW_SHOW); //如果需要,显示状态栏 m_wndStatusBar.ShowWindow(SW_SHOW); //恢复窗口以前的大小 MoveWindow(&m_mainRect); //恢复菜单栏 this->SetMenu(&m_menuMainWnd); } 退出全屏后也看不到ribbon界面了,只剩下一个标题栏,而且我将该项目删除之后重新新建一个 名字相同的mfc office的单文档程序,直接跑出来也是看不到ribbon界面,只有一个标题栏
MFC全屏显示代码的解释?
void CMainFrame::OnFullScreen() { CRect WindowRect; GetWindowRect(&WindowRect); CRect ClientRect; RepositionBars(0,0xffff,AFX_IDW_PANE_FIRST,reposQuery,&ClientRect); ClientToScreen(&ClientRect); //获取屏幕的分辨率 int nFullWidth=GetSystemMetrics(SM_CXSCREEN); int nFullHeight=GetSystemMetrics(SM_CYSCREEN); m_FullScreenRect.left=WindowRect.left-ClientRect.left; m_FullScreenRect.top=WindowRect.top-ClientRect.top; m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth; m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight; //进入全屏显示状态 WINDOWPLACEMENT wndpl; wndpl.rcNormalPosition=m_FullScreenRect; SetWindowPlacement(&wndpl); } MFC中全屏显示增加的一个函数,RepositionBars(0,0xffff,AFX_IDW_PANE_FIRST,reposQuery,&ClientRect); 的作用是什么,谁帮帮我解释下这个函数的作用,特别是每个参数,AFX_IDW_PANE_FIRST的含义?
关于C++MFC项目的问题
1>------ 已启动生成: 项目: MFC_DEMO, 配置: Debug Win32 ------ 1>LINK : fatal error LNK1104: 无法打开文件“libucrtd.lib” 新人求大神解答!感激不尽 ![图片说明](https://img-ask.csdn.net/upload/201512/23/1450859712_526636.png) 错误如上,还望大神指正!下方是MFC_DEMODlg的代码 #include "stdafx.h" #include "MFC_DEMO.h" #include "MFC_DEMODlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 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() // CMFC_DEMODlg 对话框 CMFC_DEMODlg::CMFC_DEMODlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_MFC_DEMO_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMFC_DEMODlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMFC_DEMODlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, &CMFC_DEMODlg::OnBnClickedButton1) END_MESSAGE_MAP() // CMFC_DEMODlg 消息处理程序 BOOL CMFC_DEMODlg::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); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMFC_DEMODlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CMFC_DEMODlg::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 CMFC_DEMODlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CMFC_DEMODlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 IplImage *image = NULL; if (image)cvReleaseImage(&image); image= cvLoadImage("D:\\demo.jpg", 1); DrawPicToHDC(image, IDC_STATIC); } void CMFC_DEMODlg::DrawPicToHDC(IplImage *img, UINT ID) { CDC* pDC=GetDlgItem(ID)->GetDC(); HDC hDC = pDC->GetSafeHdc(); CRect rect; GetDlgItem(ID)->GetClientRect(&rect); CvvImage cimg; cimg.CopyOf(cimg); cimg.DrawToHDC(hDC, &rect); ReleaseDC(pDC); }
MFC对话框添加背景图片的问题
按照大家的帮助,我在OnPaint函数中添加如下代码: void CsaoleiDlg::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 { CPaintDC dc(this); CDC memdc; memdc.CreateCompatibleDC(&dc); CBitmap bkg; bkg.LoadBitmap(IDB_BITMAP1); BITMAP bkginfo; bkg.GetBitmap(&bkginfo); memdc.SelectObject(&bkg); RECT rect; GetWindowRect(&rect);//获取对话框信息 dc.StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,0,0,bkginfo.bmWidth,bkginfo.bmHeight,SRCCOPY); //CDialogEx::OnPaint(); } } 结果如下:`![CSDN移动问答][1] 求问大家怎么把button以及static的背景(灰色)也弄成小黄人背景呢?谢谢! ` [1]: http://my.csdn.net/my/album/detail/1748411
基于MFC做的音乐播放器,新手,不知道问什么调试了没有声音
void Load(HWND hWnd, CString strFilepath)//将文件路径传输给MCI_OPEN_PAPMS { m_hWnd = hWnd; mciSendCommand(DeviceId, MCI_CLOSE, 0, 0); //在加载文件前先清空上一次播放的设备 mciopenparms.lpstrElementName = strFilepath; //将音乐文件路径传给设备 DWORD dwReturn; if (dwReturn = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_WAIT, (DWORD)(LPVOID)&mciopenparms)) { //如果打开玩家失败,将出错信息储存在buffer,并显示出错警告 //char buffer[256]; //获取错误码对应的错误信息 //弹出错误信息提示对话框 } DeviceId = mciopenparms.wDeviceID; //打开文件成功就关联文件到设备 } void Cmfc_music_playerDlg::OnBnClickedfilechoice() { // TODO: 在此添加控件通知处理程序代码 char szFileFilter[] = "mp3文件(*.mp3)|*.mp3|" "wma文件(*.wma)|*.wma|" "wav文件(*.wav)|*.wav|" "所有文件(*.*)|*.*|";//文件类型 CFileDialog dlg(true, NULL, NULL, OFN_HIDEREADONLY, szFileFilter); if (dlg.DoModal() == IDOK) { CString strFilepath = dlg.GetPathName();//返回文件路径 CString strFilename = dlg.GetFileName();//返回文件名 SetDlgItemText(IDC_filename, strFilename); Load(this->m_hWnd, strFilepath); } GetDlgItem(IDC_play)->EnableWindow(true); //文件读取成功时所有按钮变成可选 GetDlgItem(IDC_pause)->EnableWindow(true);//控制按钮的显示 GetDlgItem(IDC_stop)->EnableWindow(true); } //播放 void play() { MCI_PLAY_PARMS mciplayparms; mciplayparms.dwCallback = (DWORD)m_hWnd; mciplayparms.dwFrom = 0; //每次播放都是从0开始播放 mciSendCommand(DeviceId, MCI_PLAY, MCI_FROM | MCI_NOTIFY, (DWORD)(LPVOID)&mciplayparms); } //暂停 void pause() { mciSendCommand(DeviceId, MCI_PAUSE, 0, 0); } //恢复 void resume() { mciSendCommand(DeviceId, MCI_RESUME, 0, 0); } //停止 void stop() { mciSendCommand(DeviceId, MCI_STOP, 0, 0);//当点击停止按钮时,将所有的信息都清除掉 mciSendCommand(DeviceId, MCI_CLOSE, 0, 0);//点关闭按钮的时候,清除设备信息,再点播放按钮,就播放不了音乐了 //当点击停止按钮时,将所有的信息都清除掉 } //设置音量 DWORD setVolume(DWORD vol) { MCI_DGV_SETAUDIO_PARMS setvolume; //设置音量的参数结构体 setvolume.dwCallback = NULL; // setvolume.dwItem = MCI_DGV_SETAUDIO_VOLUME; //动作是设置音量 setvolume.dwValue = vol; //音量值是vol mciSendCommand(DeviceId, MCI_SETAUDIO, MCI_DGV_SETAUDIO_ITEM | MCI_DGV_SETAUDIO_VALUE, (DWORD)(LPVOID)&setvolume); return 0; } class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // Cmfc_music_playerDlg 对话框 Cmfc_music_playerDlg::Cmfc_music_playerDlg(CWnd* pParent /*=NULL*/) : CDialogEx(Cmfc_music_playerDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_int = 0; } void Cmfc_music_playerDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_SLIDER1, m_slider); // DDX_Slider(pDX, IDC_SLIDER1, m_int); DDX_Text(pDX, IDC_vol, m_int); } BEGIN_MESSAGE_MAP(Cmfc_music_playerDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_EN_CHANGE(IDC_filename, &Cmfc_music_playerDlg::OnChangeFilename) ON_BN_CLICKED(IDC_pause, &Cmfc_music_playerDlg::OnClickedPause) ON_BN_CLICKED(IDC_play, &Cmfc_music_playerDlg::OnClickedPlay) ON_BN_CLICKED(IDC_stop, &Cmfc_music_playerDlg::OnClickedStop) ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER1, &Cmfc_music_playerDlg::OnCustomdrawSlider) ON_BN_CLICKED(IDC_filechoice, &Cmfc_music_playerDlg::OnBnClickedfilechoice) ON_EN_CHANGE(IDC_vol, &Cmfc_music_playerDlg::OnEnChangevol) ON_BN_CLICKED(IDC_exitbt, &Cmfc_music_playerDlg::OnBnClickedexitbt) END_MESSAGE_MAP() // Cmfc_music_playerDlg 消息处理程序 BOOL Cmfc_music_playerDlg::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_slider.SetRange(0, 1000); //滑动条的移动范围 0~1000 m_slider.SetPos(500); //滑动条的指针处置位置为500,代表初试音量为500 GetDlgItem(IDC_play)->EnableWindow(false); //文件没有读取时所有按钮不可选 GetDlgItem(IDC_pause)->EnableWindow(false); GetDlgItem(IDC_stop)->EnableWindow(false); // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void Cmfc_music_playerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void Cmfc_music_playerDlg::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 Cmfc_music_playerDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void Cmfc_music_playerDlg::OnChangeFilename() { /** TODO: 如果该控件是 RICHEDIT 控件,它将不 发送此通知,除非重写 CDialogEx::OnInitDialog() 函数并调用 CRichEditCtrl().SetEventMask(), 同时将 ENM_CHANGE 标志“或”运算到掩码中。 TODO: 在此添加控件通知处理程序代码*/ } //播放按钮 void Cmfc_music_playerDlg::OnClickedPlay() { // TODO: 在此添加控件通知处理程序代码 play(); SetDlgItemText(IDC_pause, "暂停"); } //暂停和恢复按钮 void Cmfc_music_playerDlg::OnClickedPause() { // TODO: 在此添加控件通知处理程序代码 CString strTemp; GetDlgItemText(IDC_pause, strTemp); //获取按钮的状态 if (strTemp.Compare("暂停") == 0) { pause(); SetDlgItemText(IDC_pause,"恢复"); } if (strTemp.Compare("恢复") == 0) { resume(); SetDlgItemText(IDC_pause, "暂停"); } } //停止按钮 void Cmfc_music_playerDlg::OnClickedStop() { // TODO: 在此添加控件通知处理程序代码 stop(); SetDlgItemText(IDC_pause, "暂停"); } //GetDlgItem(IDC_play)->EnableWindow(false); //当按下stop的时候,播放和暂停不可选 //GetDlgItem(IDC_pause)->EnableWindow(false); void Cmfc_music_playerDlg::OnCustomdrawSlider(NMHDR *pNMHDR, LRESULT *pResult) { UpdateData(true); m_int = m_slider.GetPos() / 10; setVolume(m_slider.GetPos()); UpdateData(false); //LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR); // TODO: 在此添加控件通知处理程序代码 *pResult = 0; } void Cmfc_music_playerDlg::OnEnChangevol() { // TODO: 如果该控件是 RICHEDIT 控件,它将不 // 发送此通知,除非重写 CDialogEx::OnInitDialog() // 函数并调用 CRichEditCtrl().SetEventMask(), // 同时将 ENM_CHANGE 标志“或”运算到掩码中。 // TODO: 在此添加控件通知处理程序代码 } void Cmfc_music_playerDlg::OnBnClickedexitbt() { // TODO: 在此添加控件通知处理程序代码 CDialog::OnCancel(); //退出 } HRESULT Cmfc_music_playerDlg::accDoDefaultAction(VARIANT varChild) { // TODO: 在此添加专用代码和/或调用基类 return CDialogEx::accDoDefaultAction(varChild); } ```
用VS2010.。里MFC编程基于对话框动态绘图的问题
主要是3个问题(注意是VS2010!!) 我初学MFC 我想要主要实现的功能是 在对话框里添加背景图 并在背景图上动态根据坐标画线,并且图和线都随着对话框大小的改变对应按比例改变。。 1。在我的绘图过程中 最后一段线 就是从N-1到N段 没有画出来 我这里取的是N=12段 共13个点,只有拖拽或者最大化对话框的时候才出现。。; 2。每当画完(不包括缺失的最后一段)时,会出现一个从原点到N-1点的直线(我本意的线可以从坐标点里看出),并且与我本意的线同时出现; 3。我所画的线不随对话框大小改变而改变,包括最大化 拉伸和压缩。可能是我没搞清楚这些点是在什么坐标系下的,但是貌似要ScreenToClient() 也没用。。这是我最纠结的问题。 4.另外CSDN问答不会加图片。。。那种什么链接格式的添加图片法 不懂哎。。 求大神指导,最好有代码例子 或是对我的程序的指导的建议,最好不要对我的代码大动干戈。。。能实现功能就好。 下面是我的代码,中文注释之间的乱码可以无视,应该不影响看代码 这是头文件 // 789Dlg.h : 头文件 // #pragmaonce #include"activexcontrol1.h" // CMy789Dlg 对?话¡ã框¨° class CMy789Dlg : public CDialogEx { // 构1造¨¬ public: CMy789Dlg(CWnd* pParent = NULL); // 标À¨º准Á?构1造¨¬函¡¥数ºy int hua; // 对?话¡ã框¨°数ºy据Y enum { IDD = IDD_MY789_DIALOG }; protected: virtualvoid DoDataExchange(CDataExchange* pDX); // DDX/DDV 支¡ì持? // 实º¦Ì现? protected: HICON m_hIcon; // 生成的消息映射函数 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 BOOL OnEraseBkgnd(CDC* pDC); CRect rect; afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg void OnBnClickedButton1(); //afx_msg void InvalidateRect(); afx_msg void OnBnClickedOk(); }; 下面cpp文件 // 789Dlg.cpp : 实º¦Ì现?文?件t // #include"stdafx.h" #include"789.h" #include"789Dlg.h" #include"afxdialogex.h" #ifdef _DEBUG #definenew DEBUG_NEW #endif // 用®?于®¨²应®|用®?程¨¬序¨°“¡ã关?于®¨²”¡À菜?单Ì£¤项?的Ì? CAboutDlg 对?话¡ã框¨° class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对?话¡ã框¨°数ºy据Y enum { IDD = IDD_ABOUTBOX }; protected: virtualvoid DoDataExchange(CDataExchange* pDX); // DDX/DDV 支¡ì持? // 实º¦Ì现? protected: DECLARE_MESSAGE_MAP() public: afx_msg BOOL OnEraseBkgnd(CDC* pDC); }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) ON_WM_ERASEBKGND() END_MESSAGE_MAP() // CMy789Dlg 对?话¡ã框¨° CMy789Dlg::CMy789Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(CMy789Dlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMy789Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); //DDX_Control(pDX, IDC_ACTIVEXCONTROL1, m_aaa); } BEGIN_MESSAGE_MAP(CMy789Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_ERASEBKGND() ON_WM_TIMER() ON_BN_CLICKED(IDC_BUTTON1, &CMy789Dlg::OnBnClickedButton1) ON_BN_CLICKED(IDOK, &CMy789Dlg::OnBnClickedOk) END_MESSAGE_MAP() // CMy789Dlg 消?息¡é处ä|理¤¨ª程¨¬序¨° BOOL CMy789Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将?“¡ã关?于®¨²...”¡À菜?单Ì£¤项?添¬¨ª加¨®到Ì?系¦Ì统ª3菜?单Ì£¤中D。¡ê // IDM_ABOUTBOX 必À?须?在¨²系¦Ì统ª3命¨¹令¢?范¤?围¡ì内¨²。¡ê 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); } } // 设¦¨¨置?此ä?对?话¡ã框¨°的Ì?图ª?标À¨º。¡ê当Ì¡À应®|用®?程¨¬序¨°主¡Â窗ä¡ã口¨²不?是º?对?话¡ã框¨°时º¡À,ê?框¨°架¨¹将?自Á?动¡¥ // 执¡ä行D此ä?操¨´作Á¡Â SetIcon(m_hIcon, TRUE); // 设¦¨¨置?大䨮图ª?标À¨º SetIcon(m_hIcon, FALSE); // 设¦¨¨置?小?图ª?标À¨º // TODO: 在¨²此ä?添¬¨ª加¨®额?外ªa的Ì?初?始º?化¡¥代䨲码? hua=-1; return TRUE; // 除y非¤?将?焦1点Ì?设¦¨¨置?到Ì?控?件t,ê?否¤?则¨°返¤¦Ì回? TRUE } void CMy789Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如¨?果?向¨°对?话¡ã框¨°添¬¨ª加¨®最Á?小?化¡¥按ã¡ä钮£¤,ê?则¨°需¨¨要°a下?面?的Ì?代䨲码? // 来¤¡ä绘?制?该?图ª?标À¨º。¡ê对?于®¨²使º1用®?文?档̦Ì/视º¨®图ª?模¡ê型¨ª的Ì? MFC 应®|用®?程¨¬序¨°,ê? // 这a将?由®¨¦框¨°架¨¹自Á?动¡¥完ª¨º成¨¦。¡ê void CMy789Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用®?于®¨²绘?制?的Ì?设¦¨¨备À?上¦?下?文? SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使º1图ª?标À¨º在¨²工¡è作Á¡Â区?矩?形?中D居¨®中D 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 { //Invalidate(); //UpdateWindow(); CPaintDC dc(this); // 用®?于®¨²绘?制?的Ì?设¦¨¨备À?上¦?下?文? CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP4); BITMAP bmp; bitmap.GetBitmap(&bmp); CDC dcCompatible; //CDC* pDC; dcCompatible.CreateCompatibleDC(&dc); dcCompatible.SelectObject(&bitmap); //CRect rect; GetClientRect(&rect); //GetUpdateRect(&rect); //pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); //return CDialogEx::OnEraseBkgnd(pDC); this->GetClientRect(&rect); CDC *pDC=GetDC();//=pwnd->GetDC(); ScreenToClient(rect); int a[100]={0,10,20,30,40,50,60,70,80,90,100,110,250};//x int b[100]={0,10,20,30,40,50,50,70,80,90,100,110,250};//y int height=rect.Height(); int width=rect.Width(); CPen pen1; CPen *oldPen; pen1.CreatePen(PS_SOLID,2,RGB(192,192,2));//创ä¡ä建¡§对?象¨® oldPen=dc.SelectObject(&pen1);//将?画-笔À¨º选?入¨?设¦¨¨备À?描¨¨述º?表À¨ª,ê?并¡é保À¡ê存ä?旧¨¦的Ì?画-笔À¨º int i=-1; for(i=-1;i<=hua;i++) { int x=a[i]; int y=b[i]; int x1=a[i+1]; int y1=b[i+1]; dc.MoveTo(x,y);//定¡§义°?起e点Ì? dc.LineTo(x1,y1);//线?的Ì?终?点Ì? }; pDC->SelectObject(oldPen);//将?以°?前¡ã的Ì?画-笔À¨º选?入¨?设¦¨¨备À?描¨¨述º?表À¨ª''''''*/ Invalidate(); CDialogEx::OnPaint(); } } //当Ì¡À用®?户¡ì拖ª?动¡¥最Á?小?化¡¥窗ä¡ã口¨²时º¡À系¦Ì统ª3调Ì¡Â用®?此ä?函¡¥数ºy取¨?得Ì?光a标À¨º //显?示º?。¡ê HCURSOR CMy789Dlg::OnQueryDragIcon() { returnstatic_cast<HCURSOR>(m_hIcon); } BOOL CAboutDlg::OnEraseBkgnd(CDC* pDC) { // TODO: 在¨²此ä?添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?和¨ª/或¨°调Ì¡Â用®?默?认¨?值¦Ì return CDialogEx::OnEraseBkgnd(pDC); } BOOL CMy789Dlg::OnEraseBkgnd(CDC* pDC) { // TODO: 在¨²此ä?添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?和¨ª/或¨°调Ì¡Â用®?默?认¨?值¦Ì //CRect rect; //CBitmap bitmap; //bitmap.LoadBitmap(IDB_BITMAP3); //BITMAP bmp; //bitmap.GetBitmap(&bmp); //// //CDC dcCompatible; ////CDC* pDC; //dcCompatible.CreateCompatibleDC(pDC); // dcCompatible.SelectObject(&bitmap); // //CRect rect; // GetClientRect(&rect); // //GetUpdateRect(&rect); // //pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY); // pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); //////return CDialogEx::OnEraseBkgnd(pDC); // int a[100];//x // int b[100];//y // int height=rect.Height(); // int width=rect.Width(); // // //GetUpdateRect(&rect); // return (TRUE); } void CMy789Dlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在¨²此ä?添¬¨ª加¨®消?息¡é处ä|理¤¨ª程¨¬序¨°代䨲码?和¨ª/或¨°调Ì¡Â用®?默?认¨?值¦Ì //CMy789Dlg::OnPaint(); ++hua; if (hua>11) { KillTimer(1); }; InvalidateRect(rect,true); CDialogEx::OnTimer(nIDEvent); } void CMy789Dlg::OnBnClickedButton1() { SetTimer(1, 1000, NULL); hua=0;// TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? } void CMy789Dlg::OnBnClickedOk() { // TODO: 在¨²此ä?添¬¨ª加¨®控?件t通ª¡§知a处ä|理¤¨ª程¨¬序¨°代䨲码? CDialogEx::OnOK(); } 求大神!!!!!! [1]: http://
MFC中使用Update(FALSE)后变量不更新显示新的值
各位大佬麻烦帮忙看一下,放了一个static text的控件,在对话框中添加了下拉框的消息的处理函数,想要调用UpdateData(FALSE)函数将变量m_DriveType的值更新到界面上,但是运行后什么都没有。。 ``` // File1Dlg.cpp : 实现文件 // #include "stdafx.h" #include "File1.h" #include "File1Dlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CFile1Dlg 对话框 CFile1Dlg::CFile1Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(CFile1Dlg::IDD, pParent) , m_DriverType(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CFile1Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO1, m_drive); DDX_Text(pDX, IDC_STATIC1, m_DriverType); } BEGIN_MESSAGE_MAP(CFile1Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_OK, &CFile1Dlg::OnBnClickedOk) ON_CBN_SELCHANGE(IDC_COMBO1, &CFile1Dlg::OnCbnSelchangeComboDrive) END_MESSAGE_MAP() // CFile1Dlg 消息处理程序 BOOL CFile1Dlg::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); // 设置小图标 // TODO: 在此添加额外的初始化代码 //第一次调用 size_t alldrive=::GetLogicalDriveStrings(0,NULL); _TCHAR *driverstr; driverstr=new _TCHAR[alldrive+sizeof(_T(""))]; //printf("AllDrivesize is: %d\r\n",alldrive); //第二次调用 size_t twosize=GetLogicalDriveStrings(alldrive,driverstr); CString DriveLetter; for(int i=0;i<alldrive/4;i++) { DriveLetter=driverstr+i*4; m_drive.InsertString(i,DriveLetter.GetBuffer()); } m_drive.SetCurSel(0); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CFile1Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CFile1Dlg::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 CFile1Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CFile1Dlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CString strDrive; m_drive.GetWindowTextW(strDrive); this->MessageBox(strDrive.GetBuffer()); OnOK(); } void CFile1Dlg::OnCbnSelchangeComboDrive() { // TODO: 在此添加控件通知处理程序代码 CString m_DriveType; CString strDrive; int now=m_drive.GetCurSel(); m_drive.GetLBText(now,strDrive); // not // m_Drive.GetWindowText(strDrive); int retCode = ::GetDriveType(strDrive); switch (retCode) { case DRIVE_UNKNOWN: m_DriveType = "驱动器类型:未知"; break; case DRIVE_NO_ROOT_DIR: m_DriveType = "类型:驱动器根路径错误"; break; case DRIVE_REMOVABLE:// 2 m_DriveType = "类型:可移动磁盘驱动器"; break; case DRIVE_FIXED:// 3 m_DriveType = "类型:固定磁盘驱动器"; break; case DRIVE_REMOTE: m_DriveType = "类型:网络磁盘驱动器"; break; case DRIVE_CDROM: m_DriveType = "类型:CD-ROM"; break; case DRIVE_RAMDISK: m_DriveType = "类型:RAM"; break; default: m_DriveType = "类型:未知"; break; } UpdateData(FALSE); } ``` ![图片说明](https://img-ask.csdn.net/upload/201909/25/1569421005_977279.png) ![图片说明](https://img-ask.csdn.net/upload/201909/25/1569421041_644529.png) ps.变量类型是value还是control会影响UpdateData(FALSE)的调用吗??
在vs2010中利用mfc写一个连连看游戏时各种资源窗口啥的等都报“未声明的标识符”问题
写这个连连看游戏刚开始导入各种资源文件改好ID后运行正常,但通过进一步的编程后不知道为什么开始报各种”未声明的标识符“bug(可能中途改了一些什么设置.....),现项目最近运行的log文件如下: ``` 生成启动时间为 2016/5/26 17:37:08。 1>项目“C:\Users\Aliez\documents\visual studio 2010\Projects\Lianliankan\LLK\LLK.vcxproj”在节点 2 上(build 个目标)。 1>InitializeBuildStatus: 正在对“Debug\LLK.unsuccessfulbuild”执行 Touch 任务。 ClCompile: 所有输出均为最新。 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\CL.exe /c /ZI /nologo /W3 /WX- /Od /Oy- /D WIN32 /D _WINDOWS /D _DEBUG /D _UNICODE /D UNICODE /D _AFXDLL /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Yc"StdAfx.h" /Fp"Debug\LLK.pch" /Fo"Debug\\" /Fd"Debug\vc100.pdb" /Gd /TP /analyze- /errorReport:prompt stdafx.cpp stdafx.cpp C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\CL.exe /c /ZI /nologo /W3 /WX- /Od /Oy- /D WIN32 /D _WINDOWS /D _DEBUG /D _UNICODE /D UNICODE /D _AFXDLL /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Yu"StdAfx.h" /Fp"Debug\LLK.pch" /Fo"Debug\\" /Fd"Debug\vc100.pdb" /Gd /TP /analyze- /errorReport:prompt GameControl.cpp GameDlg.cpp GameLogic.cpp LLK.cpp LLKDlg.cpp LLKDlg.cpp 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.h(14): error C2065: “IDD_LLK_DIALOG”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.h(14): error C2146: 语法错误: 缺少“;”(在标识符“m_GameC”的前面) 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.h(14): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.h(14): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.h(17): error C2065: “IDD_GAME_DIALOG”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(23): error C2065: “IDD_ABOUTBOX”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(54): error C2065: “IDR_MAINFRAME”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(66): error C2065: “IDC_BTN_BASIC”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(66): error C2065: “IDC_BTN_BASIC”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(67): error C2065: “IDC_BTN_BASIC”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(67): error C2065: “IDC_BTN_BASIC”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(79): error C2065: “IDM_ABOUTBOX”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(79): error C2065: “IDM_ABOUTBOX”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(80): error C2065: “IDM_ABOUTBOX”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(87): error C2065: “IDS_ABOUTBOX”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(92): error C2065: “IDM_ABOUTBOX”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(108): error C2065: “IDM_ABOUTBOX”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\llkdlg.cpp(161): error C2065: “IDB_MAIN_BG”: 未声明的标识符 LLK.cpp GameLogic.cpp 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamelogic.cpp(15): error C2653: “CGameControl”: 不是类或命名空间名称 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamelogic.cpp(15): error C2065: “s_nRows”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamelogic.cpp(16): error C2653: “CGameControl”: 不是类或命名空间名称 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamelogic.cpp(16): error C2065: “s_nCols”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamelogic.cpp(17): error C2653: “CGameControl”: 不是类或命名空间名称 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamelogic.cpp(17): error C2065: “s_nPicNum”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamelogic.cpp(70): error C2653: “CGameControl”: 不是类或命名空间名称 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamelogic.cpp(70): error C2065: “s_nRows”: 未声明的标识符 GameDlg.cpp 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.h(14): error C2146: 语法错误: 缺少“;”(在标识符“m_GameC”的前面) 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.h(14): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.h(14): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.h(17): error C2065: “IDD_GAME_DIALOG”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(32): error C2065: “IDB_Game_BG”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(41): error C2065: “IDC_BTN_START”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(41): error C2065: “IDC_BTN_START”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(54): error C2065: “IDR_MAINFRAME”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(55): error C2065: “IDR_MAINFRAME”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(109): error C2065: “CGameControl”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(109): error C2146: 语法错误: 缺少“;”(在标识符“ctr”的前面) 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(109): error C2065: “ctr”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(110): error C2065: “ctr”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(110): error C2228: “.StartGame”的左边必须有类/结构/联合 类型是“'unknown-type'” 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(116): error C2653: “CGameControl”: 不是类或命名空间名称 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(116): error C2065: “s_nRows”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(117): error C2653: “CGameControl”: 不是类或命名空间名称 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(117): error C2065: “s_nCols”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(125): error C2065: “m_GameC”: 未声明的标识符 1>c:\users\Aliez\documents\visual studio 2010\projects\lianliankan\llk\gamedlg.cpp(125): error C2228: “.GetElement”的左边必须有类/结构/联合 类型是“'unknown-type'” GameControl.cpp 正在生成代码... 1>已完成生成项目“C:\Users\Aliez\documents\visual studio 2010\Projects\Lianliankan\LLK\LLK.vcxproj”(build 个目标)的操作 - 失败。 生成失败。 已用时间 00:00:15.03 ``` 有关LLKDlg.cpp代码如下: ``` // LLKDlg.cpp : 实现文件 // #include "stdafx.h" #include "LLKDlg.h" #include "afxdialogex.h" #include <afxwin.h> #include "GameDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD =IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CLLKDlg 对话框 CLLKDlg::CLLKDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CLLKDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CLLKDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CLLKDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BTN_BASIC, &CLLKDlg::OnBnClickedBtnBasic) ON_BN_CLICKED(IDC_BTN_BASIC, &CLLKDlg::OnBnClickedBtnBasic) END_MESSAGE_MAP() // CLLKDlg 消息处理程序 BOOL CLLKDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 InitBackground(); // 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); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CLLKDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) ==IDM_ABOUTBOX)//IDM_ABOUTBOX { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CLLKDlg::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 {//创建CPanitDC对象 CPaintDC dc(this); dc.BitBlt(0,0,800,600,&m_dcMem,0,0,SRCCOPY);//绘制背景图片 CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CLLKDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CLLKDlg::InitBackground() { CClientDC dc(this);//获得对话框的视频内存 CBitmap bmpMain; bmpMain.LoadBitmap(IDB_MAIN_BG); m_dcMem.CreateCompatibleDC(&dc);//创建与视频内存兼容的内存DC m_dcMem.SelectObject(bmpMain);//将位图组员选入DC //调整窗口大小 CRect rtWin; CRect rtClient; this->GetWindowRect(rtWin);//获得窗口大小 this->GetClientRect(rtClient);//获得客户区大小 //标题栏和外边框的大小 int nSpanWidth = rtWin.Width()-rtClient.Width(); int nSpanHeight = rtWin.Height()-rtClient.Height(); //设置窗口大小 MoveWindow(0,0,800+nSpanWidth,600 + nSpanHeight); CenterWindow(); } void CLLKDlg::OnBnClickedBtnBasic() { // TODO: 在此添加控件通知处理程序代码 CDialogEx::ShowWindow(SW_HIDE); CGameDlg dlg; dlg.DoModal(); } ``` ![图片说明](https://img-ask.csdn.net/upload/201605/26/1464256700_607782.png) 总之希望解决这里各种报”未声明的标识符“问题,有关资源ID我都已经改过与代码中一致了,然而....... 因为老师布置作业要求入了mfc这个坑,请各位前辈菊苣指教,万分感谢.....
急!MFC强制重绘问题 ::SendMessage()
``` void CEmailSettingDlg::OnBnClickedOk() { UpdateData(1); CEmailManagementDlg *pdlg = (CEmailManagementDlg*)AfxGetApp()->GetMainWnd(); if (m_str_BackGround == "蒲公英") m_str_BackGround = "1"; if (m_str_BackGround == "书") m_str_BackGround = "2"; if (m_str_BackGround == "天空") m_str_BackGround = "3"; if (m_str_BackGround == "秦时明月") m_str_BackGround = "4"; //刷新显示新的背景 CString temp = pdlg->m_backGround; //暂存原背景图数据 pdlg->m_backGround = m_str_BackGround; ** ::SendMessage(pdlg->m_hWnd, WM_PAINT, 0, 0);** //UpdateWindow(); pdlg->m_backGround = temp; //如果设置没变,则不需要打开数据库(出于效率考虑) if (!(m_str_AutoReply == pdlg->m_auto_reply && m_str_BackGround == pdlg->m_backGround)) { CString temp; temp.Format("update user_psw_tab set auto_reply = '%s', back_ground = %d where user_name = '%s'", m_str_AutoReply, atoi(m_str_BackGround), pdlg->m_str_UserName); TRACE(temp); pdlg->m_db.ExecuteSQL(temp); AfxMessageBox("更新成功!"); } CDialogEx::OnOK(); } ``` ``` void CEmailManagementDlg::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 { CPaintDC dc(this); // 用于绘制的设备上下文 CRect rc; GetClientRect(&rc); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; switch (atoi(m_backGround)) { case 1: bmpBackground.LoadBitmap(IDB_BITMAP_FLOWER); break; case 2: bmpBackground.LoadBitmap(IDB_BITMAP_BOOK); break; case 3: bmpBackground.LoadBitmap(IDB_BITMAP_SKY); break; case 4: bmpBackground.LoadBitmap(IDB_BITMAP_QIN); break; } BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap* pbmpPri = dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0, 0, rc.Width(), rc.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY); //CDialogEx::OnPaint(); //这句需要去掉 } } ``` 我想实现实时切换 CEmailManagementDlg的背景 CEmailSettingDlg设置背景数据,点击确定后去刷新CEmailManagementDlg的背景 但是调试发现尽管SendMessage消息以后进入了CEmailManagementDlg的OnPaint函数,但是语句执行完以后并没有改变背景,请问我哪里错了吗。。
新手MFC求教,我用MFC做了一个用HOOK的电脑用录制回放器但是出完错后运行法相用不了。
能帮我看看哪有问题吗 // MFCApplication2Dlg.cpp : 实现文件 // #include "stdafx.h" #include "MFCApplication2.h" #include "MFCApplication2Dlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 HHOOK hHook; CTypedPtrList<CPtrList,EVENTMSG*> EventMsgList; class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CMFCApplication2Dlg 对话框 CMFCApplication2Dlg::CMFCApplication2Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(CMFCApplication2Dlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMFCApplication2Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDOK, &CMFCApplication2Dlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON3, &CMFCApplication2Dlg::OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON2, &CMFCApplication2Dlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication2Dlg::OnBnClickedButton1) END_MESSAGE_MAP() // CMFCApplication2Dlg 消息处理程序 BOOL CMFCApplication2Dlg::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); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMFCApplication2Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CMFCApplication2Dlg::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 CMFCApplication2Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CMFCApplication2Dlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CDialogEx::OnOK(); } void CMFCApplication2Dlg::OnBnClickedButton3() { hHook =SetWindowsHookEx( WH_JOURNALRECORD, (HOOKPROC)JournalRecordProc, AfxGetApp()->m_hInstance, 0 ); // TODO: 在此添加控件通知处理程序代码 } void CMFCApplication2Dlg::OnBnClickedButton2() { UnhookWindowsHookEx(hHook); // TODO: 在此添加控件通知处理程序代码 } void CMFCApplication2Dlg::OnBnClickedButton1() { hHook=SetWindowsHookEx( WH_JOURNALPLAYBACK, (HOOKPROC)JounralPlaybackProc, AfxGetApp()->m_hInstance, 0 ); // TODO: 在此添加控件通知处理程序代码 } //LRESULT CMFCApplication2Dlg::JournalRecordPro(void) //{ // return LRESULT CALLBACK(); //} LRESULT CALLBACK CMFCApplication2Dlg::JournalRecordProc(int nCode,WPARAM wparam,LPARAM lparam) { if (nCode<0) return CallNextHookEx(NULL,nCode,wparam,lparam); EVENTMSG*pmsg=(EVENTMSG*)lparam; switch(nCode) { case HC_ACTION: {EVENTMSG * pEventMsg =new EVENTMSG; memcpy(pEventMsg,pmsg,sizeof(EVENTMSG)); EventMsgList.AddTail(pEventMsg);} break; case HC_SYSMODALOFF: break; case HC_SYSMODALON: break; } } LRESULT CALLBACK CMFCApplication2Dlg::JounralPlaybackProc(int nCode,WPARAM wparam,LPARAM lparam) { static unsigned i=0; static BOOL bFlag =TRUE; EVENTMSG*pMsg; POSITION pos; DWORD PreTime,NowTime; switch (nCode) { case HC_SKIP: bFlag =TRUE; i++; break; case HC_GETNEXT: if(i>=EventMsgList.GetCount()-2) { i=0; UnhookWindowsHookEx(hHook); AfxMessageBox(_T("回放完毕!")); } pos=EventMsgList.FindIndex(i); pMsg=EventMsgList.GetAt(pos); memcpy((LPEVENTMSG)lparam,pMsg,sizeof(EVENTMSG)); if((i)!=0 && bFlag==TRUE) { bFlag=FALSE; NowTime=pMsg->time; pos=EventMsgList.FindIndex(i-1); pMsg=EventMsgList.GetAt(pos); PreTime=pMsg->time; return NowTime-PreTime; } else return 0; break; default: return CallNextHookEx(NULL,nCode,wparam,lparam); } return 0; } 调试后框里出来的东西: “MFCApplication2.exe”(Win32): 已加载“E:\PJB\MFCApplication2\Debug\MFCApplication2.exe”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\kernel32.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\mfc110ud.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\msvcr110d.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\user32.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.9600.17784_none_a9f497a901334c74\comctl32.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\oleaut32.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\gdi32.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\msvcrt.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\combase.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\rpcrt4.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\sspicli.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\cryptbase.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\sechost.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\bcryptprimitives.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\imm32.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\msctf.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\advapi32.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\shlwapi.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\ole32.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\shell32.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\uxtheme.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\dwmapi.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\kernel.appcore.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\SHCore.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Users\Saber\AppData\Roaming\TaobaoProtect\TaobaoProtectSE.dll”。无法查找或打开 PDB 文件。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\psapi.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\crypt32.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\version.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\sfc.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\msasn1.dll”。已加载符号。 “MFCApplication2.exe”(Win32): 已加载“C:\Windows\SysWOW64\sfc_os.dll”。已加载符号。 程序“[10192] MFCApplication2.exe”已退出,返回值为 2 (0x2)。
新手做了个MFC程序程序,调试界面能出来了,但是按按钮没反应,弄了几天了。
新手做了个MFC程序程序,出错提示全改后运行,点击按钮没反应,只有界面显示,能帮我看看吗,弄了好几天了。 // MFCApplication2Dlg.cpp : 实现文件 // #include "stdafx.h" #include "MFCApplication2.h" #include "MFCApplication2Dlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 HHOOK hHook; CTypedPtrList<CPtrList,EVENTMSG*> EventMsgList; class CAboutDlg : public CDialogEx { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CMFCApplication2Dlg 对话框 CMFCApplication2Dlg::CMFCApplication2Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(CMFCApplication2Dlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMFCApplication2Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDOK, &CMFCApplication2Dlg::OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON3, &CMFCApplication2Dlg::OnBnClickedButton3) ON_BN_CLICKED(IDC_BUTTON2, &CMFCApplication2Dlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication2Dlg::OnBnClickedButton1) END_MESSAGE_MAP() // CMFCApplication2Dlg 消息处理程序 BOOL CMFCApplication2Dlg::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); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMFCApplication2Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CMFCApplication2Dlg::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 CMFCApplication2Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CMFCApplication2Dlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CDialogEx::OnOK(); } void CMFCApplication2Dlg::OnBnClickedButton3() { hHook =SetWindowsHookEx( WH_JOURNALRECORD, (HOOKPROC)JournalRecordProc, AfxGetApp()->m_hInstance, 0 ); // TODO: 在此添加控件通知处理程序代码 } void CMFCApplication2Dlg::OnBnClickedButton2() { UnhookWindowsHookEx(hHook); // TODO: 在此添加控件通知处理程序代码 } void CMFCApplication2Dlg::OnBnClickedButton1() { hHook=SetWindowsHookEx( WH_JOURNALPLAYBACK, (HOOKPROC)JounralPlaybackProc, AfxGetApp()->m_hInstance, 0 ); // TODO: 在此添加控件通知处理程序代码 } //LRESULT CMFCApplication2Dlg::JournalRecordPro(void) //{ // return LRESULT CALLBACK(); //} LRESULT CALLBACK CMFCApplication2Dlg::JournalRecordProc(int nCode,WPARAM wparam,LPARAM lparam) { if (nCode<0) return CallNextHookEx(NULL,nCode,wparam,lparam); EVENTMSG*pmsg=(EVENTMSG*)lparam; switch(nCode) { case HC_ACTION: {EVENTMSG * pEventMsg =new EVENTMSG; memcpy(pEventMsg,pmsg,sizeof(EVENTMSG)); EventMsgList.AddTail(pEventMsg);} break; case HC_SYSMODALOFF: break; case HC_SYSMODALON: break; } } LRESULT CALLBACK CMFCApplication2Dlg::JounralPlaybackProc(int nCode,WPARAM wparam,LPARAM lparam) { static unsigned i=0; static BOOL bFlag =TRUE; EVENTMSG*pMsg; POSITION pos; DWORD PreTime,NowTime; switch (nCode) { case HC_SKIP: bFlag =TRUE; i++; break; case HC_GETNEXT: if(i>=EventMsgList.GetCount()-2) { i=0; UnhookWindowsHookEx(hHook); AfxMessageBox(_T("回放完毕!")); } pos=EventMsgList.FindIndex(i); pMsg=EventMsgList.GetAt(pos); memcpy((LPEVENTMSG)lparam,pMsg,sizeof(EVENTMSG)); if((i)!=0 && bFlag==TRUE) { bFlag=FALSE; NowTime=pMsg->time; pos=EventMsgList.FindIndex(i-1); pMsg=EventMsgList.GetAt(pos); PreTime=pMsg->time; return NowTime-PreTime; } else return 0; break; default: return CallNextHookEx(NULL,nCode,wparam,lparam); } return 0; } // MFCApplication2Dlg.h : 头文件 // #pragma once // CMFCApplication2Dlg 对话框 class CMFCApplication2Dlg : public CDialogEx { // 构造 public: CMFCApplication2Dlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据 enum { IDD = IDD_MFCAPPLICATION2_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: HICON m_hIcon; // 生成的消息映射函数 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 OnBnClickedButton3(); afx_msg void OnBnClickedButton2(); afx_msg void OnBnClickedButton1(); static LRESULT CALLBACK JournalRecordProc(int nCode,WPARAM wparam,LPARAM lparam); static LRESULT CALLBACK JounralPlaybackProc(int nCode,WPARAM wparam,LPARAM lparam); 这两句是我在.h上加的用来申明全局函数。 };
MFC 错误 LNK2001 无法解析的外部符号
// SerialTest3Dlg.h : 头文件 // #pragma once #include "afxwin.h" #include "mscomm2.h" #include "stdint.h" #include "stdafx.h" // CSerialTest3Dlg 对话框 class CSerialTest3Dlg : public CDialogEx { // 构造 public: CSerialTest3Dlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_SERIALTEST3_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: HICON m_hIcon; // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() private: CString m_EditReceive;//接收框 CString m_Editsend;//发送框 CComboBox m_comb1;//COM口下拉框 public: CComboBox m_comb2;//波特率下拉框 CMscomm2 m_mscom;//串口控件 afx_msg void OnBnClickedButtonOpen();//打开按钮 afx_msg void OnBnClickedButtonCleanup();//清楚按钮 afx_msg void OnBnClickedButtonClose();//关闭按钮 DECLARE_EVENTSINK_MAP() void OnCommMscomm1();//串口按钮(隐形) CEdit m_Edit; CString m_interpretingdata;//解析数据 afx_msg void OnBnClickedButton5();//发送按钮 }; typedef struct FPGA_INFO_REPORT { uint8_t bWorkMode; //当前工作模式0x00表示初始模式0x01表示扫频模式0x02表示闭环驱动和检测模式0x03表示开环驱动和检测模式0x04表示连续Q值计算模式 uint8_t bCheckMode; //当前检测类型0x01表示开环检测0x02表示闭环检测调试0x03表示闭环检测0x04表示正交校正模式 uint8_t bADMagTimes; //检测信号放大倍数 uint32_t dwSweepTime; //扫频完成时间,毫秒 float fSweepFreq; //扫频得到的谐振频率 float fSweepFreqAmpl; //扫频谐振频率对应的驱动反馈信号幅值 float fDriSignalFreq; //驱动信号频率 float fDriSignalAmpl; //驱动信号幅度 float fDriveFbAmpl; //驱动反馈信号幅度 float fDriveFbPhase; //驱动反馈信号相位 float fBalSignalAmpl; //力平衡信号幅度 float fBalSignalPhase; //力平衡信号相位 float fCheckSignalAmpl; //检测信号幅度 float fCheckSignalPhase; //检测信号相位 float fCheckSignalPalst; //角速度 }FPGA_INFO_REPORT1; // SerialTest3Dlg.cpp : 实现文件 // #include "stdafx.h" #include "SerialTest3.h" #include "SerialTest3Dlg.h" #include "afxdialogex.h" #include <stdlib.h> #include "parser.h" #include <string.h> #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 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() // CSerialTest3Dlg 对话框 CSerialTest3Dlg::CSerialTest3Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_SERIALTEST3_DIALOG, pParent) , m_EditReceive(_T("")) , m_Editsend(_T("")) , m_interpretingdata(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CSerialTest3Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_Rev, m_EditReceive); DDX_Text(pDX, IDC_EDIT_Tev, m_Editsend); DDX_Control(pDX, IDC_COMBO2, m_comb1); DDX_Control(pDX, IDC_COMBO3, m_comb2); DDX_Control(pDX, IDC_MSCOMM2, m_mscom); DDX_Control(pDX, IDC_EDIT_Rev, m_Edit); DDX_Text(pDX, IDC_EDIT16, m_interpretingdata); } BEGIN_MESSAGE_MAP(CSerialTest3Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_OPEN, &CSerialTest3Dlg::OnBnClickedButtonOpen) ON_BN_CLICKED(IDC_BUTTON_CLEANUP, &CSerialTest3Dlg::OnBnClickedButtonCleanup) ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CSerialTest3Dlg::OnBnClickedButtonClose) //ON_BN_CLICKED(IDC_BUTTON1, &CSerialTest3Dlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON5, &CSerialTest3Dlg::OnBnClickedButton5) END_MESSAGE_MAP() // CSerialTest3Dlg 消息处理程序 BOOL CSerialTest3Dlg::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); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 串口选择组合框 CString str; int i; for (i = 0; i < 5; i++) { str.Format(_T("com %d"), i + 1); m_comb1.InsertString(i, str); } m_comb1.SetCurSel(0);//预置COM口 // 波特率选择组合框 CString str1[] = { _T("4800"),_T("9600"),_T("19200"),_T("38400"),_T("43000"),_T("56000"),_T("57600"),_T("115200") }; for (int i = 0; i < 8; i++) { int judge_tf = m_comb2.AddString(str1[i]); if ((judge_tf == CB_ERR) || (judge_tf == CB_ERRSPACE)) MessageBox(_T("build baud error!")); } m_comb2.SetCurSel(7);//预置波特率为"115200" return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CSerialTest3Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CSerialTest3Dlg::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 CSerialTest3Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CSerialTest3Dlg::OnBnClickedButtonOpen()//打开串口 按钮程序 { // TODO: 在此添加控件通知处理程序代码 CString str, str1, n; //定义字符串 GetDlgItemText(IDC_BUTTON_OPEN, str); CWnd *h1; h1 = GetDlgItem(IDC_BUTTON_OPEN); //指向控件的caption if (!m_mscom.get_PortOpen()) { m_comb2.GetLBText(m_comb2.GetCurSel(), str1);//取得所选的字符串,并存放在str1里面 str1 = str1 + ',' + 'n' + ',' + '8' + ',' + '1'; //这句话很关键 m_mscom.put_CommPort((m_comb1.GetCurSel() + 1)); //选择串口 m_mscom.put_InputMode(1); //设置输入方式为二进制方式 m_mscom.put_Settings(str1); //波特率为(波特率组合框)无校验,8数据位,1个停止位 m_mscom.put_InputLen(1024); //设置当前接收区数据长度为1024 m_mscom.put_RThreshold(1); //缓冲区一个字符引发事件 m_mscom.put_RTSEnable(1); //设置RT允许 m_mscom.put_PortOpen(true); //打开串口 if (m_mscom.get_PortOpen()) { str = _T("关闭串口"); UpdateData(true); h1->SetWindowText(str); //改变按钮名称为“关闭串口” } } else { m_mscom.put_PortOpen(false); if (str != _T("打开串口")) { str = _T("打开串口"); UpdateData(true); h1->SetWindowText(str); //改变按钮名称为打开串口 } } } void CSerialTest3Dlg::OnBnClickedButtonCleanup()//清除数据按钮 { // TODO: 在此添加控件通知处理程序代码 m_EditReceive = _T(""); //给接收编辑框发送空格符 UpdateData(false); //更新数据 } void CSerialTest3Dlg::OnBnClickedButtonClose()//退出按钮 { // TODO: 在此添加控件通知处理程序代码 m_EditReceive = _T(""); //给接收编辑框发送空格符 UpdateData(false); //更新数据 } BEGIN_EVENTSINK_MAP(CSerialTest3Dlg, CDialogEx) ON_EVENT(CSerialTest3Dlg, IDC_MSCOMM2, 1, CSerialTest3Dlg::OnCommMscomm1, VTS_NONE) END_EVENTSINK_MAP() //CString temp; void CSerialTest3Dlg::OnCommMscomm1()//串口控件(按钮) { // TODO: 在此处添加消息处理程序代码 if (m_mscom.get_CommEvent() == 2) { char str[2048] = { 0 }; long k; CString temp; VARIANT InputData = m_mscom.get_Input(); //读缓冲区 COleSafeArray fs; fs = InputData; //VARIANT型变量转换为COleSafeArray型变量 for (k = 0; k < fs.GetOneDimSize(); k++) { fs.GetElement(&k, str + k); //转换为BYTE型数组 temp.Format(L"%02X",(char*)(str + k));//输出显示16进制 m_EditReceive += temp; // 接收到数据显示在编辑框里面 } SetTimer(1,10,NULL); //延时10ms UpdateData(false); m_Edit.SetSel(-1, 1); this->SetDlgItemTextW(IDC_EDIT_Rev, m_EditReceive);//将接收框内容显示到最后位置 m_Edit.LineScroll(m_Edit.GetLineCount() - 1, 0);//将垂直滚动条滚动到最后一行 FPGA_INFO_REPORT1 info; memcpy(&info, str, sizeof(str)); CString str2; str2.Format(L"当前工作模式:%c\n", info.bWorkMode, "当前检测类型:%c\n", info.bCheckMode, "检测信号放大倍数:%c\n", info.bADMagTimes, "扫频完成时间:%c\n", info.dwSweepTime, "扫频得到的谐振频率:%f\n", info.fSweepFreq, "扫频谐振频率对应的驱动反馈信号幅值:%f\n", info.fSweepFreqAmpl, "驱动信号频率:%f\n", info.fDriSignalFreq, "驱动信号幅度:%f\n", info.fDriSignalAmpl, "驱动反馈信号幅度:%f\n", info.fDriveFbAmpl, "力平衡信号幅度:%f\n", info.fBalSignalAmpl, "力平衡信号相位:%f\n", info.fBalSignalPhase, "检测信号幅度:%f\n", info.fCheckSignalAmpl, "检测信号相位:%f\n", info.fCheckSignalPhase, "角速度:%f\n", info.fCheckSignalPalst); m_interpretingdata =str2; } } void CSerialTest3Dlg::OnBnClickedButton5() { // TODO: 在此添加控件通知处理程序代码 UpdateData(true); //更新控件数据 m_mscom.put_Output(COleVariant(m_Editsend));//把发送编辑框的数据发送出去 } 以上代码报错 :错误 LNK2001 无法解析的外部符号 "public: virtual struct CRuntimeClass * __thiscall CMscomm2::GetRuntimeClass(void)const " (?GetRuntimeClass@CMscomm2@@UBEPAUCRuntimeClass@@XZ) SerialTest3 C:\Users\LFY\Desktop\SerialTest3\SerialTest3\SerialTest3Dlg.obj 1 是什么原因
使用VC调用别人用Delphi做的动态库访问冲突且无法加载请问是什么原因呢?
因为最近要做个PC与PLC通信的软件,因此在网上找到一个人用Delphi写的PLC通信dll库,应该是32位。我用VC2015写了个MFC要调用这个dll发现总是提示访问冲突,调用失败。因为有其他人是写图像处理的,环境必须要用VC 2015。但是和那个人联系他说其他人用了是没问题的,我因为是刚开始学这个软件,也没有dll源码,不知道问题出在哪。下面是我程序的源码,其他dll内函数声明我都还没用,只是用LoadlibraryA发现就已经失败了。**如果有朋友能在32位(64位更好)的C++ MFC环境下解决并调试成功的话,必有感谢。** 引用线内部分是我添加的,其他都是向导生成的。附件里面有调用的库。 ![图片说明](https://img-ask.csdn.net/upload/201911/21/1574305525_943286.png) dll地址:h1ttps://pan.baidu.com/s/1chKfBqmRsmDmvfMqt31RNg ``` // MFC-PLC21Dlg.cpp : 实现文件 // #include "stdafx.h" #include "MFC-PLC21.h" #include "MFC-PLC21Dlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif ///////////////////////////////////////////////////////////////// HINSTANCE hinstDLL; typedef int(_stdcall *pOpen)(int nport, int BaudRate, int DataBits, char* Parity, int StopBits, char* User); typedef int(_stdcall *pClose)(int nport); typedef int(_stdcall *pSetDelay)(int value); typedef int(_stdcall *pComTrue)(int nport); typedef int(_stdcall *pComWork)(int nport); typedef int(_stdcall *pReadBit)(int nport, int node, char* element, int address, int Bit); typedef int(_stdcall *pReadByte)(int nport, int node, char* element, int address, int Count, int* RxdBuffer); typedef int(_stdcall *pReadInt)(int nport, int node, char* element, int address, int Count, int* RxdBuffer); typedef int(_stdcall *pReadDInt)(int nport, int node, char* element, int address, int Count, int* RxdBuffer); typedef int(_stdcall *pReadFloat)(int nport, int node, char* element, int address, int Count, float* RxdBuffer); typedef int(_stdcall *pBitWrite)(int nport, int node, char* element, int address, int Bit, int value); typedef int(_stdcall *pBitEWrite)(int nport, int node, char* element, int address, int Bit, int value); typedef int(_stdcall *pEbitCancel)(int nport, int node, char* element, int address, int Bit); typedef int(_stdcall *pWriteByte)(int nport, int node, char* element, int address, int Count, int* TxdBuffer); typedef int(_stdcall *pWriteInt)(int nport, int node, char* element, int address, int Count, int* TxdBuffer); typedef int(_stdcall *pWriteDInt)(int nport, int node, char* element, int address, int Count, int* TxdBuffer); typedef int(_stdcall *pWriteFloat)(int nport, int node, char* element, int address, int Count, float* TxdBuffer); typedef int(_stdcall *pPlcRun)(int nport, int node); typedef int(_stdcall *pPlcStop)(int nport, int node); typedef int(_stdcall *pBitBin)(int value, int Bitaddress); typedef int(_stdcall *p16I_8h)(int value); typedef int(_stdcall *p16I_8l)(int value); typedef int(_stdcall *p8I_16I)(int valueH, int valueL); typedef int(_stdcall *p32I_16h)(int value); typedef int(_stdcall *p32I_16l)(int value); typedef int(_stdcall *p16I_32I)(int valueH, int valueL); typedef int(_stdcall *p32f_16h)(float value); typedef int(_stdcall *p32f_16l)(float value); typedef float(_stdcall *p16I_32f)(int valueH, int valueL); pOpen mOpen; pClose mClose; pSetDelay mSetDelay; pComTrue mComTrue; pComWork mComWork; pReadBit mReadBit; pReadByte mReadByte; pReadInt mReadInt; pReadDInt mReadDInt; pReadFloat mReadFloat; pBitWrite mBitWrite; pBitEWrite mBitEWrite; pEbitCancel mEbitCancel; pWriteByte mWriteByte; pWriteInt mWriteInt; pWriteDInt mWriteDInt; pWriteFloat mWriteFloat; pPlcRun mPlcRun; pPlcStop mPlcStop; pBitBin mBitBin; p16I_8h m16I_8h; p16I_8l m16I_8l; p8I_16I m8I_16I; p32I_16h m32I_16h; p32I_16l m32I_16l; p16I_32I m16I_32I; p32f_16h m32f_16h; p32f_16l m32f_16l; p16I_32f m16I_32f; /////////////////////////////////////////////////////////////// // 用于应用程序“关于”菜单项的 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() // CMFCPLC21Dlg 对话框 CMFCPLC21Dlg::CMFCPLC21Dlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_MFCPLC21_DIALOG, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMFCPLC21Dlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMFCPLC21Dlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(Test, &CMFCPLC21Dlg::OnBnClickedTest) END_MESSAGE_MAP() // CMFCPLC21Dlg 消息处理程序 BOOL CMFCPLC21Dlg::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); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMFCPLC21Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CMFCPLC21Dlg::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 CMFCPLC21Dlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } ///////////////////////////////////////////////////////////////////// void CMFCPLC21Dlg::OnBnClickedTest() { // TODO: 在此添加控件通知处理程序代码 hinstDLL = LoadLibraryA("S7200_PPI.dll"); if (hinstDLL) { mOpen = (pOpen)GetProcAddress(hinstDLL, "S7200ComOpen"); mClose = (pClose)GetProcAddress(hinstDLL, "S7200ComClose"); mSetDelay = (pSetDelay)GetProcAddress(hinstDLL, "S7200SetDelay"); mComTrue = (pComTrue)GetProcAddress(hinstDLL, "S7200ComTrue"); mComWork = (pComWork)GetProcAddress(hinstDLL, "S7200ComWork"); mReadBit = (pReadBit)GetProcAddress(hinstDLL, "S7200BitRead"); mReadByte = (pReadByte)GetProcAddress(hinstDLL, "S7200ByteRead"); mReadInt = (pReadInt)GetProcAddress(hinstDLL, "S7200WordRead"); mReadDInt = (pReadDInt)GetProcAddress(hinstDLL, "S7200DwordRead"); mReadFloat = (pReadFloat)GetProcAddress(hinstDLL, "S7200FloatRead"); mBitWrite = (pBitWrite)GetProcAddress(hinstDLL, "S7200BitWrite"); mBitEWrite = (pBitEWrite)GetProcAddress(hinstDLL, "S7200BitEWrite"); mEbitCancel = (pEbitCancel)GetProcAddress(hinstDLL, "S7200EbitCancel"); mWriteByte = (pWriteByte)GetProcAddress(hinstDLL, "S7200ByteWrite"); mWriteInt = (pWriteInt)GetProcAddress(hinstDLL, "S7200WordWrite"); mWriteDInt = (pWriteDInt)GetProcAddress(hinstDLL, "S7200DwordWrite"); mWriteFloat = (pWriteFloat)GetProcAddress(hinstDLL, "S7200FloatWrite"); mPlcRun = (pPlcRun)GetProcAddress(hinstDLL, "S7200PlcRun"); mPlcStop = (pPlcStop)GetProcAddress(hinstDLL, "S7200PlcStop"); mBitBin = (pBitBin)GetProcAddress(hinstDLL, "DecBitBin"); m16I_8h = (p16I_8h)GetProcAddress(hinstDLL, "Int16ToInt_8h"); m16I_8l = (p16I_8l)GetProcAddress(hinstDLL, "Int16ToInt_8l"); m8I_16I = (p8I_16I)GetProcAddress(hinstDLL, "Int8ToInt16"); m32I_16h = (p32I_16h)GetProcAddress(hinstDLL, "Int32ToInt_16h"); m32I_16l = (p32I_16l)GetProcAddress(hinstDLL, "Int32ToInt_16l"); m16I_32I = (p16I_32I)GetProcAddress(hinstDLL, "Int16ToInt32"); m32f_16h = (p32f_16h)GetProcAddress(hinstDLL, "Float32ToInt_16h"); m32f_16l = (p32f_16l)GetProcAddress(hinstDLL, "Float32ToInt_16l"); m16I_32f = (p16I_32f)GetProcAddress(hinstDLL, "Int16ToFloat32"); AfxMessageBox(L"S7200_PPI.dll已成功载入!"); } else { AfxMessageBox(L"没找到S7200_PPI.dll!"); SendMessage(WM_CLOSE); } } /////////////////////////////////////////////////////////// ```
VS2003 MFC 语音播报程序始终中断
基于VS2003,建立了一个MFC界面,上面只有一个按钮,功能是希望点击摁钮后发出文字语音。 网上了解到应使用Microsoft Speech SDK进行开发,方法如下完全按链接: http://blog.csdn.net/jmxiaocai/article/details/7036033 http://blog.csdn.net/hxmcnu/article/details/12444675 在SoundtestDlg.cpp中编写程序如下: // SoundtestDlg.cpp : 实现文件 ``` // SoundtestDlg.cpp : 实现文件 // #include "stdafx.h" #include "Soundtest.h" #include "SoundtestDlg.h" #include ".\soundtestdlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CSoundtestDlg 对话框 CSoundtestDlg::CSoundtestDlg(CWnd* pParent /*=NULL*/) : CDialog(CSoundtestDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CSoundtestDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CSoundtestDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) END_MESSAGE_MAP() // CSoundtestDlg 消息处理程序 BOOL CSoundtestDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将\“关于...\”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非设置了控件的焦点,否则返回 TRUE } void CSoundtestDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CSoundtestDlg::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 { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标显示。 HCURSOR CSoundtestDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CSoundtestDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 ISpVoice* pVoice; ::CoInitialize(NULL); HRESULT hr =CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL,IID_ISpVoice, (void **)&pVoice); CString strText="语音测试";//引号是朗读的话 可以是中文 hr = pVoice->Speak(strText.AllocSysString(), 0, NULL); pVoice->Release(); pVoice = NULL; CoUninitialize(); } ``` 其中 ``` #include <sapi.h> #include <sphelper.h> #include <spuihelp.h> #pragma comment(lib,"ole32.lib") //CoInitialize CoCreateInstance需要调用ole32.dll #pragma comment(lib,"sapi.lib") //sapi.lib在SDK的lib目录,必需正确配置 ``` 等头文件写在了SoundtestDlg.h中 结果编译没有问题,但运行时,一旦我点击摁钮,就会发生如下问题,使程序中断,同时并没有发出任何声音: ![图片说明](https://img-ask.csdn.net/upload/201703/15/1489589703_816228.png) 不明白其中的原因何在,是否有可能是我 speech sdk 工具包安装存在问题?亦或是其他原因?
用VC的MFC如何实现图中的查找替换功能?(基本对话框)越简单越好,急!
用VC的MFC如何实现图中的查找替换功能!![图片说明](https://img-ask.csdn.net/upload/201607/05/1467713926_170555.png) 最好是用Replace函数的 // newDlg.cpp : implementation file // #include "stdafx.h" #include "new.h" #include "newDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CNewDlg dialog CNewDlg::CNewDlg(CWnd* pParent /*=NULL*/) : CDialog(CNewDlg::IDD, pParent) { //{{AFX_DATA_INIT(CNewDlg) m_txt = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CNewDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CNewDlg) DDX_Text(pDX, IDC_EDIT1, m_txt); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CNewDlg, CDialog) //{{AFX_MSG_MAP(CNewDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_save, Onsave) ON_BN_CLICKED(IDC_resave, Onresave) ON_BN_CLICKED(IDC_FindReplace, OnFindReplace) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CNewDlg message handlers BOOL CNewDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } void CNewDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CNewDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CNewDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CNewDlg::Onsave() { // TODO: Add your control notification handler code here TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"); // 构造打开文件对话框 CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this); CString strFilePath; // 显示打开文件对话框 if (IDOK == fileDlg.DoModal()) { // 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里 strFilePath = fileDlg.GetPathName(); // SetDlgItemText(IDC_BUTTON1, strFilePath); } AfxMessageBox("保存成功!"); } void CNewDlg::Onresave() { // TODO: Add your control notification handler code here TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"); // 构造打开文件对话框 CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this); CString strFilePath; // 显示打开文件对话框 if (IDOK == fileDlg.DoModal()) { // 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里 strFilePath = fileDlg.GetPathName(); // SetDlgItemText(IDC_BUTTON1, strFilePath); } } void CNewDlg::OnFindReplace() { // TODO: Add your control notification handler code here } 该怎样添加函数
新人求教,我用mfc做了一个tcp fin的端口扫描器,死后得不出结果,求大神帮忙找出问题
cpp文件 // scanDlg.cpp : implementation file // #include "stdafx.h" #include "scan.h" #include "scanDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CAboutDlg dialog used for App About class CAboutDlg : public CDialogEx { public: CAboutDlg(); // Dialog Data enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CscanDlg dialog CscanDlg::CscanDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CscanDlg::IDD, pParent) , m_star_port(_T("")) , m_end_port(_T("")) , m_IP(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CscanDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_list); DDX_Text(pDX, IDC_EDIT2, m_star_port); DDX_Text(pDX, IDC_EDIT3, m_end_port); DDX_Text(pDX, IDC_EDIT1, m_IP); } BEGIN_MESSAGE_MAP(CscanDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1, &CscanDlg::OnBnClickedButton1) END_MESSAGE_MAP() // CscanDlg message handlers BOOL CscanDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. 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); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } hostent* CscanDlg::g_pHost = 0; SOCKET CscanDlg::sock = 0; void CscanDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CscanDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CscanDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CscanDlg::OnBnClickedButton1() { // TODO: Add your control notification handler code here send_revc((LPSTR)(LPCTSTR)m_IP,(LPSTR)(LPCTSTR)m_star_port,(LPSTR)(LPCTSTR)m_end_port,&m_list);//char ch1[],char tr1[],char tr2[] } void CscanDlg ::send_revc(char ch1[],char tr1[],char tr2[],CListBox* m_list) { WSADATA WSAData; WSAStartup(MAKEWORD(2,2), &WSAData); sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);//定义套接字 BOOL flag = true; setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag)); char sLocalName[64]; gethostname((char*)sLocalName, sizeof(sLocalName)-1); g_pHost = gethostbyname(sLocalName); sockaddr_in addr_local; addr_local.sin_addr = *(in_addr *)g_pHost->h_addr_list[0]; //绑定到本地网卡,INADDR_ANY不行 addr_local.sin_family = AF_INET;// addr_local.sin_port = htons(SOURCE_PORT); bind(sock, (PSOCKADDR)&addr_local, sizeof(sockaddr_in));//绑套接字 DWORD dwValue = 1; SADDR sAddr; USHORT int1,int2; sAddr.m_destip=ch1; sAddr.m_starpost=atoi(tr1); sAddr.m_endpost=atoi(tr2); ioctlsocket(sock, SIO_RCVALL, &dwValue); int nTimeOut = 500;//设置超时 setsockopt(sock,SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOut, sizeof(nTimeOut)); HANDLE threads[2];//开双线程 threads[0] = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)revcfunc,(LPVOID)m_list,0,NULL); threads[1] = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)sendfunc,(LPVOID)(&sAddr), 0,NULL); WaitForMultipleObjects(2,threads,FALSE,INFINITE); } USHORT CscanDlg ::checksumfunc(USHORT *buffer, int size)//检验和函数 { unsigned long cksum=0; while(size >1) { cksum+=*buffer++; size -=sizeof(USHORT); } if(size) { cksum += *(UCHAR*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(~cksum); } void CscanDlg ::sendfunc(SADDR* sAddr ) { IP_HEADER ipHeader; TCP_HEADER tcpHeader; PSD_HEADER psdHeader; char Sendto_Buff[MAX_BUFF_LEN]; //发送缓冲区 unsigned short check_Buff[MAX_BUFF_LEN]; //检验和缓冲区 const char tcp_send_data[]={"This is my homework of networt,I am happy!"}; BOOL flag; int rect,nTimeOver; //先试一下在外面弄好套接字初始化行不行 flag=true; nTimeOver=1000; //填充IP首部 ipHeader.h_verlen=(IPVER<<4 | sizeof(ipHeader)/sizeof(unsigned long)); ipHeader.tos=(UCHAR)0; ipHeader.total_len=htons((unsigned short)sizeof(ipHeader)+sizeof(tcpHeader)+sizeof(tcp_send_data)); ipHeader.ident=0; //16位标识 ipHeader.frag_and_flags=0; //3位标志位 ipHeader.ttl=128; //8位生存时间 ipHeader.proto=IPPROTO_UDP; //协议类型 ipHeader.checksum=0; //检验和暂时为0 ipHeader.sourceIP=*(int*)g_pHost->h_addr_list[0]; //32位源IP地址可以直接获取 ipHeader.destIP=inet_addr(sAddr->m_destip); //32位目的IP地址 //计算IP头部检验和 memset(check_Buff,0,MAX_BUFF_LEN); memcpy(check_Buff,&ipHeader,sizeof(IP_HEADER)); ipHeader.checksum=checksumfunc(check_Buff,sizeof(IP_HEADER)); //构造TCP伪首部 psdHeader.saddr=ipHeader.sourceIP; psdHeader.daddr=ipHeader.destIP; psdHeader.mbz=0; psdHeader.ptcl=ipHeader.proto; psdHeader.tcpl=htons(sizeof(TCP_HEADER)+sizeof(tcp_send_data)); for(int i=sAddr->m_starpost;i<sAddr->m_endpost;i++) //填充TCP首部 { tcpHeader.th_dport=htons(i); //16位目的端口号 tcpHeader.th_sport=htons(SOURCE_PORT); //16位源端口号 tcpHeader.th_seq=0; //SYN序列号 tcpHeader.th_ack=0; //ACK序列号置为0 //TCP长度和保留位 tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned long)<<4|0); tcpHeader.th_flag=1; //修改这里来实现不同的标志位探测,2是SYN,1是//FIN,16是ACK探测 等等 tcpHeader.th_win=htons((unsigned short)16384); //窗口大小 tcpHeader.th_urp=0; //偏移大小 tcpHeader.th_sum=0; //检验和暂时填为0 //计算TCP校验和 memset(check_Buff,0,MAX_BUFF_LEN); memcpy(check_Buff,&psdHeader,sizeof(psdHeader)); memcpy(check_Buff+sizeof(psdHeader),&tcpHeader,sizeof(tcpHeader)); memcpy(check_Buff+sizeof(PSD_HEADER)+sizeof(TCP_HEADER), tcp_send_data,sizeof(tcp_send_data)); tcpHeader.th_sum=checksumfunc(check_Buff,sizeof(PSD_HEADER)+ sizeof(TCP_HEADER)+sizeof(tcp_send_data)); //填充发送缓冲区 memset(Sendto_Buff,0,MAX_BUFF_LEN); memcpy(Sendto_Buff,&ipHeader,sizeof(IP_HEADER)); memcpy(Sendto_Buff+sizeof(IP_HEADER),&tcpHeader, sizeof(TCP_HEADER)); memcpy(Sendto_Buff+sizeof(IP_HEADER)+sizeof(TCP_HEADER), tcp_send_data,sizeof(tcp_send_data)); int datasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+ sizeof(tcp_send_data); //发送数据报的目的地址 SOCKADDR_IN dest; memset(&dest,0,sizeof(dest)); dest.sin_family=AF_INET; dest.sin_addr.s_addr=inet_addr(sAddr->m_destip); dest.sin_port=htons(i); rect=sendto(sock,Sendto_Buff,datasize, 0,(struct sockaddr*)&dest, sizeof(dest)); } } void CscanDlg ::revcfunc(CListBox* m_list) { CString str; char RecvBuf[MAX_BUFF_LEN]; IP_HEADER* ip; TCP_HEADER* tcp; while(1) { int ret = recv(sock, RecvBuf, MAX_BUFF_LEN, 0); if (ret > 0) { ip = (IP_HEADER*)RecvBuf; tcp = (TCP_HEADER*)(RecvBuf + (ip->h_verlen&0x0f)*4); str.Format(_T("%hu"), tcp->th_sport); m_list->AddString(str); } else str.Format(_T("%d"),ret),m_list->AddString(str); } } 头文件// scanDlg.h : header file // #pragma once #include<winsock2.h> #include<ws2tcpip.h> #include<stdio.h> #pragma comment(lib,"ws2_32.lib") //#define SIO_RCVALL_WSAIOW(IOC_VENDOR,1) #include <stdlib.h> #include <windows.h> #include <time.h> #include "afxwin.h" #define IPVER 4 //IP协议预定 #define MAX_BUFF_LEN 65500 //发送缓冲区最大值 #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) #define SOURCE_PORT 8088 //local TCP segment source port // CscanDlg dialog class CscanDlg : public CDialogEx { // Construction public: CscanDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data enum { IDD = IDD_SCAN_DIALOG }; typedef struct ip_hdr //定义IP首部 { UCHAR h_verlen; //4位首部长度,4位IP版本号 UCHAR tos; //8位服务类型TOS USHORT total_len; //16位总长度(字节) USHORT ident; //16位标识 USHORT frag_and_flags; //3位标志位 UCHAR ttl; //8位生存时间 TTL UCHAR proto; //8位协议 (TCP, UDP 或其他) USHORT checksum; //16位IP首部校验和 ULONG sourceIP; //32位源IP地址 ULONG destIP; //32位目的IP地址 }IP_HEADER; typedef struct tsd_hdr //定义TCP伪首部 { ULONG saddr; //源地址 ULONG daddr; //目的地址 UCHAR mbz; //没用 UCHAR ptcl; //协议类型 USHORT tcpl; //TCP长度 }PSD_HEADER; typedef struct tcp_hdr //定义TCP首部 { USHORT th_sport; //16位源端口 USHORT th_dport; //16位目的端口 ULONG th_seq; //32位序列号 ULONG th_ack; //32位确认号 UCHAR th_lenres; //4位首部长度/6位保留字 UCHAR th_flag; //6位标志位 USHORT th_win; //16位窗口大小 USHORT th_sum; //16位校验和 USHORT th_urp; //16位紧急数据偏移量 }TCP_HEADER; typedef struct SADDR //定义TCP首部 { char* m_destip; USHORT m_starpost; USHORT m_endpost; }; USHORT static checksumfunc(USHORT *buffer, int size); void static sendfunc(SADDR* sAddr); void static revcfunc(CListBox* m_list); void send_revc(char ch1[],char tr1[],char tr2[],CListBox* m_list); SOCKET static sock; //用于收发TCP报文段的全局socket hostent static *g_pHost; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support // Implementation protected: HICON m_hIcon; // Generated message map functions virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: CListBox m_list; afx_msg void OnBnClickedButton1(); CString m_star_port; CString m_end_port; CString m_IP; };
0xC000041D: 用户回调期间遇到未经处理的异常。。
请大神指教一下,调试时****围着部分提示0x010020FF 处有未经处理的异常(在 MFC.exe 中): 0xC000041D: 用户回调期间遇到未经处理的异常。。 MFCDlg.cpp : 实现文件 // #include "stdafx.h" #include "MFC.h" #include "MFCDlg.h" #include "afxdialogex.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 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() // CMFCDlg 对话框 CMFCDlg::CMFCDlg(CWnd* pParent /*=NULL*/) : CDialogEx(IDD_MFC_DIALOG, pParent) , n(0) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMFCDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CMFCDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_Open, &CMFCDlg::OnBnClickedButtonOpen) END_MESSAGE_MAP() // CMFCDlg 消息处理程序 BOOL CMFCDlg::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); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CMFCDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CMFCDlg::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(); HDC hdc; hdc = ::GetDC(m_hWnd); EntityData *pointer; pointer = entity; int i = 0; if (pointer != NULL) { do { ************** ************************************************ MoveToEx(hdc,pointer->data.line.x1, pointer->data.line.y1,NULL); LineTo(hdc,pointer->data.line.x2, pointer->data.line.y2); pointer = pointer->next; ****************************************************************** i++; } while (pointer != NULL); } } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CMFCDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CMFCDlg::OnBnClickedButtonOpen() { CStdioFile file; // TODO: 在此添加控件通知处理程序代码 // 设置过滤器 TCHAR szFilter[] = _T("DXF文件(*.dxf)|*.dxf|所有文件(*.*)|*.*||"); // 构造打开文件对话框 CFileDialog fileDlg(TRUE, _T("dxf"), NULL, 0, szFilter, this); CString strFilePath; // 显示打开文件对话框 if (IDOK == fileDlg.DoModal()) { // 得到我们的选择文件的地址,用于之后的打开文件的操作 strFilePath = fileDlg.GetPathName(); //添加读取这个文件内容的代码,CFile::modeRead是说以只读文件的模式打开 file.Open(strFilePath, CFile::modeRead); /*逐行读取字符串*/ CString szLine; CString strText; while (file.ReadString(szLine)) { strText += szLine; } sscanf(strText, "%d", &code); sscanf(strText, "%s", codevalue); if (code == 2 && strcmp(codevalue, "ENTITIES") == 0) { while (strcmp(codevalue, "ENDSEC")) { sscanf(strText, "%d", &code); sscanf(strText, "%s", codevalue); if (code == 0 && strcmp(codevalue, "LINE") == 0) { entity1 = (EntityData *)malloc(DATASIZE); strcpy(entity1->id, codevalue); sscanf(strText, "%d", &code); while (code) { switch (code) { case 8: sscanf(strText, "%s", codevalue); sscanf(strText, "%d", &code); strcpy(entity1->layer, codevalue); break; case 10: sscanf(strText, "%f", &value); sscanf(strText, "%d", &code); entity1->data.line.x1 = value; break; case 20: sscanf(strText, "%f", &value); sscanf(strText, "%d", &code); entity1->data.line.y1 = value; break; case 30: sscanf(strText, "%f", &value); sscanf(strText, "%d", &code); entity1->data.line.z1 = value; break; case 11: sscanf(strText, "%f", &value); sscanf(strText, "%d", &code); entity1->data.line.x2 = value; break; case 21: sscanf(strText, "%f", &value); sscanf(strText, "%d", &code); entity1->data.line.y2 = value; break; case 31: sscanf(strText, "%f", &value); sscanf(strText, "%d", &code); entity1->data.line.z2 = value; break; default: { sscanf(strText, "%s", codevalue); sscanf(strText, "%d", &code); } } } entity2->next = entity1; entity2 = entity1; } } entity2->next = NULL; } entity = entity->next; } //关闭文件 file.Close(); }
求大神给该段代码详细注解(MFC 俄罗斯方块)
// TetrisDlg.cpp : 实现文件 // #include "stdafx.h" #include "myself.h" #include "Tetris.h" #include "TetrisDlg.h" #include <iostream> #include <math.h> // #include<windows.h> // #include <mmsystem.h>//导入声音头文件 // #pragma comment(lib,"winmm.lib")//导入声音头文件库 using namespace std; #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CTetrisDlg 对话框 CTetrisDlg::CTetrisDlg(CWnd* pParent /*=NULL*/) : CDialog(CTetrisDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTetrisDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CTetrisDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_WM_LBUTTONDOWN() ON_WM_TIMER() ON_WM_KEYDOWN() ON_COMMAND(ID_32771, &CTetrisDlg::On32771) ON_COMMAND(ID_32772, &CTetrisDlg::On32772) ON_COMMAND(ID_32773, &CTetrisDlg::On32773) ON_COMMAND(ID_32775, &CTetrisDlg::On32775) ON_COMMAND(ID_32776, &CTetrisDlg::On32776) ON_COMMAND(ID_32777, &CTetrisDlg::On32777) ON_COMMAND(ID_32779, &CTetrisDlg::On32779) ON_COMMAND(ID_32778, &CTetrisDlg::On32778) END_MESSAGE_MAP() // CTetrisDlg 消息处理程序 BOOL CTetrisDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 srand((unsigned)time(NULL)); my_brush.CreateSolidBrush(RGB(0,0,0)); speed=1; score=0; gamestate=STOP; return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CTetrisDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CTetrisDlg::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 { CRect rect; CPaintDC dc(this); GetClientRect(rect); dc.FillSolidRect(rect,RGB(0,0,0)); CPen pen(PS_SOLID,1,RGB(255,255,255)); pDC=GetDC(); pDC->SelectObject(&pen); //绘制方框区 pDC->MoveTo(MAINFRAME_X-1,MAINFRAME_Y-1); pDC->LineTo(MAINFRAME_X+MAX_COL*SIZE+1,MAINFRAME_Y-1); pDC->LineTo(MAINFRAME_X+MAX_COL*SIZE+1,MAINFRAME_Y+MAX_ROW*SIZE+1); pDC->LineTo(MAINFRAME_X-1,MAINFRAME_Y+MAX_ROW*SIZE+1); pDC->LineTo(MAINFRAME_X-1,MAINFRAME_Y-1); //绘制预览区 pDC->MoveTo(LOOK_X,LOOK_Y); pDC->LineTo(LOOK_X+6*SIZE,LOOK_Y); pDC->LineTo(LOOK_X+6*SIZE,LOOK_Y+6*SIZE); pDC->LineTo(LOOK_X,LOOK_Y+6*SIZE); pDC->LineTo(LOOK_X,LOOK_Y); //绘制文字 pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,0,0)); pDC->TextOut(LOOK_X,LOOK_Y+SIZE*6+20,_T("Score:"),6); pDC->SetTextColor(RGB(0,255,0)); pDC->TextOut(LOOK_X,LOOK_Y+SIZE*6+55,_T("Speed:"),6); //绘制图标 BITMAP bm1; CDC MemDC1; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_PAUSE); my_bitmap.GetObject(sizeof(BITMAP),&bm1); MemDC1.CreateCompatibleDC(pDC); MemDC1.SelectObject(&my_bitmap); pDC->StretchBlt(LOOK_X+45,LOOK_Y+SIZE*6+175,bm1.bmWidth,bm1.bmHeight,&MemDC1,0,0,40,40,SRCCOPY); my_bitmap.DeleteObject(); BITMAP bm2; CDC MemDC2; my_bitmap.LoadBitmap(IDB_START); my_bitmap.GetObject(sizeof(BITMAP),&bm2); MemDC2.CreateCompatibleDC(pDC); MemDC2.SelectObject(&my_bitmap); pDC->StretchBlt(LOOK_X+45,LOOK_Y+SIZE*6+100,bm2.bmWidth,bm2.bmHeight,&MemDC2,0,0,40,40,SRCCOPY); my_bitmap.DeleteObject(); BITMAP bm3; CDC MemDC3; my_bitmap.LoadBitmap(IDB_STOP); my_bitmap.GetObject(sizeof(BITMAP),&bm3); MemDC3.CreateCompatibleDC(pDC); MemDC3.SelectObject(&my_bitmap); pDC->StretchBlt(LOOK_X+45,LOOK_Y+SIZE*6+250,bm3.bmWidth,bm3.bmHeight,&MemDC3,0,0,40,40,SRCCOPY); my_bitmap.DeleteObject(); DrawNextState(LOOK_X,LOOK_Y); for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_STATE_NOT_EMPTY) { BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); pDC->StretchBlt(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,SIZE,SIZE,&MemDC,0,0,SIZE,SIZE,SRCCOPY); my_bitmap.DeleteObject(); } else if (stateMap[i][j]==MAP_FALLING) { BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); pDC->StretchBlt(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); my_bitmap.DeleteObject(); } else { CRect my(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,MAINFRAME_X+j*SIZE+SIZE,MAINFRAME_Y+i*SIZE+SIZE); pDC=GetDC(); pDC->FillRect(my,&my_brush); } } } pDC=GetDC(); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+20,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); pDC=GetDC(); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,0,0)); CString Cscore; Cscore.Format(_T("%d"),score); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+20,Cscore,Cscore.GetLength()); CString Cspeed; switch(speed) { case 1: Cspeed.Format(_T("简单")); break; case 2: Cspeed.Format(_T("一般")); break; case 3: Cspeed.Format(_T("困难")); break; } pDC->SetTextColor(RGB(0,255,0)); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+55,Cspeed,Cspeed.GetLength()); CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CTetrisDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CTetrisDlg::start() { score=0; InitMap(); Produce_NextState(); NexttoActive(); Produce_NextState(); ActivetoMap(); pDC=GetDC(); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,0,0)); CString Cscore; Cscore.Format(_T("%d"),score); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+20,Cscore,Cscore.GetLength()); CString Cspeed; switch(speed) { case 1: Cspeed.Format(_T("简单")); break; case 2: Cspeed.Format(_T("一般")); break; case 3: Cspeed.Format(_T("困难")); break; } pDC->SetTextColor(RGB(0,255,0)); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+55,Cspeed,Cspeed.GetLength()); if (gamestate==OVER) gameover(); } void CTetrisDlg::Produce_NextState() { int Shape=rand()%7; NextColor=rand()%4+1; switch(Shape) //调试中 { case 0: { switch(rand()%4) { case 0: //山条,完成 { NextState[0][0]=2; NextState[0][1]=0; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=1; NextState[3][0]=2; NextState[3][1]=2; break; } case 1: { NextState[0][0]=2; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=2; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=3; NextState[3][1]=2; break; } case 2: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=2; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=1; NextState[3][1]=3; break; } case 3: { NextState[0][0]=0; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=1; NextState[3][0]=1; NextState[3][1]=2; break; } default:break; } break; } case 1: //长条,完成 { switch(rand()%4) { case 0: { NextState[0][0]=0; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=1; NextState[3][0]=3; NextState[3][1]=1; break; } case 1: { NextState[0][0]=2; NextState[0][1]=0; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=3; break; } case 2: { NextState[0][0]=0; NextState[0][1]=2; NextState[1][0]=1; NextState[1][1]=2; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=3; NextState[3][1]=2; break; } case 3: { NextState[0][0]=1; NextState[0][1]=0; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=1; NextState[3][1]=3; break; } default:break; } break; } case 2: //L,完成 { switch(rand()%4) { case 0: { NextState[0][0]=2; NextState[0][1]=0; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=2; break; } case 1: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=2; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=3; NextState[3][1]=2; break; } case 2: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=1; NextState[3][1]=3; break; } case 3: { NextState[0][0]=0; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=1; NextState[3][0]=2; NextState[3][1]=2; break; } default:break; } break; } case 3: //倒L,完成 { switch(rand()%4) { case 0: { NextState[0][0]=1; NextState[0][1]=0; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=2; break; } case 1: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=3; NextState[2][1]=1; NextState[3][0]=1; NextState[3][1]=2; break; } case 2: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=3; break; } case 3: { NextState[0][0]=2; NextState[0][1]=1; NextState[1][0]=0; NextState[1][1]=2; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=2; break; } default:break; } break; } case 4: //正Z { switch(rand()%4) { case 0: { NextState[0][0]=1; NextState[0][1]=0; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=1; NextState[3][0]=2; NextState[3][1]=2; break; } case 1: { NextState[0][0]=2; NextState[0][1]=1; NextState[1][0]=3; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=2; break; } case 2: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=2; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=3; break; } case 3: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=0; NextState[2][1]=2; NextState[3][0]=1; NextState[3][1]=2; break; } default:break; } break; } case 5: //倒Z { switch(rand()%4) { case 0: { NextState[0][0]=2; NextState[0][1]=0; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=1; NextState[3][0]=1; NextState[3][1]=2; break; } case 1: { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=3; NextState[3][1]=2; break; } case 2: { NextState[0][0]=2; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=2; NextState[2][0]=2; NextState[2][1]=2; NextState[3][0]=1; NextState[3][1]=3; break; } case 3: { NextState[0][0]=0; NextState[0][1]=1; NextState[1][0]=1; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=2; break; } default:break; } break; } case 6: //方格,完成 { NextState[0][0]=1; NextState[0][1]=1; NextState[1][0]=2; NextState[1][1]=1; NextState[2][0]=1; NextState[2][1]=2; NextState[3][0]=2; NextState[3][1]=2; break; } default:break; } } void CTetrisDlg::NexttoActive() { for (int i=0;i<4;i++) for (int j=0;j<2;j++) ActiveState[i][j]=NextState[i][j]; ActiveColor=NextColor; } void CTetrisDlg::DrawNextState(int x,int y) { BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); for (int i=0;i<4;i++) { if (NextState[i][1]>=0&&NextState[i][0]>=0) pDC->StretchBlt(x+SIZE+NextState[i][1]*SIZE,y+SIZE+NextState[i][0]*SIZE,bm.bmWidth,SIZE,&MemDC,0,SIZE*NextColor,SIZE,SIZE,SRCCOPY); } my_bitmap.DeleteObject(); } void CTetrisDlg::ActivetoMap() { int min_row; int min_col; min_row=ActiveState[0][0]; if (ActiveState[1][0]<min_row) min_row=ActiveState[1][0]; if (ActiveState[2][0]<min_row) min_row=ActiveState[2][0]; if (ActiveState[3][0]<min_row) min_row=ActiveState[3][0]; min_col=ActiveState[0][1]; if (ActiveState[1][1]<min_col) min_col=ActiveState[1][1]; if (ActiveState[2][1]<min_col) min_col=ActiveState[2][1]; if (ActiveState[3][1]<min_col) min_col=ActiveState[3][1]; for (int i=0;i<4;i++) { if (stateMap[ActiveState[i][0]-min_row][MAX_COL/2-1+ActiveState[i][1]-min_col]==MAP_STATE_NOT_EMPTY) { gamestate=OVER; break; } else stateMap[ActiveState[i][0]-min_row][MAX_COL/2-1+ActiveState[i][1]-min_col]=MAP_FALLING; } } void CTetrisDlg::OnLButtonDown(UINT nFlags, CPoint point) { if ((point.x>=LOOK_X+45)&&(point.x<=LOOK_X+85)&&(point.y>=(LOOK_Y+SIZE*6+100))&&(point.y<=(LOOK_Y+SIZE*6+140))&&gamestate>=STOP) { SetTimer(1,600/speed,NULL); start(); gamestate=PLAY; OnPaint(); } if ((point.x>=LOOK_X+45)&&(point.x<=LOOK_X+85)&&(point.y>=(LOOK_Y+SIZE*6+100))&&(point.y<=(LOOK_Y+SIZE*6+140))&&gamestate==PAUSE) { SetTimer(1,600/speed,NULL); gamestate=PLAY; } if ((point.x>=LOOK_X+45)&&(point.x<=LOOK_X+85)&&(point.y>=(LOOK_Y+SIZE*6+175))&&(point.y<=(LOOK_Y+SIZE*6+215))&&gamestate==PLAY) { KillTimer(1); gamestate=PAUSE; } if ((point.x>=LOOK_X+45)&&(point.x<=LOOK_X+85)&&(point.y>=(LOOK_Y+SIZE*6+250))&&(point.y<=(LOOK_Y+SIZE*6+290))&&gamestate<=PAUSE) { KillTimer(1); pDC=GetDC(); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+20,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); InitMap(); InitNextAndActive(); gamestate=STOP; DrawMapBlack(); DrawLookBlack(); } CDialog::OnLButtonDown(nFlags, point); } void CTetrisDlg::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent==1) { if (IsBottom()==1) { for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { stateMap[i][j]=MAP_STATE_NOT_EMPTY; BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); pDC->StretchBlt(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,SIZE,SIZE,&MemDC,0,0,SIZE,SIZE,SRCCOPY); my_bitmap.DeleteObject(); } } } Sweep(); NexttoActive(); Produce_NextState(); DrawLookBlack(); DrawNextState(LOOK_X,LOOK_Y); ActivetoMap(); if (gamestate==OVER) gameover(); else { BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); for (int i=0;i<4;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { pDC->StretchBlt(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); } } } my_bitmap.DeleteObject(); } } else { BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); for (int i=MAX_ROW-1;i>=0;i--) { for (int j=MAX_COL-1;j>=0;j--) { if (stateMap[i][j]==MAP_FALLING) { stateMap[i][j]=MAP_STATE_EMPTY; stateMap[i+1][j]=MAP_FALLING; pDC->StretchBlt(MAINFRAME_X+j*SIZE,MAINFRAME_Y+(i+1)*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); CRect my(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,MAINFRAME_X+j*SIZE+SIZE,MAINFRAME_Y+i*SIZE+SIZE); pDC=GetDC(); pDC->FillRect(my,&my_brush); } } } my_bitmap.DeleteObject(); } } KillTimer(1); SetTimer(1,600/speed,NULL); CDialog::OnTimer(nIDEvent); } int CTetrisDlg::IsLeftLimit() //1代表不能左移 { for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { if ((j==0)||stateMap[i][j-1]==MAP_STATE_NOT_EMPTY) return 1; } } } return 0; } int CTetrisDlg::IsRightLimit() { for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { if ((j==MAX_COL-1)||stateMap[i][j+1]==MAP_STATE_NOT_EMPTY) return 1; } } } return 0; } int CTetrisDlg::IsBottom() { for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { if ((i==MAX_ROW-1)||stateMap[i+1][j]==MAP_STATE_NOT_EMPTY) { return 1; } } } } return 0; } void CTetrisDlg::InitMap() { for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { stateMap[i][j]=MAP_STATE_EMPTY; } } } void CTetrisDlg::InitNextAndActive() { for (int i=0;i<4;i++) { for (int j=0;j<2;j++) { NextState[i][j]=-1; ActiveState[i][j]=-1; } } } void CTetrisDlg::DrawMapBlack() { for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { CRect my(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,MAINFRAME_X+j*SIZE+SIZE,MAINFRAME_Y+i*SIZE+SIZE); pDC=GetDC(); pDC->FillRect(my,&my_brush); } } } void CTetrisDlg::DrawLookBlack() { CRect my(LOOK_X+1,LOOK_Y+1,LOOK_X+6*SIZE-1,LOOK_Y+6*SIZE-1); pDC=GetDC(); pDC->FillRect(my,&my_brush); } void CTetrisDlg::gameover() { KillTimer(1); CString notice; notice.Format(_T("GAME IS OVER!\nYOUR SCORE IS %d"),score); AfxMessageBox(notice); /////////////////////////////////////////清除记录的数字 pDC=GetDC(); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+20,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); InitMap(); InitNextAndActive(); gamestate=STOP; DrawMapBlack(); DrawLookBlack(); } void CTetrisDlg::RectLeft() { //PlaySound(_T("sounds\\rotateANDmove.WAV"),NULL,SND_FILENAME|SND_ASYNC); if (IsLeftLimit()==0) { int temp[4][2]; int count=0; for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { stateMap[i][j-1]=MAP_FALLING; stateMap[i][j]=MAP_STATE_EMPTY; temp [count][0]=i; temp [count][1]=j-1; count++; } } } BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); count--; for (;count>=0;count--) pDC->StretchBlt(MAINFRAME_X+temp[count][1]*SIZE,MAINFRAME_Y+temp[count][0]*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); my_bitmap.DeleteObject(); for (int i=0;i<4;i++) { if (stateMap[temp[i][0]][temp[i][1]+1]==MAP_STATE_EMPTY) { CRect my(MAINFRAME_X+(temp[i][1]+1)*SIZE,MAINFRAME_Y+temp[i][0]*SIZE,MAINFRAME_X+SIZE+(temp[i][1]+1)*SIZE,MAINFRAME_Y+SIZE+temp[i][0]*SIZE); pDC->FillRect(my,&my_brush); } } } } void CTetrisDlg::RectRight() { if (IsRightLimit()==0) { int temp[4][2]; int count=0; for (int i=0;i<MAX_ROW;i++) { for (int j=MAX_COL-1;j>=0;j--) { if (stateMap[i][j]==MAP_FALLING) { stateMap[i][j+1]=MAP_FALLING; stateMap[i][j]=MAP_STATE_EMPTY; temp [count][0]=i; temp [count][1]=j+1; count++; } } } BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); count--; for (;count>=0;count--) pDC->StretchBlt(MAINFRAME_X+temp[count][1]*SIZE,MAINFRAME_Y+temp[count][0]*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); my_bitmap.DeleteObject(); for (int i=0;i<4;i++) { if (stateMap[temp[i][0]][temp[i][1]-1]==MAP_STATE_EMPTY) { CRect my(MAINFRAME_X+(temp[i][1]-1)*SIZE,MAINFRAME_Y+temp[i][0]*SIZE,MAINFRAME_X+SIZE+(temp[i][1]-1)*SIZE,MAINFRAME_Y+SIZE+temp[i][0]*SIZE); pDC->FillRect(my,&my_brush); } } } } void CTetrisDlg::RectUp() //逆时针旋转 { bool choice; int temp[4][2]; for (int i=0;i<4;i++) { temp[i][1]=ActiveState[i][0]; temp[i][0]=3-ActiveState[i][1]; } int locate[4][2]; //将旋转前falling状态的方块记住 int count=0; for (int j=0;j<MAX_COL;j++) { for (int i=0;i<MAX_ROW;i++) { if (stateMap[i][j]==MAP_FALLING) { locate[count][0]=i; locate[count][1]=j; ++count; } } } --count; int travel[4][2]; //将旋转后的falling状态的方块记住 for (int i=0;i<4;i++) for (int j=0;j<2;j++) travel[i][j]=locate[i][j]+(temp[i][j]-ActiveState[i][j]); choice=TRUE; for (int i=0;i<4;i++) { if (!(travel[i][0]>=0&&travel[i][0]<MAX_ROW&&travel[i][1]>=0&&travel[i][1]<MAX_COL&&stateMap[travel[i][0]][travel[i][1]]!=MAP_STATE_NOT_EMPTY)) choice=FALSE; } if (choice==TRUE) { pDC=GetDC(); for (int i=0;i<4;i++) { stateMap[locate[i][0]][locate[i][1]]=MAP_STATE_EMPTY; //zuotu CRect my(MAINFRAME_X+locate[i][1]*SIZE,MAINFRAME_Y+locate[i][0]*SIZE,MAINFRAME_X+SIZE+locate[i][1]*SIZE,MAINFRAME_Y+SIZE+locate[i][0]*SIZE); pDC->FillRect(my,&my_brush); } BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); for (int i=0;i<4;i++) { stateMap[travel[i][0]][travel[i][1]]=MAP_FALLING; //zuotu pDC->StretchBlt(MAINFRAME_X+travel[i][1]*SIZE,MAINFRAME_Y+travel[i][0]*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); } my_bitmap.DeleteObject(); for (int i=0;i<4;i++) for (int j=0;j<2;j++) ActiveState[i][j]=temp[i][j]; for (int j=0;j<3;j++) { for (int i=2;i>=j;i--) if (ActiveState[i][1]>ActiveState[i+1][1]||(ActiveState[i][1]==ActiveState[i+1][1]&&ActiveState[i][0]>ActiveState[i+1][0])) { int x=ActiveState[i+1][0]; int y=ActiveState[i+1][1]; ActiveState[i+1][0]=ActiveState[i][0]; ActiveState[i+1][1]=ActiveState[i][1]; ActiveState[i][0]=x; ActiveState[i][1]=y; } } } } void CTetrisDlg::RectDown() { int temp[4][2]; int origin[4][2]; int count=0; for (int i=0;i<MAX_ROW;i++) { for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_FALLING) { origin[count][0]=temp [count][0]=i; origin[count][1]=temp [count][1]=j; count++; } } } if (!IsBottom()) { for (int i=3;i>=0;i--) { stateMap [temp[i][0]+1][temp[i][1]]=MAP_FALLING; stateMap [temp[i][0]][temp[i][1]]=MAP_STATE_EMPTY; temp[i][0]++; } } for (int i=0;i<4;i++) { if (stateMap[origin[i][0]][origin[i][1]]==MAP_STATE_EMPTY) { CRect my(MAINFRAME_X+(origin[i][1])*SIZE,MAINFRAME_Y+origin[i][0]*SIZE,MAINFRAME_X+(origin[i][1])*SIZE+SIZE,MAINFRAME_Y+origin[i][0]*SIZE+SIZE); pDC->FillRect(my,&my_brush); } } BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); for (int i=0;i<4;i++) pDC->StretchBlt(MAINFRAME_X+temp[i][1]*SIZE,MAINFRAME_Y+temp[i][0]*SIZE,SIZE,SIZE,&MemDC,0,SIZE*ActiveColor,SIZE,SIZE,SRCCOPY); my_bitmap.DeleteObject(); } BOOL CTetrisDlg::PreTranslateMessage(MSG* pMsg) { if(pMsg->message==WM_KEYDOWN&&gamestate==PLAY) { switch(pMsg->wParam) { case VK_LEFT: RectLeft(); break; case VK_RIGHT: RectRight(); break; case VK_UP: RectUp(); break; case VK_DOWN: RectDown(); break; } } return CDialog::PreTranslateMessage(pMsg); } void CTetrisDlg::Sweep() { bool m_sweep; int bottom; int judge=0; int ii=0; for (int i=MAX_ROW-1;i>=0;i--) { m_sweep=TRUE; for (int j=0;j<MAX_COL;j++) { if(stateMap[i][j]==MAP_STATE_EMPTY) { m_sweep=FALSE; break; } } if (m_sweep) { if (judge!=1) { bottom=i; judge=1; } for (int k=i;k>0;k--) { for (int l=0;l<MAX_COL;l++) { stateMap[k][l]=stateMap[k-1][l]; } } for (int l=0;l<MAX_COL;l++) stateMap[0][l]=MAP_STATE_EMPTY; i++; ii++; } } if (judge==1) { BITMAP bm; CDC MemDC; pDC=GetDC(); my_bitmap.LoadBitmap(IDB_SQUARE); my_bitmap.GetObject(sizeof(BITMAP),&bm); MemDC.CreateCompatibleDC(pDC); MemDC.SelectObject(&my_bitmap); for (int i=bottom;i>=0;i--) for (int j=0;j<MAX_COL;j++) { if (stateMap[i][j]==MAP_STATE_NOT_EMPTY) pDC->StretchBlt(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,SIZE,SIZE,&MemDC,0,0,SIZE,SIZE,SRCCOPY); else { CRect my(MAINFRAME_X+j*SIZE,MAINFRAME_Y+i*SIZE,MAINFRAME_X+j*SIZE+SIZE,MAINFRAME_Y+i*SIZE+SIZE); pDC->FillRect(my,&my_brush); } } my_bitmap.DeleteObject(); score+=ii*ii*100; CRect my(LOOK_X+50,LOOK_Y+SIZE*6+20,LOOK_X+100,LOOK_Y+SIZE*6+55); pDC=GetDC(); pDC->FillRect(my,&my_brush); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255,0,0)); CString Cscore; Cscore.Format(_T("%d"),score); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+20,Cscore,Cscore.GetLength()); // PlaySound(_T("sounds\\line.WAV"),NULL,SND_FILENAME|SND_ASYNC); } } void CTetrisDlg::On32771() { if (gamestate>=STOP) { SetTimer(1,600/speed,NULL); start(); gamestate=PLAY; OnPaint(); } if (gamestate==PAUSE) { SetTimer(1,600/speed,NULL); gamestate=PLAY; } } void CTetrisDlg::On32772() { if (gamestate==PLAY) { KillTimer(1); gamestate=PAUSE; } } void CTetrisDlg::On32773() { if (gamestate<=PAUSE) { KillTimer(1); pDC=GetDC(); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+20,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); InitMap(); InitNextAndActive(); gamestate=STOP; DrawMapBlack(); DrawLookBlack(); } } void CTetrisDlg::On32775() { speed=1; pDC=GetDC(); pDC->SetBkMode(TRANSPARENT); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+55,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); CString Cspeed; Cspeed.Format(_T("简单")); pDC->SetTextColor(RGB(0,255,0)); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+55,Cspeed,Cspeed.GetLength()); } void CTetrisDlg::On32776() { speed=2; pDC=GetDC(); pDC->SetBkMode(TRANSPARENT); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+55,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); CString Cspeed; Cspeed.Format(_T("一般")); pDC->SetTextColor(RGB(0,255,0)); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+55,Cspeed,Cspeed.GetLength()); } void CTetrisDlg::On32777() { speed=3; pDC=GetDC(); pDC->SetBkMode(TRANSPARENT); CRect my(LOOK_X+50,LOOK_Y+SIZE*6+55,LOOK_X+6*SIZE,LOOK_Y+SIZE*6+100); pDC->FillRect(my,&my_brush); CString Cspeed; Cspeed.Format(_T("困难")); pDC->SetTextColor(RGB(0,255,0)); pDC->TextOut(LOOK_X+50,LOOK_Y+SIZE*6+55,Cspeed,Cspeed.GetLength()); } void CTetrisDlg::On32779() { OnCancel(); } void CTetrisDlg::On32778() { AfxMessageBox(_T("通过键盘控制方块移动和旋转\n上:旋转物块\n下:加速下滑\n左、右:左右移动\n当一行全部填满可消去")); } void CTetrisDlg::OnOK() {} // PlaySound(_T("sounds\\question.wav"),NULL,SND_FILENAME|SND_ASYNC);
关于C++ 文件夹资源PAK打包解包程序源码的问题求助!
// MakeFilePackDlg.cpp : 实现文件 // #include "stdafx.h" #include "MakeFilePack.h" #include "MakeFilePackDlg.h" #include "CJShell.h" #include ".\makefilepackdlg.h" #include <strstream> #include "../engine/include/engine.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CMakeFilePackDlg 对话框 CMakeFilePackDlg::CMakeFilePackDlg(CWnd* pParent /*=NULL*/) : CDialog(CMakeFilePackDlg::IDD, pParent) , m_strSrcPath(_T("")) , m_strPackExtName(_T("pak")) , m_bCompress(TRUE) , m_nZipLevel(6) , m_bEnc(TRUE) , m_bEncHeaderOnly(FALSE) , m_bDefaultPassword(TRUE) , m_strPassword(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMakeFilePackDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_strSrcPath); DDX_Text(pDX, IDC_EDIT2, m_strPackExtName); DDX_Check(pDX, IDC_CHECK1, m_bCompress); DDX_Text(pDX, IDC_EDIT3, m_nZipLevel); DDX_Control(pDX, IDC_SPIN1, m_wndSpinZipLevel); DDX_Check(pDX, IDC_CHECK2, m_bEnc); DDX_Control(pDX, IDC_EDIT3, m_wndEditZipLevel); DDX_Check(pDX, IDC_ENCHEADERONLY, m_bEncHeaderOnly); DDX_Check(pDX, IDC_DEFAULT_PASSWORD, m_bDefaultPassword); DDX_Text(pDX, IDC_PASSWORD, m_strPassword); } BEGIN_MESSAGE_MAP(CMakeFilePackDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_ADD_DIR, OnBnClickedAddDir) ON_BN_CLICKED(IDC_ADD_DIRS, OnBnClickedAddDirs) ON_BN_CLICKED(IDC_CLEAR_DIR, OnBnClickedClearDir) ON_BN_CLICKED(IDC_MAKEPACK, OnBnClickedMakepack) ON_BN_CLICKED(IDC_CHECK1, OnBnClickedCheck1) ON_BN_CLICKED(IDC_CHECK2, OnBnClickedCheck2) ON_BN_CLICKED(IDC_DEFAULT_PASSWORD, OnBnClickedDefaultPassword) ON_BN_CLICKED(IDC_EXPORTPACK, OnBnClickedExportpack) END_MESSAGE_MAP() // CMakeFilePackDlg 消息处理程序 class CMyCommandLineInfo : public CCommandLineInfo { public: bool bZip; bool bEnc; CString m_strPath; int m_iIndex; CMyCommandLineInfo() { m_iIndex = 0; bZip = false; bEnc = false; } void ParseParam( const char* pszParam, BOOL bFlag, BOOL bLast) { if(m_iIndex == 0) m_strPath = pszParam; else if(stricmp(pszParam,"enc") == 0) bEnc = true; else if(stricmp(pszParam,"zip") == 0) bZip = true; m_iIndex++; } }; BOOL CMakeFilePackDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将\“关于...\”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 m_wndEditZipLevel.EnableWindow(m_bCompress); m_wndSpinZipLevel.EnableWindow(m_bCompress); m_wndSpinZipLevel.SetRange32(0,9); CMyCommandLineInfo cmdLineInfo; AfxGetApp()->ParseCommandLine(cmdLineInfo); if(cmdLineInfo.m_iIndex > 0) { m_bEnc = cmdLineInfo.bEnc; m_bCompress = cmdLineInfo.bZip; m_strSrcPath =cmdLineInfo.m_strPath; UpdateData(FALSE); OnBnClickedMakepack(); PostMessage(WM_CLOSE); } return TRUE; // 除非设置了控件的焦点,否则返回 TRUE } void CMakeFilePackDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CMakeFilePackDlg::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 { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标显示。 HCURSOR CMakeFilePackDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } static LPCTSTR GetBrowseFolder() { static CCJShell s_dlg; if(s_dlg.BrowseForFolder(AfxGetMainWnd())) { if(s_dlg.m_strPath.Right(1) == '\\') s_dlg.m_strPath.Delete(s_dlg.m_strPath.GetLength()-1,1); return s_dlg.m_strPath; } return NULL; } void CMakeFilePackDlg::OnBnClickedAddDir() { // TODO: 在此添加控件通知处理程序代码 LPCTSTR lpszDir; if(lpszDir = GetBrowseFolder()) { UpdateData(TRUE); if(m_strSrcPath.IsEmpty() || m_strSrcPath.Right(1) == _T('\n')) m_strSrcPath += lpszDir; else { m_strSrcPath += _T("\r\n"); m_strSrcPath += lpszDir; } UpdateData(FALSE); } } void CMakeFilePackDlg::OnBnClickedAddDirs() { // TODO: 在此添加控件通知处理程序代码 LPCTSTR lpszDir; if(lpszDir = GetBrowseFolder()) { CFileFind ff; CString strFind; strFind.Format(_T("%s\\*"),lpszDir); BOOL b = ff.FindFile(strFind); UpdateData(TRUE); m_strSrcPath = _T(""); while(b) { b = ff.FindNextFile(); if(ff.IsDirectory() && !ff.IsDots()) { TCHAR szDir[MAX_PATH]; _stprintf(szDir,_T("%s\\%s\r\n"),lpszDir,ff.GetFileName()); m_strSrcPath += szDir; } } UpdateData(FALSE); } } void CMakeFilePackDlg::OnBnClickedClearDir() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); m_strSrcPath = _T(""); UpdateData(FALSE); } void CMakeFilePackDlg::OnBnClickedMakepack() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); std::istrstream str(m_strSrcPath); if(m_strPackExtName.IsEmpty()) m_strPackExtName = _T("pak"); char szPath[MAX_PATH]; while(1) { szPath[0] = 0; str.getline(szPath,sizeof(szPath)); if(!szPath[0]) break; char* p = szPath + strlen(szPath)-1; while(p != szPath && (*p == '\r' || *p == '\n')) { *p = 0; --p; } char szPackName[MAX_PATH]; sprintf(szPackName,"%s.%s",szPath,m_strPackExtName); int nEnc = 0; if(m_bEnc) { if(m_bEncHeaderOnly) nEnc = 2; else nEnc = 1; } const char* pszPassword = NULL; if(m_bEnc) { if(!m_bDefaultPassword) pszPassword = m_strPassword; } std::vector<std::string> aFilter; BOOL bStop = FALSE; if(!PackAggregate::MakePackDir(szPath,szPackName,m_bCompress,nEnc,m_nZipLevel,pszPassword,aFilter,NULL,bStop,NULL)) { CString strMsg; strMsg.Format(_T("打包%s失败!"),szPath); AfxMessageBox(strMsg); } } } void CMakeFilePackDlg::OnBnClickedCheck1() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); m_wndEditZipLevel.EnableWindow(m_bCompress); m_wndSpinZipLevel.EnableWindow(m_bCompress); } void CMakeFilePackDlg::OnBnClickedCheck2() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); GetDlgItem(IDC_ENCHEADERONLY)->EnableWindow(m_bEnc); GetDlgItem(IDC_DEFAULT_PASSWORD)->EnableWindow(m_bEnc); GetDlgItem(IDC_PASSWORD)->EnableWindow(m_bEnc && (!m_bDefaultPassword)); } void CMakeFilePackDlg::OnBnClickedDefaultPassword() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); GetDlgItem(IDC_PASSWORD)->EnableWindow(m_bEnc && (!m_bDefaultPassword)); } void CMakeFilePackDlg::OnBnClickedExportpack() { // TODO: 在此添加控件通知处理程序代码 PackAggregate PakAggregate; BYTE des_key[3][8]; PasswordToDesKey( PackAggregate::GetDefaultPassword(),des_key[0],des_key[1],des_key[2] ); PakAggregate.SetDesKey((const BYTE*)des_key); **// 2010 3 Can't Use //PakAggregate.openAggregate( "test\\1.pak" ); //if (PakAggregate.openAggregate("test\\2.pak")) //{ // PakAggregate.tOutputFunc; //} //else //{ // 打开图形包失败 //Assert(0); // } ** } 把最后一段的//取消掉。程序编译的时候会报错,什么东西不能在右边的错误,求帮助,是不是这个代码不全?因为不取消掉最后一段的//,生成出来的程序能正常使用,但是无法解包,一并求解决!搞了一个通宵。没有办法了,求大神帮忙!
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
JSON解析——net.sf.json.JSONObject
简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言。 JSON建构于两种结构: “名称/值”对的集合(A Collection of name/va...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
2019年还剩1天,我从外包公司离职了
这日子过的可真快啊,2019年还剩1天,外包公司干了不到3个月,我离职了
我一个37岁的程序员朋友
周末了,人一旦没有点事情干,心里就瞎想,而且跟几个老男人坐在一起,更容易瞎想,我自己现在也是 30 岁了,也是无时无刻在担心自己的职业生涯,担心丢掉工作没有收入,担心身体机能下降,担心突...
计算机网络的核心概念
这是《计算机网络》系列文章的第二篇文章 我们第一篇文章讲述了计算机网络的基本概念,互联网的基本名词,什么是协议以及几种接入网以及网络传输的物理媒体,那么本篇文章我们来探讨一下网络核心、交换网络、时延、丢包、吞吐量以及计算机网络的协议层次和网络攻击。 网络核心 网络的核心是由因特网端系统和链路构成的网状网络,下面这幅图正确的表达了这一点 那么在不同的 ISP 和本地以及家庭网络是如何交换信息的呢?...
python自动下载图片
近日闲来无事,总有一种无形的力量萦绕在朕身边,让朕精神涣散,昏昏欲睡。 可是,像朕这么有职业操守的社畜怎么能在上班期间睡瞌睡呢,我不禁陷入了沉思。。。。 突然旁边的IOS同事问:‘嘿,兄弟,我发现一个网站的图片很有意思啊,能不能帮我保存下来提升我的开发灵感?’ 作为一个坚强的社畜怎么能说自己不行呢,当时朕就不假思索的答应:‘oh, It’s simple. Wait for me a few
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
程序员如何通过造轮子走向人生巅峰?
前言:你所做的事情,也许暂时看不到成果。但不要灰心,你不是没有成长,而是在扎根。 程序员圈经常流行的一句话:“不要重复造轮子”。在计算机领域,我们将封装好的组件、库,叫做轮子。因为它可以拿来直接用,直接塞进我们的项目中,就能实现对应的功能。 有些同学会问,人家都已经做好了,你再来重新弄一遍,有什么意义?这不是在浪费时间吗。 殊不知,造轮子是一种学习方式,能快速进步,造得好,是自己超强能力的表...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试一个ArrayList我都能跟面试官扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
立即提问