如何实现CDialogEx::OnOK()中的传数据功能但又不关闭对话框?

请问大家,我有一个对话框类Display,其中一个函数给一个和变量赋了值,用了
CDialogEx::OnOK()把值传给View类中的DoModal,并在View类中有一个变
量来接收Display对话框中的变量的值。但是这样的话,每次Display对话框点了按钮
都会消失,如果不加CDialogEx::OnOK()又不能把值传到View中,请问该怎么实现
不关闭对话框,但是在View类中可以在每一次点击Display对话框按钮的时候获得值呢?
以下是代码:

 void Display::OnBnClickeddsift()
{
    // TODO: Add your control notification handler code here
    UpdateData();
    if (m_intDisp == 0){
        m_intSift = 1;
    }

    CDialogEx::OnOK();
}                                                          //Display对话框中按钮的代码


void CSIMSView::OnDisplay()
{
    // TODO: Add your command handler code here
    Display disp;

    if (disp.DoModal()==IDOK){
        m_IntDISP = disp.m_intDisp;
        if (m_IntDISP == 3 || m_IntDISP == 4)
            m_DSMAJOR = disp.m_dsMajor;
        Invalidate();                                     
    }
}                                                         //View类中Display对话框的代码,要求每次
                                                          //点击Display中的按钮都能把值传到View中

求各位大神解答!感激不尽!

3个回答

获取View的句柄,然后自定义一个消息,对话框中PostMessage发送数据过去

为什么一定要用OnOK,直接sendmessage不是很好吗?

neverpassaway
Jin the Conqueror 请问可否再指点一下具体怎么做==不是很懂==
4 年多之前 回复
neverpassaway
Jin the Conqueror ==不会用。。之前没用过这个。。不过谢谢指点,我去查一下怎么用~
4 年多之前 回复

