手记

Windows 编程简介从C/C++到Windows编程

Windows 编程简介

一、从C/C++到Windows编程

 

前面我们学习的C/C++程序都是DOS程序(或称为Windows控制台程序),也就是现在大学里的开设的《C/C++程序设计》的内容,这些程序由于不涉及到Windows 编程的细节,因此比较容易入门学习,这对训练初学者的编程思想是很有用的,也是有益的。但是当我们基本掌握了C/C++程序设计后,就不能仅仅停留在DOS下(或Windows控制台下)编写、运行程序。我们应该从编程思想的训练到Windows实用编程的转变。

一个最简单的Windows C程序。

include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL,"Hello 欢迎使用Turbo C for Windows 集成实验与学习环境!","我的第一个Windows程序",MB_OK);
return 0;
}

程序的运行结果是:

程序解析:

1、windows.h是每一个Windows程序都需要的头文件。

2、WinMain函数是所有Windows C程序的入口,类似于DOS C中的main函数。

3、MessageBox是一个Win32 API函数(API,Application Programming Interface 应用程序接口),其作用是弹出一个对话框,显示消息的内容。该函数的第一个参数是用来指定父窗口句柄,即对话框所在的窗口句柄。第二个参数是用来显示消息的内容(你可以修改成你想显示的内容)。第三个参数是 对话框标的标题,如本例的“我的第一个Windows程序”,第四个参数是指定对话框中显示的按钮,试一试,将MB_OK修改成MB_OKCANCEL,运行一下程序会出现什么结果,再试一试修改成MB_RETRYCANCEL

 

试一试将个求1+2+3+…+100的和的DOS C程序修改成Windows 程序。

include "stdio.h"

main()
{
int sum=0,i;
for(i=1;i<=100;i++)
{
sum=sum+i;
}
printf("1-100自然书数的和是:%d\n",sum);
}

 

参考程序:

 

include <windows.h>
include <stdlib.h>
include <string.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
int sum=0,i;
char str1[40]="1-100自然书数的和是:",str2[10];
for(i=1;i<=100;i++)
{
sum=sum+i;
}
itoa(sum,str2,10); /将整型变量sum的运算结果转化字符串str2,以方便显示/
strcat(str1,str2); /将str1的值(1-100自然书数的和是:)与str2连接,以方便显示/

MessageBox(NULL,str1,"第二个Win32程序",MB_OK);
return 0;

}

运行结果:

二、Windows 程序简介

 

(1)Windows C程序的组成:

 

1.C程序源文件,扩展名为.c或.cpp

2.头文件,扩展名为.h

3.资源文件,扩展名为.rc

 

(2)源程序的组成结构

 

Windows C程序有相对固定的基本结构,一般有入口函数WinMain和窗口函数。

 

1、WinMain函数

 

是所有Windows C程序的入口,类似于DOS C的main函数,其功能是完成一系列的定义和初始化工作,并产生消息循环。消息循环是整个程序运行的核心。

WinMain函数有三个基本的组成部分:函数说明、初始化和消息循环

a、WinMain函数的说明:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)

参数说明:

hInstance 应用程序当前实例句柄

hPrevInstance 前一个实例句柄,在32位系统中该参数永远是NULL

szCmdLine 程序运行时的命令行参数

iCmdShow 程序运行时的显示方式,如最大化、最小化、隐藏显示等。

 

b、初始化

初始化包括窗口类的定义、注册、创建窗口实例和显示窗口四部分。

这是固定格式,所有的Windows程序基本一样,记住即可,具体参见下面的程序实例的注释。

 

2、窗口函数

 

窗口函数定义了Windows C程序对接受到的不同消息的响应,其中包含了应用程序对各种可能接收到的消息的处理过程,是消息处理分支控制语句的集合。通常窗口函数是有一个或多个switch语句组成。每一条case语句对应一种消息,当应用程序接收到一个消息时,就会执行相应case 语句下的程序模块来完成相应的功能。

窗口函数说明:

 

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

参数说明:

hwnd 窗口句柄

message 代表所处理消息的消息值

wParam 消息的附加参数,是message的进一步信息

lParam 消息的附加参数,是message的进一步信息

 

一般用法:

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{
...
switch (message)
{
case 常数1:
...

       case  常数2:

              ...

 

       ...

              case WM_DESTROY:
                     PostQuitMessage (0) ; //在消息队列中插入一条“退出”消息
                     return 0 ;
       }
       return DefWindowProc (hwnd, message, wParam, lParam);//执行默认的消息处理
  }

 

窗口函数的主体是消息处理语句,该语句是有一系列case语句组成。我们学习者自需要根据窗口可能收到的消息在case语句中编写相应的处理程序即可。

   三、一个简单的Windows C程序:Hello World程序

 

include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; //窗口函数声明

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow) //WinMain函数说明
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ; //窗口句柄
MSG msg ; //消息结构
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))//为程序窗口注册窗口类
 {
       return 0 ;
 }

 //根据窗口类创建窗口
 hwnd = CreateWindow (szAppName, TEXT ("一个简单的Win32程序"), 
              WS_OVERLAPPEDWINDOW, 
              CW_USEDEFAULT, 
              CW_USEDEFAULT, 
              CW_USEDEFAULT, 
              CW_USEDEFAULT, 
              NULL, 
              NULL, 
              hInstance, 
              NULL

            ) ; 

 //显示窗口

 ShowWindow (hwnd, iCmdShow) ; 
 UpdateWindow (hwnd) ; //指示窗口刷新自身

 //消息循环

 while (GetMessage (&msg, NULL, 0, 0)) 
 {
      TranslateMessage (&msg) ; //转换某些键盘消息
       DispatchMessage (&msg) ; //将消息发送给窗口过程
 }
 return msg.wParam ;

}
 

//窗口函数
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;

switch (message)
{
     case WM_PAINT:
            hdc = BeginPaint (hwnd, &ps) ; //开始窗口绘制
            GetClientRect (hwnd, &rect) ; //获取窗口客户区的尺寸
            DrawText (hdc, TEXT ("Hello World!"), -1, &rect,
             DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; //显示Hello World,可以修改程序你要显示的内容

            EndPaint (hwnd, &ps) ; //结束窗口绘制
            return 0 ;

     case WM_DESTROY:
            PostQuitMessage (0) ; //在消息队列中插入一条“退出”消息
            return 0 ;
}
 return DefWindowProc (hwnd, message, wParam, lParam);//执行默认的消息处理

}

 

提示:该程序的源代码在《简单的入门程序实例》中

 

四、总结

 

   所有Windows 程序的基本结构都与上面的实例相同或相近(说明:有的程序是将窗口类和窗机窗口封住成函数后调用,其实质是一样的),记住一个例子,编写其他程序时,在其上面修改即可。
9人推荐
随时随地看视频
慕课网APP