面是用api写的最简单的窗口文件:#include <windows.h> //定义Windows函数,数据类型,结构,常量,宏...
#include <stdio.h>LRESULT CALLBACK  WndProc (HWND, UINT, WPARAM, LPARAM) ;//WndProc声明 //WinMain()是程序入口,WINAPI是32位应用规定,int是返回数据类型;
//hInstance是实例句柄,hPrevInstance是前一个实例句柄;
//lpszCmdParam是指向命令行字符串指针,nCmdShow是窗口显示方式
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpszCmdParam, int nCmdShow)
{
 static char szAppName[] = "Hello" ; 
 HWND        hwnd ; //新数据类型,代表窗口句柄
 MSG         msg ; //结构变量,其中成员:msg.message
 //                   msg.wParam
 //                   msg.lParam
 WNDCLASS    wndclass ;//结构变量
 
 //为wndclass赋值,规定窗口特性
 if (!hPrevInstance)
 {
  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 = GetStockObject (LTGRAY_BRUSH) ;
  wndclass.lpszMenuName  = NULL ;
  wndclass.lpszClassName = szAppName ;//用任一名:"Hello"  
  RegisterClass (&wndclass) ;    //登录
 }
 
 //用CreateWindow()建立一个窗口,它也规定了一些窗口特性
 hwnd = CreateWindow (szAppName,        //同上面名:"Hello" 
  "The Hello Program",   // window caption
  WS_OVERLAPPEDWINDOW,     // window style
  CW_USEDEFAULT,           // initial x position
  CW_USEDEFAULT,           // initial y position
  CW_USEDEFAULT,           // initial x size
  CW_USEDEFAULT,           // initial y size
  NULL,                    // parent window handle
  NULL,                    // window menu handle
  hInstance,               // program instance handle
  NULL) ;            // creation parameters
 
 ShowWindow (hwnd, nCmdShow) ; //按照nCmdShow值显示窗口
 UpdateWindow (hwnd) ;   //若当前有无效矩形区,则产生
 //WM_PAINT消息,不经消息队列,直送过程函数。若无无效矩形区,
 //则不执行任何事情.
 
 //消息循环
 while (GetMessage (&msg, NULL, 0, 0)) //获取消息
 {
  TranslateMessage (&msg) ;
  DispatchMessage (&msg) ;   //发送消息到过程函数
 }
 return msg.wParam ;
}//过程函数WndProc(),CALLBACK表示由Windows调用,
//LRESULT是32位数据类。hwnd是窗口句柄,message是消息,
//wParam及lParam是代表消息的参数。它们由Windows系统
//调用WndProc()时给出
LRESULT CALLBACK  WndProc (HWND hwnd, UINT message, 
         WPARAM wParam,LPARAM lParam)

 HDC hdc;
 PAINTSTRUCT ps ;
 int j;
 char str[60]; switch (message)
 {   
 case WM_CREATE:
  return 0;
  
 case WM_PAINT:
  hdc = BeginPaint (hwnd, &ps) ;
  j=sprintf(str,"Defenestration can be hazardous");
  TextOut(hdc, 0, 0, str, j); 
  EndPaint(hwnd, &ps);
  return 0;
 case WM_DESTROY:
  PostQuitMessage (0) ;
  return 0 ;    
 }
 //DefWindowProc()函数处理所有WinProc()不处理的消息
 return DefWindowProc (hwnd, message, wParam, lParam) ;
}研究了半天也看不懂上面的代码,帮我系统的解释一下好吗?先谢了!

