面是用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) ;
}研究了半天也看不懂上面的代码,帮我系统的解释一下好吗?先谢了!
#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) ;
}研究了半天也看不懂上面的代码,帮我系统的解释一下好吗?先谢了!
//里面囊括了大多数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);
}
一:一个程序要被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的程序都是基于消息的.所以下面是消息处理吧.
里面的四个参数好像没有用到,参数都是做什么的呀?
2.这个值返回给系统。在WinMain执行之前系统会先运行一段程序,WinMain的返回值就是反给它的
3。DefWindowProc是所有WINDOWS消息的默认处理,调用它是让它处理你不想亲自的处理的消息,但有些消息是必须被处理的,所以必须调用它。