吕鑫MFC教程笔记---1(-P37)

版权声明:版权归ciscomonkey所有,QQ:1183699227 https://blog.csdn.net/ciscomonkey/article/details/89300664

前言

吕鑫的视频资源在bilibili上面有,当然,我并不指望全靠他的视频,但是,他的视频入门还是不错的,用的VC6.0,都是结合MSDN来讲解,这一点做的不错,我先打算跟着他视频走走,然后后面再转向Vs2012。本笔记不会手把手的记录,只是观看视频和书籍后,把一些必要的知识点简单总结一下,能入门即可。后续,再多多学习别人的代码,在实际中提高,不过这都是后话了。

第一个WIN32程序

事件和消息

鼠标的移动,单击等等任何一个操作都是一个事件。消息是操作系统将事件传递给用户程序的数据格式,是一种传递数据的通信协议(通信协议=类型+数据),消息的通信协议是由消息类型和相关数据组成的。比如说:消息=你执行了单击操作+你点击了具体哪一个按钮
当鼠标单击了一个按钮时候,应用程序会接收到一个消息,消息的类型是WM_COMMAND,而数据时一个按钮的ID,应用程序根据ID就可以判断用户单击的是哪一个按钮。

编写一个静态的对话框

总结:
代码:
以下是仅仅显示一个对话框,但是对话框实际并没有任何效果的代码。

 // win32_first.cpp : Defines the entry point for the application.
 //
 
 #include "stdafx.h"
 #include "resource.h"
 
 BOOL CALLBACK DialogProc(HWND hwndDlg,  UINT uMsg, WPARAM wParam, LPARAM lParam )
 {
 return FALSE;
 }
 
 int APIENTRY WinMain(HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPSTR     lpCmdLine,
                      int       nCmdShow)
 {
  	// TODO: Place code here.
 DialogBox(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,DialogProc);
 	return 0;
 }

通常,有的人会出现下面的错误,missing function header (old-stytle formal list?)
这一点要仔细检查你的代码,我发现我就是声明函数时候添加了;结果导致错误。通常错误都在提示错误的上一行。
上述代码中:DialogBox第一个参数hInstance,代表应用进程,必须把对话框加入我们windows的应用进程。
第二个参数,代表与对话框模块关联的对话框的ID,并且带入前要对数字ID进行强制类型转化成字符型
第三个参数代表句柄,由于对话框没有父窗口,所以可设置为NULL
第四个参数代表回调函数的地址,该参数是一个指定格式的回调函数的地址,该函数用于处理各类的窗口事件。

在这里插入图片描述
运行效果:
下面执行后,连关都没法关闭,无法执行鼠标,键盘操作。

在这里插入图片描述

win32数据类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编写一个可执行的加法计算器

在这里插入图片描述
在这里插入图片描述
以上代表回调函数,也就是diglogBox的回调函数,用于返回对话框的消息,(比如你按了那个按钮,你的光标落在了那个位置)。

代码:

   ```c
    // win32_first.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    #include "resource.h" //包含对话框资源
    #include "stdio.h"
    
    BOOL CALLBACK DialogProc(HWND hwndDlg,  UINT uMsg, WPARAM wParam, LPARAM lParam )//对话框回调函数
    {
    	char s[256];
    	sprintf(s,"uMsg=0x%x,wParam=0x%x,lParam=0x%x\n",uMsg,wParam,lParam); //输出到数组中,也可以注释掉
    	OutputDebugString(s);  //输出到调试窗口,可以注释掉
    	if (WM_COMMAND==uMsg)		//返回的消息是命令(因为返回的消息有很多,包括鼠标挪动,但是仅仅对WM_COMMAND这一类消息做出响应)
    	{
    	if (LOWORD(wParam)==IDCANCEL)  //如果返回的消息是按钮取消键的ID
    	{
    		EndDialog(hwndDlg,IDCANCEL);	//就关闭对话框
    	}
    	if (LOWORD(wParam)==IDOK)  //如果返回的消息是确定按钮的ID,就开始执行以下代码的计算
    	{
    		int left_number=GetDlgItemInt(hwndDlg,IDC_EDIT1,NULL,TRUE);  //GetDlgItemInt这个函数是从按钮中取值
    		int right_number=GetDlgItemInt(hwndDlg,IDC_EDIT2,NULL,TRUE);
    		int add_result=left_number+right_number;	//执行加法运算
    		SetDlgItemInt(hwndDlg,IDC_EDIT3,add_result,TRUE);  //在对话框中设置值到响应的按钮中
    	}
    	}
    return FALSE;
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
     	// TODO: Place code here.
    	DialogBox(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,DialogProc);
    	return 0;
    }
    ```

实现效果:
在这里插入图片描述
代码图片版:
在这里插入图片描述

心得总结:

1、出现missing function header (old-stytle formal list?),多半是你的程序写得有问题,仔细检查你的分号等容易忽视的地方。
2、消息有很多种类,包括刷新对话框,移动鼠标等等,如果消息等于WM_COMMAND(点击了按钮,或者快捷键)这一类消息,那么就执行。
3、函数的使用:

	sprintf
	OutputDebugString
	EndDialog
	WM_COMMAND
	GetDlgItemInt
	SetDlgItemInt

猜你喜欢

转载自blog.csdn.net/ciscomonkey/article/details/89300664