您的位置:软件 > 开发者网络 > 技术跟踪 > Windows编程 > 正文
Windows程序的基本结构
[文章信息]
作者:冯明德
时间:2004-05-24
出处:论坛
责任编辑:方舟
[文章导读]
Windows程序具有相对固定的结构,对编写者而言,不需要书写整个过程,大部分过程由系统完成
advertisement
热点推荐
· 天极网软件频道改版调查
· 25软件精选 Excel分页汇总
· 提升Win XP性能的20个特殊技巧
· 图解JBuilderX安装与实践
· Fireworks国画:葡萄小鸡图
[正文]
  一、概述

  Windows程序具有相对固定的结构,对编写者而言,不需要书写整个过程,大部分过程由系统完成。

  程序中只要按一定的格式填写系统留给客户的那一小部分。

  所需要完成的有:

  窗口类的定义、窗口的建立、消息函数的书写、消息循环。

  二、消息处理函数

  Windows程序是事件驱动的,对于一个窗口,它的大部分例行维护是由系统维护的。没个窗口都有一个消息处理函数。

  在消息处理函数中,对传入的消息进行处理。系统内还有它自己的缺省消息处理函数。

  客户写一个消息处理函数,在窗口建立前,将消息处理函数与窗口关联。这样,每当有消息产生时,就会去调用这个消息处理函数。

  通常情况下,客户都不会处理全部的消息,而是只处理自己感兴趣的消息,其他的,则送回到系统的缺省消息处理函数中去。

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case ...
...
case ...
...

}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

  三、窗口的建立

  客户需要自己建立窗口,建立后会得到系统返回的窗口句柄(HWND),后继的针对窗口的操作都针对句柄进行。

  1.注册窗口类

  建立窗口前,需要制定好这个窗口的相关属性,最主要的就是将自己定义的消息处理函数与窗口关联,其他的属性还包括:菜单、图标等等。

  这个属性指定步骤是通过指定"窗口类"来完成的。

  对于自己建立的窗口,这个"窗口类"需要自己制定,也即自己填充一个WNDCLASS结构,然后向系统注册。
对于一些特殊窗口,如按钮等控件,他们的行为是系统制定好了的,所以不需要自己注册,直接使用对应的“窗口类”名称就行了。

  2.建立窗口

  建立窗口时,注册的"窗口类"名称作为参数传入。

  这样,当有针对该窗口的消息时,将调用“窗口类”中指定的消息处理函数,在其中得到处理。

  四、消息循环

  系统会将针对这个程序的消息依次放到程序的“消息队列”中,由程序自己依次取出消息,在分发到对应的窗口中去。

  因此,建立窗口后,将进入一个循环。

  在循环中,取出消息、派发消息,循环往复,直到取得的消息是退出消息。

  循环退出后,程序即结束。

#include "stdafx.h"
#include <windows.h>

//一、消息处理函数
//参数:窗口句柄,消息,消息参数,消息参数
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 //处理感兴趣的消息
 switch (message)
 {
  case WM_DESTROY:
   //当用户关闭窗口,窗口销毁,程序需结束,发退出消息,以退出消息循环
   PostQuitMessage (0) ;
   return 0 ;
 }
 //其他消息交给由系统提供的缺省处理函数
 return ::DefWindowProc (hwnd, message, wParam, lParam) ;
}

//二、应用程序主函数
//参数:实例句柄、前一个实例的句柄、命令行参数、窗口显示方式
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
 //1.注册窗口类
 static TCHAR szAppName[] = TEXT ("HelloWin") ; //窗口类名称
 //定制"窗口类"结构
 WNDCLASS wndclass ;
 wndclass.style = CS_HREDRAW | CS_VREDRAW ;
 wndclass.lpfnWndProc = WndProc ; //关联消息处理函数
 wndclass.cbClsExtra = 0 ;
 wndclass.cbWndExtra = 0 ;
 wndclass.hInstance = hInstance ; //实例句柄
 wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //图标
 wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //光标
 wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); //画刷
 wndclass.lpszMenuName = NULL ;
 wndclass.lpszClassName = szAppName; //类名称
 //注册
 if (!RegisterClass (&wndclass))
 {
  MessageBox (NULL, TEXT ("RegisterClass Fail!"),
  szAppName, MB_ICONERROR) ;
  return 0 ;
 }

 //建立窗口
 HWND hwnd ;
 hwnd = CreateWindow (szAppName, //窗口类名称
  TEXT ("The Hello Program"), //窗口标题
  WS_OVERLAPPEDWINDOW, //窗口风格
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  NULL,
  NULL,
  hInstance, //实例句柄
  NULL);

 ShowWindow (hwnd, iCmdShow) ;
 UpdateWindow (hwnd) ;
 
 //消息循环
 MSG msg ;
 while (GetMessage (&msg, NULL, 0, 0)) //从消息队列中取消息
 {
  TranslateMessage (&msg) ; //转换消息
  DispatchMessage (&msg) ; //派发消息
 }
 return msg.wParam ;
}

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • Windows编程中的堆管理
  • Win2000驱动程序设计初步
  • Windows下DLL编程技术及应用
  • 盘符混乱咋办 拨乱反正有巧招
  • MotherBoard Monitor入门篇
  • MotherBoard Monitor进阶篇
  • 如何买到一部称心的品牌电脑
  • 关注!国内首款GeForce 6200显卡曝光
  • 《魔兽世界》角色扮演游戏壁纸
  • 天极缉拿假IE4.0为首的仿冒鼠
  • 《魔兽世界》Q版人物头像集
  • Advertisement

    天极无线
    待机彩图    >>更多
    多彩动画    >>更多
    美妙和弦    >>更多
    天使在唱歌
    壁虎漫步
    PrettyBoy
    LoveLoveLove
    我是你的小小狗
    单身情歌
    十面埋伏
    祝酒歌
    回心转意
    波斯猫
    太委屈
    S.H.E
    潘玮柏
    M2M
    蔡依林
    阿牛
    林志炫
    陈弈迅
    刀郎
    黑龙
    S.H.E
    陶晶莹
    情人玫瑰坊
    音乐风云
    新片速递
    神秘测试
    都市约会
    ·天极彩信天天精彩
    ·图铃梦工厂下载无限!
    ·找寻童真,卡通专题
    ·夏日激情交友社区!
    ·星座运程,预测人生

    CSEEK搜索