OnOK点击后会关闭是因为 默认给他的资源ID是IDOK 取消的是IDCANCEL 当点击按钮后调用endDialog()关闭对话框,你可以自己改变他的资源id就好了,然后自定义这个按钮的响应函数,在函数里传递你想要的数据信息

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
MFC:主界面调用子界面,子界面OnOk异常
我在主界面的OnInitDialog里面写了一个: mainDlg.cpp: BOOL CMainDlg::OnInitDialog() { ........ if (m_LogonDlg.DoModal() != IDOK) { exit(1); } //成功后做其他操作 } LogonDlg.cpp: 当我点击登陆界面的ok的时候,触发了OnBnClickedOk,发送了一个请求登陆的消息给OnSendMessage去处理,OnSendMessage处理完毕后,在OnSendMessage中调用了CDialogEx::OnOK();然后回到主界面的OnInitDialog,就中断了。 请教大家,如何修改啊。。。。 ps:我的OnSendMessage如下: 首先定义了消息ON_MESSAGE(WM_USER_LOGON, OnSendMessage), 其中‘WM_USER_LOGON’是我定义的消息 ,指定收到这个消息用OnSendMessage处理。 ``` LRESULT CLogonDlg::OnSendMessage(WPARAM wParam, LPARAM lParam) { BOOL32 bQuit = false; switch(wParam) { case EVENT_LOGON_ACK: { //其他显示登陆成功的操作省略 bQuit = true; break; } default: break; } if(bQuit) { CDialogEx::OnOK(); MSG_DEBUG(TEXT("登陆成功OnOk()")); } return 0; } ```
MFC对话框程序通过按钮弹出子对话框,如何初始化子窗口
要实现的功能就是点击按钮,用dlg.DoModal()弹出子对话框,在子对话框中有CListControl控件,要对CListControl控件进行数据的初始化,但是无法对其进行初始化。子对话类中已经添加了OnInitDialog()方法,感觉没有执行这个方法,求解。 点击按钮事件代码: void CMFCPaikeDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CDialogEx::OnOK(); CDialog dlg(IDD_DIALOGCLASS); dlg.DoModal(); } 子窗口类中的OnInitDialog()代码: BOOL ClassEidt::OnInitDialog() { CDialogEx::OnInitDialog(); classCListctr.InsertColumn(0, _T("id"), LVCFMT_CENTER); classCListctr.InsertColumn(0, _T("name"), LVCFMT_CENTER); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE }
VS2012 重载OnNcHitTest(CPoint point)函数屏蔽对话框标题栏移动
``` LRESULT CIRD1000Dlg::OnNcHitTest(CPoint point) { static UINT iFlag = CDialogEx::OnNcHitTest(point); if(HTCAPTION == iFlag) return HTCLIENT; return CDialogEx::OnNcHitTest(point); } ``` 鼠标点住标题栏,对话框仍然可以移动~~这是怎么回事?
MFC单击按钮弹出模态对话框的相关问题
主对话框本身是一个模态对话框,有一个按钮。 从资源视图插入dialog,然后在类向导中添加类rrrDlg1 在主对话框的按钮点击事件中添加如下代码: ``` void CrrrDlg::OnBnClickedOk(){ //TODO: 在此添加控件通知处理程序代码 rrrDlg1 dlg1; INT_PTR n1Response = dlg1.DoModal(); if (n1Response == IDOK){ } else if (n1Response == IDCANCEL){ } CDialogEx::OnOK(); } ``` 其中DoModal()有波浪线提示错误:类rrrDlg1没有成员DoModal 问题来了:怎样建立的对话框是模态对话框,怎样又是非模态的?在整个建立的流程中并没有相关选项,只在实例化之后告诉我没有DoModal这个方法,太郁闷了!!
用MFC的对话框载入摄像头并处理,运行接近10分钟后提示内存出错,指针都释放掉了。这是什么原因呀?
![图片说明](https://img-ask.csdn.net/upload/201603/28/1459166465_682627.jpg) 相关的代码: void CMFC_VedioDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 if(!pCapture) { pCapture = cvCaptureFromCAM(0); pFrame = cvQueryFrame(pCapture); drawToDC(pFrame, IDC_Open); } SetTimer(IDC_BUTTON1, 10, NULL); } void CMFC_VedioDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 SetTimer(IDC_BUTTON2, 10, NULL); } void CMFC_VedioDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 int i, j; switch(nIDEvent) { case IDC_BUTTON1: { if(m_bOpenCamera) { pFrame = cvQueryFrame(pCapture); drawToDC(pFrame, IDC_Open); } break; } case IDC_BUTTON2: { IplImage* pGray = cvCreateImage(cvGetSize(pFrame), 8, 1); cvCvtColor(pFrame, pGray, CV_BGR2GRAY); cvCanny(pGray,pGray,100,255,3); drawToDC(pGray, IDC_DEAL); cvReleaseImage(&pGray); break; } } CDialogEx::OnTimer(nIDEvent); } void CMFC_VedioDlg::OnClose() { // TODO: 在此添加消息处理程序代码和/或调用默认值c cvReleaseCapture(&pCapture); cvReleaseImage(&pFrame); KillTimer(IDC_BUTTON1); KillTimer(IDC_BUTTON2); CDialogEx::OnClose(); } void CMFC_VedioDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CDialogEx::OnOK(); } PS:参考这个博客写的代码:http://www.cnblogs.com/leven20061001/archive/2012/10/17/2727865.html 运行10分钟程序就报错了,好郁闷呀!
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)的调用吗??
非模态对话框创建的时候出错
我先说一下我创建非模态对话框的思路, 资源视图中创建一个对话框并创建类Coption,在菜单中加入一个按键coption, 在CChildView类中创建一个Coption类对象指针,在CChildView类中用Coption类对象指针创建非模态对话框,并判断Coption类对象指针是否为null,如果不为null,则不创建,将焦点给非模态对话框就行,创建的时候,将CChildView类作为Coption类构造参数传入Coption类中,当非模态对话框点击取消时,销毁非模态对话框,并发送消息给CChildView类,让他将Coption类对象指针赋值为null,否则非模态对话框只能出来一次, 但是现在发送消息会报错, 下面贴出四个文件代码,忘大佬们解答 CChildView.h: ``` #pragma once #include"Coption.h" // CChildView 窗口 class CChildView : public CWnd { // 构造 public: CChildView(); // 特性 public: // 操作 public: // 重写 protected: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); // 实现 public: virtual ~CChildView(); // 生成的消息映射函数 protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() protected: Coption* m_option; public: afx_msg void On32771(); //为菜单option按钮 afx_msg LRESULT ON_GOODBYE(WPARAM wparam, LPARAM lparam); }; ``` ChildView.cpp: ``` #include "stdafx.h" #include "MFCApplication5.h" #include "ChildView.h" #include "resource.h" // 主符号 #ifdef _DEBUG #define new DEBUG_NEW #endif // CChildView CChildView::CChildView() { m_option = NULL; } CChildView::~CChildView() { } BEGIN_MESSAGE_MAP(CChildView, CWnd) ON_WM_PAINT() ON_COMMAND(ID_32771, &CChildView::On32771) ON_MESSAGE(WM_GOODBYE,ON_GOODBYE) END_MESSAGE_MAP() LRESULT CChildView::ON_GOODBYE(WPARAM wparam, LPARAM lparam) { delete m_option; m_option = NULL; return 0; } // CChildView 消息处理程序 BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) { if (!CWnd::PreCreateWindow(cs)) return FALSE; cs.dwExStyle |= WS_EX_CLIENTEDGE; cs.style &= ~WS_BORDER; cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, ::LoadCursor(nullptr, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), nullptr); return TRUE; } void CChildView::OnPaint() { CPaintDC dc(this); // 用于绘制的设备上下文 // TODO: 在此处添加消息处理程序代码 // 不要为绘制消息而调用 CWnd::OnPaint() } void CChildView::On32771() { if (NULL!=m_option) { SetFocus(); MessageBox(_T("m_option不为空")); } else { m_option = new Coption; m_option->Create(IDD_DIALOG1,this); m_option->ShowWindow(SW_SHOW); MessageBox(_T("m_option为空")); } // TODO: 在此添加命令处理程序代码 } ``` Coption.h: ``` class Coption : public CDialogEx { DECLARE_DYNAMIC(Coption) public: Coption(CWnd* pParent = nullptr); // 标准构造函数 Coption(CView* pview); // 标准构造函数 virtual ~Coption(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_DIALOG1 }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedCancel(); virtual void PostNcDestroy(); private: CView* p_view; public: afx_msg void OnBnClickedOk(); }; ``` Coption.cpp: ``` #include "stdafx.h" #include "MFCApplication5.h" #include "Coption.h" #include "afxdialogex.h" // Coption 对话框 IMPLEMENT_DYNAMIC(Coption, CDialogEx) Coption::Coption(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG1, pParent) { } Coption::Coption(CView* pview /*=nullptr*/) { p_view = pview; } Coption::~Coption() { } void Coption::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(Coption, CDialogEx) ON_BN_CLICKED(IDCANCEL, &Coption::OnBnClickedCancel) ON_BN_CLICKED(IDOK, &Coption::OnBnClickedOk) END_MESSAGE_MAP() // Coption 消息处理程序 void Coption::OnBnClickedCancel() { // TODO: 在此添加控件通知处理程序代码 //CDialogEx::OnCancel(); DestroyWindow(); } void Coption::PostNcDestroy() { // TODO: 在此添加专用代码和/或调用基类 CDialogEx::PostNcDestroy(); p_view->SendMessage(WM_GOODBYE, 0,0); //屏蔽这一行就不会报错 } void Coption::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 //CDialogEx::OnOK(); DestroyWindow(); } ```
非模态对话框出错,非模态对话框
我先说一下我创建非模态对话框的思路, 资源视图中创建一个对话框并创建类Coption,在菜单中加入一个按键coption, 在CChildView类中创建一个Coption类对象指针,在CChildView类中用Coption类对象指针创建非模态对话框,并判断Coption类对象指针是否为null,如果不为null,则不创建,将焦点给非模态对话框就行,创建的时候,将CChildView类作为Coption类构造参数传入Coption类中,当非模态对话框点击取消时,销毁非模态对话框,并发送消息给CChildView类,让他将Coption类对象指针赋值为null,否则非模态对话框只能出来一次,但是现在发送消息会报错, 下面贴出四个文件代码: ``` Coption.h: #pragma once // Coption 对话框 class Coption : public CDialogEx { DECLARE_DYNAMIC(Coption) public: Coption(CWnd* pParent = nullptr); // 标准构造函数 Coption(CView* pview); // 标准构造函数 virtual ~Coption(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_DIALOG1 }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedCancel(); virtual void PostNcDestroy(); private: CView* p_view; public: afx_msg void OnBnClickedOk(); }; ``` Coption.cpp: // Coption.cpp: 实现文件 // #include "stdafx.h" #include "MFCApplication5.h" #include "Coption.h" #include "afxdialogex.h" // Coption 对话框 IMPLEMENT_DYNAMIC(Coption, CDialogEx) Coption::Coption(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG1, pParent) { } Coption::Coption(CView* pview /*=nullptr*/) { p_view = pview; } Coption::~Coption() { } void Coption::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(Coption, CDialogEx) ON_BN_CLICKED(IDCANCEL, &Coption::OnBnClickedCancel) ON_BN_CLICKED(IDOK, &Coption::OnBnClickedOk) END_MESSAGE_MAP() // Coption 消息处理程序 void Coption::OnBnClickedCancel() { // TODO: 在此添加控件通知处理程序代码 //CDialogEx::OnCancel(); DestroyWindow(); } void Coption::PostNcDestroy() { // TODO: 在此添加专用代码和/或调用基类 CDialogEx::PostNcDestroy(); p_view->SendMessage(WM_GOODBYE, 0,0); //屏蔽这一行就不会报错 } void Coption::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 //CDialogEx::OnOK(); DestroyWindow(); } ``` CChildView.cpp: // ChildView.cpp: CChildView 类的实现 // #include "stdafx.h" #include "MFCApplication5.h" #include "ChildView.h" #include "resource.h" // 主符号 #ifdef _DEBUG #define new DEBUG_NEW #endif // CChildView CChildView::CChildView() { m_option = NULL; } CChildView::~CChildView() { } BEGIN_MESSAGE_MAP(CChildView, CWnd) ON_WM_PAINT() ON_COMMAND(ID_32771, &CChildView::On32771) ON_MESSAGE(WM_GOODBYE,ON_GOODBYE) END_MESSAGE_MAP() LRESULT CChildView::ON_GOODBYE(WPARAM wparam, LPARAM lparam) { /*delete m_option;*/ m_option = NULL; return 0; } // CChildView 消息处理程序 BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) { if (!CWnd::PreCreateWindow(cs)) return FALSE; cs.dwExStyle |= WS_EX_CLIENTEDGE; cs.style &= ~WS_BORDER; cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, ::LoadCursor(nullptr, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), nullptr); return TRUE; } void CChildView::OnPaint() { CPaintDC dc(this); // 用于绘制的设备上下文 // TODO: 在此处添加消息处理程序代码 // 不要为绘制消息而调用 CWnd::OnPaint() } void CChildView::On32771() { if (NULL==m_option) { /*SetFocus(); MessageBox(_T("m_option不为空"));*/ m_option = new Coption; m_option->Create(IDD_DIALOG1, this); MessageBox(_T("m_option为空")); } m_option->ShowWindow(SW_SHOW); // TODO: 在此添加命令处理程序代码 } ``` CChildView.h: // ChildView.h: CChildView 类的接口 // #pragma once #include"Coption.h" // CChildView 窗口 class CChildView : public CWnd { // 构造 public: CChildView(); // 特性 public: // 操作 public: // 重写 protected: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); // 实现 public: virtual ~CChildView(); // 生成的消息映射函数 protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() protected: Coption* m_option; public: afx_msg void On32771(); afx_msg LRESULT ON_GOODBYE(WPARAM wparam, LPARAM lparam); }; ``` 报错如下: ![图片说明](https://img-ask.csdn.net/upload/201908/15/1565872965_493989.png) 如果实在没人愿意回答,讲一下编写非模态对话框心得也行
基于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); } ```
新手做了个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上加的用来申明全局函数。 };
测试的时候点击“确定”按钮后直接退出了,没执行函数,哪位大虾来帮忙解决一下呀?
给对话框的“确定”按钮添加了消息映射,但测试的时候点击“确定”按钮后直接退出了,没执行OnBnClickedOk() 函数,这是为什么?哪位大虾来帮忙解决一下呀? ``` void CSearchDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CIngformation iSet; UpdateData(); m_strSearch.TrimLeft(); if (m_strSearch.IsEmpty()) { MessageBox(_T("要查询的学号不能为空!")); return; } if (iSet.IsOpen()) iSet.Close(); iSet.m_strFilter.Format(_T("PID='%s'"), m_strSearch); iSet.m_strSort = "ID"; iSet.Open(); if (!iSet.IsEOF()) UpdateData(FALSE);//改 else MessageBox(_T("没有查到你要找的信息!")); CDialogEx::OnOK(); } ``` ``` ```
请教一个MFC填充背景色的问题
BOOL C2Dlg::OnEraseBkgnd(CDC* pDC) { GetWindowRect(rect); pDC->SelectObject(fff); pDC->Rectangle(rect); return CDialogEx::OnEraseBkgnd(pDC); } 我想一调试程序就背景显示指定的颜色,用CCLIENTDC可以,但是用这个函数传进来的 PDC好像不行,请问下是为什么呀?CBRUSH fff已经在初始化函数中定义了。
请问一个MFC中的DC的问题
void CmouselessionDlg::OnMouseMove(UINT nFlags, CPoint point) { if (nFlags ==MK_LBUTTON) { dd.MoveTo(pt); dd.LineTo(point.x,point.y); } pt = point; CDialogEx::OnMouseMove(nFlags, point); } 请问下这个程序对么?pt和dd都定义了
请教MFC一个ERASEBKGROUND函数的问题
BOOL C用完删3Dlg::OnEraseBkgnd(CDC* pDC) { CBrush* oldbru = pDC->SelectObject(&bru); pDC->Rectangle(rect); pDC->SelectObject(oldbru); return CDialogEx::OnEraseBkgnd(pDC); } rect和bru都在INITDIALOG里面定义了,请问下这样写调试运行之后为什么不能改变 窗体的颜色呢?
关于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); }
关于DoDataExchange()报错问题
我在西安嘎母仲新建了一个窗体,里面加了一个listcontrol,副窗体中调用对象用DoMadal()打开 然后报错就定位到下面: void mybill::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST3, m_bill); } 把DDX_Control(pDX, IDC_LIST3, m_bill);注释掉就不报错了,请问怎么解决
vs2010里,无法解析的外部符号 protected: void __thiscall
按论坛的教程编程串口,错误提示: yyyzzzDlg.obj : error LNK2001: 无法解析的外部符号 "protected: void __thiscall CyyyzzzDlg::OnStnClickedStatic4(void)" (?OnStnClickedStatic4@CyyyzzzDlg@@IAEXXZ) c:\users\yz980\documents\visual studio 2010\Projects\yyyzzz\Debug\yyyzzz.exe : fatal error LNK1120: 1 个无法解析的外部命令 程序: // yyyzzzDlg.cpp : 实现文件 // #include "stdafx.h" #include "yyyzzz.h" #include "yyyzzzDlg.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() // CyyyzzzDlg 对话框 CyyyzzzDlg::CyyyzzzDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CyyyzzzDlg::IDD, pParent) , m_EditReceive(_T("")) , m_EditSend(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CyyyzzzDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_EditReceive); DDX_Text(pDX, IDC_EDIT2, m_EditSend); DDX_Control(pDX, IDC_COMBO1, m_comb1); DDX_Control(pDX, IDC_COMBO2, m_cob2); DDX_Control(pDX, IDC_MSCOMM1, m_mscom); } BEGIN_MESSAGE_MAP(CyyyzzzDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_OPEN, &CyyyzzzDlg::OnBnClickedButtonOpen) ON_BN_CLICKED(IDC_BUTTON_SEND, &CyyyzzzDlg::OnBnClickedButtonSend) ON_BN_CLICKED(IDC_BUTTON_CLEAR, &CyyyzzzDlg::OnBnClickedButtonClear) ON_BN_CLICKED(IDC_BUTTON_CLOSE, &CyyyzzzDlg::OnBnClickedButtonClose) ON_STN_CLICKED(IDC_STATIC4, &CyyyzzzDlg::OnStnClickedStatic4) END_MESSAGE_MAP() // CyyyzzzDlg 消息处理程序 BOOL CyyyzzzDlg::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 < 15; i++) { str.Format(_T("COM %d"), i+1); m_comb1.InsertString(i, str); //将COM 1-15填入comb1 } m_comb1.SetCurSel(0); //预置为COM 1 //波特率选择组合框 CString str1[]={_T("300"),_T("600"),_T("1200"),_T("2400"),_T("4800"),_T("9600"), _T("19200"),_T("38400"),_T("43000"),_T("56000"),_T("57600"),_T("115200")}; for(i = 0; i < 12; i++) { int judge_tf = m_cob2.AddString(str1[i]); if((judge_tf == CB_ERR) || (judge_tf == CB_ERRSPACE)) MessageBox(_T("Build baud error!")); } m_cob2.SetCurSel(5); //预置波特率为9600 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CyyyzzzDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CyyyzzzDlg::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 CyyyzzzDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CyyyzzzDlg::OnBnClickedButtonOpen() { CString str, str1, n; GetDlgItemText(IDC_BUTTON_OPEN, str); //str获得与对话框中的控件相关的标题或文本 CWnd *h1; //窗口类的基类 h1 = GetDlgItem(IDC_BUTTON_OPEN); //指向控件的caption //串口为关闭状态 if(!m_mscom.get_PortOpen()) { m_cob2.GetLBText(m_cob2.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); //comb2选择的波特率,无校验,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 CyyyzzzDlg::OnBnClickedButtonSend() { UpdateData(true); //更新控件数据 m_mscom.put_Output(COleVariant(m_EditSend));//把发送编辑框的数据发送出去 } void CyyyzzzDlg::OnBnClickedButtonClear() { m_EditReceive = _T(""); //给接收编辑框发送空格符 UpdateData(false); //根据数据状态反馈给控件 } void CyyyzzzDlg::OnBnClickedButtonClose() { //若当前串口为打开 if(m_mscom.get_PortOpen()) m_mscom.put_PortOpen(false); //置为关闭 CDialogEx::OnCancel(); } BEGIN_EVENTSINK_MAP(CyyyzzzDlg, CDialogEx) ON_EVENT(CyyyzzzDlg, IDC_MSCOMM1, 1, CyyyzzzDlg::OnCommMscomm1, VTS_NONE) END_EVENTSINK_MAP() void CyyyzzzDlg::OnCommMscomm1() { //接收缓冲区有数据 if(m_mscom.get_CommEvent() == 2) { char str[1024] = {0}; //缓冲区最大为1024 long k; VARIANT InputData = m_mscom.get_Input(); //读入缓冲区 COleSafeArray fs; fs = InputData; //VARIANT型变À量转换为COleSafeArray型变量 for(k = 0; (size_t)k < fs.GetOneDimSize(); k++) { fs.GetElement(&k, str+k); //转换为BYTE型数组 } m_EditReceive += str; //接收到编辑框里面 //SetTimer(1, 10, NULL); //延时10ms UpdateData(false); //将数据在屏幕中对应控件中显示出来。 } }
求大神帮忙解决这个问题,紧急!!!马上就要交作业了。
我用VS2010写了一个音频播放器,编译的时候出现: 错误 1 error LNK2001: 无法解析的外部符号 "public: virtual long __thiscall CWnd::put_FileName(struct tagVARIANT,char)" (?put_FileName@CWnd@@UAEJUtagVARIANT@@D@Z) 请求大神们帮忙,明天就要交作业了,现在还没有弄好。下面是我的代码 // SoundPlayerDlg.h : 头文件 // #pragma once #include "afxwin.h" // CSoundPlayerDlg 对话框 class CSoundPlayerDlg : public CDialogEx { // 构造 public: CSoundPlayerDlg(CWnd* pParent = NULL); // 标准构造函数 // 对话框数据 enum { IDD = IDD_SOUNDPLAYER_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: HICON m_hIcon; BOOL m_bPlay;//是否在播放文件 BOOL m_bPause;//是否已经暂停播放文件 BOOL m_nIsCda;;//判断是否为播放CD文件 MCIDEVICEID m_MCIDeviceID; // 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: CButton m_ctlOpen; CButton m_ctlPlay; CButton m_ctlPause; CButton m_ctlStop; CString m_strFile; afx_msg void OnBnClickedOpen(); afx_msg void OnBnClickedPlay(); afx_msg void OnBnClickedPause(); afx_msg void OnBnClickedStop(); afx_msg void OnBnClickedOk(); afx_msg void OnEnChangeFile(); afx_msg void OnDestroy(); afx_msg LRESULT OnMciNotify(WPARAM wParam,LPARAM lParam); void ShowError(DWORD dwErroe); }; // SoundPlayerDlg.cpp : 实现文件 // #include "stdafx.h" #include "SoundPlayer.h" #include "SoundPlayerDlg.h" //#include "afxdialogex.h" //#include<MMSystem.h> #ifdef _DEBUG #define new DEBUG_NEW #endif //#define TRUE 1 // 用于应用程序“关于”菜单项的 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() // CSoundPlayerDlg 对话框 CSoundPlayerDlg::CSoundPlayerDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CSoundPlayerDlg::IDD, pParent), m_strFile(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_bPlay = FALSE; m_bPause = FALSE; m_nIsCda = 0; m_MCIDeviceID = 0; } void CSoundPlayerDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_OPEN, m_ctlOpen); DDX_Control(pDX, IDC_PLAY, m_ctlPlay); DDX_Control(pDX, IDC_PAUSE, m_ctlPause); DDX_Control(pDX, IDC_STOP, m_ctlStop); DDX_Text(pDX, IDC_FILE, m_strFile); } BEGIN_MESSAGE_MAP(CSoundPlayerDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_OPEN, &CSoundPlayerDlg::OnBnClickedOpen) ON_BN_CLICKED(IDC_PLAY, &CSoundPlayerDlg::OnBnClickedPlay) ON_BN_CLICKED(IDC_PAUSE, &CSoundPlayerDlg::OnBnClickedPause) ON_BN_CLICKED(IDC_STOP, &CSoundPlayerDlg::OnBnClickedStop) ON_BN_CLICKED(IDOK, &CSoundPlayerDlg::OnBnClickedOk) ON_EN_CHANGE(IDC_FILE, &CSoundPlayerDlg::OnEnChangeFile) ON_WM_DESTROY() END_MESSAGE_MAP() // CSoundPlayerDlg 消息处理程序 BOOL CSoundPlayerDlg::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: 在此添加额外的初始化代码 m_ctlPlay.EnableWindow(FALSE);//将播放按钮禁止 m_ctlStop.EnableWindow(FALSE);//将停止按钮禁止 m_ctlPause.EnableWindow(FALSE);//将暂停按钮禁止 return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CSoundPlayerDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CSoundPlayerDlg::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 CSoundPlayerDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CSoundPlayerDlg::OnBnClickedOpen() { // TODO: 在此添加控件通知处理程序代码 CString filename; CString str; MCI_OPEN_PARMS mciOpen; DWORD dwError; //打开选择文件对话框 static char szFilter[]="波形音频文件(*.wav)|*.wav|MIDI Audio File(*.mid)|*.mid|CD Audio(*.cda)|*.cda|所有文件(*.*)|*.*||"; CFileDialog dlg(TRUE,"wav",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter); if(dlg.DoModal()==IDOK) { filename=dlg.GetPathName();//得到文件名 str = filename.Right(3);//得到文件的扩展名 if(!strcmp(str,"wav"));//判断是否是wav文件 { mciOpen.lpstrDeviceType="waveaudio"; } if(!strcmp(str,"mid"));//判断是否是mid文件 { mciOpen.lpstrDeviceType="sequencer"; } if(!strcmp(str,"cda"));//判断是否是cda文件 { mciOpen.lpstrDeviceType="cdaudio"; m_nIsCda = 1; } m_strFile = filename; UpdateData(FALSE); mciOpen.lpstrElementName=filename;//设置打开文件 dwError = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpen);//打开MCI设备 if(dwError) { ShowError(dwError); } m_MCIDeviceID = mciOpen.wDeviceID;//获得打开的MCI设备的ID m_ctlPlay.EnableWindow(TRUE); m_ctlStop.EnableWindow(TRUE); m_ctlPause.EnableWindow(TRUE); m_ctlOpen.EnableWindow(FALSE); m_bPlay = FALSE; m_bPause = FALSE; } } void CSoundPlayerDlg::OnBnClickedPlay() { // TODO: 在此添加控件通知处理程序代码 MCI_PLAY_PARMS mciPlay; DWORD dwError; if(!m_bPlay) { mciPlay.dwCallback= (long)GetSafeHwnd(); if(m_nIsCda==1) mciPlay.dwFrom=1; else mciPlay.dwFrom=0; dwError=mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciPlay); } if(m_bPlay) { if(m_bPause) { dwError=mciSendCommand(m_MCIDeviceID,MCI_RESUME,0,NULL); } m_bPause=!m_bPause; } if(dwError) { ShowError(dwError); } m_ctlPlay.EnableWindow(FALSE); m_ctlStop.EnableWindow(TRUE); m_ctlPause.EnableWindow(TRUE); m_ctlOpen.EnableWindow(FALSE); m_bPlay = TRUE; } void CSoundPlayerDlg::OnBnClickedPause() { // TODO: 在此添加控件通知处理程序代码 DWORD dwError; if(!m_bPause) { dwError=mciSendCommand(m_MCIDeviceID,MCI_PAUSE,0,NULL); if(dwError) { ShowError(dwError); } m_ctlPlay.EnableWindow(TRUE); m_ctlStop.EnableWindow(TRUE); m_ctlPause.EnableWindow(FALSE); m_ctlOpen.EnableWindow(FALSE); m_bPause=!m_bPause; } } void CSoundPlayerDlg::OnBnClickedStop() { // TODO: 在此添加控件通知处理程序代码 mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL); mciSendCommand(m_MCIDeviceID,MCI_CLOSE,MCI_WAIT,NULL); m_bPlay = FALSE ; m_bPause=FALSE; m_nIsCda = 0; m_ctlPlay.EnableWindow(FALSE); m_ctlStop.EnableWindow(FALSE); m_ctlPause.EnableWindow(FALSE); m_ctlOpen.EnableWindow(TRUE); } void CSoundPlayerDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 CSoundPlayerDlg::OnDestroy(); CDialogEx::OnOK(); } void CSoundPlayerDlg::OnEnChangeFile() { // TODO: 如果该控件是 RICHEDIT 控件,它将不 // 发送此通知,除非重写 CDialogEx::OnInitDialog() // 函数并调用 CRichEditCtrl().SetEventMask(), // 同时将 ENM_CHANGE 标志“或”运算到掩码中。 // TODO: 在此添加控件通知处理程序代码 UpdateData(); m_ctlPlay.EnableWindow(m_strFile.GetLength()?TRUE:FALSE); } void CSoundPlayerDlg::OnDestroy() { CDialogEx::OnDestroy(); // TODO: 在此处添加消息处理程序代码 mciSendCommand(m_MCIDeviceID,MCI_STOP,MCI_WAIT,NULL);//停止播放 mciSendCommand(m_MCIDeviceID,MCI_CLOSE,MCI_WAIT,NULL);//关闭MCI设备 } LRESULT CSoundPlayerDlg::OnMciNotify(WPARAM wParam,LPARAM lParam) { if(wParam==MCI_NOTIFY_SUCCESSFUL) { m_bPlay=FALSE; m_bPause=FALSE; m_nIsCda=FALSE; return 0; } return -1; } void CSoundPlayerDlg::ShowError(DWORD dwError) { char szBuf[1000]; MessageBeep(MB_ICONEXCLAMATION); if(mciGetErrorString(dwError,(LPSTR)szBuf,MAXERRORLENGTH)) MessageBox(szBuf,"MCI错误",MB_ICONEXCLAMATION); else MessageBox("未知错误","MCI错误",MB_ICONEXCLAMATION); } // stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 // 特定于项目的包含文件 #pragma once #ifndef VC_EXTRALEAN #define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料 #endif #include "targetver.h" #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的 // 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏 #define _AFX_ALL_WARNINGS #include <afxwin.h> // MFC 核心组件和标准组件 #include <afxext.h> // MFC 扩展 #include <afxdisp.h> // MFC 自动化类 #ifndef _AFX_NO_OLE_SUPPORT #include <afxdtctl.h> // MFC 对 Internet Explorer 4 公共控件的支持 #endif #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> // MFC 对 Windows 公共控件的支持 #endif // _AFX_NO_AFXCMN_SUPPORT #include <afxcontrolbars.h> // 功能区和控件条的 MFC 支持 #include<MMSystem.h> #pragma comment(lib,"winmm.lib") #ifdef _UNICODE #if defined _M_IX86 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") #elif defined _M_X64 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") #else #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") #endif #endif
新手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)。
130 个相见恨晚的超实用网站,一次性分享出来
相见恨晚的超实用网站 持续更新中。。。
我花了一夜用数据结构给女朋友写个H5走迷宫游戏
起因 又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个迷宫小游戏啥的! 当我码完字准备睡觉时:写不好别睡觉! 分析 如果用数据结构与算法造出东西来呢? ...
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
win10系统安装教程(U盘PE+UEFI安装)
一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱 极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件, 选择安装到U盘(按照操作无需更改) 三、重启进入pe系统 1、关机后,将U盘插入电脑 2、按下电源后,按住F12进入启动项选择(技嘉主板是F12) 选择需要启...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
HAL 硬件抽象层介绍
和你一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:和你一起终身学习,这里是程序员 Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、HAL 概述一、HAL 概述HAL定义了供硬件供应商实施的标准接口,该接口使Android无需考虑底层驱动程序的实现。使用HA...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
致 Python 初学者们!
作者 | 许向武 责编 | 屠敏 出品 | CSDN 博客 前言 在 Python 进阶的过程中,相信很多同学应该大致上学习了很多 Python 的基础知识,也正在努力成长。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 Python 这门编程语言,从2009年开始单一使用 Python 应对所有的开发工作,直至今
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
使用 Angular 打造微前端架构的 ToB 企业级应用
这篇文章其实已经准备了11个月了,因为虽然我们年初就开始使用 Angular 的微前端架构,但是产品一直没有正式发布,无法通过生产环境实践验证可行性,11月16日我们的产品正式灰度发布,所以是时候分享一下我们在使用 Angular 微前端这条路上的心得(踩过的坑)了额,希望和 Angular 社区一起成长一起进步,如果你对微前端有一定的了解并且已经在项目中尝试了可以忽略前面的章节。 什么是微前...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
拿下微软、Google、Adobe,印度为何盛产科技圈 CEO?
作者 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 世界500强中,30%的掌舵人,都是印度人。 是的,你没看错。这是近日《哈佛商业评论》的研究结果。 其中又以微软CEO萨提亚·纳德拉(Satya Nadella)、和谷歌CEO桑达尔·皮查伊(Sundar Pichai,以下简称劈柴)最为出名。 微软CEO萨提亚·纳德拉(Satya Nadella) 其他著名印度...
Linux(内核剖析):19---中断总体概述
一、为什么要引入中断? 任何操作系统内核的核心任务,都包含有对连接到计算机上的硬件设备进行有效管理,如硬盘、蓝光碟机、键盘、鼠标、3D 处理器,以及无线电等。而想要管理这些设备,首先要能和它们互通音信才行。众所周知,处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求,然后专门等待回应的办法,显然差强人意。既然硬件的响应这么慢,那么内核就应该在此期间...
程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
深度学习笔记------卷积神经网络
深度学习笔记------卷积神经网络
一文带你入门Linux
文章目录1.1 Linux的概述:1.1.1 什么是Linux:1.1.1.1 学习Linux之前先了解Unix1.1.1.2 Linux的概述:1.1.1.3 Linux的历史:1.1.1.4 Linux系统的应用:1.1.1.5 Linux的版本1.1.1.6 Linux的主流版本1.2 Linux的安装:1.2.1 虚拟机安装:1.2.1.1 什么是虚拟机1.2.1.2 安装VmWare1....
普通三本毕业,我怎么一路艰辛进入阿里的
英雄不问出处? 自古以来就有这样一句话,真的英雄不问出处吗?这句话太挫了。普通三本院校的我,大四的时候居然都不知道什么是校招,所以出处太重要了。这也是没有机会参加阿里校招的原因,毕竟校招门槛比社招还是要低的,最重要的是校招进入阿里能让你的起点比别人更高。 有幸可以社招进入阿里,了解了校招的思路,赶紧介绍给学弟们,现在我们三本院校的小学弟今年居然有 3 个人通过了阿里的校招。下面我也把这份宝贵的经...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
强烈推荐10本程序员在家读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
疫情数据接口api
返回json示例 { "errcode":0,//0标识接口正常 "data":{ "date":"2020-01-30 07:47:23",//实时更新时间 "diagnosed":7736,//确诊人数 "suspect":12167,//疑是病例人数 "death":170,//死亡人数 "cur...
智力题(程序员面试经典)
NO.1  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 解法 有时候,严格的限制条件有可能反倒是解题的线索。在这个问题中,限制条件是天平只能用一次。 因为天平只能用一次,我们也得以知道一个有趣的事实:一次必须同时称很多药丸,其实更准确地说,是必须从19瓶拿出药丸进行称重。否则,如果跳过两瓶或更多瓶药...
疫情防控,开发者集结出战!
作者 | 屠敏出品 | CSDN(ID:CSDNnews)2020 年伊始,病毒肆虐,人心惶惶。截止北京时间 1 月 31 日 15 时 30 分,全国确诊新型冠状病毒肺炎的数字已达到了...
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问