VC++实例编程系列——第一天

类别:VC语言 点击:0 评论:0 推荐:
  第一部分:Win32 SDK学习 第一天、 做一个空白窗口 先来搞清Win32 SDK应用程序的流程:

再来看看Win32程序是怎么开始的:

  在C或C++中,一个DOS程序是从main()函数开始的,那么Windows程序是不是也是从main()函数开始呢?当然,答案是NO。那么Windows程序是从哪开始的呢?在Windows中,程序是从一个叫做WinMain()的函数开始的,它就像DOS程序中的main()函数。

下面看看WinMain()函数的格式: int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) 参数说明:

hInstance:当前实例句柄,由系统自动分配。

hPrevInstance:上一个实例句柄,在Win32中永远为NULL。

lpCmdLine:这个程序的命令行参数,没想到吧,Windows下的程序也支持命令行参数。这是个字符串。

nShowCmd:指定怎样显示窗口。这个参数,我一直都不明白,程序都是由系统启动的,我不知道怎样输入这个参数。

返回值:

如果是在接收到WM_QUIT消息后退出,则应该返回消息的wParam参数;
如果是在消息循环开始前退出,则应该返回一个0。

Win32程序的开始点搞清楚了,那这个函数中应该有点什么呢?

在WinMain()函数中,一般应完成这几方面的任务:(结构及函数详细说明参见本人翻译的Win32 SDK)

注册新的主窗口类型;

在这里需要了解一个结构和一个函数:

WNDCLASS结构;RegisterClass函数

新建并显示主窗口;

在这里需要了解CreateWindow函数、ShowWindow函数、UpdateWindow函数。

开始主窗口的消息循环。

在这里需要了解GetMessage函数、TranslateMessage函数、DispatchMessage。

好,现在就试着写一个空窗口程序:

//--------------------------------------------------------------------
//***********************华奇英多功能编辑器主头文件*********************
//文件名:Heditor.h
//--------------------------------------------------------------------
bool H_RegWindowsClass(HINSTANCE hInstance);
bool H_InitWindow(HINSTANCE hInstance,int nShowCmd);
LRESULT CALLBACK H_WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); //-------------------------------------------------------------------
//********************* 华奇英多功能编辑器主文件***********************
//文件名:Heditor.cpp
//-------------------------------------------------------------------
//包含文件
#include <windows.h> //在Win32程序中必须包含
#include "Heditor.h"
//全局变量
HINSTANCE H_Instance; //保存当前实例句柄的变量,供以后使用
//函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
 MSG cu_Msg; //消息结构

 if(H_RegWindowsClass(hInstance)) //注册新的窗口类型
 { //如果注册成功
  H_Instance=hInstance; //保存当前实例句柄
  H_InitWindow(hInstance,nShowCmd); //建立窗口并显示

  while(GetMessage(&cu_Msg,NULL,0,0)) //开始消息循环
  {
   TranslateMessage(&cu_Msg); //翻译字符消息
   DispatchMessage(&cu_Msg); //分配信息
  }
  return(cu_Msg.wParam);
 }

 return(0);
 }

bool H_RegWindowsClass(HINSTANCE hInstance) //注册视窗类型
 {
 WNDCLASS wc; //定义类注册结构

 wc.style=CS_OWNDC|CS_HREDRAW|CS_VREDRAW; //定义类风格
 wc.lpfnWndProc=H_WndProc; //窗口过程回调函数
 wc.hInstance=hInstance; //实例句柄
 wc.cbClsExtra=0;
 wc.cbWndExtra=0;
 wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); //窗口图标
 wc.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口光标
 wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); //窗口背景刷
 wc.lpszMenuName=NULL; //窗口菜单名
 wc.lpszClassName="webmain_Class"; //定义类名

 if(RegisterClass(&wc)) //注册窗口类
  return true; //成功,返回真
 return false; //失败,返回假
 }

bool H_InitWindow( //窗口初始化函数
          HINSTANCE hInstance, //当前窗口实例句柄
          int nShowCmd //显示窗口的方式
         )
 {
 HWND cu_hWnd; //窗口句柄

 cu_hWnd=CreateWindow("webmain_Class", //类名
             "一个空白窗口", //窗口名称
             WS_OVERLAPPEDWINDOW, //窗口风格
             0,0, //窗口的左上角坐标
             500,400, //窗口的宽与高
             NULL, //窗口的父句柄或所有者句柄
             NULL, //窗口的菜单句柄
             hInstance, //实例句柄
             NULL //一般为NULL,在以后的多文档窗口的建立中会讨论
            ); //新建窗口
 if(!cu_hWnd)
  { //如果建立窗口失败
   return(false);
  }

 ShowWindow(cu_hWnd,nShowCmd); //显示窗口
 UpdateWindow(cu_hWnd); //更新窗口
 return(true);
 }

LRESULT CALLBACK H_WndProc( //窗口处理函数
               HWND hwnd, //当前窗口的句柄
               UINT uMsg, //消息标识符
               WPARAM wParam, //消息的第一个附加参数
               LPARAM lParam //消息的第二个附加参数
              )
 {
 switch(uMsg)
  {
   case WM_DESTROY:
    PostQuitMessage(0); //结束程序
    break;
   default:
    return DefWindowProc(hwnd, uMsg, wParam, lParam); //调用默认窗口过程
  }
 return(0);
 }

好,程序代码已写成,按Ctrl+F5试试。运行结果如下:

  好,一个空白窗口已经完成,需要注意的是H_WndProc()函数,这个函数不能自己调用,必须由系统调用。它的名字可以是任意的,但参数不可以改变。这个函数是由窗口类型注册时写到窗口类型结构的lpfnWndProc参数中的。

本人由于是第一次写教学文章,难免有错误之处,请广大观者指出:[email protected]
http://websl.126.com

未完,待续……

本文地址:http://com.8s8s.com/it/it2752.htm