牛刀教程笔记—生成窗口

#include <windows.h>
//LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
/**************************************************
HINSTANCE是句柄定义了两个句柄,LPSTR是字符串指针
typedef CHAR *LPSTR, *PSTR; 其中CHAR typedef char CHAR;
***************************************************/
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )

{

HWND hwnd;//不是结构体,是句柄说明了是一个32位的数
MSG Msg;//是结构体如下
/*########################## Message structure###############

/*typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
##################################################################*/
WNDCLASS wndclass;//是结构体 typedef WNDCLASSA WNDCLASS;
/*#typedef struct tagWNDCLASSA {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA;
####################################################################*/


char lpszClassName[]="窗口";//l long,p pointer,sz string
char lpszTitle[]="做自己的窗口";
wndclass.style=0;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;//实例句柄这个句柄表明当前程序当我们使用WinMain函数时,
//函数中就传递过来了
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//HICON是图标句柄这里用LoadIcon函数
//调用了一个系统图标
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//光标也用系统LoadCursor函数调用系统的一个光标
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//HBRUSH是一个画刷。这里用WITE_BRUSH.
//可以改为BLACK_BRUSH试试看
wndclass.lpszMenuName=NULL;//菜单指向NULL,没有菜单
wndclass.lpszClassName=lpszClassName;
/*******************************************************
RegisterClass是向系统注册窗体 我们的系统与DOS系统不同,
是多任务系统。每个句柄都是一个资源WINDOWS,最多有2^32种资源。
每一个句柄都要让系统知道这个句柄,在程序运行之前注册,注册
有可能失败,所以写成以下形式:
********************************************************/

if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return FALSE;
}
/************************************************************
下面这个函数返回一个句柄,其实是得到一个窗口句柄。我们上面的赋值
仅仅是将我们的想法告诉一个结构体,结构本身是一堆数据,注册结构体
是告诉系统我们需要用这些结构体产生一个窗体,而CreateWindow则是产
这个窗体。
第一个参数:窗口类名
就是我们上面的那个名字,为什么要用这个名字呢?因为这个名字的窗口
我们向系统已经注册了,系统中已经有这个名字的窗口存在了。所以我们
产生窗口就必须是这个名字的窗口,当然你可能会想不是有结构体吗?还
用名字做啥?因为结构体一旦注册了窗口,使命就完成了结构体是一种数
据结构,而窗口是一种系统资源。
第二个参数:窗口标题名
第三个参数:窗口样式
还有以下几种
WS_BORDER
WS_CAPTION
WS_VICROLL
WS_MAXIMIZEBOX
WS_MAXIMIZE
WS_MINIMIZEBOX
WS_MINIMIZE
WS_OVERLAPPED
WS_OVERLAPPEDW
WS_POPUP
WS_POPUPWINDOW
WS_SYSMENU
WS_HSCROLL
再下面就是窗口左上角坐标与窗口的宽度与高度
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT采用系统默认值CW_USEDEFAULT
再下面就是窗口句柄,菜单句柄,实例句柄等。
NULL,NULL,hInstance,NULL
*************************************************************/
hwnd=CreateWindow(lpszClassName,lpszTitle,WS_OVERLAPPEDWINDOW
,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL
,NULL,hInstance,NULL);
/************************************************************
ShowWindow(hwnd,nShowCmd);第一个参数是窗口句柄,第二个是窗口状
态。
*************************************************************/


ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd);
/***********************************************************
消息循环GetMessage 得到消息,将其放在Msg结构体中。
*************************************************************/
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);//翻译消息:如当按下键和松开按键时
//得到VM_KEYDOWN和VM_KEYUP消息。而消息
//字符VM_CHAR就是通过TranslateMessage这个
//函数翻译过来的
DispatchMessage(&Msg);//分发消息

}
return Msg.wParam; //返回消息中的一个数据
}
/***************************************************************************
WndProc名称可以改。
typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
HWND hwnd:是句柄,窗口句柄,因为下面的操作都是对这个窗口进行操作的所以必须有
这个句柄。
UINT message:无符号整数,传来的是消息,这个函数中主要是处理消息。处理过程是在
WinMain消息循环中。处理消息由本函数来承担。
WPARAM wParam,LPARAM lParam:一个是十六位参数。W(WORD),L(LONG)。


**************************************************************************/
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
/**switch结构处理消息***/
switch(message)
{
/***************************************************
我们下面只处理了一个消息:WM_DESTORY,这其实是一个当我们按下
关闭时,系统需要捕捉的一个消息,其实如果没有这一消息,系统也一样地关闭,
但为什么要有呢?大家用记事本时,如果内容改了,一定会出现一个对话框吧,
问要不要存盘?哎,就是这个消息要管的事,这个消息可以截获我们的关闭信息,
也就是说,如果有这个消息,就可以实现不关闭,当然我们可以做个试验,还在
其中做个消息框吧:(注意啊,大家看这里没有 break啊,其实应该有的,但
一般正常情况下一个窗口既然关了,下面也就什么都运行不到了,但作为一个好
习惯,建议大家还是加上 break;,
*****************************************************/
case WM_DESTROY:
MessageBox(hwnd,"牛刀不让你关",":'(",MB_OK);
break;
PostQuitMessage(0);
default:
return DefWindowProc(hwnd,message,wParam,lParam);//不处理的消息都送给这个函数去处理,
//至于怎么处理,那我们就管不着了。

}

return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值