鱼C论坛

 找回密码
 立即注册
查看: 3376|回复: 3

[吹水] API入门篇之 二 自己的窗口

[复制链接]
发表于 2013-4-6 22:51:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
源代码选参考 《windows程序设计》第三章
没什么好讲的 只是我把每一句都注释   
希望对初学者有帮助,
本来想出个课程的,但是自己学艺未精,怕大伙笑话,就不献丑了  所以就帖 吹水阁了
代码放在编译器上观看效果更好 ,VC6新建一个 win32 Application  选择第二个 一个简单的Win32程序。 #include "stdafx.h"
#include <windows.h>//包含应用程序中,数据类型和,数据结构的定义 ;

LRESULT CALLBACK WndProc (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);//消息处理函数声明


// WINAPI,__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事;1.参数传递顺序 ;2.调用堆栈由谁清理.
//WinMain函数是所有Windows应用程序的入口,类似c语言中的main函数 其功能是完成//一系列的定义和初始化,并产生消息循环                     
/*      入口    实例句柄      父类实例  字符串 命令行 窗体显示方式  */
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
//函数入口 函数说明


{
    /* 全局静态变量 随意取名*/
static TCHAR szApppName[] =TEXT("hello,windows!");   //定义字符串型数组,为主窗体取一个名称;
HWND hwnd; //句柄;hwnd表示消息所属的窗口
MSG 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);// 光标标=采用箭头光标;第一个参数为句柄,设置为空

/* GetStockObject返回HGDIOBJ类型;因为wndclass.hbrBackground是HBRUSH类型所以需要转化 */
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景==白色
wndclass.lpszMenuName =NULL;//菜单名称,没有菜单所以不需要名称;
wndclass.lpszClassName =szApppName; //窗口类名,开始定义的那个字符串数组名;

//*****************************************************************************************************
/*RegisterClass()函数功能:该函数注册在随后调用CreateWindow函数和CreateWindowEx函数中使用的窗口类 。

   CreateWindow();该函数创建一个重叠式窗口、弹出式窗口或子窗口。
   它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的)。
   函数也指该窗口的父窗口或所属窗口,及窗口的菜单
   CreateWindowEx();该函数创建一个具有扩展风格的重叠式窗口、弹出式窗口或子窗口,其他与 CreateWindow函数相同。
   //*****************************************************************************************************
   
  RegisterClass函数有一个参数 是一个指针 ,在这里我们指向的是,我们定义的窗体类
如果你的应用程序不打算创建窗口,就可以不用这个函数;                           */
if (!RegisterClass(&wndclass)) //如果注册失败 发出警告
{
  MessageBox(NULL,TEXT("窗口注册失败不能运行"),szApppName,MB_OK);//自己去查
  return 0;//不成功的话得让他返回,返回0就是结束了···
}//如果创建失败,就此结束!


//如果创建成功进行以下步骤,

//第二步以下是窗口类的注册 ,关于CreateWindow的介绍 往上看;
//CreateWindow 有一个返回值,是HWND类型,他必须返回;我们就用前面定义的 HWND hwnd;来接收他;
hwnd = CreateWindow(szApppName, //窗口类名;开始定义的那个字符串数组名
  TEXT("患得患失"),//窗口标题名;随便取
  WS_OVERLAPPEDWINDOW, //窗口的风格=默认的,可选风格实在太多,这里就不列举了喜欢倒腾的,童鞋们自己去MSDN吧;
  CW_USEDEFAULT,  // 指定窗口的初始水平位置X
  CW_USEDEFAULT,  // 指定窗口的初始垂直位置Y
  
  /*CW_USEDEFAULT是指窗口的大小位置等位默认值*/
  
  CW_USEDEFAULT,  // 以设备单元指明窗口的宽度
  CW_USEDEFAULT,  // 以设备单元指明窗口的宽度
  NULL,//此窗口父窗口  无
  NULL, //此窗口子菜单 无
  hInstance, //创建此窗口的应用程序的当前句柄
  NULL //窗口创建数据;无
  );

//创建完成我们就得显示他,
//第三步显示窗体;
//SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口,显示方式很多,详见MSDN;
ShowWindow(hwnd,SW_SHOW);//窗体句柄,指定窗口如何显示;

//第四步更新窗体;
UpdateWindow(hwnd);


/////////////消息循环
//函数GetMessage 是从调用线程的消息队列里取得一个消息并将其放于指定的结构
//GetMessage()参数1.指向MSG结构的指针,2取得其消息的窗口的句柄,3第一条消息4.最后一条信息
while (GetMessage (&msg, NULL, 0, 0))//while条件循环 ;; 最后参数 为 0,所有消息都会响应
  
  
{
  
/*TranslateMessage函数功能:该函数将虚拟键消息转换为字符消息。
字符消息被寄送到调用线程的消息队列里,
  当下一次线程调用函数GetMessage或PeekMessage时被读出。*/
  TranslateMessage (&msg) ; //将虚拟键消息转换为字符消息。翻译消息,处理键盘;
  DispatchMessage (&msg) ;//分发一个消息给窗口程序,
  
  
}
return msg.wParam ; //消息循环结束 即程序结束时 将信息返回系统
//系统根据hwnd来确定窗体


}  

