自己动手写类似酷狗播放器(1)_创建一个基于对话框模板

	学习 C语言也有两个多月了,现在在看的书籍是<windows程序设计>和网友系列文章。自动动手写了音乐播放器,仿照酷狗界面做的,只实现了主要功能。这个会做个连载,主要针对那些刚学习windows程序的同学,有个参考和思路,同时自己也做个总结和展望,以便进一步学习。欢迎同学们留言探讨...

       环境:vc++6.0  SDK编写   操作系统 :winxp sp3    语言:C 语言  待学习完C++后,将全部用C++重写.

(1).理解windows消息机制

    什么叫做windows消息机制?在windows系统中,一切都是操作都是以消息的形式给出,这是操作系统完成的,不用我们管,应用程序就是跑在OS上面的,所以一切的响应操作都是OS和应用程序互相交互,一句话解释就是:操作系统告诉应用程序发生了什么事。然后应用程序接着去做什么
   举个例子: 你妈喊你回家吃饭。这里你妈就是操作系统,喊你就是给你(应用程序)发个消息(快回家)。然后你(应用程序)接收到了这个消息(哦!我妈喊我回家吃饭了)。然后对于你(应用程序)做一列的处理工作来响应消息(就是往回家的路上走这件事).

(2).进一步从代码角度来理解消息机制

   下面就带大家来创建一个简单的窗口,来体会下windows的消息机制。
    目标:弹出一个对话框窗口,当你按下确定键,弹出"你按下了确定键"。
先上一个效果图:

步骤:1.先建立个工程 

下面就进入代码区域了:

    创建一个对话框,可以用资源的方式和 纯代码的方式,这里为了方便体验消息机制,就用资源的方式来创建对话框。
如何创建资源,请接着往下看:
点击新建->new
   就可以在上面区域拖动控件了,实现其实做了这么多就是为了 插入一个对话框资源,当然在资源插入的时候,可以插入很多资源,比如菜单,位图什么的。

2.代码实现部分了 

添加头文件,在创建完资源后,可以到你工程所在的目录看,有个.rc后缀的文件。找到resource.h文件添加入工程中,这个.h文件就是资源的ID号什么的.

最后完整工程就是这样

接下就是代码部分了:

// DialogBased APP.cpp : Defines the entry point for the application.
//


#include "stdafx.h"
#include <windows.h>  //头文件
#include  "resource.h" //资源头文件
//#include <windowsx.h>  //	HANDLE_MSG()宏定义在此文件中定义


BOOL WINAPI Main_PRCO(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM lParam) //对话框处理程序
{	
	switch(Msg)
	{
		case WM_INITDIALOG:
			{	
				return TRUE;
			}
		case WM_COMMAND:  //命令
			{
				switch(wParam)
				{
					case IDOK:
						{	MessageBox(NULL,TEXT("你按下了确定按钮"),TEXT("提示"),MB_OK);
							break;
						}
					default:
						break;
				}
				break;
			}
		case WM_CLOSE: //关闭
			{	
				EndDialog(hwnd,0);
				break;
			}
	}
	return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,Main_PRCO);//创建一个模态对话框 (自己可以完全处理消息流)
	return 0;
}


上面就是完整的代码部分。你运行下看,就可以看到目标的效果。

(3).代码分析

    在C语言的控制台程序中,我们都知道,入口就是main()函数。同样在windows程序中,也必须有个入口函数,这里就是WinMain函数。所有一些的消息都是从这个入口给到应用程序中的。
int APIENTRY WinMain(HINSTANCE hInstance, //程序实例 就是一个应用程序的进程
                     HINSTANCE hPrevInstance, //32位windows中以抛弃
                     LPSTR     lpCmdLine,  //发送的命令
                     int       nCmdShow) //程序显示的方式,最大化,最小化
{
 	// TODO: Place code here.
	DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,Main_PRCO);//创建一个模态对话框 (自己可以完全处理消息流)具体的参数 自行查找资料 最后一个参数窗口处理函数
	return 0;
}
结论:OS通过该入口,启动应用程序,并且交互。下面 介绍窗口处理函数
BOOL CALLBACK Main_PRCO(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM lParam) //对话框处理程序
{	
	switch(Msg)
	{
		case WM_INITDIALOG: //初始化事件
			{	
				//这里添加初始化代码
				return TRUE;
			}
		case WM_COMMAND:  //命令事件 用于响应控件等的事件 
			{	
				switch(wParam)//当发生wm_command事件后,wPararm和lParam就携带消息的数据参数
				{	//这里wParam就是控件的ID号了
					case IDOK:
						{	MessageBox(NULL,TEXT("你按下了确定按钮"),TEXT("提示"),MB_OK);
							break;
						}
					default:
						break;
				}
				break;
			}
		case WM_CLOSE: //关闭事件
			{	
				EndDialog(hwnd,0);//结束对话框函数 
				break;
			}
	}
	return FALSE;
}
   返回值类型:BOOL (其实就是int) 可以查看定义 WINAPI  CALLBACK都是一种调用方式。具体可以网络查找。然后就是四个参数:1是窗口句柄,2是windows消息(wm开头的) 3.4都是消息附带的参数。至于是什么参数,表示什么,查阅MSDN了。
    上面代码中 有三类最常见的windows消息。WM_INITDIALOG初始化事件,WM_COMMAND命令事件,就是响应各种控件的操作时发生的事件,比如你按下了个按钮,将发送此类事件。WM_CLOSE结束对话框时,发生的事件。
下面这张图 ,就很清楚反应了消息机制的原理。

    进一步理解消息机制,当我们双击了该应用程序,从WinMain入口启动了应用程序,直到我们点击右上角的X来关闭应用程序时,这个程序就一直运行着,并且在一直接受操作系统传来的消息,我们的Dialogbox函数就是完全代替了While(GetMessage(&msg)...)消息循环。所以只要消息一直都在,就都会传给窗口处理过程来处理消息。直到结束窗口.那么看来一切的根源都是不断的获取消息了。对,就是这个由Whlie控制的GetMessage函数就是个系统的API函数,一直会从系统的消息队列中提取消息,不管有没有用用户的任何操作,都会成为一个事件,发送给应用程序,然后应用程序通知窗口过程函数来处理消息,直到应用程序关闭,退出了,也就不调用了GetMessage函数,这就是消息处理机制。

(3).如何创建SDK对话框模板向导

	上面的实例程序就是一个最小模块的代码,以后任何程序都要用到,所以将其变为一个向导,在每次新建一个应用程序的时候,可以不必每次都去手动创建,做重复的工作,但是第一次最好自己创建下,从无到有 的体会下.
	下面就带大家一起来创建个基于SDK 对话框的模板向导,该向导创建完毕后会在新建-工程中出现。
	首先重新双击VC 启动。然后在新建
然后 查找上面实例工程中的 .dsp后缀的文件.
 	然后修改 文件,添加个头文件即可,然后运行。
然后将会在 新建 -工程中看见此向导了。																						完毕.

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值