解决方案 »

  1.   

    这个注释应该够详细了吧:#include <windows.h>    //所有WIN32应用程序必须包含的头文件,
                            //里面囊括了大多数API//窗口过程
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,   //应用程序实例句柄,在调用程序资源的时候必
                                              //须用到
                         //上一个程序实例,在WIN16中用来重复运行程序,在WIN32中停用,
                         //设置为NULL
                         HINSTANCE hPrevInstance,
                         //命令行参数
                         LPSTR     lpCmdLine,
                         //窗口显示标志
                         int       nCmdShow)
    {
           //TCHAR是一个宏,如果定义了标志符UNICODE,那么TCHAR就是_wchar,否则就是普通
           //char. TEXT宏所起的作用也是UNICODE和ANSI的转换,如果定义了UNICODE,
           //那TEXT("Hello")就变成L("Hello")(UNICODE串),否则就是普通的字符串
      static TCHAR szAppName[]=TEXT("Hello");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;       //窗口风格,只在水平和垂直两个方向都进行重画
    wndclass.style=CS_HREDRAW|CS_VREDRAW;       //窗口消息处理过程,调用上面声明的窗口过程。WINDOWS编程和DOS编程最大的不同就
           //是这点,在DOS中,一切指令都顺序执行,由程序员决定调用什么;在WINDOWS中,
           //当有消息被触发时,WINDOWS会调用你所指定的处理过程来处理消息,不用你费心
    wndclass.lpfnWndProc=WndProc;       //在窗口类中用来保存一些额外的信息,以后可以用GetClassLong()来取出
    wndclass.cbClsExtra=0;       //在窗口中用来保存一些额外的信息,可以用GetWindowLong()来取出
    wndclass.cbWndExtra=0;       //窗口类中保存的程序实例句柄
    wndclass.hInstance=hInstance;       //窗口中使用的图标,用LoadIcon载入系统定义的默认土标
    wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);       //窗口中使用的光标,载入默认的光标
    wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);       //窗口北京画刷,设置为默认的白色。GetStockObject取系统预先定义的GDI对象,有
           //BLACK_BRUSH,WHITE_BRUSH等,对画刷的一种更直观的印象可以是把它看作
           //填充某个区域所用的颜色
    wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);       //彩旦名称,如果在资源中定义了菜蛋,比如ID是IDI_MAINFRAME,
                //可以用MAKEINTRESOURCE(IDI_MAINFRAME)来设置菜蛋名
    wndclass.lpszMenuName=NULL;       //窗口类名称,唯一标志了该窗口类的存在,以后创建的窗口都基于该名称
    wndclass.lpszClassName=szAppName;
           
           //注册窗口类
    RegisterClass(&wndclass);       //创建窗口
    hwnd=CreateWindow(szAppName,       //窗口类名称,前面刚设置了
    TEXT("The Hello Program"),  //窗口标题栏内容
    WS_OVERLAPPEDWINDOW,        //窗口风格,如果是WS_POPUP,
                                              //则无边框,写全屏游戏时常用此
    CW_USEDEFAULT,              //以下分别是窗口位置坐标和宽度与高度
                                              //军使用WINDOWS的默认值
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    NULL,                       //父窗口句柄
    NULL,                       //菜蛋句柄,如果前面已经设置了菜蛋名称,则
                                              //该项可为NULL,否则将没有菜蛋
    hInstance,                  //实例句柄
    NULL);                      //参数。你可以将自己定义的参数传入窗口使用 ShowWindow(hwnd,SW_SHOW);          //显示窗口。SW_SHOW为正常模式
    UpdateWindow(hwnd);                //更新窗口,即使整个窗口无效,引起重新绘制       //进入消息循环。WIN32系统为每个进程维护一个消息队列,并将用户或系统对程序的所有
           //输入或动作军转化为消息通知进程。GetMessage从消息队列中取出一个消息,如果消息
           //队列为空,它将不断等待,直到有一个消息被取出为止,如果遇到WM_QUIT消息,该函
           //返回0。
           //PeekMessage也能取出消息,如果有消息,它就返回非零,否则为零。它还能让人选择是
           //否从消息队列中删除该消息。调用如下 PeekMessage(&msg,NULL,0,PM_REMOVE)这个
           //调用的作用和GetMessage差不多了,如果没有消息存在,它将返回零,遇到WM_QUIT
                //也没有特殊的反应。 
    while(GetMessage(&msg,NULL,0,0)){
                  //将键盘消息分们别类的解析,哪些是系统见,哪些是用户案件全部分好,便于
                  //程序员区分
    TranslateMessage(&msg);  
                            //发送消息
    DispatchMessage(&msg);
    } return msg.wParam;
    }//窗口的所有动作处理都在该函数中完成,它处理一切淡季,击剑等
    LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,
     LPARAM lParam)
    {
           //参数分析:hwnd是发送消息的窗口句柄,有时可能有多个窗口从一个窗口类中
           //被创建,所以有必要区分是哪个窗口发送的消息。
           //message是收到的消息,用switch-case来依次判断是什么消息,并进行相应处理
           //wParam和lParam是和消息有关的附加信息,非常重要,对不同的消息含义不同
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect; switch(message)
    {
    case WM_PAINT:   //重画窗口
                  //该函数使得在PS中指定的部分窗口变的有效,以执行绘制操作
                  //该函数返回一个设备描述表句柄,它是一切绘制的基础
    hdc=BeginPaint(hwnd,&ps);
                  //取客户区巨型
    GetClientRect(hwnd,&rect);
                  //绘制字符串
    DrawText(hdc,TEXT("Hello,god!"),-1,&rect,
    DT_SINGLELINE|DT_CENTER|DT_VCENTER);
                  完成绘制,释放设备描述表
    EndPaint(hwnd,&ps);
    return 0;
    case WM_DESTROY:
    PostQuitMessage(0);   //该函数将一个WM_QUIT消息放入消息队列,结束程序运行
    return 0;
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
    }
      

  2.   

    去看《Windows程序设计》吧,上面有详细的解释
      

  3.   

    可以这样看:
    一:一个程序要被Windows所认识,必须注册.下面这段代码:
    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 = GetStockObject (LTGRAY_BRUSH) ;
      wndclass.lpszMenuName  = NULL ;
      wndclass.lpszClassName = szAppName ;//用任一名:"Hello"  
      RegisterClass (&wndclass) ;    //登录
    二:现在是创建窗口.显示窗口.
    hwnd = CreateWindow (szAppName,        //同上面名:"Hello" 
      "The Hello Program",   // window caption
      WS_OVERLAPPEDWINDOW,     // window style
      CW_USEDEFAULT,           // initial x position
      CW_USEDEFAULT,           // initial y position
      CW_USEDEFAULT,           // initial x size
      CW_USEDEFAULT,           // initial y size
      NULL,                    // parent window handle
      NULL,                    // window menu handle
      hInstance,               // program instance handle
      NULL) ;            // creation parameters
     
     ShowWindow (hwnd, nCmdShow) ; //按照nCmdShow值显示窗口
     UpdateWindow (hwnd) ;   //画窗口
    三:消息循环.Windows的程序都是基于消息的.所以下面是消息处理吧.
      

  4.   

    不好意思,我还有几个问题:1.那个注册窗体的代码………RegisterClass (&wndclass),好像c里面没有那样的结构?2.return msg.wParam返回到哪去了?3.DefWindowProc (hwnd, message, wParam, lParam)又返回到哪去了?
    里面的四个参数好像没有用到,参数都是做什么的呀?
      

  5.   

    对archer_hao(普天之下,舍我其谁)深表佩服,阁下提携新人,照顾后进,不厌其烦,不知劳累,燃烧自己,照亮别人的风范,我等望尘莫及。
      

  6.   

    1.WNDCLASS C标准库里是没有,那是WINDOWS定义的,在WINDOWS。H里面
    2.这个值返回给系统。在WinMain执行之前系统会先运行一段程序,WinMain的返回值就是反给它的
    3。DefWindowProc是所有WINDOWS消息的默认处理,调用它是让它处理你不想亲自的处理的消息,但有些消息是必须被处理的,所以必须调用它。