//窗口函数定义了应用程序对接收到的不同消息的响应,其中包含了应用程序对各种可能接受到的消息的
//处理过程,时消息处理分支控制语句的集合
//第五步处理过程;
//ALLBACK,__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事;1.参数传递顺序 ;2.调用堆栈由谁清理.
//LRESULT就是longresult,也就是长整型之所以取名类LRESULT,是因为L即long ::: 结果
/* 函数原型定义         句柄      消息,  这个两个是指它的高16位和低16位 */
LRESULT CALLBACK WndProc (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{  /*long __stdcall ==LRESULT CALLBACK*/


PAINTSTRUCT ps; // PAINTSTRUCT结构
HDC hdc;//hDC是DC的句柄,API中的一个类似指针的数据类型  显卡有关;
RECT rect;//rect这个对象是用来存储成对出现的参数,比如,一个矩形框的左上角坐标、宽度和高度
switch (message)//选择消息
{
case WM_CREATE: //WM_CREATE窗体创建的消息
  return 0 ;
  
  
case WM_PAINT:
  
  // BeginPaint函数为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个PAINTSTRUCT结构中。
  //返回的HDC句柄;
  hdc =BeginPaint(hwnd,&ps);//被重绘的窗口句柄,输出指向一个用来接收绘画信息的PAINTSTRUCT结构
  
  //GetClientRect该函数获取窗口客户区的坐标
  GetClientRect(hwnd,&rect);// 窗口句柄,客户区坐标
  
  
  //DrawText该函数在指定的矩形里写入格式化的正文,根据指定的方法对正文格式化
  DrawText(hdc,TEXT("爱鱼C!爱编程!"),-1,&rect,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
  /*  int DrawText(
  HDC hDC, // 设备描述表句柄
  LPCTSTR lpString, // 将要绘制的字符串
  int nCount, // 字符串的长度 如果参数nCount是-1,则字符串必须是以\0结束的
  LPRECT lpRect, // 指向矩形结构RECT的指针
  UINT uFormat // 正文的绘制选项 希望怎么显示自己去查MSDN
  ); */
  
  
  /* EndPaint函数标记指定窗口的绘画过程结束;
  这个函数在每次调用BeginPaint函数之后被请求,但仅仅在绘画完成以后。*/
  EndPaint (hwnd,&ps);
  return 0;
  
  
  
case WM_DESTROY://是关闭程序的 由系统处理;
  
  
  PostQuitMessage(0);//该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息。
  return 0;
}

return DefWindowProc (hwnd, message, wParam, lParam) ;//交给系统处理一些消息;


}



//系统根据hwnd来确定窗体

}  

//窗口函数定义了应用程序对接收到的不同消息的响应,其中包含了应用程序对各种可能接受到的消息的
//处理过程,时消息处理分支控制语句的集合
//第五步处理过程;
//ALLBACK,__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事;1.参数传递顺序 ;2.调用堆栈由谁清理.
//LRESULT就是longresult,也就是长整型之所以取名类LRESULT,是因为L即long ::: 结果
  
/* 函数原型定义         句柄      消息,  这个两个是指它的高16位和低16位 */
LRESULT CALLBACK WndProc (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{  /*long __stdcall ==LRESULT CALLBACK*/


PAINTSTRUCT ps; // PAINTSTRUCT结构
HDC hdc;//hDC是DC的句柄,API中的一个类似指针的数据类型  显卡有关;
RECT rect;//rect这个对象是用来存储成对出现的参数,比如,一个矩形框的左上角坐标、宽度和高度
switch (message)            //选择消息
{
case WM_CREATE:            //WM_CREATE窗体创建的消息
  return 0 ;

case WM_PAINT:
             // BeginPaint函数为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个PAINTSTRUCT结构中。
    //返回的HDC句柄;
  hdc =BeginPaint(hwnd,&ps);     //被重绘的窗口句柄,输出指向一个用来接收绘画信息的PAINTSTRUCT结构
                                //GetClientRect该函数获取窗口客户区的坐标
  GetClientRect(hwnd,&rect);       // 窗口句柄,客户区坐标
  
  //DrawText该函数在指定的矩形里写入格式化的正文,根据指定的方法对正文格式化
  DrawText(hdc,TEXT("爱鱼C!爱编程!"),-1,&rect,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
  /*
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
int DrawText(
   HDC hDC,              // 设备描述表句柄
   LPCTSTR lpString, // 将要绘制的字符串
   int nCount,           // 字符串的长度 如果参数nCount是-1,则字符串必须是以\0结束的
   LPRECT lpRect,     // 指向矩形结构RECT的指针
   UINT uFormat      // 正文的绘制选项 希望怎么显示自己去查MSDN
   );
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*/
/*   EndPaint函数标记指定窗口的绘画过程结束;
这个函数在每次调用BeginPaint函数之后被请求,但仅仅在绘画完成以后。 */
  EndPaint (hwnd,&ps);
  return 0;
  

case WM_DESTROY:   //是关闭程序的 由系统处理;

  PostQuitMessage(0); //该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息。
  return 0;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;   //交给系统处理一些消息;

}

如果此帖对你有些帮助就 打赏点吧,有较多的朋友想需要的话 我可以再更新几篇 往后进阶的!
       欢迎朋友指正错误;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-6 22:53:44 | 显示全部楼层
  乞讨帖 兄弟们  打赏点吧  
我也不设回复可见了;省得你们灌水··
    就看你们良心了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2013-4-6 22:55:52 | 显示全部楼层
错别字多,  请见谅  毕竟我只有小学文化······ 多多包涵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-6-8 11:17:11 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 08:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表