学习 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后缀的文件.
然后修改 文件,添加个头文件即可,然后运行。
然后将会在 新建 -工程中看见此向导了。 完毕.